From 279541676e2ce05498af6e7afd1ca0b2521076c7 Mon Sep 17 00:00:00 2001 From: GitHawk Date: Fri, 26 Feb 2016 11:30:22 +0100 Subject: [PATCH 001/826] Expanded module and string table --- addons/rearm/ACE_Settings.hpp | 7 +++++++ .../functions/fnc_moduleRearmSettings.sqf | 2 ++ addons/rearm/stringtable.xml | 18 +++++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/addons/rearm/ACE_Settings.hpp b/addons/rearm/ACE_Settings.hpp index f4d6562807..0d15701c06 100644 --- a/addons/rearm/ACE_Settings.hpp +++ b/addons/rearm/ACE_Settings.hpp @@ -6,4 +6,11 @@ class ACE_Settings { typeName = "SCALAR"; values[] = {CSTRING(RearmSettings_vehicle), CSTRING(RearmSettings_magazine), CSTRING(RearmSettings_caliber)}; }; + class GVAR(supply) { + displayName = CSTRING(RearmSettings_supply_DisplayName); + description = CSTRING(RearmSettings_supply_Description); + value = 0; + typeName = "SCALAR"; + values[] = {CSTRING(RearmSettings_unlimited), CSTRING(RearmSettings_caliber), CSTRING(RearmSettings_magazineSupply)}; + }; }; diff --git a/addons/rearm/functions/fnc_moduleRearmSettings.sqf b/addons/rearm/functions/fnc_moduleRearmSettings.sqf index af627862da..ae4a56563c 100644 --- a/addons/rearm/functions/fnc_moduleRearmSettings.sqf +++ b/addons/rearm/functions/fnc_moduleRearmSettings.sqf @@ -22,5 +22,7 @@ params ["_logic", "", ["_activated", false, [false]]]; if (!_activated) exitWith {}; [_logic, QGVAR(level), "level"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(supply), "supply"] call EFUNC(common,readSettingFromModule); diag_log text format ["[ACE]: Rearm Module Initialized on level: %1", GVAR(level)]; +diag_log text format ["[ACE]: Rearm Module Initialized on supply: %1", GVAR(supply)]; diff --git a/addons/rearm/stringtable.xml b/addons/rearm/stringtable.xml index a4b037c5a5..0b4fe1c90f 100644 --- a/addons/rearm/stringtable.xml +++ b/addons/rearm/stringtable.xml @@ -71,6 +71,22 @@ Ammontare basato sul calibro Cantidad basada en el calibre + + Ammunition supply + Munitionsvorat + + + How much ammunition does an ammo truck carry? + Wie viel Munition transportiert ein Munitionslaster? + + + Unlimited ammo supply + Unbegrenzter Munitionsvorat + + + Only specific Magazines + Nur bestimmte Magazine + Rearm Aufmunitionieren @@ -313,4 +329,4 @@ FAB-250M-54 - \ No newline at end of file + From 91c6341bc85b7ee41455ac3f2a3d25be39bd8dad Mon Sep 17 00:00:00 2001 From: Githawk Date: Sat, 27 Feb 2016 20:31:07 +0100 Subject: [PATCH 002/826] Implementation --- addons/rearm/ACE_Settings.hpp | 2 +- addons/rearm/CfgVehicles.hpp | 50 +++++++++++ addons/rearm/XEH_PREP.hpp | 12 +++ .../functions/fnc_addMagazineToSupply.sqf | 64 ++++++++++++++ .../rearm/functions/fnc_addRearmActions.sqf | 39 +++++---- .../fnc_addVehicleMagazinesToSupply.sqf | 42 +++++++++ .../functions/fnc_canReadSupplyCounter.sqf | 26 ++++++ .../rearm/functions/fnc_canRearmVehicle.sqf | 26 ++++++ addons/rearm/functions/fnc_canTakeAmmo.sqf | 3 +- addons/rearm/functions/fnc_createDummy.sqf | 7 +- addons/rearm/functions/fnc_dropAmmo.sqf | 6 +- addons/rearm/functions/fnc_getCaliber.sqf | 48 +++++++++++ .../functions/fnc_getConfigMagazines.sqf | 14 +-- .../rearm/functions/fnc_getMaxMagazines.sqf | 3 +- .../functions/fnc_getNeedRearmMagazines.sqf | 7 +- addons/rearm/functions/fnc_getSupplyCount.sqf | 27 ++++++ .../functions/fnc_getVehicleMagazines.sqf | 23 +++++ .../rearm/functions/fnc_hasEnoughSupply.sqf | 39 +++++++++ .../rearm/functions/fnc_magazineInSupply.sqf | 39 +++++++++ addons/rearm/functions/fnc_pickUpAmmo.sqf | 5 +- .../rearm/functions/fnc_readSupplyCounter.sqf | 75 ++++++++++++++++ addons/rearm/functions/fnc_rearm.sqf | 35 ++------ .../functions/fnc_rearmEntireVehicle.sqf | 5 +- .../fnc_rearmEntireVehicleSuccess.sqf | 14 +-- .../fnc_rearmEntireVehicleSuccessLocal.sqf | 47 ++++++---- addons/rearm/functions/fnc_rearmSuccess.sqf | 3 +- .../rearm/functions/fnc_rearmSuccessLocal.sqf | 12 ++- .../fnc_removeMagazineFromSupply.sqf | 86 +++++++++++++++++++ addons/rearm/functions/fnc_setSupplyCount.sqf | 23 +++++ addons/rearm/functions/fnc_storeAmmo.sqf | 12 ++- addons/rearm/functions/fnc_takeAmmo.sqf | 26 +----- addons/rearm/functions/fnc_takeSuccess.sqf | 15 ++-- addons/rearm/stringtable.xml | 24 ++++++ 33 files changed, 719 insertions(+), 140 deletions(-) create mode 100644 addons/rearm/functions/fnc_addMagazineToSupply.sqf create mode 100644 addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf create mode 100644 addons/rearm/functions/fnc_canReadSupplyCounter.sqf create mode 100644 addons/rearm/functions/fnc_canRearmVehicle.sqf create mode 100644 addons/rearm/functions/fnc_getCaliber.sqf create mode 100644 addons/rearm/functions/fnc_getSupplyCount.sqf create mode 100644 addons/rearm/functions/fnc_getVehicleMagazines.sqf create mode 100644 addons/rearm/functions/fnc_hasEnoughSupply.sqf create mode 100644 addons/rearm/functions/fnc_magazineInSupply.sqf create mode 100644 addons/rearm/functions/fnc_readSupplyCounter.sqf create mode 100644 addons/rearm/functions/fnc_removeMagazineFromSupply.sqf create mode 100644 addons/rearm/functions/fnc_setSupplyCount.sqf diff --git a/addons/rearm/ACE_Settings.hpp b/addons/rearm/ACE_Settings.hpp index 0d15701c06..fb69018436 100644 --- a/addons/rearm/ACE_Settings.hpp +++ b/addons/rearm/ACE_Settings.hpp @@ -11,6 +11,6 @@ class ACE_Settings { description = CSTRING(RearmSettings_supply_Description); value = 0; typeName = "SCALAR"; - values[] = {CSTRING(RearmSettings_unlimited), CSTRING(RearmSettings_caliber), CSTRING(RearmSettings_magazineSupply)}; + values[] = {CSTRING(RearmSettings_unlimited), CSTRING(RearmSettings_limited), CSTRING(RearmSettings_magazineSupply)}; }; }; diff --git a/addons/rearm/CfgVehicles.hpp b/addons/rearm/CfgVehicles.hpp index 30548aed76..acd8ab62a1 100644 --- a/addons/rearm/CfgVehicles.hpp +++ b/addons/rearm/CfgVehicles.hpp @@ -15,6 +15,26 @@ #define MACRO_REARM_TRUCK_ACTIONS \ class ACE_Actions : ACE_Actions { \ class ACE_MainActions : ACE_MainActions { \ + class GVAR(ReadSupplyCounter) { \ + displayName = CSTRING(ReadSupplyCounter); \ + distance = REARM_ACTION_DISTANCE; \ + condition = QUOTE(_this call FUNC(canReadSupplyCounter)); \ + statement = QUOTE(_this call FUNC(readSupplyCounter)); \ + exceptions[] = {"isNotInside"}; \ + showDisabled = 0; \ + priority = 2; \ + icon = PATHTOF(ui\icon_rearm_interact.paa); \ + }; \ + class GVAR(Rearm) { \ + displayName = CSTRING(Rearm); \ + distance = REARM_ACTION_DISTANCE; \ + condition = QUOTE(_this call FUNC(canRearmVehicle)); \ + insertChildren = QUOTE(_target call FUNC(addRearmActions)); \ + exceptions[] = {"isNotInside"}; \ + showDisabled = 0; \ + priority = 2; \ + icon = PATHTOF(ui\icon_rearm_interact.paa); \ + }; \ class GVAR(TakeAmmo) { \ displayName = CSTRING(TakeAmmo); \ distance = REARM_ACTION_DISTANCE; \ @@ -36,6 +56,9 @@ }; \ }; +#define MACRO_REARM_DEFAULT_SUPPLY \ + GVAR(defaultSupply) = 1200; + class CfgVehicles { class ACE_Module; class ACE_moduleRearmSettings : ACE_Module { @@ -69,6 +92,26 @@ class CfgVehicles { }; }; }; + class supply { + displayName = CSTRING(RearmSettings_supply_DisplayName); + description = CSTRING(RearmSettings_supply_Description); + typeName = "NUMBER"; + class values { + class unlimited { + name = CSTRING(RearmSettings_unlimited); + value = 0; + default = 1; + }; + class magazine { + name = CSTRING(RearmSettings_limited); + value = 1; + }; + class caliber { + name = CSTRING(RearmSettings_magazineSupply); + value = 2; + }; + }; + }; }; class ModuleDescription { description = CSTRING(RearmSettings_Module_Description); @@ -110,6 +153,7 @@ class CfgVehicles { class Truck_03_base_F : Truck_F {}; class O_Truck_03_ammo_F : Truck_03_base_F { transportAmmo = 0; + MACRO_REARM_DEFAULT_SUPPLY MACRO_REARM_TRUCK_ACTIONS }; @@ -117,10 +161,12 @@ class CfgVehicles { class Truck_02_Ammo_base_F : Truck_02_base_F {}; class I_Truck_02_ammo_F : Truck_02_Ammo_base_F { transportAmmo = 0; + MACRO_REARM_DEFAULT_SUPPLY MACRO_REARM_TRUCK_ACTIONS }; class O_Truck_02_Ammo_F : Truck_02_Ammo_base_F { transportAmmo = 0; + MACRO_REARM_DEFAULT_SUPPLY MACRO_REARM_TRUCK_ACTIONS }; @@ -129,6 +175,7 @@ class CfgVehicles { class B_Truck_01_mover_F : B_Truck_01_transport_F {}; class B_Truck_01_ammo_F : B_Truck_01_mover_F { transportAmmo = 0; + MACRO_REARM_DEFAULT_SUPPLY MACRO_REARM_TRUCK_ACTIONS }; @@ -137,12 +184,14 @@ class CfgVehicles { class Heli_Transport_04_base_F : Helicopter_Base_H {}; class O_Heli_Transport_04_ammo_F : Heli_Transport_04_base_F { transportAmmo = 0; + MACRO_REARM_DEFAULT_SUPPLY MACRO_REARM_TRUCK_ACTIONS }; class Pod_Heli_Transport_04_base_F: StaticWeapon {}; class Land_Pod_Heli_Transport_04_ammo_F: Pod_Heli_Transport_04_base_F { transportAmmo = 0; + MACRO_REARM_DEFAULT_SUPPLY MACRO_REARM_TRUCK_ACTIONS }; @@ -161,6 +210,7 @@ class CfgVehicles { class B_Slingload_01_Ammo_F : Slingload_01_Base_F { XEH_ENABLED; transportAmmo = 0; + MACRO_REARM_DEFAULT_SUPPLY MACRO_REARM_TRUCK_ACTIONS }; diff --git a/addons/rearm/XEH_PREP.hpp b/addons/rearm/XEH_PREP.hpp index 8e3c10cd2c..03e08fd4b0 100644 --- a/addons/rearm/XEH_PREP.hpp +++ b/addons/rearm/XEH_PREP.hpp @@ -1,26 +1,38 @@ +PREP(addMagazineToSupply); PREP(addRearmActions); +PREP(addVehicleMagazinesToSupply); +PREP(canReadSupplyCounter); PREP(canRearm); +PREP(canRearmVehicle); PREP(canStoreAmmo); PREP(canTakeAmmo); PREP(createDummy); PREP(disable); PREP(dropAmmo); +PREP(getCaliber); PREP(getConfigMagazines); PREP(getMaxMagazines); PREP(getNeedRearmMagazines); +PREP(getSupplyCount); +PREP(getVehicleMagazines); PREP(grabAmmo); PREP(handleKilled); PREP(handleUnconscious); +PREP(hasEnoughSupply); +PREP(magazineInSupply); PREP(makeDummy); PREP(moduleRearmSettings); PREP(pickUpAmmo); +PREP(readSupplyCounter); PREP(rearm); PREP(rearmEntireVehicle); PREP(rearmEntireVehicleSuccess); PREP(rearmEntireVehicleSuccessLocal); PREP(rearmSuccess); PREP(rearmSuccessLocal); +PREP(removeMagazineFromSupply); +PREP(setSupplyCount); PREP(storeAmmo); PREP(takeAmmo); PREP(takeSuccess); diff --git a/addons/rearm/functions/fnc_addMagazineToSupply.sqf b/addons/rearm/functions/fnc_addMagazineToSupply.sqf new file mode 100644 index 0000000000..781af9e2f4 --- /dev/null +++ b/addons/rearm/functions/fnc_addMagazineToSupply.sqf @@ -0,0 +1,64 @@ +/* + * Author: GitHawk + * Adds magazines to the supply. + * + * Argument: + * 0: Target + * 1: Magazine Classname + * 2: Only partial + * + * Return value: + * None + * + * Example: + * [ammo_truck, "32Rnd_155mm_Mo_shells"] call ace_rearm_fnc_addMagazineToSupply + * + * Public: Yes + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]], ["_magazineClass", "", [""]], ["_partial", false, [false]]]; + +if (isNull _target || + {_magazineClass isEqualTo ""} || + {GVAR(supply) == 0}) exitWith {}; + +// With limited supply, we add the caliber to the supply count +if (GVAR(supply) == 1) then { + private _supply = [_target] call FUNC(getSupplyCount); + ([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; + if (!_partial || {GVAR(level) == 1}) then { + [_target, _supply + _cal] call FUNC(setSupplyCount); + } else { + private _magazinePart = ((REARM_COUNT select _idx) / (getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"))) min 1; + [_target, (_supply + (_cal * _magazinePart))] call FUNC(setSupplyCount); + }; +}; + +// With magazine specific supply, we add or update the magazineSupply array +if (GVAR(supply) == 2) then { + private _magazineSupply = _target getVariable [QGVAR(magazineSupply), []]; + private _magazineIdx = -1; + { + _x params ["_magazine", "_rounds"]; + if ((_magazine isEqualTo _magazineClass)) exitWith { + _magazineIdx = _forEachIndex; + }; + } forEach _magazineSupply; + + private _roundsPerTransaction = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"); + if (_partial) then { + _roundsPerTransaction = _roundsPerTransaction min (REARM_COUNT select _idx); + }; + if (_magazineIdx == -1) then { + if (count _magazineSupply == 0) then { + _magazineSupply = [[_magazineClass, _roundsPerTransaction]]; + } else { + _magazineSupply append [[_magazineClass, _roundsPerTransaction]]; + } + } else { + (_magazineSupply select _magazineIdx) params ["", "_rounds"]; + _magazineSupply set [_magazineIdx, [_magazineClass, (_rounds + _roundsPerTransaction)]]; + }; + _target setVariable [QGVAR(magazineSupply), _magazineSupply, true]; +}; diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf index 6040fd6fc5..b2b388a3fd 100644 --- a/addons/rearm/functions/fnc_addRearmActions.sqf +++ b/addons/rearm/functions/fnc_addRearmActions.sqf @@ -15,25 +15,24 @@ */ #include "script_component.hpp" -private ["_vehicleActions", "_actions", "_action", "_vehicles", "_vehicle", "_needToAdd", "_magazineHelper", "_turretPath", "_magazines", "_magazine", "_icon", "_cnt"]; params [["_target", objNull, [objNull]]]; -_vehicles = nearestObjects [_target, ["AllVehicles"], 20]; +private _vehicles = nearestObjects [_target, ["AllVehicles"], 20]; if (count _vehicles < 2) exitWith {false}; // Rearming needs at least 2 vehicles -_vehicleActions = []; +private _vehicleActions = []; { - _actions = []; - _vehicle = _x; - _needToAdd = false; - _action = []; + private _actions = []; + private _vehicle = _x; + private _needToAdd = false; + private _action = []; if !((_vehicle == _target) || (_vehicle isKindOf "CAManBase")) then { - _magazineHelper = []; + private _magazineHelper = []; { - _turretPath = _x; - _magazines = [_vehicle, _turretPath] call FUNC(getConfigMagazines); + private _turretPath = _x; + private _magazines = [_vehicle, _turretPath] call FUNC(getVehicleMagazines); { - _magazine = _x; + private _magazine = _x; _currentMagazines = { _x == _magazine } count (_vehicle magazinesTurret _turretPath); if ((_currentMagazines < ([_vehicle, _turretPath, _magazine] call FUNC(getMaxMagazines))) && !(_magazine in _magazineHelper)) then { _action = [_magazine, @@ -43,9 +42,11 @@ _vehicleActions = []; {true}, {}, [_magazine, _vehicle]] call EFUNC(interact_menu,createAction); - _actions pushBack [_action, [], _target]; - _magazineHelper pushBack _magazine; - _needToAdd = true; + if (GVAR(supply) == 0 || {(GVAR(supply) == 1) && ([_target, _magazine] call FUNC(hasEnoughSupply))} || {(GVAR(supply) == 2) && ([_target, _magazine] call FUNC(magazineInSupply))}) then { + _actions pushBack [_action, [], _target]; + _magazineHelper pushBack _magazine; + _needToAdd = true; + }; } else { if (((_vehicle magazineTurretAmmo [_magazine, _turretPath]) < getNumber (configFile >> "CfgMagazines" >> _magazine >> "count")) && !(_magazine in _magazineHelper)) then { _action = [_magazine, @@ -55,16 +56,18 @@ _vehicleActions = []; {true}, {}, [_magazine, _vehicle]] call EFUNC(interact_menu,createAction); - _actions pushBack [_action, [], _target]; - _magazineHelper pushBack _magazine; - _needToAdd = true; + if (GVAR(supply) == 0 || {(GVAR(supply) == 1) && ([_target, _magazine] call FUNC(hasEnoughSupply))} || {(GVAR(supply) == 2) && ([_target, _magazine] call FUNC(magazineInSupply))}) then { + _actions pushBack [_action, [], _target]; + _magazineHelper pushBack _magazine; + _needToAdd = true; + }; }; }; } forEach _magazines; } forEach REARM_TURRET_PATHS; }; if (_needToAdd && !(_vehicle getVariable [QGVAR(disabled), false])) then { - _icon = getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "Icon"); + private _icon = getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "Icon"); if !((_icon select [0, 1]) == "\") then { _icon = ""; }; diff --git a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf new file mode 100644 index 0000000000..17ec5494d1 --- /dev/null +++ b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf @@ -0,0 +1,42 @@ +/* + * Author: GitHawk + * Adds all magazines of a vehicle to the supply. + * + * Argument: + * 0: Ammo Truck + * 1: Vehicle + * or + * 0: Ammo Truck + * 1: Vehicle class + * + * Return value: + * None + * + * Example: + * [ammo_truck, tank] call ace_rearm_fnc_addVehicleMagazinesToSupply + * [ammo_truck, "B_MBT_01_arty_F"] call ace_rearm_fnc_addVehicleMagazinesToSupply + * + * Public: Yes + */ +#include "script_component.hpp" + +params [["_ammoTruck", objNull, [objNull]], ["_vehicle", objNull, [objNull, ""]]]; + +if (isNull _ammoTruck || + {typeName _vehicle == "OBJECT" && {isNull _vehicle}}) exitWith {}; + +private _string = ""; +if (typeName _vehicle == "OBJECT") then { + _string = typeOf _vehicle; +}; +if (typeName _vehicle == "STRING") then { + _string = _vehicle; +}; +if (_string == "") exitWith {[]}; +{ + private _turretPath = _x; + private _magazines = [_string, _turretPath] call FUNC(getConfigMagazines); + { + [_ammoTruck, _x] call FUNC(addMagazineToSupply); + } forEach _magazines; +} forEach REARM_TURRET_PATHS; diff --git a/addons/rearm/functions/fnc_canReadSupplyCounter.sqf b/addons/rearm/functions/fnc_canReadSupplyCounter.sqf new file mode 100644 index 0000000000..f6991c1c27 --- /dev/null +++ b/addons/rearm/functions/fnc_canReadSupplyCounter.sqf @@ -0,0 +1,26 @@ +/* + * Author: GitHawk + * Checks if unit can read supply counter. + * + * Arguments: + * 0: Ammo Truck + * 1: Unit + * + * Return Value: + * Can read supply counter + * + * Example: + * [truck, player] call ace_rearm_fnc_canReadSupplyCounter + * + * Public: No + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; + +!(isNull _unit || + {!(_unit isKindOf "CAManBase")} || + {!local _unit} || + {!alive _target} || + {(_target distance _unit) > REARM_ACTION_DISTANCE} || + {GVAR(supply) == 0}) diff --git a/addons/rearm/functions/fnc_canRearmVehicle.sqf b/addons/rearm/functions/fnc_canRearmVehicle.sqf new file mode 100644 index 0000000000..29de8b2a2c --- /dev/null +++ b/addons/rearm/functions/fnc_canRearmVehicle.sqf @@ -0,0 +1,26 @@ +/* + * Author: GitHawk + * Check if a unit can rearm a vehicle. + * + * Arguments: + * 0: Target + * 1: Unit + * + * Return Value: + * Can Pick Up Ammo + * + * Example: + * [player, tank] call ace_rearm_fnc_canRearmVehicle + * + * Public: No + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; + +!(isNull _unit || + {!(_unit isKindOf "CAManBase")} || + {!local _unit} || + {(_target distance _unit) > REARM_ACTION_DISTANCE} || + {!isNull (_unit getVariable [QGVAR(dummy), objNull])} || + {GVAR(level) > 0}) diff --git a/addons/rearm/functions/fnc_canTakeAmmo.sqf b/addons/rearm/functions/fnc_canTakeAmmo.sqf index 496e7a12a4..2bb4676c4f 100644 --- a/addons/rearm/functions/fnc_canTakeAmmo.sqf +++ b/addons/rearm/functions/fnc_canTakeAmmo.sqf @@ -22,4 +22,5 @@ params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; {!(_unit isKindOf "CAManBase")} || {!local _unit} || {(_target distance _unit) > REARM_ACTION_DISTANCE} || - {!isNull (_unit getVariable [QGVAR(dummy), objNull])}) + {!isNull (_unit getVariable [QGVAR(dummy), objNull])} || + {GVAR(level) == 0}) diff --git a/addons/rearm/functions/fnc_createDummy.sqf b/addons/rearm/functions/fnc_createDummy.sqf index 38955fb806..d2fbdec4c0 100644 --- a/addons/rearm/functions/fnc_createDummy.sqf +++ b/addons/rearm/functions/fnc_createDummy.sqf @@ -16,12 +16,11 @@ */ #include "script_component.hpp" -private ["_ammo", "_dummyName", "_dummy"]; params [["_unit", objNull, [objNull]], ["_magazineClass", "", [""]]]; -_ammo = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); -_dummyName = getText (configFile >> "CfgAmmo" >> _ammo >> QGVAR(dummy)); -_dummy = objNull; +private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); +private _dummyName = getText (configFile >> "CfgAmmo" >> _ammo >> QGVAR(dummy)); +private _dummy = objNull; if !(_dummyName == "") then { _dummy = _dummyName createVehicle (position _unit); } else { diff --git a/addons/rearm/functions/fnc_dropAmmo.sqf b/addons/rearm/functions/fnc_dropAmmo.sqf index 48433c2f4a..1634a76c00 100644 --- a/addons/rearm/functions/fnc_dropAmmo.sqf +++ b/addons/rearm/functions/fnc_dropAmmo.sqf @@ -17,10 +17,9 @@ */ #include "script_component.hpp" -private ["_dummy", "_actionID"]; params [["_unit", objNull, [objNull]], ["_delete", false, [false]], ["_unholster", true, [true]]]; -_dummy = _unit getVariable [QGVAR(dummy), objNull]; +private _dummy = _unit getVariable [QGVAR(dummy), objNull]; if !(isNull _dummy) then { detach _dummy; if (_delete) then { @@ -29,9 +28,8 @@ if !(isNull _dummy) then { _dummy setVelocity [0,0,-0.1]; }; _unit setVariable [QGVAR(dummy), objNull]; - //_unit setVariable [QEGVAR(dragging,isCarrying), false, true]; // breaks things, since it hides interact menu on _target }; -_actionID = _unit getVariable [QGVAR(ReleaseActionID), -1]; +private _actionID = _unit getVariable [QGVAR(ReleaseActionID), -1]; if (_actionID != -1) then { _unit removeAction _actionID; _unit setVariable [QGVAR(ReleaseActionID), nil]; diff --git a/addons/rearm/functions/fnc_getCaliber.sqf b/addons/rearm/functions/fnc_getCaliber.sqf new file mode 100644 index 0000000000..fad222a571 --- /dev/null +++ b/addons/rearm/functions/fnc_getCaliber.sqf @@ -0,0 +1,48 @@ +/* + * Author: GitHawk + * Check whether enough supply is left to take the magazine. + * + * Argument: + * 0: Magazine Classname + * + * Return value: + * 0: Caliber information + * 0: Rounded caliber + * 1: Caliber index + * + * Example: + * ["500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_hasEnoughSupply + * + * Public: No + */ +#include "script_component.hpp" + +params [["_magazineClass", "", [""]]]; + +if (_magazineClass isEqualTo "") exitWith {[8, 2]}; + +private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); +private _tmpCal = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ace_caliber"); +private _cal = 8; +if (_tmpCal > 0) then { + _cal = _tmpCal; +} else { + _tmpCal = getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(caliber)); + if (_tmpCal > 0) then { + _cal = _tmpCal; + } else { + diag_log format ["[ACE] ERROR: Undefined Ammo [%1 : %2]", _ammo, inheritsFrom (configFile >> "CfgAmmo" >> _ammo)]; + if (_ammo isKindOf "BulletBase") then { + _cal = 8; + } else { + _cal = 100; + }; + }; +}; +_cal = round _cal; +private _idx = REARM_CALIBERS find _cal; +if (_idx == -1 ) then { + _idx = 2; +}; + +[_cal, _idx] diff --git a/addons/rearm/functions/fnc_getConfigMagazines.sqf b/addons/rearm/functions/fnc_getConfigMagazines.sqf index dce6c5da64..6fb9dcebfe 100644 --- a/addons/rearm/functions/fnc_getConfigMagazines.sqf +++ b/addons/rearm/functions/fnc_getConfigMagazines.sqf @@ -3,30 +3,32 @@ * Returns all magazines a turret can hold according to config. * * Arguments: - * 0: Target + * 0: Vehicle class * 1: Turret Path * * Return Value: * Magazine classes in TurretPath * * Example: - * [vehicle, [0]] call ace_rearm_fnc_getConfigMagazines + * ["B_MBT_01_arty_F", [0]] call ace_rearm_fnc_getVehicleMagazines * * Public: No */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_turretPath", [], [[]]]]; +params [["_cfgString", "", [""]], ["_turretPath", [], [[]]]]; -if (isNull _target) exitWith {[]}; +if (_cfgString == "") exitWith {[]}; -_cfg = configFile >> "CfgVehicles" >> (typeOf _target) >> "Turrets"; +private _cfg = configFile >> "CfgVehicles" >> _cfgString >> "Turrets"; + +if !(isClass _cfg) exitWith {[]}; if (count _turretPath == 1) then { _turretPath params ["_subPath"]; if (_subPath == -1) exitWith { - _cfg = configFile >> "CfgVehicles" >> (typeOf _target); + _cfg = configFile >> "CfgVehicles" >> _cfgString; }; if (count _cfg > _subPath) then { diff --git a/addons/rearm/functions/fnc_getMaxMagazines.sqf b/addons/rearm/functions/fnc_getMaxMagazines.sqf index b6211333f0..729f9e405a 100644 --- a/addons/rearm/functions/fnc_getMaxMagazines.sqf +++ b/addons/rearm/functions/fnc_getMaxMagazines.sqf @@ -17,10 +17,9 @@ */ #include "script_component.hpp" -private ["_count", "_cfg"]; params [["_target", objNull, [objNull]], ["_turretPath", [], [[]]], ["_magazineClass", "", [""]]]; if (isNull _target) exitWith {0}; -_count = {_x == _magazineClass} count ([_target, _turretPath] call FUNC(getConfigMagazines)); +private _count = {_x == _magazineClass} count ([_target, _turretPath] call FUNC(getVehicleMagazines)); _count diff --git a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf index f56b437708..ee4c3d4876 100644 --- a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf +++ b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf @@ -19,15 +19,14 @@ */ #include "script_component.hpp" -private ["_return", "_magazines", "_currentMagazines"]; params ["_target", "_magazineClass"]; -_return = [false, [], 0]; +private _return = [false, [], 0]; { - _magazines = [_target, _x] call FUNC(getConfigMagazines); + private _magazines = [_target, _x] call FUNC(getVehicleMagazines); if (_magazineClass in _magazines) then { - _currentMagazines = {_x == _magazineClass} count (_target magazinesTurret _x); + private _currentMagazines = {_x == _magazineClass} count (_target magazinesTurret _x); if ((_target magazineTurretAmmo [_magazineClass, _x]) < getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count")) exitWith { _return = [true, _x, _currentMagazines]; diff --git a/addons/rearm/functions/fnc_getSupplyCount.sqf b/addons/rearm/functions/fnc_getSupplyCount.sqf new file mode 100644 index 0000000000..e2f881380e --- /dev/null +++ b/addons/rearm/functions/fnc_getSupplyCount.sqf @@ -0,0 +1,27 @@ +/* + * Author: GitHawk + * Get the supply count. + * + * Argument: + * 0: Target + * + * Return value: + * Supply count + * + * Example: + * [ammo_truck] call ace_rearm_fnc_getSupplyCount + * + * Public: Yes + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]]]; + +private _supply = _target getVariable QGVAR(currentSupply); + +if (isNil "_supply") then { + _supply = getNumber (configFile >> "CfgVehicles" >> typeOf _target >> QGVAR(defaultSupply)); + _target setVariable [QGVAR(currentSupply), _supply, true]; +}; + +_supply diff --git a/addons/rearm/functions/fnc_getVehicleMagazines.sqf b/addons/rearm/functions/fnc_getVehicleMagazines.sqf new file mode 100644 index 0000000000..abc0a761a7 --- /dev/null +++ b/addons/rearm/functions/fnc_getVehicleMagazines.sqf @@ -0,0 +1,23 @@ +/* + * Author: GitHawk, Jonpas + * Returns all magazines a turret can hold according to config. + * + * Arguments: + * 0: Target + * 1: Turret Path + * + * Return Value: + * Magazine classes in TurretPath + * + * Example: + * [vehicle, [0]] call ace_rearm_fnc_getVehicleMagazines + * + * Public: No + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]], ["_turretPath", [], [[]]]]; + +if (isNull _target) exitWith {[]}; + +([typeOf _target, _turretPath] call FUNC(getConfigMagazines)) diff --git a/addons/rearm/functions/fnc_hasEnoughSupply.sqf b/addons/rearm/functions/fnc_hasEnoughSupply.sqf new file mode 100644 index 0000000000..8caf0f3f45 --- /dev/null +++ b/addons/rearm/functions/fnc_hasEnoughSupply.sqf @@ -0,0 +1,39 @@ +/* + * Author: GitHawk + * Check whether enough supply is left to take the magazine. + * + * Argument: + * 0: Target + * 1: Magazine Classname + * + * Return value: + * Enough supply + * + * Example: + * [ammo_truck, "500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_hasEnoughSupply + * + * Public: No + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]], ["_magazineClass", "", [""]]]; + +if (isNull _target || + {_magazineClass isEqualTo ""}) exitWith {false}; + +// With infinite supply, there is always enough +if (GVAR(supply) == 0) exitWith {true}; +// With magazine specific supply, we need to check stored magazines +if (GVAR(supply) == 2) exitWith {_this call FUNC(magazineInSupply)}; + +private _supply = [_target] call FUNC(getSupplyCount); +([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; + +// With caliber based rearming, we only need partial supply +if (GVAR(level) == 2) exitWith { + // If REARM_COUNT is bigger than the magazine size, we might get a bigger number than 1 + private _magazinePart = ((REARM_COUNT select _idx) / (getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"))) min 1; + (_cal * _magazinePart <= _supply) +}; + +(_cal <= _supply) diff --git a/addons/rearm/functions/fnc_magazineInSupply.sqf b/addons/rearm/functions/fnc_magazineInSupply.sqf new file mode 100644 index 0000000000..a11ab8c25e --- /dev/null +++ b/addons/rearm/functions/fnc_magazineInSupply.sqf @@ -0,0 +1,39 @@ +/* + * Author: GitHawk + * Returns true if the magazine is in the current supply + * + * Argument: + * 0: Target + * 1: Magazine Classname + * + * Return value: + * Magazine in supply + * + * Example: + * [ammo_truck, "500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_magazineInSupply + * + * Public: No + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]], ["_magazineClass", "", [""]]]; + +if (isNull _target || + {_magazineClass isEqualTo ""}) exitWith {false}; + +// With limited supply, we need to check supply +if (GVAR(supply) == 1) exitWith {_this call FUNC(hasEnoughSupply)}; +// With magazine specific supply, we need to check them +if (GVAR(supply) == 2) exitWith { + private _magazineSupply = _target getVariable [QGVAR(magazineSupply), []]; + private _magazinePresent = false; + { + _x params ["_magazine", "_rounds"]; + if ((_magazine isEqualTo _magazineClass) && (_rounds > 0)) exitWith {_magazinePresent = true; }; + false + } count _magazineSupply; + _magazinePresent +}; + +// With infinite supply, the is always one left +true diff --git a/addons/rearm/functions/fnc_pickUpAmmo.sqf b/addons/rearm/functions/fnc_pickUpAmmo.sqf index 546fc318b7..ac1ab0a00a 100644 --- a/addons/rearm/functions/fnc_pickUpAmmo.sqf +++ b/addons/rearm/functions/fnc_pickUpAmmo.sqf @@ -16,16 +16,13 @@ */ #include "script_component.hpp" -private ["_magazineClass"]; params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; -_dummy = _unit getVariable [QGVAR(dummy), objNull]; +private _dummy = _unit getVariable [QGVAR(dummy), objNull]; if !(isNull _dummy) exitWith {}; -//_target attachTo [_unit, [0,0.7,0], "pelvis"]; _target attachTo [_unit, [0,1,0], "pelvis"]; { [[_target, [[-1,0,0],[0,0,1]]], QFUNC(makeDummy), _x] call EFUNC(common,execRemoteFnc); } count (position _unit nearObjects ["CAManBase", 100]); _unit setVariable [QGVAR(dummy), _target]; -//_unit setVariable [QEGVAR(dragging,isCarrying), true, true]; // breaks things, since it hides interact menu on _target diff --git a/addons/rearm/functions/fnc_readSupplyCounter.sqf b/addons/rearm/functions/fnc_readSupplyCounter.sqf new file mode 100644 index 0000000000..4c96e926c6 --- /dev/null +++ b/addons/rearm/functions/fnc_readSupplyCounter.sqf @@ -0,0 +1,75 @@ +/* + * Author: GitHawk + * Get the remaining fuel amount + * + * Arguments: + * 0: Ammo Truck + * 1: Unit + * + * Return Value: + * None + * + * Example: + * [ammo_truck, player] call ace_rearm_fnc_readSupplyCounter + * + * Public: No + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; + +if (GVAR(supply) == 0) exitWith {}; + +if (GVAR(supply) == 1) then { + [ + 5, + [_unit, _target, [_target] call FUNC(getSupplyCount)], + { + params ["_args"]; + _args params [["_unit", objNull, [objNull]], ["_target", objNull, [objNull]], ["_supplyCount", 0, [0]]]; + if (_supplyCount > 0 ) then { + ["displayTextStructured", [_unit], [[LSTRING(Hint_RemainingSupplyPoints), _supplyCount], 2, _unit]] call EFUNC(common,targetEvent); + } else { + ["displayTextStructured", [_unit], [LSTRING(Hint_EmptySupplyPoints), 2, _unit]] call EFUNC(common,targetEvent); + }; + true + }, + {true}, + localize LSTRING(ReadSupplyCounterAction), + {true}, + ["isnotinside"] + ] call EFUNC(common,progressBar); +} else { + [ + 5, + [_unit, _target], + { + params ["_args"]; + _args params [["_unit", objNull, [objNull]], ["_target", objNull, [objNull]]]; + private _supply = 1.5; + private _numChars = count (localize LSTRING(Hint_RemainingAmmo)); + private _text = ""; + private _magazines = _target getVariable QGVAR(magazineSupply); + if !(isNil "_magazines") then { + { + _x params ["_magazineClass", "_rounds"]; + private _line = format ["%1: %2", getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), _rounds]; + _numChars = _numChars max (count _line); + _text = format ["%1
%2", _text, _line]; + _supply = _supply + 0.5; + } forEach _magazines; + diag_log _text; + }; + if (_supply > 1.5) then { + ["displayTextStructured", [_unit], [[LSTRING(Hint_RemainingAmmo), _text], _supply, _unit, (_numChars/2.9)]] call EFUNC(common,targetEvent); + } else { + ["displayTextStructured", [_unit], [LSTRING(Hint_Empty), 2, _unit]] call EFUNC(common,targetEvent); + }; + true + }, + {true}, + localize LSTRING(ReadSupplyCounterAction), + {true}, + ["isnotinside"] + ] call EFUNC(common,progressBar); +}; diff --git a/addons/rearm/functions/fnc_rearm.sqf b/addons/rearm/functions/fnc_rearm.sqf index 61009b085d..7ea08596e5 100644 --- a/addons/rearm/functions/fnc_rearm.sqf +++ b/addons/rearm/functions/fnc_rearm.sqf @@ -15,40 +15,17 @@ */ #include "script_component.hpp" -private ["_magazineClass", "_ammo", "_tmpCal", "_cal", "_idx", "_needRearmMags", "_magazineDisplayName"]; params [["_unit", objNull, [objNull]]]; -_dummy = _unit getVariable [QGVAR(dummy), objNull]; +private _dummy = _unit getVariable [QGVAR(dummy), objNull]; if (isNull _dummy) exitwith {false}; -_magazineClass = _dummy getVariable QGVAR(magazineClass); +private _magazineClass = _dummy getVariable QGVAR(magazineClass); if (isNil "_magazineClass") exitWith {false}; -_ammo = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); -_tmpCal = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ace_caliber"); -_cal = 8; -if (_tmpCal > 0) then { - _cal = _tmpCal; -} else { - _tmpCal = getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(caliber)); - if (_tmpCal > 0) then { - _cal = _tmpCal; - } else { - diag_log format ["[ACE] ERROR: Undefined Ammo [%1 : %2]", _ammo, inheritsFrom (configFile >> "CfgAmmo" >> _ammo)]; - if (_ammo isKindOf "BulletBase") then { - _cal = 8; - } else { - _cal = 100; - }; - }; -}; -_cal = round _cal; -_idx = REARM_CALIBERS find _cal; -if (_idx == -1) then { - _idx = 2; -}; +([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; // Get magazines that can be rearmed -_needRearmMags = [_target, _magazineClass] call FUNC(getNeedRearmMagazines); +private _needRearmMags = [_target, _magazineClass] call FUNC(getNeedRearmMagazines); _needRearmMags params ["_needRearm", "_turretPath", "_cnt"]; // Exit if no magazines need rearming @@ -56,9 +33,7 @@ if (!_needRearm) exitWith { diag_log format ["[ACE] ERROR: Could not find turret for %1 in %2", _magazineClass, typeOf _target]; }; -//hint format ["Magazine: %1\nAmmo: %2\nCaliber: %3\nIndex: %4\nTurretPath: %5\nREARM_DURATION_REARM: %6\nCount: %7", _magazine, _ammo, _cal, _idx, _turretPath, (REARM_DURATION_REARM select _idx), (REARM_COUNT select _idx)]; - -_magazineDisplayName = getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"); +private _magazineDisplayName = getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"); if (_magazineDisplayName == "") then { _magazineDisplayName = _magazineClass; diag_log format ["[ACE] ERROR: Magazine is missing display name [%1]", _magazineClass]; diff --git a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf index 27fd20c528..4c8076f5f8 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf @@ -16,11 +16,12 @@ * Public: No */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_vehicle", objNull, [objNull]]]; // _target is for future possible finite ammo, _unit placeholder + +params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_vehicle", objNull, [objNull]]]; [ 10, - _vehicle, + [_target, _vehicle], FUNC(rearmEntireVehicleSuccess), "", format [localize LSTRING(BasicRearmAction), getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf index c12286516c..1e1e58c86a 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf @@ -3,28 +3,30 @@ * Rearm an entire vehicle. * * Arguments: - * 0: Vehicle + * 0: Rearm information + * 0: Target + * 1: Vehicle - * 1: TurretPath + * 0: Target + * 1: Vehicle + * 2: TurretPath * * Return Value: * None * * Example: - * [tank, [0]] call ace_rearm_fnc_rearmEntireVehicleSuccessLocal + * [ammo_truck, tank, [0]] call ace_rearm_fnc_rearmEntireVehicleSuccessLocal * * Public: No */ #include "script_component.hpp" -private ["_magazines", "_magazine", "_currentMagazines", "_maxMagazines", "_maxRounds", "_currentRounds"]; -params [["_vehicle", objNull, [objNull]], ["_turretPath", [], [[]]]]; +params [["_target", objNull, [objNull]], ["_vehicle", objNull, [objNull]], ["_turretPath", [], [[]]]]; -_magazines = [_vehicle, _turretPath] call FUNC(getConfigMagazines); +private _magazines = [_vehicle, _turretPath] call FUNC(getVehicleMagazines); +if (isNil "_magazines") exitWith {}; { - _magazine = _x; - _currentMagazines = { _x == _magazine } count (_vehicle magazinesTurret _turretPath); - _maxMagazines = [_vehicle, _turretPath, _magazine] call FUNC(getMaxMagazines); - _maxRounds = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count"); - _currentRounds = _vehicle magazineTurretAmmo [_magazine, _turretPath]; + private _magazine = _x; + private _currentMagazines = { _x == _magazine } count (_vehicle magazinesTurret _turretPath); + private _maxMagazines = [_vehicle, _turretPath, _magazine] call FUNC(getMaxMagazines); + private _maxRounds = getNumber (configFile >> "CfgMagazines" >> _magazine >> "count"); + private _currentRounds = _vehicle magazineTurretAmmo [_magazine, _turretPath]; TRACE_7("Rearmed Turret",_vehicle,_turretPath,_currentMagazines,_maxMagazines,_currentRounds,_maxRounds,_magazine); @@ -34,11 +35,27 @@ _magazines = [_vehicle, _turretPath] call FUNC(getConfigMagazines); _currentMagazines = _currentMagazines + 1; }; if (_currentMagazines < _maxMagazines) then { - _vehicle setMagazineTurretAmmo [_magazine, _maxRounds, _turretPath]; - for "_idx" from 1 to (_maxMagazines - _currentMagazines) do { - _vehicle addMagazineTurret [_magazine, _turretPath]; + private _success = true; + if (GVAR(supply) > 0) then { + _success = [_target, _magazine, (_maxRounds - _currentRounds)] call FUNC(removeMagazineFromSupply); + }; + if (_success) then { + _vehicle setMagazineTurretAmmo [_magazine, _maxRounds, _turretPath]; + for "_idx" from 1 to (_maxMagazines - _currentMagazines) do { + _success = true; + if (GVAR(supply) > 0) then { + _success = [_target, _magazine, _maxRounds] call FUNC(removeMagazineFromSupply); + }; + _vehicle addMagazineTurret [_magazine, _turretPath]; + }; }; } else { - _vehicle setMagazineTurretAmmo [_magazine, _maxRounds, _turretPath]; + private _success = true; + if (GVAR(supply) > 0) then { + _success = [_target, _magazine, (_maxRounds - _currentRounds)] call FUNC(removeMagazineFromSupply); + }; + if (_success) then { + _vehicle setMagazineTurretAmmo [_magazine, _maxRounds, _turretPath]; + }; }; } foreach _magazines; diff --git a/addons/rearm/functions/fnc_rearmSuccess.sqf b/addons/rearm/functions/fnc_rearmSuccess.sqf index 81cda9f262..79341a99e5 100644 --- a/addons/rearm/functions/fnc_rearmSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmSuccess.sqf @@ -21,7 +21,6 @@ */ #include "script_component.hpp" -private ["_dummy", "_weaponSelect", "_turretOwnerID"]; params [["_args", [objNull, objNull, [], 0, "", 0], [[]], [6]]]; _args params ["_target", "_unit", "_turretPath", "_numMagazines", "_magazineClass", "_numRounds"]; @@ -32,7 +31,7 @@ if (local _unit) then { }; if (isServer) then { - _turretOwnerID = _target turretOwner _turretPath; + private _turretOwnerID = _target turretOwner _turretPath; if (_turretOwnerID == 0) then { [_this, QFUNC(rearmSuccessLocal), _target] call EFUNC(common,execRemoteFnc); } else { diff --git a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf index 1789767cfd..22923d5452 100644 --- a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf @@ -21,21 +21,19 @@ */ #include "script_component.hpp" -private ["_rounds", "_currentRounds", "_maxMagazines", "_currentMagazines", "_dummy", "_weaponSelect"]; params [["_args", [objNull, objNull, [], 0, "", 0], [[]], [6]]]; _args params ["_target", "_unit", "_turretPath", "_numMagazines", "_magazineClass", "_numRounds"]; -//hint format ["Target: %1\nTurretPath: %2\nNumMagazines: %3\nMagazine: %4\nNumRounds: %5\nUnit: %6", _target, _turretPath, _numMagazines, _magazineClass, _numRounds, _unit]; +private _rounds = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"); +private _currentRounds = 0; +private _maxMagazines = [_target, _turretPath, _magazineClass] call FUNC(getMaxMagazines); -_rounds = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"); -_currentRounds = 0; - -_maxMagazines = [_target, _turretPath, _magazineClass] call FUNC(getMaxMagazines); if (_maxMagazines == 1) then { - _currentMagazines = { _x == _magazineClass } count (_target magazinesTurret _turretPath); + private _currentMagazines = { _x == _magazineClass } count (_target magazinesTurret _turretPath); if (_currentMagazines == 0 && {!(_turretPath isEqualTo [-1])}) then { // Driver gun will always retain it's magazines _target addMagazineTurret [_magazineClass, _turretPath]; + _target setMagazineTurretAmmo [_magazineClass, 0, _turretPath]; }; if (GVAR(level) == 1) then { // Fill magazine completely diff --git a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf new file mode 100644 index 0000000000..5c59221f7a --- /dev/null +++ b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf @@ -0,0 +1,86 @@ +/* + * Author: GitHawk + * Removes a magazine from the supply. + * + * Argument: + * 0: Target + * 1: Magazine Classname + * 2: Number of Rounds to withdraw + * + * Return value: + * Magazine was removed + * + * Example: + * [ammo_truck, "500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_removeMagazineFromSupply + * + * Public: Yes + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]], ["_magazineClass", "", [""]], ["_numRounds", -1, [0]]]; + +if (isNull _target || + {_magazineClass isEqualTo ""}) exitWith {false}; + +private _return = false; +([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; + +if (GVAR(supply) == 1) then { + private _supply = [_target] call FUNC(getSupplyCount); + if (GVAR(level) == 2) then { + // Remove partial magazine supply count + private _rearmAmount = (REARM_COUNT select _idx); + if (_numRounds > 0) then { + _rearmAmount = _numRounds; + }; + private _magazinePart = (_rearmAmount / (getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"))) min 1; + if (_supply >= (_cal * _magazinePart)) then { + [_target, (_supply - (_cal * _magazinePart))] call FUNC(setSupplyCount); + _return = true; + }; + } else { + // Remove entire magazine supply count + if (_supply >= _cal) then { + [_target, (_supply - _cal)] call FUNC(setSupplyCount); + _return = true; + }; + }; +}; +if (GVAR(supply) == 2) then { + private _magazineSupply = _target getVariable [QGVAR(magazineSupply), []]; + private _magazineIdx = -1; + { + _x params ["_magazine"]; + if ((_magazine isEqualTo _magazineClass)) exitWith { + _magazineIdx = _forEachIndex; + }; + } forEach _magazineSupply; + if (_magazineIdx == -1) exitWith {false}; + + (_magazineSupply select _magazineIdx) params ["", "_rounds"]; + + private _configRounds = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"); + if (GVAR(level) == 2) then { + // With caliber based rearming, we need to remove the correct amount + private _rearmAmount = (REARM_COUNT select _idx); + if (_numRounds > 0) then { + if (_numRounds > _rearmAmount) then { + _rearmAmount = ceil (_numRounds / _rearmAmount); + }; + }; + private _roundsPerTransaction = _rearmAmount min _configRounds; + if (_rounds >= _roundsPerTransaction) then { + _magazineSupply set [_magazineIdx, [_magazineClass, (_rounds - _roundsPerTransaction)]]; + _target setVariable [QGVAR(magazineSupply), _magazineSupply, true]; + _return = true; + }; + } else { + // Remove entire magazine + if (_rounds >= _configRounds) then { + _magazineSupply set [_magazineIdx, [_magazineClass, (_rounds - _configRounds)]]; + _target setVariable [QGVAR(magazineSupply), _magazineSupply, true]; + _return = true; + }; + }; +}; +_return diff --git a/addons/rearm/functions/fnc_setSupplyCount.sqf b/addons/rearm/functions/fnc_setSupplyCount.sqf new file mode 100644 index 0000000000..846ec98ea2 --- /dev/null +++ b/addons/rearm/functions/fnc_setSupplyCount.sqf @@ -0,0 +1,23 @@ +/* + * Author: GitHawk + * Sets the supply count. + * + * Argument: + * 0: Target + * 1: Supply Count + * + * Return value: + * None + * + * Example: + * [ammo_truck, 1000] call ace_rearm_fnc_setSupplyCount + * + * Public: Yes + */ +#include "script_component.hpp" + +params [["_target", objNull, [objNull]], ["_supply", 0, [0]]]; + +if (isNull _target) exitWith {}; + +_target setVariable [QGVAR(currentSupply), (_supply max 0), true]; diff --git a/addons/rearm/functions/fnc_storeAmmo.sqf b/addons/rearm/functions/fnc_storeAmmo.sqf index 262affb1ef..7026c9429a 100644 --- a/addons/rearm/functions/fnc_storeAmmo.sqf +++ b/addons/rearm/functions/fnc_storeAmmo.sqf @@ -16,16 +16,20 @@ */ #include "script_component.hpp" -private "_dummy"; params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; -_dummy = _unit getVariable [QGVAR(dummy), objNull]; +private _dummy = _unit getVariable [QGVAR(dummy), objNull]; if (isNull _dummy) exitwith {}; [ 5, - _unit, - {params ["_unit"]; [_unit, true, true] call FUNC(dropAmmo)}, + [_unit, _target, _dummy], + { + params ["_args"]; + _args params ["_unit", "_target", "_dummy"]; + [_target, (_dummy getVariable [QGVAR(magazineClass), ""]), true] call FUNC(addMagazineToSupply); + [_unit, true, true] call FUNC(dropAmmo); + }, "", format [localize LSTRING(StoreAmmoAction), getText(configFile >> "CfgMagazines" >> (_dummy getVariable QGVAR(magazineClass)) >> "displayName"), getText(configFile >> "CfgVehicles" >> (typeOf _target) >> "displayName")], {true}, diff --git a/addons/rearm/functions/fnc_takeAmmo.sqf b/addons/rearm/functions/fnc_takeAmmo.sqf index d2de1e1b59..776d88fc66 100644 --- a/addons/rearm/functions/fnc_takeAmmo.sqf +++ b/addons/rearm/functions/fnc_takeAmmo.sqf @@ -19,34 +19,10 @@ */ #include "script_component.hpp" -private ["_ammo", "_tmpCal", "_cal", "_idx"]; - params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_args", ["", objNull], [[]]]]; _args params ["_magazineClass", "_vehicle"]; -_ammo = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); -_tmpCal = getNumber (configFile >> "CfgAmmo" >> _ammo >> "ace_caliber"); -_cal = 8; -if (_tmpCal > 0) then { - _cal = _tmpCal; -} else { - _tmpCal = getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(caliber)); - if (_tmpCal > 0) then { - _cal = _tmpCal; - } else { - diag_log format ["[ACE] ERROR: Undefined Ammo [%1 : %2]", _ammo, inheritsFrom (configFile >> "CfgAmmo" >> _ammo)]; - if (_ammo isKindOf "BulletBase") then { - _cal = 8; - } else { - _cal = 100; - }; - }; -}; -_cal = round _cal; -_idx = REARM_CALIBERS find _cal; -if (_idx == -1 ) then { - _idx = 2; -}; +([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; REARM_HOLSTER_WEAPON diff --git a/addons/rearm/functions/fnc_takeSuccess.sqf b/addons/rearm/functions/fnc_takeSuccess.sqf index 6d5966c9f9..b83f82aa2a 100644 --- a/addons/rearm/functions/fnc_takeSuccess.sqf +++ b/addons/rearm/functions/fnc_takeSuccess.sqf @@ -18,15 +18,20 @@ */ #include "script_component.hpp" -private ["_ammo", "_dummyName", "_dummy", "_actionID"]; -params [["_args", [objNull, "", objNull], [[]]]]; -_args params ["_unit", "_magazineClass", "_target"]; // _target is for future possible finite ammo +params [["_args", [objNull, "", objNull], [[]], 3]]; +_args params ["_unit", "_magazineClass", "_target"]; + +private _success = true; +if (GVAR(supply) > 0) then { + _success = [_target, _magazineClass] call FUNC(removeMagazineFromSupply); +}; +if !(_success) exitWith {}; [_unit, "forceWalk", QGVAR(vehRearm), true] call EFUNC(common,statusEffect_set); -_dummy = [_unit, _magazineClass] call FUNC(createDummy); +private _dummy = [_unit, _magazineClass] call FUNC(createDummy); [_dummy, _unit] call FUNC(pickUpAmmo); -_actionID = _unit addAction [ +private _actionID = _unit addAction [ format ["%1", localize ELSTRING(dragging,Drop)], '(_this select 0) call FUNC(dropAmmo)', nil, diff --git a/addons/rearm/stringtable.xml b/addons/rearm/stringtable.xml index 0b4fe1c90f..97ae997dd9 100644 --- a/addons/rearm/stringtable.xml +++ b/addons/rearm/stringtable.xml @@ -83,10 +83,34 @@ Unlimited ammo supply Unbegrenzter Munitionsvorat + + Limited ammo supply based on caliber + Begrenzter, kaliberabhängiger Munitionsvorat + Only specific Magazines Nur bestimmte Magazine + + Check remaining ammunition + Verbleibende Munition prüfen + + + Checking remaining ammunition... + Überprüfe verbleibende Munition... + + + There is ammunition worth %1 points left. + Es ist noch Munition für %1 Punkte übrig. + + + The following ammunition is left:%1 + Folgende Munition ist übrig:%1 + + + There is no ammunition left. + Es ist keine Munition übrig. + Rearm Aufmunitionieren From 8b87f1b43a1535d9737838e3cf344df2edc9018a Mon Sep 17 00:00:00 2001 From: Githawk Date: Sat, 27 Feb 2016 20:37:47 +0100 Subject: [PATCH 003/826] Custom width displayTextStructured Adding width as optional fourth parameter --- addons/common/functions/fnc_displayTextStructured.sqf | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 9fff7bb056..0271f8f3ff 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -1,11 +1,12 @@ /* - * Author: commy2, Glowbal + * Author: commy2, Glowbal, GitHawk * Display a structured text. * * Arguments: * 0: Text * 1: Size of the textbox (default: 1.5) * 2: Target Unit. Will only display if target is the player controlled object (default: ACE_player) + * 3: Custom Width * * Return Value: * None @@ -14,7 +15,7 @@ */ #include "script_component.hpp" -params ["_text", ["_size", 1.5], ["_target", ACE_player]]; +params ["_text", ["_size", 1.5], ["_target", ACE_player], ["_width", 10]]; if (_target != ACE_player) exitWith {}; @@ -52,9 +53,9 @@ private _wPos = profilenamespace getVariable ["IGUI_GRID_ACE_displayText_W", (10 private _hPos = profilenamespace getVariable ["IGUI_GRID_ACE_displayText_H", (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))]; */ -private _xPos = ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40)); +private _xPos = ((safezoneX + safezoneW) - (_width *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40)); private _yPos = safeZoneY + 0.175 * safezoneH; -private _wPos = (10 *(((safezoneW / safezoneH) min 1.2) / 40)); +private _wPos = (_width *(((safezoneW / safezoneH) min 1.2) / 40)); private _hPos = (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)); // Zeus Interface Open and Display would be under the "CREATE" list From 734c8b196289ed1ce2d45d726fed49f432771dcf Mon Sep 17 00:00:00 2001 From: Githawk Date: Sat, 27 Feb 2016 20:45:04 +0100 Subject: [PATCH 004/826] Minor fix --- addons/rearm/functions/fnc_readSupplyCounter.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/rearm/functions/fnc_readSupplyCounter.sqf b/addons/rearm/functions/fnc_readSupplyCounter.sqf index 4c96e926c6..bbbaa0ef84 100644 --- a/addons/rearm/functions/fnc_readSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_readSupplyCounter.sqf @@ -1,6 +1,6 @@ /* * Author: GitHawk - * Get the remaining fuel amount + * Get the remaining ammunition amount * * Arguments: * 0: Ammo Truck From 3d7c51bdf174d18c36c87e516eb43d4d4b1a097e Mon Sep 17 00:00:00 2001 From: Githawk Date: Sat, 27 Feb 2016 21:05:19 +0100 Subject: [PATCH 005/826] Cleanup --- .../functions/fnc_addMagazineToSupply.sqf | 16 +++---- .../rearm/functions/fnc_addRearmActions.sqf | 18 ++++---- .../fnc_addVehicleMagazinesToSupply.sqf | 6 +-- .../functions/fnc_canReadSupplyCounter.sqf | 8 ++-- addons/rearm/functions/fnc_canRearm.sqf | 15 +++--- .../rearm/functions/fnc_canRearmVehicle.sqf | 8 ++-- addons/rearm/functions/fnc_canStoreAmmo.sqf | 6 +-- addons/rearm/functions/fnc_canTakeAmmo.sqf | 6 +-- addons/rearm/functions/fnc_createDummy.sqf | 2 +- addons/rearm/functions/fnc_disable.sqf | 6 +-- addons/rearm/functions/fnc_dropAmmo.sqf | 4 +- addons/rearm/functions/fnc_getCaliber.sqf | 2 +- .../rearm/functions/fnc_getMaxMagazines.sqf | 8 ++-- .../functions/fnc_getNeedRearmMagazines.sqf | 12 ++--- addons/rearm/functions/fnc_getSupplyCount.sqf | 10 ++-- .../functions/fnc_getVehicleMagazines.sqf | 8 ++-- .../rearm/functions/fnc_hasEnoughSupply.sqf | 8 ++-- .../rearm/functions/fnc_magazineInSupply.sqf | 8 ++-- addons/rearm/functions/fnc_pickUpAmmo.sqf | 12 ++--- .../rearm/functions/fnc_readSupplyCounter.sqf | 14 +++--- addons/rearm/functions/fnc_rearm.sqf | 6 +-- .../functions/fnc_rearmEntireVehicle.sqf | 4 +- .../fnc_rearmEntireVehicleSuccess.sqf | 8 ++-- .../fnc_rearmEntireVehicleSuccessLocal.sqf | 10 ++-- addons/rearm/functions/fnc_rearmSuccess.sqf | 10 ++-- .../rearm/functions/fnc_rearmSuccessLocal.sqf | 46 +++++++++---------- .../fnc_removeMagazineFromSupply.sqf | 18 ++++---- addons/rearm/functions/fnc_setSupplyCount.sqf | 8 ++-- addons/rearm/functions/fnc_storeAmmo.sqf | 18 ++++---- addons/rearm/functions/fnc_takeAmmo.sqf | 4 +- addons/rearm/functions/fnc_takeSuccess.sqf | 6 +-- 31 files changed, 157 insertions(+), 158 deletions(-) diff --git a/addons/rearm/functions/fnc_addMagazineToSupply.sqf b/addons/rearm/functions/fnc_addMagazineToSupply.sqf index 781af9e2f4..2f2879010c 100644 --- a/addons/rearm/functions/fnc_addMagazineToSupply.sqf +++ b/addons/rearm/functions/fnc_addMagazineToSupply.sqf @@ -3,7 +3,7 @@ * Adds magazines to the supply. * * Argument: - * 0: Target + * 0: Ammo Truck * 1: Magazine Classname * 2: Only partial * @@ -17,27 +17,27 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_magazineClass", "", [""]], ["_partial", false, [false]]]; +params [["_truck", objNull, [objNull]], ["_magazineClass", "", [""]], ["_partial", false, [false]]]; -if (isNull _target || +if (isNull _truck || {_magazineClass isEqualTo ""} || {GVAR(supply) == 0}) exitWith {}; // With limited supply, we add the caliber to the supply count if (GVAR(supply) == 1) then { - private _supply = [_target] call FUNC(getSupplyCount); + private _supply = [_truck] call FUNC(getSupplyCount); ([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; if (!_partial || {GVAR(level) == 1}) then { - [_target, _supply + _cal] call FUNC(setSupplyCount); + [_truck, _supply + _cal] call FUNC(setSupplyCount); } else { private _magazinePart = ((REARM_COUNT select _idx) / (getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"))) min 1; - [_target, (_supply + (_cal * _magazinePart))] call FUNC(setSupplyCount); + [_truck, (_supply + (_cal * _magazinePart))] call FUNC(setSupplyCount); }; }; // With magazine specific supply, we add or update the magazineSupply array if (GVAR(supply) == 2) then { - private _magazineSupply = _target getVariable [QGVAR(magazineSupply), []]; + private _magazineSupply = _truck getVariable [QGVAR(magazineSupply), []]; private _magazineIdx = -1; { _x params ["_magazine", "_rounds"]; @@ -60,5 +60,5 @@ if (GVAR(supply) == 2) then { (_magazineSupply select _magazineIdx) params ["", "_rounds"]; _magazineSupply set [_magazineIdx, [_magazineClass, (_rounds + _roundsPerTransaction)]]; }; - _target setVariable [QGVAR(magazineSupply), _magazineSupply, true]; + _truck setVariable [QGVAR(magazineSupply), _magazineSupply, true]; }; diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf index b2b388a3fd..d6e37b86b6 100644 --- a/addons/rearm/functions/fnc_addRearmActions.sqf +++ b/addons/rearm/functions/fnc_addRearmActions.sqf @@ -15,9 +15,9 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]]]; +params [["_truck", objNull, [objNull]]]; -private _vehicles = nearestObjects [_target, ["AllVehicles"], 20]; +private _vehicles = nearestObjects [_truck, ["AllVehicles"], 20]; if (count _vehicles < 2) exitWith {false}; // Rearming needs at least 2 vehicles private _vehicleActions = []; @@ -26,7 +26,7 @@ private _vehicleActions = []; private _vehicle = _x; private _needToAdd = false; private _action = []; - if !((_vehicle == _target) || (_vehicle isKindOf "CAManBase")) then { + if !((_vehicle == _truck) || (_vehicle isKindOf "CAManBase")) then { private _magazineHelper = []; { private _turretPath = _x; @@ -42,8 +42,8 @@ private _vehicleActions = []; {true}, {}, [_magazine, _vehicle]] call EFUNC(interact_menu,createAction); - if (GVAR(supply) == 0 || {(GVAR(supply) == 1) && ([_target, _magazine] call FUNC(hasEnoughSupply))} || {(GVAR(supply) == 2) && ([_target, _magazine] call FUNC(magazineInSupply))}) then { - _actions pushBack [_action, [], _target]; + if (GVAR(supply) == 0 || {(GVAR(supply) == 1) && ([_truck, _magazine] call FUNC(hasEnoughSupply))} || {(GVAR(supply) == 2) && ([_truck, _magazine] call FUNC(magazineInSupply))}) then { + _actions pushBack [_action, [], _truck]; _magazineHelper pushBack _magazine; _needToAdd = true; }; @@ -56,8 +56,8 @@ private _vehicleActions = []; {true}, {}, [_magazine, _vehicle]] call EFUNC(interact_menu,createAction); - if (GVAR(supply) == 0 || {(GVAR(supply) == 1) && ([_target, _magazine] call FUNC(hasEnoughSupply))} || {(GVAR(supply) == 2) && ([_target, _magazine] call FUNC(magazineInSupply))}) then { - _actions pushBack [_action, [], _target]; + if (GVAR(supply) == 0 || {(GVAR(supply) == 1) && ([_truck, _magazine] call FUNC(hasEnoughSupply))} || {(GVAR(supply) == 2) && ([_truck, _magazine] call FUNC(magazineInSupply))}) then { + _actions pushBack [_action, [], _truck]; _magazineHelper pushBack _magazine; _needToAdd = true; }; @@ -79,7 +79,7 @@ private _vehicleActions = []; {true}, {}, _vehicle] call EFUNC(interact_menu,createAction); - _vehicleActions pushBack [_action, [], _target]; + _vehicleActions pushBack [_action, [], _truck]; } else { _action = [_vehicle, getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName"), @@ -88,7 +88,7 @@ private _vehicleActions = []; {true}, {}, []] call EFUNC(interact_menu,createAction); - _vehicleActions pushBack [_action, _actions, _target]; + _vehicleActions pushBack [_action, _actions, _truck]; }; }; } forEach _vehicles; diff --git a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf index 17ec5494d1..5f7288cf51 100644 --- a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf +++ b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf @@ -20,9 +20,9 @@ */ #include "script_component.hpp" -params [["_ammoTruck", objNull, [objNull]], ["_vehicle", objNull, [objNull, ""]]]; +params [["_truck", objNull, [objNull]], ["_vehicle", objNull, [objNull, ""]]]; -if (isNull _ammoTruck || +if (isNull _truck || {typeName _vehicle == "OBJECT" && {isNull _vehicle}}) exitWith {}; private _string = ""; @@ -37,6 +37,6 @@ if (_string == "") exitWith {[]}; private _turretPath = _x; private _magazines = [_string, _turretPath] call FUNC(getConfigMagazines); { - [_ammoTruck, _x] call FUNC(addMagazineToSupply); + [_truck, _x] call FUNC(addMagazineToSupply); } forEach _magazines; } forEach REARM_TURRET_PATHS; diff --git a/addons/rearm/functions/fnc_canReadSupplyCounter.sqf b/addons/rearm/functions/fnc_canReadSupplyCounter.sqf index f6991c1c27..f3b4fdba12 100644 --- a/addons/rearm/functions/fnc_canReadSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_canReadSupplyCounter.sqf @@ -10,17 +10,17 @@ * Can read supply counter * * Example: - * [truck, player] call ace_rearm_fnc_canReadSupplyCounter + * [ammo_truck, player] call ace_rearm_fnc_canReadSupplyCounter * * Public: No */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; !(isNull _unit || {!(_unit isKindOf "CAManBase")} || {!local _unit} || - {!alive _target} || - {(_target distance _unit) > REARM_ACTION_DISTANCE} || + {!alive _truck} || + {(_truck distance _unit) > REARM_ACTION_DISTANCE} || {GVAR(supply) == 0}) diff --git a/addons/rearm/functions/fnc_canRearm.sqf b/addons/rearm/functions/fnc_canRearm.sqf index 202524dd10..8ea0c69c50 100644 --- a/addons/rearm/functions/fnc_canRearm.sqf +++ b/addons/rearm/functions/fnc_canRearm.sqf @@ -3,27 +3,26 @@ * Check if a unit can rearm. * * Arguments: - * 0: Target + * 0: Vehicle * 1: Unit * * Return Value: * Can Rearm * * Example: - * [player, tank] call ace_rearm_fnc_canRearm + * [tank, player] call ace_rearm_fnc_canRearm * * Public: No */ #include "script_component.hpp" -private ["_dummy","_magazineClass"]; -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [["_vehicle", objNull, [objNull]], ["_unit", objNull, [objNull]]]; -if (GVAR(level) == 0 || {isNull _unit} || {!(_unit isKindOf "CAManBase")} || {!local _unit} || {_target distance _unit > REARM_ACTION_DISTANCE} || {_target getVariable [QGVAR(disabled), false]}) exitWith {false}; +if (GVAR(level) == 0 || {isNull _unit} || {!(_unit isKindOf "CAManBase")} || {!local _unit} || {_vehicle distance _unit > REARM_ACTION_DISTANCE} || {_vehicle getVariable [QGVAR(disabled), false]}) exitWith {false}; -_dummy = _unit getVariable [QGVAR(dummy), objNull]; +private _dummy = _unit getVariable [QGVAR(dummy), objNull]; if (isNull _dummy) exitwith {false}; -_magazineClass = _dummy getVariable QGVAR(magazineClass); +private _magazineClass = _dummy getVariable QGVAR(magazineClass); if (isNil "_magazineClass") exitWith {false}; -([_target, _magazineClass] call FUNC(getNeedRearmMagazines)) select 0 +([_vehicle, _magazineClass] call FUNC(getNeedRearmMagazines)) select 0 diff --git a/addons/rearm/functions/fnc_canRearmVehicle.sqf b/addons/rearm/functions/fnc_canRearmVehicle.sqf index 29de8b2a2c..5d953e8e08 100644 --- a/addons/rearm/functions/fnc_canRearmVehicle.sqf +++ b/addons/rearm/functions/fnc_canRearmVehicle.sqf @@ -3,24 +3,24 @@ * Check if a unit can rearm a vehicle. * * Arguments: - * 0: Target + * 0: Vehicle * 1: Unit * * Return Value: * Can Pick Up Ammo * * Example: - * [player, tank] call ace_rearm_fnc_canRearmVehicle + * [tank, player] call ace_rearm_fnc_canRearmVehicle * * Public: No */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [["_vehicle", objNull, [objNull]], ["_unit", objNull, [objNull]]]; !(isNull _unit || {!(_unit isKindOf "CAManBase")} || {!local _unit} || - {(_target distance _unit) > REARM_ACTION_DISTANCE} || + {(_vehicle distance _unit) > REARM_ACTION_DISTANCE} || {!isNull (_unit getVariable [QGVAR(dummy), objNull])} || {GVAR(level) > 0}) diff --git a/addons/rearm/functions/fnc_canStoreAmmo.sqf b/addons/rearm/functions/fnc_canStoreAmmo.sqf index a3139d6f11..6e6061c5ee 100644 --- a/addons/rearm/functions/fnc_canStoreAmmo.sqf +++ b/addons/rearm/functions/fnc_canStoreAmmo.sqf @@ -10,16 +10,16 @@ * Can Store Ammo * * Example: - * [player, tank] call ace_rearm_fnc_canStoreAmmo + * [ammo_truck, player] call ace_rearm_fnc_canStoreAmmo * * Public: No */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; !(isNull _unit || {!(_unit isKindOf "CAManBase")} || {!local _unit} || - {(_target distance _unit) > REARM_ACTION_DISTANCE} || + {(_truck distance _unit) > REARM_ACTION_DISTANCE} || {isNull (_unit getVariable [QGVAR(dummy), objNull])}) diff --git a/addons/rearm/functions/fnc_canTakeAmmo.sqf b/addons/rearm/functions/fnc_canTakeAmmo.sqf index 2bb4676c4f..2ae5b26b65 100644 --- a/addons/rearm/functions/fnc_canTakeAmmo.sqf +++ b/addons/rearm/functions/fnc_canTakeAmmo.sqf @@ -10,17 +10,17 @@ * Can Pick Up Ammo * * Example: - * [player, tank] call ace_rearm_fnc_canTakeAmmo + * [ammo_truck, player] call ace_rearm_fnc_canTakeAmmo * * Public: No */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; !(isNull _unit || {!(_unit isKindOf "CAManBase")} || {!local _unit} || - {(_target distance _unit) > REARM_ACTION_DISTANCE} || + {(_truck distance _unit) > REARM_ACTION_DISTANCE} || {!isNull (_unit getVariable [QGVAR(dummy), objNull])} || {GVAR(level) == 0}) diff --git a/addons/rearm/functions/fnc_createDummy.sqf b/addons/rearm/functions/fnc_createDummy.sqf index d2fbdec4c0..86d0d04223 100644 --- a/addons/rearm/functions/fnc_createDummy.sqf +++ b/addons/rearm/functions/fnc_createDummy.sqf @@ -10,7 +10,7 @@ * Created Dummy * * Example: - * ["500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_createDummy + * [player, "500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_createDummy * * Public: No */ diff --git a/addons/rearm/functions/fnc_disable.sqf b/addons/rearm/functions/fnc_disable.sqf index b5e8b77d04..47d073efca 100644 --- a/addons/rearm/functions/fnc_disable.sqf +++ b/addons/rearm/functions/fnc_disable.sqf @@ -3,7 +3,7 @@ * Disables rearm for a vehicle. * * Arguments: - * 0: Target + * 0: Vehicle * 1: Disable * * Return Value: @@ -17,5 +17,5 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_disable", true, [true]]]; -_target setVariable [QGVAR(disabled), _disable, true]; +params [["_vehicle", objNull, [objNull]], ["_disable", true, [true]]]; +_vehicle setVariable [QGVAR(disabled), _disable, true]; diff --git a/addons/rearm/functions/fnc_dropAmmo.sqf b/addons/rearm/functions/fnc_dropAmmo.sqf index 1634a76c00..4d87370e3c 100644 --- a/addons/rearm/functions/fnc_dropAmmo.sqf +++ b/addons/rearm/functions/fnc_dropAmmo.sqf @@ -4,8 +4,8 @@ * * Arguments: * 0: Unit - * 1: Delete dummy object (optional) - * 2: Unholster Weapon (optional) + * 1: Delete dummy object + * 2: Unholster Weapon * * Return Value: * None diff --git a/addons/rearm/functions/fnc_getCaliber.sqf b/addons/rearm/functions/fnc_getCaliber.sqf index fad222a571..23521d825e 100644 --- a/addons/rearm/functions/fnc_getCaliber.sqf +++ b/addons/rearm/functions/fnc_getCaliber.sqf @@ -11,7 +11,7 @@ * 1: Caliber index * * Example: - * ["500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_hasEnoughSupply + * ["500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_getCaliber * * Public: No */ diff --git a/addons/rearm/functions/fnc_getMaxMagazines.sqf b/addons/rearm/functions/fnc_getMaxMagazines.sqf index 729f9e405a..1b1bd9ef9f 100644 --- a/addons/rearm/functions/fnc_getMaxMagazines.sqf +++ b/addons/rearm/functions/fnc_getMaxMagazines.sqf @@ -3,7 +3,7 @@ * Calculates the maximum number of magazines a turret can hold according to config. * * Arguments: - * 0: Target + * 0: Vehicle * 1: Turret Path * 2: Magazine Classname * @@ -17,9 +17,9 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_turretPath", [], [[]]], ["_magazineClass", "", [""]]]; +params [["_vehicle", objNull, [objNull]], ["_turretPath", [], [[]]], ["_magazineClass", "", [""]]]; -if (isNull _target) exitWith {0}; +if (isNull _vehicle) exitWith {0}; -private _count = {_x == _magazineClass} count ([_target, _turretPath] call FUNC(getVehicleMagazines)); +private _count = {_x == _magazineClass} count ([_vehicle, _turretPath] call FUNC(getVehicleMagazines)); _count diff --git a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf index ee4c3d4876..3bf6882e1f 100644 --- a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf +++ b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf @@ -3,7 +3,7 @@ * Get rearm return value. * * Arguments: - * 0: Target + * 0: Vehicle * 1: Magazine Classname * * Return Value: @@ -19,20 +19,20 @@ */ #include "script_component.hpp" -params ["_target", "_magazineClass"]; +params ["_vehicle", "_magazineClass"]; private _return = [false, [], 0]; { - private _magazines = [_target, _x] call FUNC(getVehicleMagazines); + private _magazines = [_vehicle, _x] call FUNC(getVehicleMagazines); if (_magazineClass in _magazines) then { - private _currentMagazines = {_x == _magazineClass} count (_target magazinesTurret _x); + private _currentMagazines = {_x == _magazineClass} count (_vehicle magazinesTurret _x); - if ((_target magazineTurretAmmo [_magazineClass, _x]) < getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count")) exitWith { + if ((_vehicle magazineTurretAmmo [_magazineClass, _x]) < getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count")) exitWith { _return = [true, _x, _currentMagazines]; }; - if (_currentMagazines < ([_target, _x, _magazineClass] call FUNC(getMaxMagazines))) exitWith { + if (_currentMagazines < ([_vehicle, _x, _magazineClass] call FUNC(getMaxMagazines))) exitWith { _return = [true, _x, _currentMagazines]; }; }; diff --git a/addons/rearm/functions/fnc_getSupplyCount.sqf b/addons/rearm/functions/fnc_getSupplyCount.sqf index e2f881380e..c3a8b1df3b 100644 --- a/addons/rearm/functions/fnc_getSupplyCount.sqf +++ b/addons/rearm/functions/fnc_getSupplyCount.sqf @@ -3,7 +3,7 @@ * Get the supply count. * * Argument: - * 0: Target + * 0: Ammo Truck * * Return value: * Supply count @@ -15,13 +15,13 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]]]; +params [["_truck", objNull, [objNull]]]; -private _supply = _target getVariable QGVAR(currentSupply); +private _supply = _truck getVariable QGVAR(currentSupply); if (isNil "_supply") then { - _supply = getNumber (configFile >> "CfgVehicles" >> typeOf _target >> QGVAR(defaultSupply)); - _target setVariable [QGVAR(currentSupply), _supply, true]; + _supply = getNumber (configFile >> "CfgVehicles" >> typeOf _truck >> QGVAR(defaultSupply)); + _truck setVariable [QGVAR(currentSupply), _supply, true]; }; _supply diff --git a/addons/rearm/functions/fnc_getVehicleMagazines.sqf b/addons/rearm/functions/fnc_getVehicleMagazines.sqf index abc0a761a7..ac687993c7 100644 --- a/addons/rearm/functions/fnc_getVehicleMagazines.sqf +++ b/addons/rearm/functions/fnc_getVehicleMagazines.sqf @@ -3,7 +3,7 @@ * Returns all magazines a turret can hold according to config. * * Arguments: - * 0: Target + * 0: Vehicle * 1: Turret Path * * Return Value: @@ -16,8 +16,8 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_turretPath", [], [[]]]]; +params [["_vehicle", objNull, [objNull]], ["_turretPath", [], [[]]]]; -if (isNull _target) exitWith {[]}; +if (isNull _vehicle) exitWith {[]}; -([typeOf _target, _turretPath] call FUNC(getConfigMagazines)) +([typeOf _vehicle, _turretPath] call FUNC(getConfigMagazines)) diff --git a/addons/rearm/functions/fnc_hasEnoughSupply.sqf b/addons/rearm/functions/fnc_hasEnoughSupply.sqf index 8caf0f3f45..ef7c906c54 100644 --- a/addons/rearm/functions/fnc_hasEnoughSupply.sqf +++ b/addons/rearm/functions/fnc_hasEnoughSupply.sqf @@ -3,7 +3,7 @@ * Check whether enough supply is left to take the magazine. * * Argument: - * 0: Target + * 0: Ammo Truck * 1: Magazine Classname * * Return value: @@ -16,9 +16,9 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_magazineClass", "", [""]]]; +params [["_truck", objNull, [objNull]], ["_magazineClass", "", [""]]]; -if (isNull _target || +if (isNull _truck || {_magazineClass isEqualTo ""}) exitWith {false}; // With infinite supply, there is always enough @@ -26,7 +26,7 @@ if (GVAR(supply) == 0) exitWith {true}; // With magazine specific supply, we need to check stored magazines if (GVAR(supply) == 2) exitWith {_this call FUNC(magazineInSupply)}; -private _supply = [_target] call FUNC(getSupplyCount); +private _supply = [_truck] call FUNC(getSupplyCount); ([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; // With caliber based rearming, we only need partial supply diff --git a/addons/rearm/functions/fnc_magazineInSupply.sqf b/addons/rearm/functions/fnc_magazineInSupply.sqf index a11ab8c25e..ddb925d929 100644 --- a/addons/rearm/functions/fnc_magazineInSupply.sqf +++ b/addons/rearm/functions/fnc_magazineInSupply.sqf @@ -3,7 +3,7 @@ * Returns true if the magazine is in the current supply * * Argument: - * 0: Target + * 0: Ammo Truck * 1: Magazine Classname * * Return value: @@ -16,16 +16,16 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_magazineClass", "", [""]]]; +params [["_truck", objNull, [objNull]], ["_magazineClass", "", [""]]]; -if (isNull _target || +if (isNull _truck || {_magazineClass isEqualTo ""}) exitWith {false}; // With limited supply, we need to check supply if (GVAR(supply) == 1) exitWith {_this call FUNC(hasEnoughSupply)}; // With magazine specific supply, we need to check them if (GVAR(supply) == 2) exitWith { - private _magazineSupply = _target getVariable [QGVAR(magazineSupply), []]; + private _magazineSupply = _truck getVariable [QGVAR(magazineSupply), []]; private _magazinePresent = false; { _x params ["_magazine", "_rounds"]; diff --git a/addons/rearm/functions/fnc_pickUpAmmo.sqf b/addons/rearm/functions/fnc_pickUpAmmo.sqf index ac1ab0a00a..e8c2b1fe84 100644 --- a/addons/rearm/functions/fnc_pickUpAmmo.sqf +++ b/addons/rearm/functions/fnc_pickUpAmmo.sqf @@ -16,13 +16,13 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [["_dummy", objNull, [objNull]], ["_unit", objNull, [objNull]]]; -private _dummy = _unit getVariable [QGVAR(dummy), objNull]; -if !(isNull _dummy) exitWith {}; +private _attachedDummy = _unit getVariable [QGVAR(dummy), objNull]; +if !(isNull _attachedDummy) exitWith {}; -_target attachTo [_unit, [0,1,0], "pelvis"]; +_dummy attachTo [_unit, [0,1,0], "pelvis"]; { - [[_target, [[-1,0,0],[0,0,1]]], QFUNC(makeDummy), _x] call EFUNC(common,execRemoteFnc); + [[_dummy, [[-1,0,0],[0,0,1]]], QFUNC(makeDummy), _x] call EFUNC(common,execRemoteFnc); } count (position _unit nearObjects ["CAManBase", 100]); -_unit setVariable [QGVAR(dummy), _target]; +_unit setVariable [QGVAR(dummy), _dummy]; diff --git a/addons/rearm/functions/fnc_readSupplyCounter.sqf b/addons/rearm/functions/fnc_readSupplyCounter.sqf index bbbaa0ef84..88485040ba 100644 --- a/addons/rearm/functions/fnc_readSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_readSupplyCounter.sqf @@ -1,6 +1,6 @@ /* * Author: GitHawk - * Get the remaining ammunition amount + * Get the remaining ammunition amount. * * Arguments: * 0: Ammo Truck @@ -16,17 +16,17 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; if (GVAR(supply) == 0) exitWith {}; if (GVAR(supply) == 1) then { [ 5, - [_unit, _target, [_target] call FUNC(getSupplyCount)], + [_unit, _truck, [_truck] call FUNC(getSupplyCount)], { params ["_args"]; - _args params [["_unit", objNull, [objNull]], ["_target", objNull, [objNull]], ["_supplyCount", 0, [0]]]; + _args params [["_unit", objNull, [objNull]], ["_truck", objNull, [objNull]], ["_supplyCount", 0, [0]]]; if (_supplyCount > 0 ) then { ["displayTextStructured", [_unit], [[LSTRING(Hint_RemainingSupplyPoints), _supplyCount], 2, _unit]] call EFUNC(common,targetEvent); } else { @@ -42,14 +42,14 @@ if (GVAR(supply) == 1) then { } else { [ 5, - [_unit, _target], + [_unit, _truck], { params ["_args"]; - _args params [["_unit", objNull, [objNull]], ["_target", objNull, [objNull]]]; + _args params [["_unit", objNull, [objNull]], ["_truck", objNull, [objNull]]]; private _supply = 1.5; private _numChars = count (localize LSTRING(Hint_RemainingAmmo)); private _text = ""; - private _magazines = _target getVariable QGVAR(magazineSupply); + private _magazines = _truck getVariable QGVAR(magazineSupply); if !(isNil "_magazines") then { { _x params ["_magazineClass", "_rounds"]; diff --git a/addons/rearm/functions/fnc_rearm.sqf b/addons/rearm/functions/fnc_rearm.sqf index 7ea08596e5..20848b3c8b 100644 --- a/addons/rearm/functions/fnc_rearm.sqf +++ b/addons/rearm/functions/fnc_rearm.sqf @@ -17,9 +17,9 @@ params [["_unit", objNull, [objNull]]]; -private _dummy = _unit getVariable [QGVAR(dummy), objNull]; -if (isNull _dummy) exitwith {false}; -private _magazineClass = _dummy getVariable QGVAR(magazineClass); +private _attachedDummy = _unit getVariable [QGVAR(dummy), objNull]; +if (isNull _attachedDummy) exitwith {false}; +private _magazineClass = _attachedDummy getVariable QGVAR(magazineClass); if (isNil "_magazineClass") exitWith {false}; ([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; diff --git a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf index 4c8076f5f8..5453910530 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf @@ -17,11 +17,11 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_vehicle", objNull, [objNull]]]; +params [["_truck", objNull, [objNull]], "", ["_vehicle", objNull, [objNull]]]; [ 10, - [_target, _vehicle], + [_truck, _vehicle], FUNC(rearmEntireVehicleSuccess), "", format [localize LSTRING(BasicRearmAction), getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf index 1e1e58c86a..6b71a3b66e 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Rearm information - * 0: Target + * 0: Ammo Truck * 1: Vehicle + * 0: Ammo Truck * 1: Vehicle * 2: TurretPath * @@ -17,7 +17,7 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_vehicle", objNull, [objNull]], ["_turretPath", [], [[]]]]; +params [["_truck", objNull, [objNull]], ["_vehicle", objNull, [objNull]], ["_turretPath", [], [[]]]]; private _magazines = [_vehicle, _turretPath] call FUNC(getVehicleMagazines); if (isNil "_magazines") exitWith {}; @@ -37,14 +37,14 @@ if (isNil "_magazines") exitWith {}; if (_currentMagazines < _maxMagazines) then { private _success = true; if (GVAR(supply) > 0) then { - _success = [_target, _magazine, (_maxRounds - _currentRounds)] call FUNC(removeMagazineFromSupply); + _success = [_truck, _magazine, (_maxRounds - _currentRounds)] call FUNC(removeMagazineFromSupply); }; if (_success) then { _vehicle setMagazineTurretAmmo [_magazine, _maxRounds, _turretPath]; for "_idx" from 1 to (_maxMagazines - _currentMagazines) do { _success = true; if (GVAR(supply) > 0) then { - _success = [_target, _magazine, _maxRounds] call FUNC(removeMagazineFromSupply); + _success = [_truck, _magazine, _maxRounds] call FUNC(removeMagazineFromSupply); }; _vehicle addMagazineTurret [_magazine, _turretPath]; }; @@ -52,7 +52,7 @@ if (isNil "_magazines") exitWith {}; } else { private _success = true; if (GVAR(supply) > 0) then { - _success = [_target, _magazine, (_maxRounds - _currentRounds)] call FUNC(removeMagazineFromSupply); + _success = [_truck, _magazine, (_maxRounds - _currentRounds)] call FUNC(removeMagazineFromSupply); }; if (_success) then { _vehicle setMagazineTurretAmmo [_magazine, _maxRounds, _turretPath]; diff --git a/addons/rearm/functions/fnc_rearmSuccess.sqf b/addons/rearm/functions/fnc_rearmSuccess.sqf index 79341a99e5..28622332a9 100644 --- a/addons/rearm/functions/fnc_rearmSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmSuccess.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Params - * 0: Target + * 0: Vehicle * 1: Unit * 2: Turret Path * 3: Number of magazines @@ -22,18 +22,18 @@ #include "script_component.hpp" params [["_args", [objNull, objNull, [], 0, "", 0], [[]], [6]]]; -_args params ["_target", "_unit", "_turretPath", "_numMagazines", "_magazineClass", "_numRounds"]; +_args params ["_vehicle", "_unit", "_turretPath", "_numMagazines", "_magazineClass", "_numRounds"]; -//hint format ["Target: %1\nTurretPath: %2\nNumMagazines: %3\nMagazine: %4\nNumRounds: %5", _target, _turretPath, _numMagazines, _magazineClass, _numRounds]; +//hint format ["Vehicle: %1\nTurretPath: %2\nNumMagazines: %3\nMagazine: %4\nNumRounds: %5", _vehicle, _turretPath, _numMagazines, _magazineClass, _numRounds]; if (local _unit) then { [_unit, true, true] call FUNC(dropAmmo); }; if (isServer) then { - private _turretOwnerID = _target turretOwner _turretPath; + private _turretOwnerID = _vehicle turretOwner _turretPath; if (_turretOwnerID == 0) then { - [_this, QFUNC(rearmSuccessLocal), _target] call EFUNC(common,execRemoteFnc); + [_this, QFUNC(rearmSuccessLocal), _vehicle] call EFUNC(common,execRemoteFnc); } else { EGVAR(common,remoteFnc) = [_this, QFUNC(rearmSuccessLocal), 0]; _turretOwnerID publicVariableClient QEGVAR(common,remoteFnc); diff --git a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf index 22923d5452..c840f43436 100644 --- a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Params - * 0: Target + * 0: Vehicle * 1: Unit * 2: Turret Path * 3: Number of magazines @@ -22,67 +22,67 @@ #include "script_component.hpp" params [["_args", [objNull, objNull, [], 0, "", 0], [[]], [6]]]; -_args params ["_target", "_unit", "_turretPath", "_numMagazines", "_magazineClass", "_numRounds"]; +_args params ["_vehicle", "_unit", "_turretPath", "_numMagazines", "_magazineClass", "_numRounds"]; private _rounds = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"); private _currentRounds = 0; -private _maxMagazines = [_target, _turretPath, _magazineClass] call FUNC(getMaxMagazines); +private _maxMagazines = [_vehicle, _turretPath, _magazineClass] call FUNC(getMaxMagazines); if (_maxMagazines == 1) then { - private _currentMagazines = { _x == _magazineClass } count (_target magazinesTurret _turretPath); + private _currentMagazines = { _x == _magazineClass } count (_vehicle magazinesTurret _turretPath); if (_currentMagazines == 0 && {!(_turretPath isEqualTo [-1])}) then { // Driver gun will always retain it's magazines - _target addMagazineTurret [_magazineClass, _turretPath]; - _target setMagazineTurretAmmo [_magazineClass, 0, _turretPath]; + _vehicle addMagazineTurret [_magazineClass, _turretPath]; + _vehicle setMagazineTurretAmmo [_magazineClass, 0, _turretPath]; }; if (GVAR(level) == 1) then { // Fill magazine completely - _target setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; + _vehicle setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; ["displayTextStructured", [_unit], [[LSTRING(Hint_RearmedTriple), _rounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _target) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); + getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); } else { // Fill only at most _numRounds - _target setMagazineTurretAmmo [_magazineClass, ((_target magazineTurretAmmo [_magazineClass, _turretPath]) + _numRounds) min _rounds, _turretPath]; + _vehicle setMagazineTurretAmmo [_magazineClass, ((_vehicle magazineTurretAmmo [_magazineClass, _turretPath]) + _numRounds) min _rounds, _turretPath]; ["displayTextStructured", [_unit], [[LSTRING(Hint_RearmedTriple), _numRounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _target) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); + getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); }; } else { for "_idx" from 1 to (_maxMagazines+1) do { - _currentRounds = _target magazineTurretAmmo [_magazineClass, _turretPath]; + _currentRounds = _vehicle magazineTurretAmmo [_magazineClass, _turretPath]; if (_currentRounds > 0 || {_idx == (_maxMagazines+1)}) exitWith { if (_idx == (_maxMagazines+1) && {!(_turretPath isEqualTo [-1])}) then { - _target addMagazineTurret [_magazineClass, _turretPath]; + _vehicle addMagazineTurret [_magazineClass, _turretPath]; }; if (GVAR(level) == 2) then { - //hint format ["Target: %1\nTurretPath: %2\nNumMagazines: %3\nMaxMagazines %4\nMagazine: %5\nNumRounds: %6\nMagazine: %7", _target, _turretPath, _numMagazines, _maxMagazines, _currentRounds, _numRounds, _magazineClass]; + //hint format ["Target: %1\nTurretPath: %2\nNumMagazines: %3\nMaxMagazines %4\nMagazine: %5\nNumRounds: %6\nMagazine: %7", _vehicle, _turretPath, _numMagazines, _maxMagazines, _currentRounds, _numRounds, _magazineClass]; // Fill only at most _numRounds if ((_currentRounds + _numRounds) > _rounds) then { - _target setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; + _vehicle setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; if (_numMagazines < _maxMagazines) then { - _target addMagazineTurret [_magazineClass, _turretPath]; - _target setMagazineTurretAmmo [_magazineClass, _currentRounds + _numRounds - _rounds, _turretPath]; + _vehicle addMagazineTurret [_magazineClass, _turretPath]; + _vehicle setMagazineTurretAmmo [_magazineClass, _currentRounds + _numRounds - _rounds, _turretPath]; }; } else { - _target setMagazineTurretAmmo [_magazineClass, _currentRounds + _numRounds, _turretPath]; + _vehicle setMagazineTurretAmmo [_magazineClass, _currentRounds + _numRounds, _turretPath]; }; ["displayTextStructured", [_unit], [[LSTRING(Hint_RearmedTriple), _numRounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _target) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); + getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); } else { // Fill current magazine completely and fill next magazine partially - _target setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; + _vehicle setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; if (_numMagazines < _maxMagazines) then { - _target addMagazineTurret [_magazineClass, _turretPath]; - _target setMagazineTurretAmmo [_magazineClass, _currentRounds, _turretPath]; + _vehicle addMagazineTurret [_magazineClass, _turretPath]; + _vehicle setMagazineTurretAmmo [_magazineClass, _currentRounds, _turretPath]; }; ["displayTextStructured", [_unit], [[LSTRING(Hint_RearmedTriple), _rounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _target) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); + getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); }; }; - _target removeMagazineTurret [_magazineClass, _turretPath]; + _vehicle removeMagazineTurret [_magazineClass, _turretPath]; _numMagazines = _numMagazines - 1; }; }; diff --git a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf index 5c59221f7a..4d7c18cd16 100644 --- a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf +++ b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf @@ -3,7 +3,7 @@ * Removes a magazine from the supply. * * Argument: - * 0: Target + * 0: Ammo Truck * 1: Magazine Classname * 2: Number of Rounds to withdraw * @@ -17,16 +17,16 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_magazineClass", "", [""]], ["_numRounds", -1, [0]]]; +params [["_truck", objNull, [objNull]], ["_magazineClass", "", [""]], ["_numRounds", -1, [0]]]; -if (isNull _target || +if (isNull _truck || {_magazineClass isEqualTo ""}) exitWith {false}; private _return = false; ([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; if (GVAR(supply) == 1) then { - private _supply = [_target] call FUNC(getSupplyCount); + private _supply = [_truck] call FUNC(getSupplyCount); if (GVAR(level) == 2) then { // Remove partial magazine supply count private _rearmAmount = (REARM_COUNT select _idx); @@ -35,19 +35,19 @@ if (GVAR(supply) == 1) then { }; private _magazinePart = (_rearmAmount / (getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"))) min 1; if (_supply >= (_cal * _magazinePart)) then { - [_target, (_supply - (_cal * _magazinePart))] call FUNC(setSupplyCount); + [_truck, (_supply - (_cal * _magazinePart))] call FUNC(setSupplyCount); _return = true; }; } else { // Remove entire magazine supply count if (_supply >= _cal) then { - [_target, (_supply - _cal)] call FUNC(setSupplyCount); + [_truck, (_supply - _cal)] call FUNC(setSupplyCount); _return = true; }; }; }; if (GVAR(supply) == 2) then { - private _magazineSupply = _target getVariable [QGVAR(magazineSupply), []]; + private _magazineSupply = _truck getVariable [QGVAR(magazineSupply), []]; private _magazineIdx = -1; { _x params ["_magazine"]; @@ -71,14 +71,14 @@ if (GVAR(supply) == 2) then { private _roundsPerTransaction = _rearmAmount min _configRounds; if (_rounds >= _roundsPerTransaction) then { _magazineSupply set [_magazineIdx, [_magazineClass, (_rounds - _roundsPerTransaction)]]; - _target setVariable [QGVAR(magazineSupply), _magazineSupply, true]; + _truck setVariable [QGVAR(magazineSupply), _magazineSupply, true]; _return = true; }; } else { // Remove entire magazine if (_rounds >= _configRounds) then { _magazineSupply set [_magazineIdx, [_magazineClass, (_rounds - _configRounds)]]; - _target setVariable [QGVAR(magazineSupply), _magazineSupply, true]; + _truck setVariable [QGVAR(magazineSupply), _magazineSupply, true]; _return = true; }; }; diff --git a/addons/rearm/functions/fnc_setSupplyCount.sqf b/addons/rearm/functions/fnc_setSupplyCount.sqf index 846ec98ea2..8900480207 100644 --- a/addons/rearm/functions/fnc_setSupplyCount.sqf +++ b/addons/rearm/functions/fnc_setSupplyCount.sqf @@ -3,7 +3,7 @@ * Sets the supply count. * * Argument: - * 0: Target + * 0: Ammo Truck * 1: Supply Count * * Return value: @@ -16,8 +16,8 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_supply", 0, [0]]]; +params [["_truck", objNull, [objNull]], ["_supply", 0, [0]]]; -if (isNull _target) exitWith {}; +if (isNull _truck) exitWith {}; -_target setVariable [QGVAR(currentSupply), (_supply max 0), true]; +_truck setVariable [QGVAR(currentSupply), (_supply max 0), true]; diff --git a/addons/rearm/functions/fnc_storeAmmo.sqf b/addons/rearm/functions/fnc_storeAmmo.sqf index 7026c9429a..4f4c2f956f 100644 --- a/addons/rearm/functions/fnc_storeAmmo.sqf +++ b/addons/rearm/functions/fnc_storeAmmo.sqf @@ -3,35 +3,35 @@ * Stores ammo in an ammo truck. * * Arguments: - * 0: Target + * 0: Ammo Truck * 1: Unit * * Return Value: * None * * Example: - * [player, dummy] call ace_rearm_fnc_storeAmmo + * [ammo_truck, player] call ace_rearm_fnc_storeAmmo * * Public: No */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; -private _dummy = _unit getVariable [QGVAR(dummy), objNull]; -if (isNull _dummy) exitwith {}; +private _attachedDummy = _unit getVariable [QGVAR(dummy), objNull]; +if (isNull _attachedDummy) exitwith {}; [ 5, - [_unit, _target, _dummy], + [_unit, _truck, _attachedDummy], { params ["_args"]; - _args params ["_unit", "_target", "_dummy"]; - [_target, (_dummy getVariable [QGVAR(magazineClass), ""]), true] call FUNC(addMagazineToSupply); + _args params ["_unit", "_truck", "_attachedDummy"]; + [_truck, (_attachedDummy getVariable [QGVAR(magazineClass), ""]), true] call FUNC(addMagazineToSupply); [_unit, true, true] call FUNC(dropAmmo); }, "", - format [localize LSTRING(StoreAmmoAction), getText(configFile >> "CfgMagazines" >> (_dummy getVariable QGVAR(magazineClass)) >> "displayName"), getText(configFile >> "CfgVehicles" >> (typeOf _target) >> "displayName")], + format [localize LSTRING(StoreAmmoAction), getText(configFile >> "CfgMagazines" >> (_attachedDummy getVariable QGVAR(magazineClass)) >> "displayName"), getText(configFile >> "CfgVehicles" >> (typeOf _truck) >> "displayName")], {true}, ["isnotinside"] ] call EFUNC(common,progressBar); diff --git a/addons/rearm/functions/fnc_takeAmmo.sqf b/addons/rearm/functions/fnc_takeAmmo.sqf index 776d88fc66..07a7854ebf 100644 --- a/addons/rearm/functions/fnc_takeAmmo.sqf +++ b/addons/rearm/functions/fnc_takeAmmo.sqf @@ -19,7 +19,7 @@ */ #include "script_component.hpp" -params [["_target", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_args", ["", objNull], [[]]]]; +params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_args", ["", objNull], [[]]]]; _args params ["_magazineClass", "_vehicle"]; ([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; @@ -28,7 +28,7 @@ REARM_HOLSTER_WEAPON [ (REARM_DURATION_TAKE select _idx), - [_unit, _magazineClass, _target], + [_unit, _magazineClass, _truck], FUNC(takeSuccess), "", format [localize LSTRING(TakeAction), getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], diff --git a/addons/rearm/functions/fnc_takeSuccess.sqf b/addons/rearm/functions/fnc_takeSuccess.sqf index b83f82aa2a..34006117c8 100644 --- a/addons/rearm/functions/fnc_takeSuccess.sqf +++ b/addons/rearm/functions/fnc_takeSuccess.sqf @@ -19,11 +19,11 @@ #include "script_component.hpp" params [["_args", [objNull, "", objNull], [[]], 3]]; -_args params ["_unit", "_magazineClass", "_target"]; +_args params ["_unit", "_magazineClass", "_truck"]; private _success = true; if (GVAR(supply) > 0) then { - _success = [_target, _magazineClass] call FUNC(removeMagazineFromSupply); + _success = [_truck, _magazineClass] call FUNC(removeMagazineFromSupply); }; if !(_success) exitWith {}; @@ -39,6 +39,6 @@ private _actionID = _unit addAction [ false, true, "", - '!isNull (_target getVariable [QGVAR(dummy), objNull])' + '!isNull (_truck getVariable [QGVAR(dummy), objNull])' ]; _unit setVariable [QGVAR(ReleaseActionID), _actionID]; From 3e2b01afca1d84bfdc303fc261a4e7e178b6907a Mon Sep 17 00:00:00 2001 From: Githawk Date: Sat, 27 Feb 2016 21:12:50 +0100 Subject: [PATCH 006/826] Another minor fix --- addons/rearm/functions/fnc_getCaliber.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/rearm/functions/fnc_getCaliber.sqf b/addons/rearm/functions/fnc_getCaliber.sqf index 23521d825e..28113a31ad 100644 --- a/addons/rearm/functions/fnc_getCaliber.sqf +++ b/addons/rearm/functions/fnc_getCaliber.sqf @@ -1,6 +1,6 @@ /* * Author: GitHawk - * Check whether enough supply is left to take the magazine. + * Get the caliber of the ammo in a magazine and return its parameters. * * Argument: * 0: Magazine Classname From 8e6b4f4ffb57f2ea905c99c60249a01cea9a79a1 Mon Sep 17 00:00:00 2001 From: Githawk Date: Sat, 27 Feb 2016 21:14:23 +0100 Subject: [PATCH 007/826] More docu fixes --- addons/rearm/functions/fnc_getConfigMagazines.sqf | 4 ++-- addons/rearm/functions/fnc_getVehicleMagazines.sqf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/rearm/functions/fnc_getConfigMagazines.sqf b/addons/rearm/functions/fnc_getConfigMagazines.sqf index 6fb9dcebfe..89113e2815 100644 --- a/addons/rearm/functions/fnc_getConfigMagazines.sqf +++ b/addons/rearm/functions/fnc_getConfigMagazines.sqf @@ -1,6 +1,6 @@ /* * Author: GitHawk, Jonpas - * Returns all magazines a turret can hold according to config. + * Returns all magazines a turret of a vehicle class can hold according to config. * * Arguments: * 0: Vehicle class @@ -10,7 +10,7 @@ * Magazine classes in TurretPath * * Example: - * ["B_MBT_01_arty_F", [0]] call ace_rearm_fnc_getVehicleMagazines + * ["B_MBT_01_arty_F", [0]] call ace_rearm_fnc_getConfigMagazines * * Public: No */ diff --git a/addons/rearm/functions/fnc_getVehicleMagazines.sqf b/addons/rearm/functions/fnc_getVehicleMagazines.sqf index ac687993c7..94664e534d 100644 --- a/addons/rearm/functions/fnc_getVehicleMagazines.sqf +++ b/addons/rearm/functions/fnc_getVehicleMagazines.sqf @@ -1,6 +1,6 @@ /* * Author: GitHawk, Jonpas - * Returns all magazines a turret can hold according to config. + * Returns all magazines a turret of a vehicle object can hold according to config. * * Arguments: * 0: Vehicle From 349b05a89bd293bf023518f34b7e9f0f005448c6 Mon Sep 17 00:00:00 2001 From: GitHawk Date: Mon, 29 Feb 2016 15:21:33 +0100 Subject: [PATCH 008/826] Removed forgotten diag_log --- addons/rearm/functions/fnc_readSupplyCounter.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/rearm/functions/fnc_readSupplyCounter.sqf b/addons/rearm/functions/fnc_readSupplyCounter.sqf index 88485040ba..48a0a73352 100644 --- a/addons/rearm/functions/fnc_readSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_readSupplyCounter.sqf @@ -58,7 +58,6 @@ if (GVAR(supply) == 1) then { _text = format ["%1
%2", _text, _line]; _supply = _supply + 0.5; } forEach _magazines; - diag_log _text; }; if (_supply > 1.5) then { ["displayTextStructured", [_unit], [[LSTRING(Hint_RemainingAmmo), _text], _supply, _unit, (_numChars/2.9)]] call EFUNC(common,targetEvent); From 8dc99a4a4e63b059b62601cb5b36461a3b765121 Mon Sep 17 00:00:00 2001 From: Githawk Date: Sun, 6 Mar 2016 11:14:34 +0100 Subject: [PATCH 009/826] Replacing execRemoteFnc with events --- addons/rearm/XEH_postInit.sqf | 12 ++++++++++++ addons/rearm/functions/fnc_pickUpAmmo.sqf | 2 +- .../functions/fnc_rearmEntireVehicleSuccess.sqf | 5 ++--- addons/rearm/functions/fnc_rearmSuccess.sqf | 5 ++--- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/addons/rearm/XEH_postInit.sqf b/addons/rearm/XEH_postInit.sqf index c22b84ffb4..801f3a6a91 100644 --- a/addons/rearm/XEH_postInit.sqf +++ b/addons/rearm/XEH_postInit.sqf @@ -6,3 +6,15 @@ if (isServer) then { addMissionEventHandler ["HandleDisconnect", {params ["_unit"]; [_unit] call FUNC(dropAmmo)}]; }; + +[QGVAR(makeDummyEH), { + _this call FUNC(makeDummy); +}] call EFUNC(common,addEventHandler); + +[QGVAR(rearmEntireVehicleSuccessLocalEH), { + _this call FUNC(rearmEntireVehicleSuccessLocal); +}] call EFUNC(common,addEventHandler); + +[QGVAR(rearmSuccessLocalEH), { + _this call FUNC(rearmSuccessLocal); +}] call EFUNC(common,addEventHandler); diff --git a/addons/rearm/functions/fnc_pickUpAmmo.sqf b/addons/rearm/functions/fnc_pickUpAmmo.sqf index e8c2b1fe84..3b3bbb9034 100644 --- a/addons/rearm/functions/fnc_pickUpAmmo.sqf +++ b/addons/rearm/functions/fnc_pickUpAmmo.sqf @@ -23,6 +23,6 @@ if !(isNull _attachedDummy) exitWith {}; _dummy attachTo [_unit, [0,1,0], "pelvis"]; { - [[_dummy, [[-1,0,0],[0,0,1]]], QFUNC(makeDummy), _x] call EFUNC(common,execRemoteFnc); + [QGVAR(makeDummyEH), _x, [_dummy, [[-1,0,0],[0,0,1]]]] call EFUNC(common,objectEvent); } count (position _unit nearObjects ["CAManBase", 100]); _unit setVariable [QGVAR(dummy), _dummy]; diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf index 6b71a3b66e..ccce6eec57 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf @@ -24,10 +24,9 @@ if (isServer) then { { _turretOwnerID = _vehicle turretOwner _x; if (_turretOwnerID == 0) then { - [[_truck, _vehicle, _x], QFUNC(rearmEntireVehicleSuccessLocal), _truck] call EFUNC(common,execRemoteFnc); + [QGVAR(rearmEntireVehicleSuccessLocalEH), _truck, [_truck, _vehicle, _x]] call EFUNC(common,objectEvent); } else { - EGVAR(common,remoteFnc) = [[_truck, _vehicle, _x], QFUNC(rearmEntireVehicleSuccessLocal), 0]; - _turretOwnerID publicVariableClient QEGVAR(common,remoteFnc); + [QGVAR(rearmEntireVehicleSuccessLocalEH), _turretOwnerID, [_truck, _vehicle, _x]] call EFUNC(common,targetEvent); }; } count REARM_TURRET_PATHS; } else { diff --git a/addons/rearm/functions/fnc_rearmSuccess.sqf b/addons/rearm/functions/fnc_rearmSuccess.sqf index 28622332a9..7db711edfd 100644 --- a/addons/rearm/functions/fnc_rearmSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmSuccess.sqf @@ -33,10 +33,9 @@ if (local _unit) then { if (isServer) then { private _turretOwnerID = _vehicle turretOwner _turretPath; if (_turretOwnerID == 0) then { - [_this, QFUNC(rearmSuccessLocal), _vehicle] call EFUNC(common,execRemoteFnc); + [QGVAR(rearmSuccessLocalEH), _vehicle, _this] call EFUNC(common,objectEvent); } else { - EGVAR(common,remoteFnc) = [_this, QFUNC(rearmSuccessLocal), 0]; - _turretOwnerID publicVariableClient QEGVAR(common,remoteFnc); + [QGVAR(rearmSuccessLocalEH), _turretOwnerID, _this] call EFUNC(common,targetEvent); }; } else { [_this, QFUNC(rearmSuccess), 1] call EFUNC(common,execRemoteFnc); From 29cd940fd0bd15d1004435a2591aa56369dcd06a Mon Sep 17 00:00:00 2001 From: GitHawk Date: Mon, 7 Mar 2016 07:15:01 +0100 Subject: [PATCH 010/826] Added server events --- addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf | 2 +- addons/rearm/functions/fnc_rearmSuccess.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf index ccce6eec57..87145eccea 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf @@ -30,5 +30,5 @@ if (isServer) then { }; } count REARM_TURRET_PATHS; } else { - [_this, QFUNC(rearmEntireVehicleSuccess), 1] call EFUNC(common,execRemoteFnc); + [QGVAR(rearmEntireVehicleSuccessLocalEH), _this] call EFUNC(common,serverEvent); }; diff --git a/addons/rearm/functions/fnc_rearmSuccess.sqf b/addons/rearm/functions/fnc_rearmSuccess.sqf index 7db711edfd..003689c00b 100644 --- a/addons/rearm/functions/fnc_rearmSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmSuccess.sqf @@ -38,5 +38,5 @@ if (isServer) then { [QGVAR(rearmSuccessLocalEH), _turretOwnerID, _this] call EFUNC(common,targetEvent); }; } else { - [_this, QFUNC(rearmSuccess), 1] call EFUNC(common,execRemoteFnc); + [QGVAR(rearmSuccessLocalEH), _this] call EFUNC(common,serverEvent); }; From d0509830e3a77ac2bd76796404aff401a4aa74d4 Mon Sep 17 00:00:00 2001 From: GitHawk Date: Thu, 12 May 2016 14:55:40 +0200 Subject: [PATCH 011/826] Some things Made params nicer, replaced some forEach and used params in XEH_respawn --- addons/rearm/XEH_respawn.sqf | 8 +++----- addons/rearm/functions/fnc_addMagazineToSupply.sqf | 6 +++++- addons/rearm/functions/fnc_addRearmActions.sqf | 13 +++++++++---- .../functions/fnc_addVehicleMagazinesToSupply.sqf | 13 +++++++++---- addons/rearm/functions/fnc_canReadSupplyCounter.sqf | 5 ++++- addons/rearm/functions/fnc_canRearm.sqf | 5 ++++- addons/rearm/functions/fnc_canRearmVehicle.sqf | 5 ++++- addons/rearm/functions/fnc_canStoreAmmo.sqf | 5 ++++- addons/rearm/functions/fnc_canTakeAmmo.sqf | 5 ++++- addons/rearm/functions/fnc_createDummy.sqf | 5 ++++- addons/rearm/functions/fnc_disable.sqf | 6 +++++- addons/rearm/functions/fnc_dropAmmo.sqf | 6 +++++- addons/rearm/functions/fnc_getCaliber.sqf | 4 +++- addons/rearm/functions/fnc_getConfigMagazines.sqf | 5 ++++- addons/rearm/functions/fnc_getMaxMagazines.sqf | 6 +++++- .../rearm/functions/fnc_getNeedRearmMagazines.sqf | 10 +++++++--- addons/rearm/functions/fnc_getSupplyCount.sqf | 4 +++- addons/rearm/functions/fnc_getVehicleMagazines.sqf | 5 ++++- addons/rearm/functions/fnc_grabAmmo.sqf | 8 +++++--- addons/rearm/functions/fnc_handleKilled.sqf | 4 +++- addons/rearm/functions/fnc_handleUnconscious.sqf | 5 ++++- addons/rearm/functions/fnc_hasEnoughSupply.sqf | 5 ++++- addons/rearm/functions/fnc_magazineInSupply.sqf | 5 ++++- addons/rearm/functions/fnc_makeDummy.sqf | 5 ++++- addons/rearm/functions/fnc_moduleRearmSettings.sqf | 6 +++++- addons/rearm/functions/fnc_pickUpAmmo.sqf | 5 ++++- addons/rearm/functions/fnc_readSupplyCounter.sqf | 8 ++++++-- addons/rearm/functions/fnc_rearm.sqf | 4 +++- addons/rearm/functions/fnc_rearmEntireVehicle.sqf | 6 +++++- .../functions/fnc_rearmEntireVehicleSuccess.sqf | 6 +++++- .../fnc_rearmEntireVehicleSuccessLocal.sqf | 9 +++++++-- addons/rearm/functions/fnc_rearmSuccess.sqf | 4 +++- addons/rearm/functions/fnc_rearmSuccessLocal.sqf | 4 +++- .../functions/fnc_removeMagazineFromSupply.sqf | 6 +++++- addons/rearm/functions/fnc_setSupplyCount.sqf | 5 ++++- addons/rearm/functions/fnc_storeAmmo.sqf | 5 ++++- addons/rearm/functions/fnc_takeAmmo.sqf | 6 +++++- addons/rearm/functions/fnc_takeSuccess.sqf | 4 +++- 38 files changed, 172 insertions(+), 54 deletions(-) diff --git a/addons/rearm/XEH_respawn.sqf b/addons/rearm/XEH_respawn.sqf index 7f0d175d1c..4968e66b43 100644 --- a/addons/rearm/XEH_respawn.sqf +++ b/addons/rearm/XEH_respawn.sqf @@ -1,16 +1,14 @@ #include "script_component.hpp" -private ["_unit"]; - -_unit = _this select 0; +params ["_unit"]; if !(local _unit) exitWith {}; _unit setVariable [QGVAR(selectedWeaponOnRearm), nil]; _unit setVariable [QGVAR(carriedMagazine), nil]; -_dummy = _unit getVariable [QGVAR(dummy), objNull]; +private _dummy = _unit getVariable [QGVAR(dummy), objNull]; if !(isNull _dummy) then { detach _dummy; deleteVehicle _dummy; }; -_unit setVariable [QGVAR(dummy), nil]; \ No newline at end of file +_unit setVariable [QGVAR(dummy), nil]; diff --git a/addons/rearm/functions/fnc_addMagazineToSupply.sqf b/addons/rearm/functions/fnc_addMagazineToSupply.sqf index 2f2879010c..f2ccae8653 100644 --- a/addons/rearm/functions/fnc_addMagazineToSupply.sqf +++ b/addons/rearm/functions/fnc_addMagazineToSupply.sqf @@ -17,7 +17,11 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_magazineClass", "", [""]], ["_partial", false, [false]]]; +params [ + ["_truck", objNull, [objNull]], + ["_magazineClass", "", [""]], + ["_partial", false, [false]] +]; if (isNull _truck || {_magazineClass isEqualTo ""} || diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf index d6e37b86b6..a7bf5d0171 100644 --- a/addons/rearm/functions/fnc_addRearmActions.sqf +++ b/addons/rearm/functions/fnc_addRearmActions.sqf @@ -15,7 +15,9 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]]]; +params [ + ["_truck", objNull, [objNull]] +]; private _vehicles = nearestObjects [_truck, ["AllVehicles"], 20]; if (count _vehicles < 2) exitWith {false}; // Rearming needs at least 2 vehicles @@ -63,8 +65,10 @@ private _vehicleActions = []; }; }; }; - } forEach _magazines; - } forEach REARM_TURRET_PATHS; + false + } count _magazines; + false + } count REARM_TURRET_PATHS; }; if (_needToAdd && !(_vehicle getVariable [QGVAR(disabled), false])) then { private _icon = getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "Icon"); @@ -91,6 +95,7 @@ private _vehicleActions = []; _vehicleActions pushBack [_action, _actions, _truck]; }; }; -} forEach _vehicles; + false +} count _vehicles; _vehicleActions diff --git a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf index 5f7288cf51..3f38dcdc97 100644 --- a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf +++ b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf @@ -20,7 +20,10 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_vehicle", objNull, [objNull, ""]]]; +params [ + ["_truck", objNull, [objNull]], + ["_vehicle", objNull, [objNull, ""]] +]; if (isNull _truck || {typeName _vehicle == "OBJECT" && {isNull _vehicle}}) exitWith {}; @@ -32,11 +35,13 @@ if (typeName _vehicle == "OBJECT") then { if (typeName _vehicle == "STRING") then { _string = _vehicle; }; -if (_string == "") exitWith {[]}; +if (_string == "") exitWith {}; { private _turretPath = _x; private _magazines = [_string, _turretPath] call FUNC(getConfigMagazines); { [_truck, _x] call FUNC(addMagazineToSupply); - } forEach _magazines; -} forEach REARM_TURRET_PATHS; + false + } count _magazines; + false +} count REARM_TURRET_PATHS; diff --git a/addons/rearm/functions/fnc_canReadSupplyCounter.sqf b/addons/rearm/functions/fnc_canReadSupplyCounter.sqf index f3b4fdba12..5b09b14304 100644 --- a/addons/rearm/functions/fnc_canReadSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_canReadSupplyCounter.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [ + ["_truck", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; !(isNull _unit || {!(_unit isKindOf "CAManBase")} || diff --git a/addons/rearm/functions/fnc_canRearm.sqf b/addons/rearm/functions/fnc_canRearm.sqf index 8ea0c69c50..90872871b0 100644 --- a/addons/rearm/functions/fnc_canRearm.sqf +++ b/addons/rearm/functions/fnc_canRearm.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_vehicle", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [ + ["_vehicle", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; if (GVAR(level) == 0 || {isNull _unit} || {!(_unit isKindOf "CAManBase")} || {!local _unit} || {_vehicle distance _unit > REARM_ACTION_DISTANCE} || {_vehicle getVariable [QGVAR(disabled), false]}) exitWith {false}; diff --git a/addons/rearm/functions/fnc_canRearmVehicle.sqf b/addons/rearm/functions/fnc_canRearmVehicle.sqf index 5d953e8e08..3ab09a83f7 100644 --- a/addons/rearm/functions/fnc_canRearmVehicle.sqf +++ b/addons/rearm/functions/fnc_canRearmVehicle.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_vehicle", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [ + ["_vehicle", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; !(isNull _unit || {!(_unit isKindOf "CAManBase")} || diff --git a/addons/rearm/functions/fnc_canStoreAmmo.sqf b/addons/rearm/functions/fnc_canStoreAmmo.sqf index 6e6061c5ee..23d1bb0bc2 100644 --- a/addons/rearm/functions/fnc_canStoreAmmo.sqf +++ b/addons/rearm/functions/fnc_canStoreAmmo.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [ + ["_truck", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; !(isNull _unit || {!(_unit isKindOf "CAManBase")} || diff --git a/addons/rearm/functions/fnc_canTakeAmmo.sqf b/addons/rearm/functions/fnc_canTakeAmmo.sqf index 2ae5b26b65..be213014ca 100644 --- a/addons/rearm/functions/fnc_canTakeAmmo.sqf +++ b/addons/rearm/functions/fnc_canTakeAmmo.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [ + ["_truck", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; !(isNull _unit || {!(_unit isKindOf "CAManBase")} || diff --git a/addons/rearm/functions/fnc_createDummy.sqf b/addons/rearm/functions/fnc_createDummy.sqf index 86d0d04223..08326ca889 100644 --- a/addons/rearm/functions/fnc_createDummy.sqf +++ b/addons/rearm/functions/fnc_createDummy.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_unit", objNull, [objNull]], ["_magazineClass", "", [""]]]; +params [ + ["_unit", objNull, [objNull]], + ["_magazineClass", "", [""]] +]; private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClass >> "ammo"); private _dummyName = getText (configFile >> "CfgAmmo" >> _ammo >> QGVAR(dummy)); diff --git a/addons/rearm/functions/fnc_disable.sqf b/addons/rearm/functions/fnc_disable.sqf index 47d073efca..2398039595 100644 --- a/addons/rearm/functions/fnc_disable.sqf +++ b/addons/rearm/functions/fnc_disable.sqf @@ -17,5 +17,9 @@ */ #include "script_component.hpp" -params [["_vehicle", objNull, [objNull]], ["_disable", true, [true]]]; +params [ + ["_vehicle", objNull, [objNull]], + ["_disable", true, [true]] +]; + _vehicle setVariable [QGVAR(disabled), _disable, true]; diff --git a/addons/rearm/functions/fnc_dropAmmo.sqf b/addons/rearm/functions/fnc_dropAmmo.sqf index 4d87370e3c..861b5db31d 100644 --- a/addons/rearm/functions/fnc_dropAmmo.sqf +++ b/addons/rearm/functions/fnc_dropAmmo.sqf @@ -17,7 +17,11 @@ */ #include "script_component.hpp" -params [["_unit", objNull, [objNull]], ["_delete", false, [false]], ["_unholster", true, [true]]]; +params [ + ["_unit", objNull, [objNull]], + ["_delete", false, [false]], + ["_unholster", true, [true]] +]; private _dummy = _unit getVariable [QGVAR(dummy), objNull]; if !(isNull _dummy) then { diff --git a/addons/rearm/functions/fnc_getCaliber.sqf b/addons/rearm/functions/fnc_getCaliber.sqf index 28113a31ad..fdff5a9480 100644 --- a/addons/rearm/functions/fnc_getCaliber.sqf +++ b/addons/rearm/functions/fnc_getCaliber.sqf @@ -17,7 +17,9 @@ */ #include "script_component.hpp" -params [["_magazineClass", "", [""]]]; +params [ + ["_magazineClass", "", [""]] +]; if (_magazineClass isEqualTo "") exitWith {[8, 2]}; diff --git a/addons/rearm/functions/fnc_getConfigMagazines.sqf b/addons/rearm/functions/fnc_getConfigMagazines.sqf index 89113e2815..82dcf7936c 100644 --- a/addons/rearm/functions/fnc_getConfigMagazines.sqf +++ b/addons/rearm/functions/fnc_getConfigMagazines.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_cfgString", "", [""]], ["_turretPath", [], [[]]]]; +params [ + ["_cfgString", "", [""]], + ["_turretPath", [], [[]]] +]; if (_cfgString == "") exitWith {[]}; diff --git a/addons/rearm/functions/fnc_getMaxMagazines.sqf b/addons/rearm/functions/fnc_getMaxMagazines.sqf index 1b1bd9ef9f..c747714d86 100644 --- a/addons/rearm/functions/fnc_getMaxMagazines.sqf +++ b/addons/rearm/functions/fnc_getMaxMagazines.sqf @@ -17,7 +17,11 @@ */ #include "script_component.hpp" -params [["_vehicle", objNull, [objNull]], ["_turretPath", [], [[]]], ["_magazineClass", "", [""]]]; +params [ + ["_vehicle", objNull, [objNull]], + ["_turretPath", [], [[]]], + ["_magazineClass", "", [""]] +]; if (isNull _vehicle) exitWith {0}; diff --git a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf index 3bf6882e1f..2000b83818 100644 --- a/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf +++ b/addons/rearm/functions/fnc_getNeedRearmMagazines.sqf @@ -13,13 +13,16 @@ * 2: Number of current magazines in turret path * * Example: - * [tank, "mag"] call ace_rearm_fnc_getNeedRearmMagazines + * [tank, "500Rnd_127x99_mag_Tracer_Red"] call ace_rearm_fnc_getNeedRearmMagazines * * Public: No */ #include "script_component.hpp" -params ["_vehicle", "_magazineClass"]; +params [ + ["_vehicle", objNull, [objNull]], + ["_magazineClass", "", [""]] +]; private _return = [false, [], 0]; { @@ -38,6 +41,7 @@ private _return = [false, [], 0]; }; if (_return select 0) exitWith {}; -} forEach REARM_TURRET_PATHS; + false +} count REARM_TURRET_PATHS; _return diff --git a/addons/rearm/functions/fnc_getSupplyCount.sqf b/addons/rearm/functions/fnc_getSupplyCount.sqf index c3a8b1df3b..f53f447657 100644 --- a/addons/rearm/functions/fnc_getSupplyCount.sqf +++ b/addons/rearm/functions/fnc_getSupplyCount.sqf @@ -15,7 +15,9 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]]]; +params [ + ["_truck", objNull, [objNull]] +]; private _supply = _truck getVariable QGVAR(currentSupply); diff --git a/addons/rearm/functions/fnc_getVehicleMagazines.sqf b/addons/rearm/functions/fnc_getVehicleMagazines.sqf index 94664e534d..26da24df0c 100644 --- a/addons/rearm/functions/fnc_getVehicleMagazines.sqf +++ b/addons/rearm/functions/fnc_getVehicleMagazines.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_vehicle", objNull, [objNull]], ["_turretPath", [], [[]]]]; +params [ + ["_vehicle", objNull, [objNull]], + ["_turretPath", [], [[]]] +]; if (isNull _vehicle) exitWith {[]}; diff --git a/addons/rearm/functions/fnc_grabAmmo.sqf b/addons/rearm/functions/fnc_grabAmmo.sqf index 161627da28..dabf62d535 100644 --- a/addons/rearm/functions/fnc_grabAmmo.sqf +++ b/addons/rearm/functions/fnc_grabAmmo.sqf @@ -16,10 +16,12 @@ */ #include "script_component.hpp" -params [["_dummy", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [ + ["_dummy", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; REARM_HOLSTER_WEAPON -[_unit, "forceWalk", QGVAR(vehRearm), true] call EFUNC(common,statusEffect_set); [ 5, @@ -29,7 +31,7 @@ REARM_HOLSTER_WEAPON params ["_args"]; _args params ["_dummy", "_unit"]; [_dummy, _unit] call FUNC(pickUpAmmo); - + [_unit, "forceWalk", QGVAR(vehRearm), true] call EFUNC(common,statusEffect_set); _actionID = _unit getVariable [QGVAR(ReleaseActionID), -1]; if (_actionID != -1) then { _unit removeAction _actionID; diff --git a/addons/rearm/functions/fnc_handleKilled.sqf b/addons/rearm/functions/fnc_handleKilled.sqf index 5f80246f52..3e39dc727e 100644 --- a/addons/rearm/functions/fnc_handleKilled.sqf +++ b/addons/rearm/functions/fnc_handleKilled.sqf @@ -15,7 +15,9 @@ */ #include "script_component.hpp" -params [["_unit", objNull, [objNull]]]; +params [ + ["_unit", objNull, [objNull]] +]; if (!local _unit) exitWith {}; diff --git a/addons/rearm/functions/fnc_handleUnconscious.sqf b/addons/rearm/functions/fnc_handleUnconscious.sqf index eab25fcf64..0fbf1b8f06 100644 --- a/addons/rearm/functions/fnc_handleUnconscious.sqf +++ b/addons/rearm/functions/fnc_handleUnconscious.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_unit", objNull, [objNull]], ["_isUnconscious", false, [false]]]; +params [ + ["_unit", objNull, [objNull]], + ["_isUnconscious", false, [false]] +]; if (!local _unit || {!_isUnconscious}) exitWith {}; diff --git a/addons/rearm/functions/fnc_hasEnoughSupply.sqf b/addons/rearm/functions/fnc_hasEnoughSupply.sqf index ef7c906c54..db2814ca9e 100644 --- a/addons/rearm/functions/fnc_hasEnoughSupply.sqf +++ b/addons/rearm/functions/fnc_hasEnoughSupply.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_magazineClass", "", [""]]]; +params [ + ["_truck", objNull, [objNull]], + ["_magazineClass", "", [""]] +]; if (isNull _truck || {_magazineClass isEqualTo ""}) exitWith {false}; diff --git a/addons/rearm/functions/fnc_magazineInSupply.sqf b/addons/rearm/functions/fnc_magazineInSupply.sqf index ddb925d929..2cd6f3da67 100644 --- a/addons/rearm/functions/fnc_magazineInSupply.sqf +++ b/addons/rearm/functions/fnc_magazineInSupply.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_magazineClass", "", [""]]]; +params [ + ["_truck", objNull, [objNull]], + ["_magazineClass", "", [""]] +]; if (isNull _truck || {_magazineClass isEqualTo ""}) exitWith {false}; diff --git a/addons/rearm/functions/fnc_makeDummy.sqf b/addons/rearm/functions/fnc_makeDummy.sqf index 390ff658e0..368d2616c4 100644 --- a/addons/rearm/functions/fnc_makeDummy.sqf +++ b/addons/rearm/functions/fnc_makeDummy.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_obj", objNull, [objNull]], ["_dirAndUp", [[1,0,0],[0,0,1]], [[]]]]; +params [ + ["_obj", objNull, [objNull]], + ["_dirAndUp", [[1,0,0],[0,0,1]], [[]]] +]; _obj setVectorDirAndUp _dirAndUp; _obj allowDamage false; diff --git a/addons/rearm/functions/fnc_moduleRearmSettings.sqf b/addons/rearm/functions/fnc_moduleRearmSettings.sqf index ae4a56563c..8397eb5401 100644 --- a/addons/rearm/functions/fnc_moduleRearmSettings.sqf +++ b/addons/rearm/functions/fnc_moduleRearmSettings.sqf @@ -17,7 +17,11 @@ */ #include "script_component.hpp" -params ["_logic", "", ["_activated", false, [false]]]; +params [ + "_logic", + "", + ["_activated", false, [false]] +]; if (!_activated) exitWith {}; diff --git a/addons/rearm/functions/fnc_pickUpAmmo.sqf b/addons/rearm/functions/fnc_pickUpAmmo.sqf index 3b3bbb9034..e4ff4370ba 100644 --- a/addons/rearm/functions/fnc_pickUpAmmo.sqf +++ b/addons/rearm/functions/fnc_pickUpAmmo.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_dummy", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [ + ["_dummy", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; private _attachedDummy = _unit getVariable [QGVAR(dummy), objNull]; if !(isNull _attachedDummy) exitWith {}; diff --git a/addons/rearm/functions/fnc_readSupplyCounter.sqf b/addons/rearm/functions/fnc_readSupplyCounter.sqf index 48a0a73352..872a889814 100644 --- a/addons/rearm/functions/fnc_readSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_readSupplyCounter.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [ + ["_truck", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; if (GVAR(supply) == 0) exitWith {}; @@ -57,7 +60,8 @@ if (GVAR(supply) == 1) then { _numChars = _numChars max (count _line); _text = format ["%1
%2", _text, _line]; _supply = _supply + 0.5; - } forEach _magazines; + false + } count _magazines; }; if (_supply > 1.5) then { ["displayTextStructured", [_unit], [[LSTRING(Hint_RemainingAmmo), _text], _supply, _unit, (_numChars/2.9)]] call EFUNC(common,targetEvent); diff --git a/addons/rearm/functions/fnc_rearm.sqf b/addons/rearm/functions/fnc_rearm.sqf index 20848b3c8b..65b80b6900 100644 --- a/addons/rearm/functions/fnc_rearm.sqf +++ b/addons/rearm/functions/fnc_rearm.sqf @@ -15,7 +15,9 @@ */ #include "script_component.hpp" -params [["_unit", objNull, [objNull]]]; +params [ + ["_unit", objNull, [objNull]] +]; private _attachedDummy = _unit getVariable [QGVAR(dummy), objNull]; if (isNull _attachedDummy) exitwith {false}; diff --git a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf index 5453910530..4da9475511 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicle.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicle.sqf @@ -17,7 +17,11 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], "", ["_vehicle", objNull, [objNull]]]; +params [ + ["_truck", objNull, [objNull]], + "", + ["_vehicle", objNull, [objNull]] +]; [ 10, diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf index 87145eccea..c0f0021cd7 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccess.sqf @@ -18,7 +18,10 @@ #include "script_component.hpp" params ["_args"]; -_args params [["_truck", objNull, [objNull]], ["_vehicle", objNull, [objNull]]]; +_args params [ + ["_truck", objNull, [objNull]], + ["_vehicle", objNull, [objNull]] +]; if (isServer) then { { @@ -28,6 +31,7 @@ if (isServer) then { } else { [QGVAR(rearmEntireVehicleSuccessLocalEH), _turretOwnerID, [_truck, _vehicle, _x]] call EFUNC(common,targetEvent); }; + false } count REARM_TURRET_PATHS; } else { [QGVAR(rearmEntireVehicleSuccessLocalEH), _this] call EFUNC(common,serverEvent); diff --git a/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf index fdd8ab9b78..2e8327d7d4 100644 --- a/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmEntireVehicleSuccessLocal.sqf @@ -17,7 +17,11 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_vehicle", objNull, [objNull]], ["_turretPath", [], [[]]]]; +params [ + ["_truck", objNull, [objNull]], + ["_vehicle", objNull, [objNull]], + ["_turretPath", [], [[]]] +]; private _magazines = [_vehicle, _turretPath] call FUNC(getVehicleMagazines); if (isNil "_magazines") exitWith {}; @@ -58,4 +62,5 @@ if (isNil "_magazines") exitWith {}; _vehicle setMagazineTurretAmmo [_magazine, _maxRounds, _turretPath]; }; }; -} foreach _magazines; + false +} count _magazines; diff --git a/addons/rearm/functions/fnc_rearmSuccess.sqf b/addons/rearm/functions/fnc_rearmSuccess.sqf index 003689c00b..c5e47a5887 100644 --- a/addons/rearm/functions/fnc_rearmSuccess.sqf +++ b/addons/rearm/functions/fnc_rearmSuccess.sqf @@ -21,7 +21,9 @@ */ #include "script_component.hpp" -params [["_args", [objNull, objNull, [], 0, "", 0], [[]], [6]]]; +params [ + ["_args", [objNull, objNull, [], 0, "", 0], [[]], [6]] +]; _args params ["_vehicle", "_unit", "_turretPath", "_numMagazines", "_magazineClass", "_numRounds"]; //hint format ["Vehicle: %1\nTurretPath: %2\nNumMagazines: %3\nMagazine: %4\nNumRounds: %5", _vehicle, _turretPath, _numMagazines, _magazineClass, _numRounds]; diff --git a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf index c840f43436..2b1809cfb5 100644 --- a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf @@ -21,7 +21,9 @@ */ #include "script_component.hpp" -params [["_args", [objNull, objNull, [], 0, "", 0], [[]], [6]]]; +params [ + ["_args", [objNull, objNull, [], 0, "", 0], [[]], [6]] +]; _args params ["_vehicle", "_unit", "_turretPath", "_numMagazines", "_magazineClass", "_numRounds"]; private _rounds = getNumber (configFile >> "CfgMagazines" >> _magazineClass >> "count"); diff --git a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf index 4d7c18cd16..ed19bfb53f 100644 --- a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf +++ b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf @@ -17,7 +17,11 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_magazineClass", "", [""]], ["_numRounds", -1, [0]]]; +params [ + ["_truck", objNull, [objNull]], + ["_magazineClass", "", [""]], + ["_numRounds", -1, [0]] +]; if (isNull _truck || {_magazineClass isEqualTo ""}) exitWith {false}; diff --git a/addons/rearm/functions/fnc_setSupplyCount.sqf b/addons/rearm/functions/fnc_setSupplyCount.sqf index 8900480207..b4deea7a74 100644 --- a/addons/rearm/functions/fnc_setSupplyCount.sqf +++ b/addons/rearm/functions/fnc_setSupplyCount.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_supply", 0, [0]]]; +params [ + ["_truck", objNull, [objNull]], + ["_supply", 0, [0]] +]; if (isNull _truck) exitWith {}; diff --git a/addons/rearm/functions/fnc_storeAmmo.sqf b/addons/rearm/functions/fnc_storeAmmo.sqf index 4f4c2f956f..b59a75aaa9 100644 --- a/addons/rearm/functions/fnc_storeAmmo.sqf +++ b/addons/rearm/functions/fnc_storeAmmo.sqf @@ -16,7 +16,10 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]]]; +params [ + ["_truck", objNull, [objNull]], + ["_unit", objNull, [objNull]] +]; private _attachedDummy = _unit getVariable [QGVAR(dummy), objNull]; if (isNull _attachedDummy) exitwith {}; diff --git a/addons/rearm/functions/fnc_takeAmmo.sqf b/addons/rearm/functions/fnc_takeAmmo.sqf index 07a7854ebf..9b0cfd3100 100644 --- a/addons/rearm/functions/fnc_takeAmmo.sqf +++ b/addons/rearm/functions/fnc_takeAmmo.sqf @@ -19,7 +19,11 @@ */ #include "script_component.hpp" -params [["_truck", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_args", ["", objNull], [[]]]]; +params [ + ["_truck", objNull, [objNull]], + ["_unit", objNull, [objNull]], + ["_args", ["", objNull], [[]]] +]; _args params ["_magazineClass", "_vehicle"]; ([_magazineClass] call FUNC(getCaliber)) params ["_cal", "_idx"]; diff --git a/addons/rearm/functions/fnc_takeSuccess.sqf b/addons/rearm/functions/fnc_takeSuccess.sqf index 34006117c8..831c2722bd 100644 --- a/addons/rearm/functions/fnc_takeSuccess.sqf +++ b/addons/rearm/functions/fnc_takeSuccess.sqf @@ -18,7 +18,9 @@ */ #include "script_component.hpp" -params [["_args", [objNull, "", objNull], [[]], 3]]; +params [ + ["_args", [objNull, "", objNull], [[]], 3] +]; _args params ["_unit", "_magazineClass", "_truck"]; private _success = true; From a2b9678b15056af2148e97f7e3b3e98023e8777c Mon Sep 17 00:00:00 2001 From: Githawk Date: Mon, 6 Jun 2016 19:50:54 +0200 Subject: [PATCH 012/826] Object event --- addons/rearm/functions/fnc_readSupplyCounter.sqf | 8 ++++---- addons/rearm/functions/fnc_rearmSuccessLocal.sqf | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/addons/rearm/functions/fnc_readSupplyCounter.sqf b/addons/rearm/functions/fnc_readSupplyCounter.sqf index 872a889814..8de95776cb 100644 --- a/addons/rearm/functions/fnc_readSupplyCounter.sqf +++ b/addons/rearm/functions/fnc_readSupplyCounter.sqf @@ -31,9 +31,9 @@ if (GVAR(supply) == 1) then { params ["_args"]; _args params [["_unit", objNull, [objNull]], ["_truck", objNull, [objNull]], ["_supplyCount", 0, [0]]]; if (_supplyCount > 0 ) then { - ["displayTextStructured", [_unit], [[LSTRING(Hint_RemainingSupplyPoints), _supplyCount], 2, _unit]] call EFUNC(common,targetEvent); + ["displayTextStructured", _unit, [[LSTRING(Hint_RemainingSupplyPoints), _supplyCount], 2, _unit]] call EFUNC(common,objectEvent); } else { - ["displayTextStructured", [_unit], [LSTRING(Hint_EmptySupplyPoints), 2, _unit]] call EFUNC(common,targetEvent); + ["displayTextStructured", _unit, [LSTRING(Hint_EmptySupplyPoints), 2, _unit]] call EFUNC(common,objectEvent); }; true }, @@ -64,9 +64,9 @@ if (GVAR(supply) == 1) then { } count _magazines; }; if (_supply > 1.5) then { - ["displayTextStructured", [_unit], [[LSTRING(Hint_RemainingAmmo), _text], _supply, _unit, (_numChars/2.9)]] call EFUNC(common,targetEvent); + ["displayTextStructured", _unit, [[LSTRING(Hint_RemainingAmmo), _text], _supply, _unit, (_numChars/2.9)]] call EFUNC(common,objectEvent); } else { - ["displayTextStructured", [_unit], [LSTRING(Hint_Empty), 2, _unit]] call EFUNC(common,targetEvent); + ["displayTextStructured", _unit, [LSTRING(Hint_Empty), 2, _unit]] call EFUNC(common,objectEvent); }; true }, diff --git a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf index 2b1809cfb5..f04ab4b501 100644 --- a/addons/rearm/functions/fnc_rearmSuccessLocal.sqf +++ b/addons/rearm/functions/fnc_rearmSuccessLocal.sqf @@ -40,15 +40,15 @@ if (_maxMagazines == 1) then { if (GVAR(level) == 1) then { // Fill magazine completely _vehicle setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; - ["displayTextStructured", [_unit], [[LSTRING(Hint_RearmedTriple), _rounds, + ["displayTextStructured", _unit, [[LSTRING(Hint_RearmedTriple), _rounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); + getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,objectEvent); } else { // Fill only at most _numRounds _vehicle setMagazineTurretAmmo [_magazineClass, ((_vehicle magazineTurretAmmo [_magazineClass, _turretPath]) + _numRounds) min _rounds, _turretPath]; - ["displayTextStructured", [_unit], [[LSTRING(Hint_RearmedTriple), _numRounds, + ["displayTextStructured", _unit, [[LSTRING(Hint_RearmedTriple), _numRounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); + getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,objectEvent); }; } else { for "_idx" from 1 to (_maxMagazines+1) do { @@ -69,9 +69,9 @@ if (_maxMagazines == 1) then { } else { _vehicle setMagazineTurretAmmo [_magazineClass, _currentRounds + _numRounds, _turretPath]; }; - ["displayTextStructured", [_unit], [[LSTRING(Hint_RearmedTriple), _numRounds, + ["displayTextStructured", _unit, [[LSTRING(Hint_RearmedTriple), _numRounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); + getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,objectEvent); } else { // Fill current magazine completely and fill next magazine partially _vehicle setMagazineTurretAmmo [_magazineClass, _rounds, _turretPath]; @@ -79,9 +79,9 @@ if (_maxMagazines == 1) then { _vehicle addMagazineTurret [_magazineClass, _turretPath]; _vehicle setMagazineTurretAmmo [_magazineClass, _currentRounds, _turretPath]; }; - ["displayTextStructured", [_unit], [[LSTRING(Hint_RearmedTriple), _rounds, + ["displayTextStructured", _unit, [[LSTRING(Hint_RearmedTriple), _rounds, getText(configFile >> "CfgMagazines" >> _magazineClass >> "displayName"), - getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,targetEvent); + getText(configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "displayName")], 3, _unit]] call EFUNC(common,objectEvent); }; }; _vehicle removeMagazineTurret [_magazineClass, _turretPath]; From 9cfa2f11d96e7d6e8c7e0f9f58f28015d41a231c Mon Sep 17 00:00:00 2001 From: Githawk Date: Mon, 6 Jun 2016 20:42:20 +0200 Subject: [PATCH 013/826] Stuff Arguments, Return Value, (optional) --- .../functions/fnc_displayProtractor.sqf | 4 ++-- .../functions/fnc_getChildrenAttachActions.sqf | 4 ++-- addons/captives/functions/fnc_canStopEscorting.sqf | 1 - addons/cargo/functions/fnc_canLoad.sqf | 2 +- addons/cargo/functions/fnc_canLoadItemIn.sqf | 2 +- addons/cargo/functions/fnc_canUnloadItem.sqf | 4 ++-- addons/cargo/functions/fnc_findNearestVehicle.sqf | 2 +- addons/cargo/functions/fnc_getCargoSpaceLeft.sqf | 2 +- addons/cargo/functions/fnc_getSizeItem.sqf | 2 +- addons/cargo/functions/fnc_handleDestroyed.sqf | 2 +- addons/cargo/functions/fnc_initObject.sqf | 2 +- addons/cargo/functions/fnc_loadItem.sqf | 2 +- addons/cargo/functions/fnc_makeLoadable.sqf | 2 +- addons/cargo/functions/fnc_onMenuOpen.sqf | 2 +- addons/cargo/functions/fnc_startLoadIn.sqf | 2 +- addons/cargo/functions/fnc_startUnload.sqf | 2 +- addons/cargo/functions/fnc_unloadItem.sqf | 2 +- addons/cargo/functions/fnc_validateCargoSpace.sqf | 2 +- addons/common/functions/fnc_codeToString.sqf | 2 +- .../common/functions/fnc_displayTextStructured.sqf | 2 +- addons/common/functions/fnc_dropBackpack.sqf | 2 +- addons/common/functions/fnc_dumpArray.sqf | 2 +- addons/common/functions/fnc_findUnloadPosition.sqf | 6 +++--- addons/common/functions/fnc_firedEH.sqf | 4 ++-- addons/common/functions/fnc_fixPosition.sqf | 2 +- addons/common/functions/fnc_getMGRSdata.sqf | 2 +- addons/common/functions/fnc_isInBuilding.sqf | 2 +- addons/common/functions/fnc_monitor.sqf | 2 +- .../common/functions/fnc_removeAllEventHandlers.sqf | 2 +- addons/common/functions/fnc_removeEventHandler.sqf | 2 +- addons/common/functions/fnc_runAfterSettingsInit.sqf | 4 ++-- addons/common/functions/fnc_serverEvent.sqf | 2 +- .../functions/fnc_setApproximateVariablePublic.sqf | 4 ++-- addons/common/functions/fnc_setVariablePublic.sqf | 4 ++-- addons/common/functions/fnc_showHud.sqf | 4 ++-- addons/common/functions/fnc_showUser.sqf | 2 +- addons/common/functions/fnc_unloadPersonLocal.sqf | 2 +- addons/common/functions/fnc_waitUntilAndExecute.sqf | 4 ++-- addons/disarming/functions/fnc_disarmDropItems.sqf | 2 +- addons/dragging/functions/fnc_initObject.sqf | 2 +- addons/dragging/functions/fnc_initPerson.sqf | 4 ++-- addons/dragging/functions/fnc_isObjectOnObject.sqf | 4 ++-- addons/dragging/functions/fnc_setCarryable.sqf | 2 +- addons/dragging/functions/fnc_setDraggable.sqf | 4 ++-- addons/dragging/functions/fnc_startDrag.sqf | 4 ++-- addons/explosives/functions/fnc_placeExplosive.sqf | 2 +- .../explosives/functions/fnc_scriptedExplosive.sqf | 2 +- addons/fcs/functions/fnc_calculateSolution.sqf | 2 +- addons/fcs/functions/fnc_canResetFCS.sqf | 2 +- addons/fcs/functions/fnc_getRange.sqf | 4 ++-- addons/fcs/functions/fnc_updateRangeHUD.sqf | 4 ++-- addons/gforces/functions/fnc_addPFEH.sqf | 4 ++-- addons/gforces/functions/fnc_pfhUpdateGForces.sqf | 4 ++-- addons/hearing/functions/fnc_updateVolume.sqf | 2 +- .../interact_menu/functions/fnc_addActionToClass.sqf | 4 ++-- .../functions/fnc_addActionToObject.sqf | 4 ++-- addons/interact_menu/functions/fnc_addMainAction.sqf | 4 ++-- .../functions/fnc_collectActiveActionTree.sqf | 4 ++-- addons/interact_menu/functions/fnc_compileMenu.sqf | 4 ++-- .../functions/fnc_compileMenuSelfAction.sqf | 4 ++-- .../interact_menu/functions/fnc_compileMenuZeus.sqf | 4 ++-- addons/interact_menu/functions/fnc_createAction.sqf | 4 ++-- .../functions/fnc_ctrlSetParsedTextCached.sqf | 4 ++-- .../interact_menu/functions/fnc_findActionNode.sqf | 4 ++-- .../functions/fnc_handlePlayerChanged.sqf | 4 ++-- addons/interact_menu/functions/fnc_isSubPath.sqf | 4 ++-- addons/interact_menu/functions/fnc_keyDown.sqf | 4 ++-- addons/interact_menu/functions/fnc_keyUp.sqf | 4 ++-- .../functions/fnc_removeActionFromClass.sqf | 4 ++-- .../functions/fnc_removeActionFromObject.sqf | 4 ++-- addons/interact_menu/functions/fnc_render.sqf | 4 ++-- .../functions/fnc_renderActionPoints.sqf | 4 ++-- .../interact_menu/functions/fnc_renderBaseMenu.sqf | 4 ++-- addons/interact_menu/functions/fnc_renderIcon.sqf | 4 ++-- addons/interact_menu/functions/fnc_renderMenu.sqf | 4 ++-- .../interact_menu/functions/fnc_renderSelector.sqf | 4 ++-- .../interact_menu/functions/fnc_setupTextColors.sqf | 4 ++-- addons/interact_menu/functions/fnc_splitPath.sqf | 4 ++-- addons/interaction/functions/fnc_canJoinTeam.sqf | 2 +- addons/interaction/functions/fnc_getWeaponPos.sqf | 2 +- addons/interaction/functions/fnc_hideMouseHint.sqf | 2 +- addons/interaction/functions/fnc_showMouseHint.sqf | 2 +- addons/interaction/functions/fnc_switchLamp.sqf | 2 +- addons/laser/functions/fnc_laserOff.sqf | 2 +- addons/laser/functions/fnc_laserOn.sqf | 2 +- addons/laser/functions/fnc_seekerFindLaserSpot.sqf | 2 +- .../laser/functions/fnc_unitTurretCanLockLaser.sqf | 4 ++-- .../functions/fnc_vanillaLaserSeekerHandler.sqf | 4 ++-- .../functions/fnc_findLaserSource.sqf | 2 +- .../functions/fnc_laserHudDesignateOff.sqf | 2 +- .../functions/fnc_getMagazineChildren.sqf | 4 ++-- addons/map/functions/fnc_compileFlashlightMenu.sqf | 2 +- addons/map/functions/fnc_flashlightGlow.sqf | 2 +- addons/map/functions/fnc_getUnitFlashlights.sqf | 2 +- addons/map/functions/fnc_switchFlashlight.sqf | 2 +- addons/maptools/functions/fnc_addLineMarker.sqf | 2 +- addons/maptools/functions/fnc_calculateMapScale.sqf | 2 +- addons/maptools/functions/fnc_canDraw.sqf | 2 +- addons/maptools/functions/fnc_canUseMapGPS.sqf | 2 +- addons/maptools/functions/fnc_canUseMapTools.sqf | 2 +- addons/maptools/functions/fnc_cancelDrawing.sqf | 2 +- .../maptools/functions/fnc_copyMapReceiveMarkers.sqf | 2 +- addons/maptools/functions/fnc_copyMapRemoteSend.sqf | 4 ++-- addons/maptools/functions/fnc_copyMapStart.sqf | 2 +- addons/maptools/functions/fnc_handleKeyDown.sqf | 2 +- addons/maptools/functions/fnc_handleMouseButton.sqf | 4 ++-- addons/maptools/functions/fnc_handleMouseMove.sqf | 4 ++-- .../maptools/functions/fnc_handleMouseZChanged.sqf | 4 ++-- addons/maptools/functions/fnc_isInsideMapTool.sqf | 2 +- addons/maptools/functions/fnc_openMapGps.sqf | 2 +- addons/maptools/functions/fnc_removeLineMarker.sqf | 2 +- addons/maptools/functions/fnc_updateLineMarker.sqf | 2 +- .../maptools/functions/fnc_updateMapToolMarkers.sqf | 2 +- .../functions/fnc_addUnloadPatientActions.sqf | 4 ++-- addons/microdagr/functions/fnc_openDisplay.sqf | 2 +- addons/missileguidance/functions/fnc_checkLos.sqf | 4 ++-- .../functions/fnc_checkSeekerAngle.sqf | 4 ++-- addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf | 2 +- addons/nametags/functions/fnc_drawNameTagIcon.sqf | 2 +- .../overheating/functions/fnc_calculateCooling.sqf | 4 ++-- addons/overheating/functions/fnc_firedEH.sqf | 4 ++-- addons/overheating/functions/fnc_getWeaponData.sqf | 4 ++-- addons/overheating/functions/fnc_handleTakeEH.sqf | 4 ++-- addons/overheating/functions/fnc_jamWeapon.sqf | 4 ++-- .../functions/fnc_loadCoolestSpareBarrel.sqf | 4 ++-- addons/overheating/functions/fnc_overheat.sqf | 4 ++-- .../fnc_sendSpareBarrelsTemperaturesHint.sqf | 4 ++-- addons/overheating/functions/fnc_swapBarrel.sqf | 4 ++-- .../functions/fnc_swapBarrelAssistant.sqf | 4 ++-- .../overheating/functions/fnc_swapBarrelCallback.sqf | 4 ++-- .../fnc_updateSpareBarrelsTemperaturesThread.sqf | 4 ++-- .../overheating/functions/fnc_updateTemperature.sqf | 4 ++-- .../functions/fnc_updateTemperatureThread.sqf | 4 ++-- .../functions/fnc_cacheOverPressureValues.sqf | 4 ++-- addons/overpressure/functions/fnc_firedEHBB.sqf | 2 +- addons/overpressure/functions/fnc_firedEHOP.sqf | 2 +- addons/overpressure/functions/fnc_getDistance.sqf | 2 +- .../functions/fnc_overpressureDamage.sqf | 4 ++-- addons/rearm/functions/fnc_addMagazineToSupply.sqf | 6 +++--- addons/rearm/functions/fnc_addRearmActions.sqf | 4 ++-- .../functions/fnc_addVehicleMagazinesToSupply.sqf | 4 ++-- addons/rearm/functions/fnc_disable.sqf | 2 +- addons/rearm/functions/fnc_dropAmmo.sqf | 4 ++-- addons/rearm/functions/fnc_getCaliber.sqf | 4 ++-- addons/rearm/functions/fnc_getSupplyCount.sqf | 4 ++-- addons/rearm/functions/fnc_hasEnoughSupply.sqf | 4 ++-- addons/rearm/functions/fnc_magazineInSupply.sqf | 6 +++--- .../rearm/functions/fnc_removeMagazineFromSupply.sqf | 6 +++--- addons/rearm/functions/fnc_setSupplyCount.sqf | 4 ++-- addons/reload/functions/fnc_canCheckAmmo.sqf | 4 ++-- addons/reload/functions/fnc_canLinkBelt.sqf | 4 ++-- addons/reload/functions/fnc_checkAmmo.sqf | 4 ++-- addons/reload/functions/fnc_displayAmmo.sqf | 4 ++-- addons/reload/functions/fnc_startLinkingBelt.sqf | 4 ++-- .../functions/fnc_addMissileReloadActions.sqf | 4 ++-- addons/reloadlaunchers/functions/fnc_canLoad.sqf | 4 ++-- .../functions/fnc_getLoadableMissiles.sqf | 4 ++-- addons/reloadlaunchers/functions/fnc_load.sqf | 4 ++-- .../reloadlaunchers/functions/fnc_reloadLauncher.sqf | 4 ++-- addons/scopes/functions/fnc_adjustScope.sqf | 4 ++-- addons/scopes/functions/fnc_adjustZero.sqf | 4 ++-- addons/scopes/functions/fnc_applyScopeAdjustment.sqf | 4 ++-- addons/scopes/functions/fnc_canAdjustZero.sqf | 4 ++-- addons/scopes/functions/fnc_firedEH.sqf | 4 ++-- addons/spectator/functions/fnc_toggleInterface.sqf | 12 ++++++------ addons/spottingscope/functions/fnc_pickup.sqf | 2 +- addons/spottingscope/functions/fnc_place.sqf | 2 +- addons/tripod/functions/fnc_adjust.sqf | 2 +- addons/tripod/functions/fnc_pickup.sqf | 2 +- addons/tripod/functions/fnc_place.sqf | 2 +- addons/weather/functions/fnc_displayWindInfo.sqf | 4 ++-- addons/weather/functions/fnc_getMapData.sqf | 4 ++-- addons/weather/functions/fnc_getWind.sqf | 4 ++-- addons/weather/functions/fnc_initWind.sqf | 4 ++-- addons/weather/functions/fnc_serverController.sqf | 4 ++-- addons/weather/functions/fnc_updateAceWeather.sqf | 4 ++-- addons/weather/functions/fnc_updateHumidity.sqf | 4 ++-- addons/weather/functions/fnc_updateRain.sqf | 4 ++-- addons/weather/functions/fnc_updateTemperature.sqf | 4 ++-- addons/weather/functions/fnc_updateWind.sqf | 4 ++-- 180 files changed, 291 insertions(+), 292 deletions(-) diff --git a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf index 62663c843b..528b3e2e97 100644 --- a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf +++ b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf @@ -3,10 +3,10 @@ * * Displays a protractor in the top left corner of the screen * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/attach/functions/fnc_getChildrenAttachActions.sqf b/addons/attach/functions/fnc_getChildrenAttachActions.sqf index 9f811197e0..0b2e4e705c 100644 --- a/addons/attach/functions/fnc_getChildrenAttachActions.sqf +++ b/addons/attach/functions/fnc_getChildrenAttachActions.sqf @@ -3,11 +3,11 @@ * Show the ammo counts for a static weapon. * Called from "insertChildren" on interact_menu * - * Argument: + * Arguments: * 0: Target * 1: Player * - * Return value: + * Return Value: * ChildActiosn * * Example: diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index cfafb5a0e8..28b018491b 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -4,7 +4,6 @@ * * Arguments: * 0: caller (player) - * 1: target * * Return Value: * The return value diff --git a/addons/cargo/functions/fnc_canLoad.sqf b/addons/cargo/functions/fnc_canLoad.sqf index bf1098dbf1..f576ea3e79 100644 --- a/addons/cargo/functions/fnc_canLoad.sqf +++ b/addons/cargo/functions/fnc_canLoad.sqf @@ -6,7 +6,7 @@ * 0: Player * 1: Object to load * - * Return value: + * Return Value: * Can load * * Example: diff --git a/addons/cargo/functions/fnc_canLoadItemIn.sqf b/addons/cargo/functions/fnc_canLoadItemIn.sqf index d6092c2a2d..e2bb1ecc4d 100644 --- a/addons/cargo/functions/fnc_canLoadItemIn.sqf +++ b/addons/cargo/functions/fnc_canLoadItemIn.sqf @@ -6,7 +6,7 @@ * 0: Item * 1: Holder Object (Vehicle) * - * Return value: + * Return Value: * Can load in * * Example: diff --git a/addons/cargo/functions/fnc_canUnloadItem.sqf b/addons/cargo/functions/fnc_canUnloadItem.sqf index ea6cb7a6eb..be14f71a76 100644 --- a/addons/cargo/functions/fnc_canUnloadItem.sqf +++ b/addons/cargo/functions/fnc_canUnloadItem.sqf @@ -5,9 +5,9 @@ * Arguments: * 0: loaded Object * 1: Object - * 2: Unloader (player) + * 2: Unloader (player) (optional) * - * Return value: + * Return Value: * Can be unloaded * * Example: diff --git a/addons/cargo/functions/fnc_findNearestVehicle.sqf b/addons/cargo/functions/fnc_findNearestVehicle.sqf index b5b441df92..6d5b7ce1a8 100644 --- a/addons/cargo/functions/fnc_findNearestVehicle.sqf +++ b/addons/cargo/functions/fnc_findNearestVehicle.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Unit * - * Return value: + * Return Value: * Vehicle in Distance * * Example: diff --git a/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf b/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf index 7d94570749..7e8594ffe4 100644 --- a/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf +++ b/addons/cargo/functions/fnc_getCargoSpaceLeft.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Object * - * Return value: + * Return Value: * Cargo space left * * Example: diff --git a/addons/cargo/functions/fnc_getSizeItem.sqf b/addons/cargo/functions/fnc_getSizeItem.sqf index 775bdefd10..c53c05ee28 100644 --- a/addons/cargo/functions/fnc_getSizeItem.sqf +++ b/addons/cargo/functions/fnc_getSizeItem.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Item * - * Return value: + * Return Value: * Cargo size (default: -1) * * Example: diff --git a/addons/cargo/functions/fnc_handleDestroyed.sqf b/addons/cargo/functions/fnc_handleDestroyed.sqf index d50ea488d6..88b3cb9351 100644 --- a/addons/cargo/functions/fnc_handleDestroyed.sqf +++ b/addons/cargo/functions/fnc_handleDestroyed.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Object * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/cargo/functions/fnc_initObject.sqf b/addons/cargo/functions/fnc_initObject.sqf index f740d0e371..92403b8dd9 100644 --- a/addons/cargo/functions/fnc_initObject.sqf +++ b/addons/cargo/functions/fnc_initObject.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Object * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/cargo/functions/fnc_loadItem.sqf b/addons/cargo/functions/fnc_loadItem.sqf index 443143ece0..8672604e35 100644 --- a/addons/cargo/functions/fnc_loadItem.sqf +++ b/addons/cargo/functions/fnc_loadItem.sqf @@ -7,7 +7,7 @@ * 0: Item * 1: Vehicle * - * Return value: + * Return Value: * Object loaded * * Example: diff --git a/addons/cargo/functions/fnc_makeLoadable.sqf b/addons/cargo/functions/fnc_makeLoadable.sqf index ceb1dc1acd..27513a1864 100644 --- a/addons/cargo/functions/fnc_makeLoadable.sqf +++ b/addons/cargo/functions/fnc_makeLoadable.sqf @@ -7,7 +7,7 @@ * 1: Set as loadable (default: true) * 2: Size. (default: 1) * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/cargo/functions/fnc_onMenuOpen.sqf b/addons/cargo/functions/fnc_onMenuOpen.sqf index a045862e36..a9f558ac76 100644 --- a/addons/cargo/functions/fnc_onMenuOpen.sqf +++ b/addons/cargo/functions/fnc_onMenuOpen.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Display * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/cargo/functions/fnc_startLoadIn.sqf b/addons/cargo/functions/fnc_startLoadIn.sqf index 6fcd3cf62c..0d42de829a 100644 --- a/addons/cargo/functions/fnc_startLoadIn.sqf +++ b/addons/cargo/functions/fnc_startLoadIn.sqf @@ -6,7 +6,7 @@ * 0: Player * 1: Object * - * Return value: + * Return Value: * Load ProgressBar Started * * Example: diff --git a/addons/cargo/functions/fnc_startUnload.sqf b/addons/cargo/functions/fnc_startUnload.sqf index 46a69e737f..33c8118cdf 100644 --- a/addons/cargo/functions/fnc_startUnload.sqf +++ b/addons/cargo/functions/fnc_startUnload.sqf @@ -5,7 +5,7 @@ * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/cargo/functions/fnc_unloadItem.sqf b/addons/cargo/functions/fnc_unloadItem.sqf index 8bd18f989e..a2d9fb8845 100644 --- a/addons/cargo/functions/fnc_unloadItem.sqf +++ b/addons/cargo/functions/fnc_unloadItem.sqf @@ -6,7 +6,7 @@ * 0: Item * 1: Vehicle * - * Return value: + * Return Value: * Object unloaded * * Example: diff --git a/addons/cargo/functions/fnc_validateCargoSpace.sqf b/addons/cargo/functions/fnc_validateCargoSpace.sqf index ecb011aed3..6e3d79cf8d 100644 --- a/addons/cargo/functions/fnc_validateCargoSpace.sqf +++ b/addons/cargo/functions/fnc_validateCargoSpace.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Object * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/common/functions/fnc_codeToString.sqf b/addons/common/functions/fnc_codeToString.sqf index b4fe37db35..62e4cb5698 100644 --- a/addons/common/functions/fnc_codeToString.sqf +++ b/addons/common/functions/fnc_codeToString.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Code * - * Return value: + * Return Value: * Code * * Public: Yes diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 59ca469cf1..5d42f00875 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -6,7 +6,7 @@ * 0: Text * 1: Size of the textbox (default: 1.5) * 2: Target Unit. Will only display if target is the player controlled object (default: ACE_player) - * 3: Custom Width + * 3: Custom Width (optional) * * Return Value: * None diff --git a/addons/common/functions/fnc_dropBackpack.sqf b/addons/common/functions/fnc_dropBackpack.sqf index 7b7ee5765e..b0d77af7d5 100644 --- a/addons/common/functions/fnc_dropBackpack.sqf +++ b/addons/common/functions/fnc_dropBackpack.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Unit that has a backpack * - * Return value: + * Return Value: * Ground wepaon holder with backpack * * Public: Yes diff --git a/addons/common/functions/fnc_dumpArray.sqf b/addons/common/functions/fnc_dumpArray.sqf index 026b08501e..b60cede087 100644 --- a/addons/common/functions/fnc_dumpArray.sqf +++ b/addons/common/functions/fnc_dumpArray.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Array to be dumped - * 1: Depth + * 1: Depth (optional) * * Return Value: * None diff --git a/addons/common/functions/fnc_findUnloadPosition.sqf b/addons/common/functions/fnc_findUnloadPosition.sqf index c3b0dc3f34..dbb554d6d3 100644 --- a/addons/common/functions/fnc_findUnloadPosition.sqf +++ b/addons/common/functions/fnc_findUnloadPosition.sqf @@ -6,9 +6,9 @@ * Arguments: * 0: Source Vehicle * 1: Cargo Classname - * 2: Unloader (player) - * 3: Max Distance (meters) - * 4: Check Vehicle is Stable + * 2: Unloader (player) (optional) + * 3: Max Distance (meters) (optional) + * 4: Check Vehicle is Stable (optional) * * Return Value: * Unload PositionAGL (Can Be [] if no valid pos found) diff --git a/addons/common/functions/fnc_firedEH.sqf b/addons/common/functions/fnc_firedEH.sqf index d70f0a8650..75657d6dfe 100644 --- a/addons/common/functions/fnc_firedEH.sqf +++ b/addons/common/functions/fnc_firedEH.sqf @@ -2,7 +2,7 @@ * Author: esteldunedain * Unfied handling of weapon fire * - * Argument: + * Arguments: * 0: unit - Object the event handler is assigned to * 1: weapon - Fired weapon * 2: muzzle - Muzzle that was used @@ -11,7 +11,7 @@ * 5: magazine - magazine name which was used * 6: projectile - Object of the projectile that was shot * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/common/functions/fnc_fixPosition.sqf b/addons/common/functions/fnc_fixPosition.sqf index 689512d925..883a502c4e 100644 --- a/addons/common/functions/fnc_fixPosition.sqf +++ b/addons/common/functions/fnc_fixPosition.sqf @@ -3,7 +3,7 @@ * * Fixes position of an object. E.g. moves object above ground and adjusts to terrain slope. Requires local object. * - * Argument: + * Arguments: * Object * * Return Value: diff --git a/addons/common/functions/fnc_getMGRSdata.sqf b/addons/common/functions/fnc_getMGRSdata.sqf index 44fc204638..259c5e267f 100644 --- a/addons/common/functions/fnc_getMGRSdata.sqf +++ b/addons/common/functions/fnc_getMGRSdata.sqf @@ -4,7 +4,7 @@ * Also gets longitude, latitude and altitude offset for the map. * Writes return values to GVAR(MGRS_data) if run on the current map. * - * Argument: + * Arguments: * 0: Map name (default: worldName) * * Return Value: diff --git a/addons/common/functions/fnc_isInBuilding.sqf b/addons/common/functions/fnc_isInBuilding.sqf index e5234b9200..d4a9307cd6 100644 --- a/addons/common/functions/fnc_isInBuilding.sqf +++ b/addons/common/functions/fnc_isInBuilding.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Unit * - * Return value: + * Return Value: * Is the unit in a building? * * Public: Yes diff --git a/addons/common/functions/fnc_monitor.sqf b/addons/common/functions/fnc_monitor.sqf index 4672d6eec0..8aef62895c 100644 --- a/addons/common/functions/fnc_monitor.sqf +++ b/addons/common/functions/fnc_monitor.sqf @@ -2,7 +2,7 @@ * Author: commy2 * hint retun value of given function every frame * - * Argument: + * Arguments: * * * Return Value: diff --git a/addons/common/functions/fnc_removeAllEventHandlers.sqf b/addons/common/functions/fnc_removeAllEventHandlers.sqf index ed1cce278c..d1c6989b99 100644 --- a/addons/common/functions/fnc_removeAllEventHandlers.sqf +++ b/addons/common/functions/fnc_removeAllEventHandlers.sqf @@ -2,7 +2,7 @@ * Author: Nou * Remove all events of a certain event type. * - * Argument: + * Arguments: * 0: Event name * * Return Value: diff --git a/addons/common/functions/fnc_removeEventHandler.sqf b/addons/common/functions/fnc_removeEventHandler.sqf index a0b5ed5333..846cb4eeee 100644 --- a/addons/common/functions/fnc_removeEventHandler.sqf +++ b/addons/common/functions/fnc_removeEventHandler.sqf @@ -2,7 +2,7 @@ * Author: Nou * Remove an event handler. * - * Argument: + * Arguments: * 0: Event name * 1: Event code * diff --git a/addons/common/functions/fnc_runAfterSettingsInit.sqf b/addons/common/functions/fnc_runAfterSettingsInit.sqf index cf3faa1d7e..15631a626a 100644 --- a/addons/common/functions/fnc_runAfterSettingsInit.sqf +++ b/addons/common/functions/fnc_runAfterSettingsInit.sqf @@ -2,11 +2,11 @@ * Author: PabstMirror * Executes code after setting are initilized. * - * Argument: + * Arguments: * 0: Code to execute * 1: Parameters to run the code with * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/common/functions/fnc_serverEvent.sqf b/addons/common/functions/fnc_serverEvent.sqf index 65ab0da2a7..d6820fbf2e 100644 --- a/addons/common/functions/fnc_serverEvent.sqf +++ b/addons/common/functions/fnc_serverEvent.sqf @@ -2,7 +2,7 @@ * Author: Nou * Execute a event only on the server. * - * Argument: + * Arguments: * 0: Event name * 1: Event args * diff --git a/addons/common/functions/fnc_setApproximateVariablePublic.sqf b/addons/common/functions/fnc_setApproximateVariablePublic.sqf index 5131f99058..549dea9eb4 100644 --- a/addons/common/functions/fnc_setApproximateVariablePublic.sqf +++ b/addons/common/functions/fnc_setApproximateVariablePublic.sqf @@ -2,13 +2,13 @@ * Author: esteldunedain * Publish a variable if it's different enough from the previously published value. * - * Argument: + * Arguments: * 0: Object the variable should be assigned to * 1: Name of the variable * 2: Value of the variable * 3: Absolute tolerance * - * Return value: + * Return Value: * Nothing. * * Example: diff --git a/addons/common/functions/fnc_setVariablePublic.sqf b/addons/common/functions/fnc_setVariablePublic.sqf index 1cfba0a422..5eeff87aee 100644 --- a/addons/common/functions/fnc_setVariablePublic.sqf +++ b/addons/common/functions/fnc_setVariablePublic.sqf @@ -2,13 +2,13 @@ * Author: commy2 and CAA-Picard and joko and PabstMirror * Publish a variable, but wait a certain amount of time before allowing it to be published it again. * - * Argument: + * Arguments: * 0: Object the variable should be assigned to * 1: Name of the variable * 2: Value of the variable * 3: Embargo delay (Optional. Default: 1) * - * Return value: + * Return Value: * Nothing. * * Example: diff --git a/addons/common/functions/fnc_showHud.sqf b/addons/common/functions/fnc_showHud.sqf index 723c2436ed..a79636ed16 100644 --- a/addons/common/functions/fnc_showHud.sqf +++ b/addons/common/functions/fnc_showHud.sqf @@ -4,8 +4,8 @@ * Bitwise AND Logic (a single false in a mask will make it false) * * Arguments: - * 0: Source ID - * 1: Show Hud Bool Array (8 to set, empty to remove) + * 0: Source ID (optional) + * 1: Show Hud Bool Array (8 to set, empty to remove) (optional) * - [hud, info, radar, compass, direction, menu, group, cursors] * - hud: Boolean - show scripted HUD (same as normal showHUD true/false) * - info: Boolean - show vehicle + soldier info (hides weapon info from the HUD as well) diff --git a/addons/common/functions/fnc_showUser.sqf b/addons/common/functions/fnc_showUser.sqf index b783fb4ec5..2e7af12a3f 100644 --- a/addons/common/functions/fnc_showUser.sqf +++ b/addons/common/functions/fnc_showUser.sqf @@ -2,7 +2,7 @@ * Author: commy2 * hint the Variable ACE_isUsedBy from the input Object every frame * - * Argument: + * Arguments: * * * Return Value: diff --git a/addons/common/functions/fnc_unloadPersonLocal.sqf b/addons/common/functions/fnc_unloadPersonLocal.sqf index 741accb689..280c9875d7 100644 --- a/addons/common/functions/fnc_unloadPersonLocal.sqf +++ b/addons/common/functions/fnc_unloadPersonLocal.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: unit to unload * 1: Vehicle - * 2: Unloader (player) + * 2: Unloader (player) (optional) * * Return Value: * Returns true if succesfully unloaded person diff --git a/addons/common/functions/fnc_waitUntilAndExecute.sqf b/addons/common/functions/fnc_waitUntilAndExecute.sqf index 76f3d22ce1..52c596c70a 100644 --- a/addons/common/functions/fnc_waitUntilAndExecute.sqf +++ b/addons/common/functions/fnc_waitUntilAndExecute.sqf @@ -2,12 +2,12 @@ * Author: joko // Jonas * Executes a code once with after the Condition is True, using a PFH * - * Argument: + * Arguments: * 0: Condition * 1: Code to execute * 2: Parameters to run the code with * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf index c9eb920084..9e9829dd0f 100644 --- a/addons/disarming/functions/fnc_disarmDropItems.sqf +++ b/addons/disarming/functions/fnc_disarmDropItems.sqf @@ -7,7 +7,7 @@ * 0: caller (player) * 1: target * 2: classnamess - * 3: Do Not Drop Ammo + * 3: Do Not Drop Ammo (optional) * * Return Value: * Nothing diff --git a/addons/dragging/functions/fnc_initObject.sqf b/addons/dragging/functions/fnc_initObject.sqf index b9f623395e..d36ffe9339 100644 --- a/addons/dragging/functions/fnc_initObject.sqf +++ b/addons/dragging/functions/fnc_initObject.sqf @@ -2,7 +2,7 @@ * Author: commy2 * Initialize variables for drag or carryable objects. Called from init EH. * - * Argument: + * Arguments: * 0: Any object * * Return Value: diff --git a/addons/dragging/functions/fnc_initPerson.sqf b/addons/dragging/functions/fnc_initPerson.sqf index 9e4aefeead..c8c26a4f8c 100644 --- a/addons/dragging/functions/fnc_initPerson.sqf +++ b/addons/dragging/functions/fnc_initPerson.sqf @@ -2,10 +2,10 @@ * Author: commy2 * Initialize variables for drag or carryable persons. Called from init EH. * - * Argument: + * Arguments: * 0: Unit * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/dragging/functions/fnc_isObjectOnObject.sqf b/addons/dragging/functions/fnc_isObjectOnObject.sqf index c113688322..cec6ce764e 100644 --- a/addons/dragging/functions/fnc_isObjectOnObject.sqf +++ b/addons/dragging/functions/fnc_isObjectOnObject.sqf @@ -2,10 +2,10 @@ * Author: commy2 * Check if Object is Overlapping * - * Argument: + * Arguments: * 0: Object * - * Return value: + * Return Value: * * * Example; diff --git a/addons/dragging/functions/fnc_setCarryable.sqf b/addons/dragging/functions/fnc_setCarryable.sqf index 0253c6ed4b..4de52e7bd8 100644 --- a/addons/dragging/functions/fnc_setCarryable.sqf +++ b/addons/dragging/functions/fnc_setCarryable.sqf @@ -2,7 +2,7 @@ * Author: commy2 * Enable the object to be carried. * - * Argument: + * Arguments: * 0: Any object * 1: true to enable carrying, false to disable * 2: Position offset for attachTo command (default: [0,1,1]) diff --git a/addons/dragging/functions/fnc_setDraggable.sqf b/addons/dragging/functions/fnc_setDraggable.sqf index 4c4d11ecf6..1fbcb995dc 100644 --- a/addons/dragging/functions/fnc_setDraggable.sqf +++ b/addons/dragging/functions/fnc_setDraggable.sqf @@ -2,13 +2,13 @@ * Author: commy2 * Enable the object to be dragged. * - * Argument: + * Arguments: * 0: Any object * 1: true to enable dragging, false to disable * 2: Position offset for attachTo command (Array, optinal; default: [0,0,0]) * 3: Direction in degree to rotate the object after attachTo (Number, optional; default: 0) * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/dragging/functions/fnc_startDrag.sqf b/addons/dragging/functions/fnc_startDrag.sqf index 8c46fbe122..5ddaa0ede4 100644 --- a/addons/dragging/functions/fnc_startDrag.sqf +++ b/addons/dragging/functions/fnc_startDrag.sqf @@ -2,11 +2,11 @@ * Author: commy2 * Start the dragging process. * - * Argument: + * Arguments: * 0: Unit that should do the dragging * 1: Object to drag * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/explosives/functions/fnc_placeExplosive.sqf b/addons/explosives/functions/fnc_placeExplosive.sqf index 83cdb2fef8..4e3f7304df 100644 --- a/addons/explosives/functions/fnc_placeExplosive.sqf +++ b/addons/explosives/functions/fnc_placeExplosive.sqf @@ -9,7 +9,7 @@ * 3: Magazine class * 4: Config of trigger * 5: Variables required for the trigger type - * 6: Explosive placeholder + * 6: Explosive placeholder (optional) * * Return Value: * Placed explosive diff --git a/addons/explosives/functions/fnc_scriptedExplosive.sqf b/addons/explosives/functions/fnc_scriptedExplosive.sqf index 6a554ac09c..b4813cec29 100644 --- a/addons/explosives/functions/fnc_scriptedExplosive.sqf +++ b/addons/explosives/functions/fnc_scriptedExplosive.sqf @@ -5,7 +5,7 @@ * * Arguments: * 0: Explosives objects to detonate - * 1: Fuze delay (for each explosive; use negative number for random time up to value) + * 1: Fuze delay (for each explosive; use negative number for random time up to value) (optional) * * Return Value: * None diff --git a/addons/fcs/functions/fnc_calculateSolution.sqf b/addons/fcs/functions/fnc_calculateSolution.sqf index 6d489de006..61bfbd8c58 100644 --- a/addons/fcs/functions/fnc_calculateSolution.sqf +++ b/addons/fcs/functions/fnc_calculateSolution.sqf @@ -8,7 +8,7 @@ * 2: Target distance * 3: Azimuth offset * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/fcs/functions/fnc_canResetFCS.sqf b/addons/fcs/functions/fnc_canResetFCS.sqf index b57435f388..cf0dcf2674 100644 --- a/addons/fcs/functions/fnc_canResetFCS.sqf +++ b/addons/fcs/functions/fnc_canResetFCS.sqf @@ -2,7 +2,7 @@ * Author: KoffeinFlummi * Called from config. Can player reset FCS? * - * Argument: + * Arguments: * Nothing * * Return Value: diff --git a/addons/fcs/functions/fnc_getRange.sqf b/addons/fcs/functions/fnc_getRange.sqf index 64619241c4..ba49621047 100644 --- a/addons/fcs/functions/fnc_getRange.sqf +++ b/addons/fcs/functions/fnc_getRange.sqf @@ -2,13 +2,13 @@ * Author: commy2 * Read laser distance measurement from engine. * - * Argument: + * Arguments: * 0: Measurement Accuracy (default: 1) * 1: Maximum measure distance (default: 5000) * 2: Minimum measure distance (default: 0) * 3: Blank display on range error (default: false) * - * Return value: + * Return Value: * Measured distance * * Public: No diff --git a/addons/fcs/functions/fnc_updateRangeHUD.sqf b/addons/fcs/functions/fnc_updateRangeHUD.sqf index 374254c620..0bb15b2507 100644 --- a/addons/fcs/functions/fnc_updateRangeHUD.sqf +++ b/addons/fcs/functions/fnc_updateRangeHUD.sqf @@ -2,10 +2,10 @@ * Author: commy2 * Update compatible info elements. * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/gforces/functions/fnc_addPFEH.sqf b/addons/gforces/functions/fnc_addPFEH.sqf index 50311c3a06..9bd4d7fa1a 100644 --- a/addons/gforces/functions/fnc_addPFEH.sqf +++ b/addons/gforces/functions/fnc_addPFEH.sqf @@ -2,10 +2,10 @@ * Author: KoffeinFlummi and esteldunedain * Adds the PFEH * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf index 7909f3d0ee..48370c2431 100644 --- a/addons/gforces/functions/fnc_pfhUpdateGForces.sqf +++ b/addons/gforces/functions/fnc_pfhUpdateGForces.sqf @@ -2,11 +2,11 @@ * Author: KoffeinFlummi and esteldunedain * Calculates average g-forces and triggers g-effects * - * Argument: + * Arguments: * 0: Arguments * 1: pfh_id * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf index 01ab58ef76..af0483ae9c 100644 --- a/addons/hearing/functions/fnc_updateVolume.sqf +++ b/addons/hearing/functions/fnc_updateVolume.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Args - * -----0: Just update volume (skip ringing/recovery) + * -----0: Just update volume (skip ringing/recovery) (optional) * * Return Value: * None diff --git a/addons/interact_menu/functions/fnc_addActionToClass.sqf b/addons/interact_menu/functions/fnc_addActionToClass.sqf index 56ae64e5f9..32c086f692 100644 --- a/addons/interact_menu/functions/fnc_addActionToClass.sqf +++ b/addons/interact_menu/functions/fnc_addActionToClass.sqf @@ -3,13 +3,13 @@ * Insert an ACE action to a class, under a certain path * Note: This function is NOT global. * - * Argument: + * Arguments: * 0: TypeOf of the class * 1: Type of action, 0 for actions, 1 for self-actions * 2: Parent path of the new action * 3: Action * - * Return value: + * Return Value: * The entry full path, which can be used to remove the entry, or add children entries . * * Example: diff --git a/addons/interact_menu/functions/fnc_addActionToObject.sqf b/addons/interact_menu/functions/fnc_addActionToObject.sqf index 31e15ae7aa..d307f8b9ad 100644 --- a/addons/interact_menu/functions/fnc_addActionToObject.sqf +++ b/addons/interact_menu/functions/fnc_addActionToObject.sqf @@ -3,13 +3,13 @@ * Insert an ACE action to an object, under a certain config path * Note: This function is NOT global. * - * Argument: + * Arguments: * 0: Object the action should be assigned to * 1: Type of action, 0 for actions, 1 for self-actions * 2: Parent path of the new action * 3: Action * - * Return value: + * Return Value: * The entry full path, which can be used to remove the entry, or add children entries . * * Example: diff --git a/addons/interact_menu/functions/fnc_addMainAction.sqf b/addons/interact_menu/functions/fnc_addMainAction.sqf index 4370f4d2ee..43273ef967 100644 --- a/addons/interact_menu/functions/fnc_addMainAction.sqf +++ b/addons/interact_menu/functions/fnc_addMainAction.sqf @@ -2,11 +2,11 @@ * Author: Jonpas, PabstMirror * Makes sure there is a ACE_MainActions on the object type * - * Argument: + * Arguments: * 0: Object classname * 1: Type of action, 0 for actions, 1 for self-actions * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf index 42fcf96cc7..ae066576f7 100644 --- a/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf +++ b/addons/interact_menu/functions/fnc_collectActiveActionTree.sqf @@ -2,13 +2,13 @@ * Author: esteldunedain * Collect a entire tree of active actions * - * Argument: + * Arguments: * 0: Object * 1: Original action tree * 2: Parent path * 3: Distance to base point (will be 0 for self/zeus/in-vehicle) * - * Return value: + * Return Value: * Active children * * Public: No diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 7f2ca38540..4cf657a3bc 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -2,10 +2,10 @@ * Author: NouberNou and esteldunedain * Compile the action menu from config for an object's class * - * Argument: + * Arguments: * 0: Object or class name or * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index eb9727a072..0c5e236f0b 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -2,10 +2,10 @@ * Author: NouberNou and esteldunedain * Compile the self action menu from config for an object's class * - * Argument: + * Arguments: * 0: Object or class name or * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf index 6026735154..c0797269e6 100644 --- a/addons/interact_menu/functions/fnc_compileMenuZeus.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuZeus.sqf @@ -2,10 +2,10 @@ * Author: SilentSpike * Compile the zeus action menu (only to be done once) * - * Argument: + * Arguments: * nil * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf index db31200c47..b7616b9718 100644 --- a/addons/interact_menu/functions/fnc_createAction.sqf +++ b/addons/interact_menu/functions/fnc_createAction.sqf @@ -3,7 +3,7 @@ * Creates an isolated ACE action * Note: This function is NOT global. * - * Argument: + * Arguments: * 0: Action name * 1: Name of the action shown in the menu * 2: Icon @@ -16,7 +16,7 @@ * 9: Other parameters [showDisabled,enableInside,canCollapse,runOnHover,doNotCheckLOS] (Optional) * 10: Modifier function (Optional) * - * Return value: + * Return Value: * Action * * Example: diff --git a/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf b/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf index 1c4e535d66..38e5a42460 100644 --- a/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf +++ b/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf @@ -2,12 +2,12 @@ * Author: commy2 * Sets the controls structured text if it isn't already set. * - * Argument: + * Arguments: * 0: Structured Text Ctrl * 1: Index * 2: Text * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/interact_menu/functions/fnc_findActionNode.sqf b/addons/interact_menu/functions/fnc_findActionNode.sqf index edd0cace04..c328e03f39 100644 --- a/addons/interact_menu/functions/fnc_findActionNode.sqf +++ b/addons/interact_menu/functions/fnc_findActionNode.sqf @@ -3,11 +3,11 @@ * Return action point from path * Note: This function is NOT global. * - * Argument: + * Arguments: * 0: List of Action Tree * 1: Path * - * Return value: + * Return Value: * Action node or if not found * * Example: diff --git a/addons/interact_menu/functions/fnc_handlePlayerChanged.sqf b/addons/interact_menu/functions/fnc_handlePlayerChanged.sqf index d8ad91c434..f995ffa454 100644 --- a/addons/interact_menu/functions/fnc_handlePlayerChanged.sqf +++ b/addons/interact_menu/functions/fnc_handlePlayerChanged.sqf @@ -2,11 +2,11 @@ * Author: commy2 * Disables firing while the menu is opened. Called from playerChanged eh. * - * Argument: + * Arguments: * 0: New unit to add the addAction eh * 1: Old unit to remove the addAction eh * - * Return value: + * Return Value: * None */ #include "script_component.hpp" diff --git a/addons/interact_menu/functions/fnc_isSubPath.sqf b/addons/interact_menu/functions/fnc_isSubPath.sqf index 53d88eb9d1..5933e2c462 100644 --- a/addons/interact_menu/functions/fnc_isSubPath.sqf +++ b/addons/interact_menu/functions/fnc_isSubPath.sqf @@ -2,11 +2,11 @@ * Author: esteldunedain * Check if the first path is a subpath of the other * - * Argument: + * Arguments: * 0: LongPath * 1: ShortPath * - * Return value: + * Return Value: * Bool * * Example: diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index 4d9f0af4db..c1c7789a64 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -2,10 +2,10 @@ * Author: NouberNou and esteldunedain * Handle interactions key down * - * Argument: + * Arguments: * 0: Type of key: 0 interaction / 1 self interaction * - * Return value: + * Return Value: * true * * Public: No diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index b6eae6f527..6a43c8e559 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -2,10 +2,10 @@ * Author: NouberNou and esteldunedain * Handle interactions key up * - * Argument: + * Arguments: * 0: Type of key: 0 interaction / 1 self interaction * - * Return value: + * Return Value: * true * * Public: No diff --git a/addons/interact_menu/functions/fnc_removeActionFromClass.sqf b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf index a01078ad3b..f3db5fc8c3 100644 --- a/addons/interact_menu/functions/fnc_removeActionFromClass.sqf +++ b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf @@ -2,12 +2,12 @@ * Author: esteldunedain * Removes an action from a class * - * Argument: + * Arguments: * 0: TypeOf of the class * 1: Type of action, 0 for actions, 1 for self-actions * 2: Full path of the new action * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/interact_menu/functions/fnc_removeActionFromObject.sqf b/addons/interact_menu/functions/fnc_removeActionFromObject.sqf index e630bf4ad1..3b720d3c71 100644 --- a/addons/interact_menu/functions/fnc_removeActionFromObject.sqf +++ b/addons/interact_menu/functions/fnc_removeActionFromObject.sqf @@ -2,12 +2,12 @@ * Author: commy2, NouberNou and esteldunedain * Removes an action from an object * - * Argument: + * Arguments: * 0: Object the action is assigned to * 1: Type of action, 0 for actions, 1 for self-actions * 2: Full path of the action to remove * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 00745a406f..221ddb7ba9 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -2,10 +2,10 @@ * Author: NouberNou and esteldunedain * Render all available nearby interactions * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index d3df02ca40..21aec3f24c 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -2,10 +2,10 @@ * Author: NouberNou and esteldunedain * Render all action points * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index 57ded33be0..512779fe82 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -2,12 +2,12 @@ * Author: NouberNou and esteldunedain * Render the interaction menu for a base action * - * Argument: + * Arguments: * 0: Object * 1: Action node * 2: 3D position or 2D position (Optional) * - * Return value: + * Return Value: * Was the menu rendered * * Public: No diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 9ead5c65cf..ceeeb9991d 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -2,13 +2,13 @@ * Author: NouberNou and esteldunedain * Render a single interaction icon * - * Argument: + * Arguments: * 0: Text * 1: Icon * 2: 2d position * 3: Text Settings * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index f975db17f1..687c56d2c3 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -2,13 +2,13 @@ * Author: NouberNou and esteldunedain * Render an interaction menu and it's children recursively * - * Argument: + * Arguments: * 0: Parent path * 1: Action data * 2: 2D position * 3: Angle range available for rendering * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/interact_menu/functions/fnc_renderSelector.sqf b/addons/interact_menu/functions/fnc_renderSelector.sqf index 69f8a81b95..ef10456b5a 100644 --- a/addons/interact_menu/functions/fnc_renderSelector.sqf +++ b/addons/interact_menu/functions/fnc_renderSelector.sqf @@ -2,11 +2,11 @@ * Author: esteldunedain * Render a single interaction icon * - * Argument: + * Arguments: * 0: 2d position * 1: Icon * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/interact_menu/functions/fnc_setupTextColors.sqf b/addons/interact_menu/functions/fnc_setupTextColors.sqf index cbdd56fb07..120c5b18e3 100644 --- a/addons/interact_menu/functions/fnc_setupTextColors.sqf +++ b/addons/interact_menu/functions/fnc_setupTextColors.sqf @@ -2,10 +2,10 @@ * Author: PabstMirror * Builds color strings needed for displaying interaction text * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/interact_menu/functions/fnc_splitPath.sqf b/addons/interact_menu/functions/fnc_splitPath.sqf index ba07dc1d9e..eba203aa6f 100644 --- a/addons/interact_menu/functions/fnc_splitPath.sqf +++ b/addons/interact_menu/functions/fnc_splitPath.sqf @@ -2,10 +2,10 @@ * Author: esteldunedain * Take full path and split it between parent path and action name * - * Argument: + * Arguments: * Full path of the action to remove * - * Return value: + * Return Value: * 0: Parent path * 1: Action name * diff --git a/addons/interaction/functions/fnc_canJoinTeam.sqf b/addons/interaction/functions/fnc_canJoinTeam.sqf index b91a5abd5c..7732e164e7 100644 --- a/addons/interaction/functions/fnc_canJoinTeam.sqf +++ b/addons/interaction/functions/fnc_canJoinTeam.sqf @@ -6,7 +6,7 @@ * 0: Player * 1: Target * - * Return value: + * Return Value: * Able to join a team * * Example: diff --git a/addons/interaction/functions/fnc_getWeaponPos.sqf b/addons/interaction/functions/fnc_getWeaponPos.sqf index 58c8756076..d0db3cee77 100644 --- a/addons/interaction/functions/fnc_getWeaponPos.sqf +++ b/addons/interaction/functions/fnc_getWeaponPos.sqf @@ -5,7 +5,7 @@ * Arguments: * None (uses local variable _target) * - * Return value: + * Return Value: * Children actions * * Example: diff --git a/addons/interaction/functions/fnc_hideMouseHint.sqf b/addons/interaction/functions/fnc_hideMouseHint.sqf index 709b798fed..757fe952e5 100644 --- a/addons/interaction/functions/fnc_hideMouseHint.sqf +++ b/addons/interaction/functions/fnc_hideMouseHint.sqf @@ -5,7 +5,7 @@ * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/interaction/functions/fnc_showMouseHint.sqf b/addons/interaction/functions/fnc_showMouseHint.sqf index 57c8a7bf50..821abda14e 100644 --- a/addons/interaction/functions/fnc_showMouseHint.sqf +++ b/addons/interaction/functions/fnc_showMouseHint.sqf @@ -7,7 +7,7 @@ * 1: Right Click Text * 2: Scroll Text (Optional) * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/interaction/functions/fnc_switchLamp.sqf b/addons/interaction/functions/fnc_switchLamp.sqf index 20a2d45dea..9b5a6ab6bb 100644 --- a/addons/interaction/functions/fnc_switchLamp.sqf +++ b/addons/interaction/functions/fnc_switchLamp.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Lamp * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/laser/functions/fnc_laserOff.sqf b/addons/laser/functions/fnc_laserOff.sqf index 7899ec1253..c310eb73c9 100644 --- a/addons/laser/functions/fnc_laserOff.sqf +++ b/addons/laser/functions/fnc_laserOff.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: UUID (from laserOn) * - * Return value: + * Return Value: * None */ diff --git a/addons/laser/functions/fnc_laserOn.sqf b/addons/laser/functions/fnc_laserOn.sqf index e44671e856..c34ef495c8 100644 --- a/addons/laser/functions/fnc_laserOn.sqf +++ b/addons/laser/functions/fnc_laserOn.sqf @@ -10,7 +10,7 @@ * 4: Laser code * 5: Beam divergence (in mils off beam center). * - * Return value: + * Return Value: * String, UUID for sending to laserOff function. */ diff --git a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf index 45b60a69c1..f43541b56f 100644 --- a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf +++ b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf @@ -9,7 +9,7 @@ * 3: Seeker wavelength sensitivity range, [1550,1550] is common eye safe. * 4: Seeker laser code. * - * Return value: + * Return Value: * Array, [Strongest compatible laser spot ASL pos, owner object] Nil array values if nothing found. */ diff --git a/addons/laser/functions/fnc_unitTurretCanLockLaser.sqf b/addons/laser/functions/fnc_unitTurretCanLockLaser.sqf index a82e42400a..9fe478f623 100644 --- a/addons/laser/functions/fnc_unitTurretCanLockLaser.sqf +++ b/addons/laser/functions/fnc_unitTurretCanLockLaser.sqf @@ -2,10 +2,10 @@ * Author: jaynus * Checks if the turret occupied by the given unit can lock a laser designator and select laser code. * - * Argument: + * Arguments: * 0: Unit * - * Return value: + * Return Value: * Has designator? */ #include "script_component.hpp" diff --git a/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf b/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf index 091c4f7acf..5357a99c37 100644 --- a/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf +++ b/addons/laser/functions/fnc_vanillaLaserSeekerHandler.sqf @@ -2,11 +2,11 @@ * Author: jaynus * Handler function for laser network code. * - * Argument: + * Arguments: * 0: Emitter * 1: Owner * - * Return value: + * Return Value: * [position, direction] */ //#define DEBUG_MODE_FULL diff --git a/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf b/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf index 955f1ea51d..d3ba242b85 100644 --- a/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf +++ b/addons/laser_selfdesignate/functions/fnc_findLaserSource.sqf @@ -2,7 +2,7 @@ * Author: jaynus * Handler function for laser network code. * - * Argument: + * Arguments: * 0: Emitter * * Return Value: diff --git a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf index 300811cba2..28624eafc8 100644 --- a/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf +++ b/addons/laser_selfdesignate/functions/fnc_laserHudDesignateOff.sqf @@ -2,7 +2,7 @@ * Author: jaynus * Turns off passed laser self designation. * - * Argument: + * Arguments: * 0: Shooter, player shooting the laser * 1: LaserUUID, the UUID of the laser returned by EFUNC(laser,laserOn) * 2: Local laser target, unused. diff --git a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf index 88cd0ff275..f8a18438e9 100644 --- a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf +++ b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf @@ -2,11 +2,11 @@ * Author: PabstMirror, commy2, esteldunedain, Ruthberg * Gets magazine children for interaciton menu. * - * Argument: + * Arguments: * 0: Target * 1: Player * - * Return value: + * Return Value: * ChildActions * * Example: diff --git a/addons/map/functions/fnc_compileFlashlightMenu.sqf b/addons/map/functions/fnc_compileFlashlightMenu.sqf index 836b483a20..5b91f15ca4 100644 --- a/addons/map/functions/fnc_compileFlashlightMenu.sqf +++ b/addons/map/functions/fnc_compileFlashlightMenu.sqf @@ -7,7 +7,7 @@ * 1: Player * 3: Parameters * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/map/functions/fnc_flashlightGlow.sqf b/addons/map/functions/fnc_flashlightGlow.sqf index 799b99e3d2..07567b9079 100644 --- a/addons/map/functions/fnc_flashlightGlow.sqf +++ b/addons/map/functions/fnc_flashlightGlow.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Flashlight classname ("" for off) * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/map/functions/fnc_getUnitFlashlights.sqf b/addons/map/functions/fnc_getUnitFlashlights.sqf index 41874cc0ca..eeaf504156 100644 --- a/addons/map/functions/fnc_getUnitFlashlights.sqf +++ b/addons/map/functions/fnc_getUnitFlashlights.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Unit to check * - * Return value: + * Return Value: * Flashlight classnames (empty for none) * * Example: diff --git a/addons/map/functions/fnc_switchFlashlight.sqf b/addons/map/functions/fnc_switchFlashlight.sqf index e177f886fa..e270ee0c11 100644 --- a/addons/map/functions/fnc_switchFlashlight.sqf +++ b/addons/map/functions/fnc_switchFlashlight.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Flashlight classname ("" for off) * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/maptools/functions/fnc_addLineMarker.sqf b/addons/maptools/functions/fnc_addLineMarker.sqf index 017dc5b494..bc3e74b797 100644 --- a/addons/maptools/functions/fnc_addLineMarker.sqf +++ b/addons/maptools/functions/fnc_addLineMarker.sqf @@ -8,7 +8,7 @@ * 2: Marker end pos * 3: Color index * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/maptools/functions/fnc_calculateMapScale.sqf b/addons/maptools/functions/fnc_calculateMapScale.sqf index 018edf68d9..a3b925e014 100644 --- a/addons/maptools/functions/fnc_calculateMapScale.sqf +++ b/addons/maptools/functions/fnc_calculateMapScale.sqf @@ -5,7 +5,7 @@ * Arguments: * None * - * Return value: + * Return Value: * No * * Public: No diff --git a/addons/maptools/functions/fnc_canDraw.sqf b/addons/maptools/functions/fnc_canDraw.sqf index da55043d85..35bf4eb3f2 100644 --- a/addons/maptools/functions/fnc_canDraw.sqf +++ b/addons/maptools/functions/fnc_canDraw.sqf @@ -5,7 +5,7 @@ * Arguments: * None * - * Return value: + * Return Value: * * * Public: No diff --git a/addons/maptools/functions/fnc_canUseMapGPS.sqf b/addons/maptools/functions/fnc_canUseMapGPS.sqf index 381136a1cc..a327c2bc8d 100644 --- a/addons/maptools/functions/fnc_canUseMapGPS.sqf +++ b/addons/maptools/functions/fnc_canUseMapGPS.sqf @@ -5,7 +5,7 @@ * Arguments: * None * - * Return value: + * Return Value: * * * Public: No diff --git a/addons/maptools/functions/fnc_canUseMapTools.sqf b/addons/maptools/functions/fnc_canUseMapTools.sqf index 7658c2c1d2..8c16425082 100644 --- a/addons/maptools/functions/fnc_canUseMapTools.sqf +++ b/addons/maptools/functions/fnc_canUseMapTools.sqf @@ -5,7 +5,7 @@ * Arguments: * None * - * Return value: + * Return Value: * * * Public: No diff --git a/addons/maptools/functions/fnc_cancelDrawing.sqf b/addons/maptools/functions/fnc_cancelDrawing.sqf index bc80602cfc..203e0831b9 100644 --- a/addons/maptools/functions/fnc_cancelDrawing.sqf +++ b/addons/maptools/functions/fnc_cancelDrawing.sqf @@ -5,7 +5,7 @@ * Arguments: * None * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf b/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf index 6c3c706208..644ad00ac8 100644 --- a/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf +++ b/addons/maptools/functions/fnc_copyMapReceiveMarkers.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Array of markers to copy * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/maptools/functions/fnc_copyMapRemoteSend.sqf b/addons/maptools/functions/fnc_copyMapRemoteSend.sqf index 551019f900..e909391715 100644 --- a/addons/maptools/functions/fnc_copyMapRemoteSend.sqf +++ b/addons/maptools/functions/fnc_copyMapRemoteSend.sqf @@ -3,10 +3,10 @@ * * Send Map markers to other player * - * Argument: + * Arguments: * 0: Target player (Unit) * - * Return value: + * Return Value: * Return */ diff --git a/addons/maptools/functions/fnc_copyMapStart.sqf b/addons/maptools/functions/fnc_copyMapStart.sqf index 7295f6f499..c0178b54db 100644 --- a/addons/maptools/functions/fnc_copyMapStart.sqf +++ b/addons/maptools/functions/fnc_copyMapStart.sqf @@ -11,7 +11,7 @@ * handeled by: copyMapRemoteSend: triggers event "drawing_sendbackMarkers" on origin * handeled by: copyMapReceiveMarkers * - * Return value: + * Return Value: * Return */ diff --git a/addons/maptools/functions/fnc_handleKeyDown.sqf b/addons/maptools/functions/fnc_handleKeyDown.sqf index a83522ac91..5102771dc2 100644 --- a/addons/maptools/functions/fnc_handleKeyDown.sqf +++ b/addons/maptools/functions/fnc_handleKeyDown.sqf @@ -9,7 +9,7 @@ * 3: Ctrl Key (boolean) * 4: Alt Key (boolean) * - * Return value: + * Return Value: * Boolean, true if event was handled */ diff --git a/addons/maptools/functions/fnc_handleMouseButton.sqf b/addons/maptools/functions/fnc_handleMouseButton.sqf index cb1a4598ad..d8f9eb5cca 100644 --- a/addons/maptools/functions/fnc_handleMouseButton.sqf +++ b/addons/maptools/functions/fnc_handleMouseButton.sqf @@ -2,11 +2,11 @@ * Author: esteldunedain * Handle mouse buttons. * - * Argument: + * Arguments: * 0: 1 if mouse down down, 0 if mouse button up (Number) * 1: Parameters of the mouse button event * - * Return value: + * Return Value: * Boolean, true if event was handled */ diff --git a/addons/maptools/functions/fnc_handleMouseMove.sqf b/addons/maptools/functions/fnc_handleMouseMove.sqf index b27087290b..2819ca0353 100644 --- a/addons/maptools/functions/fnc_handleMouseMove.sqf +++ b/addons/maptools/functions/fnc_handleMouseMove.sqf @@ -2,11 +2,11 @@ * Author: esteldunedain * Handle mouse movement over the map tool. * - * Argument: + * Arguments: * 0: Map Control * 1: Mouse position on screen coordinates * - * Return value: + * Return Value: * Boolean, true if event was handled */ diff --git a/addons/maptools/functions/fnc_handleMouseZChanged.sqf b/addons/maptools/functions/fnc_handleMouseZChanged.sqf index 0af86a81c5..2b9e969e47 100644 --- a/addons/maptools/functions/fnc_handleMouseZChanged.sqf +++ b/addons/maptools/functions/fnc_handleMouseZChanged.sqf @@ -3,11 +3,11 @@ * * Handle mouse wheel. * - * Argument: + * Arguments: * 0: Control * 1: Scroll Amount * - * Return value: + * Return Value: * Boolean, true if event was handled */ diff --git a/addons/maptools/functions/fnc_isInsideMapTool.sqf b/addons/maptools/functions/fnc_isInsideMapTool.sqf index eeaf8f346a..0eaa9c40ef 100644 --- a/addons/maptools/functions/fnc_isInsideMapTool.sqf +++ b/addons/maptools/functions/fnc_isInsideMapTool.sqf @@ -6,7 +6,7 @@ * 0: x Position (in meters) * 1: y Position (in meters) * - * Return value: + * Return Value: * Boolean */ #include "script_component.hpp" diff --git a/addons/maptools/functions/fnc_openMapGps.sqf b/addons/maptools/functions/fnc_openMapGps.sqf index dc2df07b57..56c96d4e4b 100644 --- a/addons/maptools/functions/fnc_openMapGps.sqf +++ b/addons/maptools/functions/fnc_openMapGps.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Open GPS? * - * Return value: + * Return Value: * Nothing * * Public: No diff --git a/addons/maptools/functions/fnc_removeLineMarker.sqf b/addons/maptools/functions/fnc_removeLineMarker.sqf index bd0a16adb1..f2be5436cc 100644 --- a/addons/maptools/functions/fnc_removeLineMarker.sqf +++ b/addons/maptools/functions/fnc_removeLineMarker.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: Marker Name * - * Return value: + * Return Value: * Return */ diff --git a/addons/maptools/functions/fnc_updateLineMarker.sqf b/addons/maptools/functions/fnc_updateLineMarker.sqf index 12aee5b1df..de7ab6e87c 100644 --- a/addons/maptools/functions/fnc_updateLineMarker.sqf +++ b/addons/maptools/functions/fnc_updateLineMarker.sqf @@ -8,7 +8,7 @@ * 2: Marker end pos * 3: Color index * - * Return value: + * Return Value: * None */ #include "script_component.hpp" diff --git a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf index 530d213773..99275f0721 100644 --- a/addons/maptools/functions/fnc_updateMapToolMarkers.sqf +++ b/addons/maptools/functions/fnc_updateMapToolMarkers.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: The Map * - * Return value: + * Return Value: * Nothing * * Public: No diff --git a/addons/medical/functions/fnc_addUnloadPatientActions.sqf b/addons/medical/functions/fnc_addUnloadPatientActions.sqf index f29b3923f1..9a8220f781 100644 --- a/addons/medical/functions/fnc_addUnloadPatientActions.sqf +++ b/addons/medical/functions/fnc_addUnloadPatientActions.sqf @@ -2,12 +2,12 @@ * Author: esteldunedain * Create one unload action per unconscious passenger * - * Argument: + * Arguments: * 0: Vehicle * 1: Player * 3: Parameters * - * Return value: + * Return Value: * Children actions * * Public: No diff --git a/addons/microdagr/functions/fnc_openDisplay.sqf b/addons/microdagr/functions/fnc_openDisplay.sqf index aa2db94827..21ddf884c6 100644 --- a/addons/microdagr/functions/fnc_openDisplay.sqf +++ b/addons/microdagr/functions/fnc_openDisplay.sqf @@ -3,7 +3,7 @@ * Changes the display mode of the microDAGR * * Arguments: - * 0: Display Mode to show the microDAGR in + * 0: Display Mode to show the microDAGR in (optional) * * Return Value: * None diff --git a/addons/missileguidance/functions/fnc_checkLos.sqf b/addons/missileguidance/functions/fnc_checkLos.sqf index f21a841367..7962409625 100644 --- a/addons/missileguidance/functions/fnc_checkLos.sqf +++ b/addons/missileguidance/functions/fnc_checkLos.sqf @@ -2,11 +2,11 @@ * Author: jaynus * Returns whether the seeker object can see the target position with lineIntersect * - * Argument: + * Arguments: * 0: Seeker [Object] * 1: Target [Object] * - * Return value: + * Return Value: * Boolean */ #include "script_component.hpp" diff --git a/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf b/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf index e8bc1a16f5..6327892fa1 100644 --- a/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf +++ b/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf @@ -3,12 +3,12 @@ * Returns whether the target position is within the maximum angle FOV of the provided seeker * objects current direction. * - * Argument: + * Arguments: * 0: Seeker [Object] * 1: Target [Position] * 2: Max Angle [Degrees] * - * Return value: + * Return Value: * Boolean */ diff --git a/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf b/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf index 16016f06e6..5116a44d71 100644 --- a/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf +++ b/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf @@ -6,7 +6,7 @@ * 0: static * 1: unit * 2: time to load - * 3: magazineClassOptional + * 3: magazineClassOptional (optional) * * Return Value: * None diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index f031882da7..0c313d572e 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -11,7 +11,7 @@ * 5: Draw rank * 6: Draw soundwave * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/overheating/functions/fnc_calculateCooling.sqf b/addons/overheating/functions/fnc_calculateCooling.sqf index 955c41441e..ced682d6d7 100644 --- a/addons/overheating/functions/fnc_calculateCooling.sqf +++ b/addons/overheating/functions/fnc_calculateCooling.sqf @@ -2,12 +2,12 @@ * Author: esteldunedain * Calculate the cooling down of a weapon over a time interval. * - * Argument: + * Arguments: * 0: Initial temperature * 1: Barrel mass * 2: Time interval * - * Return value: + * Return Value: * Final temperature * * Example: diff --git a/addons/overheating/functions/fnc_firedEH.sqf b/addons/overheating/functions/fnc_firedEH.sqf index 5bd725b74d..e392190bb0 100644 --- a/addons/overheating/functions/fnc_firedEH.sqf +++ b/addons/overheating/functions/fnc_firedEH.sqf @@ -2,10 +2,10 @@ * Author: Commy2 and esteldunedain * Handle weapon fire. Called from the unified fired EH 1- always for the local player 2- and for non local players if dispersion is simulated. * - * Argument: + * Arguments: * None. Parameters inherited from EFUNC(common,firedEH) * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/overheating/functions/fnc_getWeaponData.sqf b/addons/overheating/functions/fnc_getWeaponData.sqf index e7da350e91..b1525f0f41 100644 --- a/addons/overheating/functions/fnc_getWeaponData.sqf +++ b/addons/overheating/functions/fnc_getWeaponData.sqf @@ -2,10 +2,10 @@ * Author: PabstMirror and esteldunedain * Get weapon data with caching * - * Argument: + * Arguments: * 0: weapon type * - * Return value: + * Return Value: * 0: dispresion * 1: slowdownFactor * 2: jamChance diff --git a/addons/overheating/functions/fnc_handleTakeEH.sqf b/addons/overheating/functions/fnc_handleTakeEH.sqf index ffcead342f..b4eecbf236 100644 --- a/addons/overheating/functions/fnc_handleTakeEH.sqf +++ b/addons/overheating/functions/fnc_handleTakeEH.sqf @@ -3,12 +3,12 @@ * Handle "take" event * I think it fixs jams when manually dragging a new magazine in from player's inventory * - * Argument: + * Arguments: * 0: unit - Object the event handler is assigned to * 1: container * 2: item * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/overheating/functions/fnc_jamWeapon.sqf b/addons/overheating/functions/fnc_jamWeapon.sqf index 4e42f769f7..ec860e5cf6 100644 --- a/addons/overheating/functions/fnc_jamWeapon.sqf +++ b/addons/overheating/functions/fnc_jamWeapon.sqf @@ -2,11 +2,11 @@ * Author: Commy2, based on KK_fnc_playerWeaponMulfunction from KillzoneKid * Jam the weapon * - * Argument: + * Arguments: * 0: Unit * 1: Weapon * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/overheating/functions/fnc_loadCoolestSpareBarrel.sqf b/addons/overheating/functions/fnc_loadCoolestSpareBarrel.sqf index 7887a87ce6..a208c603e3 100644 --- a/addons/overheating/functions/fnc_loadCoolestSpareBarrel.sqf +++ b/addons/overheating/functions/fnc_loadCoolestSpareBarrel.sqf @@ -3,14 +3,14 @@ * Collect the temperature of all the spare barrels a unit has and load the * coolest on the unit weapon. Runs on the server. * - * Argument: + * Arguments: * 0: Unit that has the spare barrels * 1: Unit that has the weapon * 2: Weapon * 3: Weapon temp before switching * 4: Mass of the removed barrel * - * Return value: + * Return Value: * None * * diff --git a/addons/overheating/functions/fnc_overheat.sqf b/addons/overheating/functions/fnc_overheat.sqf index 57a4bd7cba..84ab7e152f 100644 --- a/addons/overheating/functions/fnc_overheat.sqf +++ b/addons/overheating/functions/fnc_overheat.sqf @@ -2,7 +2,7 @@ * Author: Commy2 and esteldunedain * Handle weapon fire, heat up the weapon * - * Argument: + * Arguments: * 0: Unit * 1: Weapon * 3: Muzzle @@ -10,7 +10,7 @@ * 5: Magazine * 6: Projectile * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf b/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf index 2ff248016d..6e229faaf5 100644 --- a/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf +++ b/addons/overheating/functions/fnc_sendSpareBarrelsTemperaturesHint.sqf @@ -3,11 +3,11 @@ * Collect the temperature of all the spare barrels a unit has and send a hint * to a client. Runs on the server. * - * Argument: + * Arguments: * 0: Target unit of the hint * 1: Unit that has the spare barrels * - * Return value: + * Return Value: * None * * diff --git a/addons/overheating/functions/fnc_swapBarrel.sqf b/addons/overheating/functions/fnc_swapBarrel.sqf index a63ef5a36a..b904936403 100644 --- a/addons/overheating/functions/fnc_swapBarrel.sqf +++ b/addons/overheating/functions/fnc_swapBarrel.sqf @@ -2,12 +2,12 @@ * Author: Commy2 * Make a unit start swapping it's barrel * - * Argument: + * Arguments: * 0: Unit initiating the action * 1: Unit that has the weapon * 2: Weapon * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/overheating/functions/fnc_swapBarrelAssistant.sqf b/addons/overheating/functions/fnc_swapBarrelAssistant.sqf index 5e3c31fc5e..30d9a3d044 100644 --- a/addons/overheating/functions/fnc_swapBarrelAssistant.sqf +++ b/addons/overheating/functions/fnc_swapBarrelAssistant.sqf @@ -2,12 +2,12 @@ * Author: esteldunedain, Commy2 * Make a unit start swapping the barrel of another unit * - * Argument: + * Arguments: * 0: Unit initiating the action * 1: Unit that has the weapon * 2: Weapon * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/overheating/functions/fnc_swapBarrelCallback.sqf b/addons/overheating/functions/fnc_swapBarrelCallback.sqf index 01a0bde8ce..21b8dbdc03 100644 --- a/addons/overheating/functions/fnc_swapBarrelCallback.sqf +++ b/addons/overheating/functions/fnc_swapBarrelCallback.sqf @@ -2,12 +2,12 @@ * Author: Commy2, esteldunedain * Swap barrel callback * - * Argument: + * Arguments: * 0: Unit initiating the action * 1: Unit that has the weapon * 2: Weapon * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/overheating/functions/fnc_updateSpareBarrelsTemperaturesThread.sqf b/addons/overheating/functions/fnc_updateSpareBarrelsTemperaturesThread.sqf index 602de01c3b..0bb240533c 100644 --- a/addons/overheating/functions/fnc_updateSpareBarrelsTemperaturesThread.sqf +++ b/addons/overheating/functions/fnc_updateSpareBarrelsTemperaturesThread.sqf @@ -2,10 +2,10 @@ * Author: esteldunedain * Calculate cooldown of all the stored spare barrels. * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/overheating/functions/fnc_updateTemperature.sqf b/addons/overheating/functions/fnc_updateTemperature.sqf index d5e29a150b..51b4b13ae3 100644 --- a/addons/overheating/functions/fnc_updateTemperature.sqf +++ b/addons/overheating/functions/fnc_updateTemperature.sqf @@ -2,12 +2,12 @@ * Author: esteldunedain * Update temperature of a weapon. * - * Argument: + * Arguments: * 0: Unit * 1: Weapon * 2: Heat increment (J) * - * Return value: + * Return Value: * Current temperature * * Example: diff --git a/addons/overheating/functions/fnc_updateTemperatureThread.sqf b/addons/overheating/functions/fnc_updateTemperatureThread.sqf index 476ff3e352..1d1574b1ed 100644 --- a/addons/overheating/functions/fnc_updateTemperatureThread.sqf +++ b/addons/overheating/functions/fnc_updateTemperatureThread.sqf @@ -2,10 +2,10 @@ * Author: esteldunedain * Update cooldown calculation of all player weapons at regular intervals. * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf index 273843ce8f..4b447b5012 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -3,12 +3,12 @@ * Cache the shot data for a given weapon/mag/ammo combination. * Will use the config that has the highest priority. * - * Argument: + * Arguments: * 0: Weapon * 1: Magazine * 2: Ammo * - * Return value: + * Return Value: * Shot Config : * 0: Angle * 1: Range diff --git a/addons/overpressure/functions/fnc_firedEHBB.sqf b/addons/overpressure/functions/fnc_firedEHBB.sqf index 8dc15e0f0a..fe1005ebad 100644 --- a/addons/overpressure/functions/fnc_firedEHBB.sqf +++ b/addons/overpressure/functions/fnc_firedEHBB.sqf @@ -5,7 +5,7 @@ * Arguments: * None. Parameters inherited from EFUNC(common,firedEH) * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/overpressure/functions/fnc_firedEHOP.sqf b/addons/overpressure/functions/fnc_firedEHOP.sqf index dff9215a52..0669077782 100644 --- a/addons/overpressure/functions/fnc_firedEHOP.sqf +++ b/addons/overpressure/functions/fnc_firedEHOP.sqf @@ -5,7 +5,7 @@ * Arguments: * None. Parameters inherited from EFUNC(common,firedEH) * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/overpressure/functions/fnc_getDistance.sqf b/addons/overpressure/functions/fnc_getDistance.sqf index 616feb8660..febb4ea747 100644 --- a/addons/overpressure/functions/fnc_getDistance.sqf +++ b/addons/overpressure/functions/fnc_getDistance.sqf @@ -8,7 +8,7 @@ * 2: Max distance to search * 3: Shooter * - * Return value: + * Return Value: * Distance to intersection (999 if distance is greater than max) * * Example: diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index 3b8d4ea6f2..5852cf3bfd 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -3,7 +3,7 @@ * Calculate and apply backblast damage to potentially affected local units * Handles the "overpressure" event. * - * Argument: + * Arguments: * 0: Unit that fired * 1: Pos ASL of the projectile * 2: Direction of the projectile (reversed for launcher backblast) @@ -11,7 +11,7 @@ * 4: Magazine * 5: Ammo * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/rearm/functions/fnc_addMagazineToSupply.sqf b/addons/rearm/functions/fnc_addMagazineToSupply.sqf index f2ccae8653..55188408d1 100644 --- a/addons/rearm/functions/fnc_addMagazineToSupply.sqf +++ b/addons/rearm/functions/fnc_addMagazineToSupply.sqf @@ -2,12 +2,12 @@ * Author: GitHawk * Adds magazines to the supply. * - * Argument: + * Arguments: * 0: Ammo Truck * 1: Magazine Classname - * 2: Only partial + * 2: Only partial (optional) * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/rearm/functions/fnc_addRearmActions.sqf b/addons/rearm/functions/fnc_addRearmActions.sqf index a7bf5d0171..d69c2bfee7 100644 --- a/addons/rearm/functions/fnc_addRearmActions.sqf +++ b/addons/rearm/functions/fnc_addRearmActions.sqf @@ -2,10 +2,10 @@ * Author: GitHawk * Show the resupplyable ammunition of all surrounding vehicles. * - * Argument: + * Arguments: * 0: Target * - * Return value: + * Return Value: * ChildActions * * Example: diff --git a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf index 3f38dcdc97..f5496ca343 100644 --- a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf +++ b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf @@ -2,14 +2,14 @@ * Author: GitHawk * Adds all magazines of a vehicle to the supply. * - * Argument: + * Arguments: * 0: Ammo Truck * 1: Vehicle * or * 0: Ammo Truck * 1: Vehicle class * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/rearm/functions/fnc_disable.sqf b/addons/rearm/functions/fnc_disable.sqf index 2398039595..4f7a6e81ff 100644 --- a/addons/rearm/functions/fnc_disable.sqf +++ b/addons/rearm/functions/fnc_disable.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Vehicle - * 1: Disable + * 1: Disable (optional) * * Return Value: * None diff --git a/addons/rearm/functions/fnc_dropAmmo.sqf b/addons/rearm/functions/fnc_dropAmmo.sqf index 861b5db31d..8c1336476d 100644 --- a/addons/rearm/functions/fnc_dropAmmo.sqf +++ b/addons/rearm/functions/fnc_dropAmmo.sqf @@ -4,8 +4,8 @@ * * Arguments: * 0: Unit - * 1: Delete dummy object - * 2: Unholster Weapon + * 1: Delete dummy object (optional) + * 2: Unholster Weapon (optional) * * Return Value: * None diff --git a/addons/rearm/functions/fnc_getCaliber.sqf b/addons/rearm/functions/fnc_getCaliber.sqf index fdff5a9480..7a07b9a1db 100644 --- a/addons/rearm/functions/fnc_getCaliber.sqf +++ b/addons/rearm/functions/fnc_getCaliber.sqf @@ -2,10 +2,10 @@ * Author: GitHawk * Get the caliber of the ammo in a magazine and return its parameters. * - * Argument: + * Arguments: * 0: Magazine Classname * - * Return value: + * Return Value: * 0: Caliber information * 0: Rounded caliber * 1: Caliber index diff --git a/addons/rearm/functions/fnc_getSupplyCount.sqf b/addons/rearm/functions/fnc_getSupplyCount.sqf index f53f447657..4c4cb4f81d 100644 --- a/addons/rearm/functions/fnc_getSupplyCount.sqf +++ b/addons/rearm/functions/fnc_getSupplyCount.sqf @@ -2,10 +2,10 @@ * Author: GitHawk * Get the supply count. * - * Argument: + * Arguments: * 0: Ammo Truck * - * Return value: + * Return Value: * Supply count * * Example: diff --git a/addons/rearm/functions/fnc_hasEnoughSupply.sqf b/addons/rearm/functions/fnc_hasEnoughSupply.sqf index db2814ca9e..a4f5e04217 100644 --- a/addons/rearm/functions/fnc_hasEnoughSupply.sqf +++ b/addons/rearm/functions/fnc_hasEnoughSupply.sqf @@ -2,11 +2,11 @@ * Author: GitHawk * Check whether enough supply is left to take the magazine. * - * Argument: + * Arguments: * 0: Ammo Truck * 1: Magazine Classname * - * Return value: + * Return Value: * Enough supply * * Example: diff --git a/addons/rearm/functions/fnc_magazineInSupply.sqf b/addons/rearm/functions/fnc_magazineInSupply.sqf index 2cd6f3da67..627534219e 100644 --- a/addons/rearm/functions/fnc_magazineInSupply.sqf +++ b/addons/rearm/functions/fnc_magazineInSupply.sqf @@ -2,11 +2,11 @@ * Author: GitHawk * Returns true if the magazine is in the current supply * - * Argument: + * Arguments: * 0: Ammo Truck * 1: Magazine Classname * - * Return value: + * Return Value: * Magazine in supply * * Example: @@ -38,5 +38,5 @@ if (GVAR(supply) == 2) exitWith { _magazinePresent }; -// With infinite supply, the is always one left +// With infinite supply, there is always one left true diff --git a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf index ed19bfb53f..967f6000cf 100644 --- a/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf +++ b/addons/rearm/functions/fnc_removeMagazineFromSupply.sqf @@ -2,12 +2,12 @@ * Author: GitHawk * Removes a magazine from the supply. * - * Argument: + * Arguments: * 0: Ammo Truck * 1: Magazine Classname - * 2: Number of Rounds to withdraw + * 2: Number of Rounds to withdraw (optional) * - * Return value: + * Return Value: * Magazine was removed * * Example: diff --git a/addons/rearm/functions/fnc_setSupplyCount.sqf b/addons/rearm/functions/fnc_setSupplyCount.sqf index b4deea7a74..c106d0ee5a 100644 --- a/addons/rearm/functions/fnc_setSupplyCount.sqf +++ b/addons/rearm/functions/fnc_setSupplyCount.sqf @@ -2,11 +2,11 @@ * Author: GitHawk * Sets the supply count. * - * Argument: + * Arguments: * 0: Ammo Truck * 1: Supply Count * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/reload/functions/fnc_canCheckAmmo.sqf b/addons/reload/functions/fnc_canCheckAmmo.sqf index 41a46ea465..7f38e3fbfa 100644 --- a/addons/reload/functions/fnc_canCheckAmmo.sqf +++ b/addons/reload/functions/fnc_canCheckAmmo.sqf @@ -2,11 +2,11 @@ * Author: CAA-Picard * Check if the player can check the ammo of the target. * - * Argument: + * Arguments: * 0: Unit * 1: Target * - * Return value: + * Return Value: * Can link belt * * Example: diff --git a/addons/reload/functions/fnc_canLinkBelt.sqf b/addons/reload/functions/fnc_canLinkBelt.sqf index 13fad4d460..7d25b5ea22 100644 --- a/addons/reload/functions/fnc_canLinkBelt.sqf +++ b/addons/reload/functions/fnc_canLinkBelt.sqf @@ -2,11 +2,11 @@ * Author: esteldunedain * Check if the target has an MG equiped with belt system that the player can link * - * Argument: + * Arguments: * 0: Player * 1: Target * - * Return value: + * Return Value: * Can link belt */ #include "script_component.hpp" diff --git a/addons/reload/functions/fnc_checkAmmo.sqf b/addons/reload/functions/fnc_checkAmmo.sqf index 8edfd172c0..49a1f0728d 100644 --- a/addons/reload/functions/fnc_checkAmmo.sqf +++ b/addons/reload/functions/fnc_checkAmmo.sqf @@ -2,11 +2,11 @@ * Author: commy2 and esteldunedain * Count the ammo of the currently loaded magazine or count rifle grenades. Play animation and display message. * - * Argument: + * Arguments: * 0: Player * 1: Target. Optional, if not suplied the player counts his personal or static weapon ammo * - * Return value: + * Return Value: * Nothing */ #include "script_component.hpp" diff --git a/addons/reload/functions/fnc_displayAmmo.sqf b/addons/reload/functions/fnc_displayAmmo.sqf index 7fff5564c0..6aa8f013d9 100644 --- a/addons/reload/functions/fnc_displayAmmo.sqf +++ b/addons/reload/functions/fnc_displayAmmo.sqf @@ -2,10 +2,10 @@ * Author: commy2 and esteldunedain * Display the ammo of the currently loaded magazine of the target or count rifle grenades. * - * Argument: + * Arguments: * 0: Target * - * Return value: + * Return Value: * Nothing */ #include "script_component.hpp" diff --git a/addons/reload/functions/fnc_startLinkingBelt.sqf b/addons/reload/functions/fnc_startLinkingBelt.sqf index 5924e1b4e1..c39d9ffb4b 100644 --- a/addons/reload/functions/fnc_startLinkingBelt.sqf +++ b/addons/reload/functions/fnc_startLinkingBelt.sqf @@ -2,11 +2,11 @@ * Author: esteldunedain * Start linking the belt * - * Argument: + * Arguments: * 0: Player * 1: Target * - * Return value: + * Return Value: * None */ #include "script_component.hpp" diff --git a/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf b/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf index f6cd923845..6a9d779d02 100644 --- a/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf +++ b/addons/reloadlaunchers/functions/fnc_addMissileReloadActions.sqf @@ -2,11 +2,11 @@ * Author: commy2 * Create one action per reloadable missile * - * Argument: + * Arguments: * 1: Target (Object) * 0: Player (Object) * - * Return value: + * Return Value: * Children actions (Array) * * Public: No diff --git a/addons/reloadlaunchers/functions/fnc_canLoad.sqf b/addons/reloadlaunchers/functions/fnc_canLoad.sqf index 116a900092..5072d44a48 100644 --- a/addons/reloadlaunchers/functions/fnc_canLoad.sqf +++ b/addons/reloadlaunchers/functions/fnc_canLoad.sqf @@ -2,13 +2,13 @@ * Author: commy2 * Check of the unit can reload the launcher of target unit. * - * Argument: + * Arguments: * 0: Unit to do the reloading (Object) * 1: Unit eqipped with launcher (Object) * 2: weapon name (String) * 3: missile name (String) * - * Return value: + * Return Value: * NONE * * Public: No diff --git a/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf b/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf index f466490b64..40766a5905 100644 --- a/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf +++ b/addons/reloadlaunchers/functions/fnc_getLoadableMissiles.sqf @@ -2,11 +2,11 @@ * Author: commy2 * Return all magazine types from reloaders inventory that are compatible with given weapon. * - * Argument: + * Arguments: * 0: Unit to to the reload (Object) * 1: A launcher (String) * - * Return value: + * Return Value: * Reloable magazines (Array) * * Public: No diff --git a/addons/reloadlaunchers/functions/fnc_load.sqf b/addons/reloadlaunchers/functions/fnc_load.sqf index db18e7edaa..4005871a3e 100644 --- a/addons/reloadlaunchers/functions/fnc_load.sqf +++ b/addons/reloadlaunchers/functions/fnc_load.sqf @@ -2,13 +2,13 @@ * Author: commy2 * Reload a launcher * - * Argument: + * Arguments: * 0: Unit with magazine (Object) * 1: Unit with launcher (Object) * 2: weapon name (String) * 3: missile name (String) * - * Return value: + * Return Value: * NONE * * Public: No diff --git a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf index 2aec180d22..96db7cdca5 100644 --- a/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf +++ b/addons/reloadlaunchers/functions/fnc_reloadLauncher.sqf @@ -2,13 +2,13 @@ * Author: commy2 * Reload a launcher * - * Argument: + * Arguments: * 0: Unit to do the reloading (Object) * 1: Target to rload (Object) * 2: weapon name (String) * 3: missile name (String) * - * Return value: + * Return Value: * NONE * * Public: No diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index 5b0c6d11a6..9a38ef40cb 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -2,12 +2,12 @@ * Author: KoffeinFlummi, Ruthberg * Changes the adjustment for the current scope * - * Argument: + * Arguments: * 0: Unit * 1: Turret and Direction * 2: Major Step * - * Return value: + * Return Value: * Did we adjust anything? * * Example: diff --git a/addons/scopes/functions/fnc_adjustZero.sqf b/addons/scopes/functions/fnc_adjustZero.sqf index 363407e090..9e953d0523 100644 --- a/addons/scopes/functions/fnc_adjustZero.sqf +++ b/addons/scopes/functions/fnc_adjustZero.sqf @@ -2,10 +2,10 @@ * Author: KoffeinFlummi, Ruthberg * Updates the zero reference for the current scope * - * Argument: + * Arguments: * 0: Unit * - * Return value: + * Return Value: * true * * Example: diff --git a/addons/scopes/functions/fnc_applyScopeAdjustment.sqf b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf index af2f018e11..7067b0442c 100644 --- a/addons/scopes/functions/fnc_applyScopeAdjustment.sqf +++ b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf @@ -2,13 +2,13 @@ * Author: KoffeinFlummi, Ruthberg * Applies the adjustment for the current scope * - * Argument: + * Arguments: * 0: Unit * 1: Absolute elevation * 2: Absolute windage * 3: Absolute zero reference * - * Return value: + * Return Value: * True * * Example: diff --git a/addons/scopes/functions/fnc_canAdjustZero.sqf b/addons/scopes/functions/fnc_canAdjustZero.sqf index 36ea4ac793..477dc12635 100644 --- a/addons/scopes/functions/fnc_canAdjustZero.sqf +++ b/addons/scopes/functions/fnc_canAdjustZero.sqf @@ -2,10 +2,10 @@ * Author: KoffeinFlummi, Ruthberg * Changes the adjustment for the current scope * - * Argument: + * Arguments: * 0: Unit * - * Return value: + * Return Value: * Can we update the zero reference? * * Example: diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index 07eadb5620..444b768eb5 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -2,10 +2,10 @@ * Author: KoffeinFlummi, esteldunedain * Adjusts the flight path of the bullet according to the zeroing. Called from the unified fired EH only for local and non-local players on foot. * - * Argument: + * Arguments: * None. Parameters inherited from EFUNC(common,firedEH) * - * Return value: + * Return Value: * None * * Public: No diff --git a/addons/spectator/functions/fnc_toggleInterface.sqf b/addons/spectator/functions/fnc_toggleInterface.sqf index 31472702fc..cbc6091ae4 100644 --- a/addons/spectator/functions/fnc_toggleInterface.sqf +++ b/addons/spectator/functions/fnc_toggleInterface.sqf @@ -4,12 +4,12 @@ * * Arguments: * 0: Display - * 1: Toogle compass - * 2: Toogle help - * 3: Toogle interface - * 4: Toogle map - * 5: Toogle toolbar - * 6: Toogle unit list + * 1: Toogle compass (optional) + * 2: Toogle help (optional) + * 3: Toogle interface (optional) + * 4: Toogle map (optional) + * 5: Toogle toolbar (optional) + * 6: Toogle unit list (optional) * * Return Value: * None diff --git a/addons/spottingscope/functions/fnc_pickup.sqf b/addons/spottingscope/functions/fnc_pickup.sqf index cdcc78bea3..1a15bd7880 100644 --- a/addons/spottingscope/functions/fnc_pickup.sqf +++ b/addons/spottingscope/functions/fnc_pickup.sqf @@ -6,7 +6,7 @@ * 0: spotting scope * 1: unit * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/spottingscope/functions/fnc_place.sqf b/addons/spottingscope/functions/fnc_place.sqf index 21560f948f..07daa51e9a 100644 --- a/addons/spottingscope/functions/fnc_place.sqf +++ b/addons/spottingscope/functions/fnc_place.sqf @@ -6,7 +6,7 @@ * 0: unit * 1: scope class * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/tripod/functions/fnc_adjust.sqf b/addons/tripod/functions/fnc_adjust.sqf index 2b8659b2a4..b12f713ace 100644 --- a/addons/tripod/functions/fnc_adjust.sqf +++ b/addons/tripod/functions/fnc_adjust.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: tripod * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/tripod/functions/fnc_pickup.sqf b/addons/tripod/functions/fnc_pickup.sqf index 9a291480ad..dc8b990515 100644 --- a/addons/tripod/functions/fnc_pickup.sqf +++ b/addons/tripod/functions/fnc_pickup.sqf @@ -6,7 +6,7 @@ * 0: unit * 1: tripod * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/tripod/functions/fnc_place.sqf b/addons/tripod/functions/fnc_place.sqf index 64dc0786e8..b4b6790ef6 100644 --- a/addons/tripod/functions/fnc_place.sqf +++ b/addons/tripod/functions/fnc_place.sqf @@ -6,7 +6,7 @@ * 0: unit * 1: tripod class * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/weather/functions/fnc_displayWindInfo.sqf b/addons/weather/functions/fnc_displayWindInfo.sqf index 5ea69c59a0..10a1e45861 100644 --- a/addons/weather/functions/fnc_displayWindInfo.sqf +++ b/addons/weather/functions/fnc_displayWindInfo.sqf @@ -2,10 +2,10 @@ * Author: Ruthberg * Displays a wind info (colored arrow) in the top left corner of the screen * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/weather/functions/fnc_getMapData.sqf b/addons/weather/functions/fnc_getMapData.sqf index e1b56f2ed2..08a6f38568 100644 --- a/addons/weather/functions/fnc_getMapData.sqf +++ b/addons/weather/functions/fnc_getMapData.sqf @@ -2,10 +2,10 @@ * Author: Ruthberg, esteldunedain * Get the weather data for the current map * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/weather/functions/fnc_getWind.sqf b/addons/weather/functions/fnc_getWind.sqf index 7c08e813e1..2d29335026 100644 --- a/addons/weather/functions/fnc_getWind.sqf +++ b/addons/weather/functions/fnc_getWind.sqf @@ -2,10 +2,10 @@ * Author: ACE2 Team, Ruthberg * Calculate current wind locally from the data broadcasted by the server * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * Wind * * Example: diff --git a/addons/weather/functions/fnc_initWind.sqf b/addons/weather/functions/fnc_initWind.sqf index ddd314c0c6..634542c1e4 100644 --- a/addons/weather/functions/fnc_initWind.sqf +++ b/addons/weather/functions/fnc_initWind.sqf @@ -2,10 +2,10 @@ * Author: Ruthberg * Inits the wind variables on mission start * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/weather/functions/fnc_serverController.sqf b/addons/weather/functions/fnc_serverController.sqf index 9791049914..79d2aab93e 100644 --- a/addons/weather/functions/fnc_serverController.sqf +++ b/addons/weather/functions/fnc_serverController.sqf @@ -2,10 +2,10 @@ * Author: Ruthberg * Gather weather parameters and broadcast them to the clients * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/weather/functions/fnc_updateAceWeather.sqf b/addons/weather/functions/fnc_updateAceWeather.sqf index 3f2f9a356c..db8783cd83 100644 --- a/addons/weather/functions/fnc_updateAceWeather.sqf +++ b/addons/weather/functions/fnc_updateAceWeather.sqf @@ -2,10 +2,10 @@ * Author: ACE2 Team, esteldunedain, ruthberg * Updates the wind and rain evolution on the server. Broadcasts the current and next values to the clients * - * Argument: + * Arguments: * None * - * Return value: + * Return Value: * None * * Example: diff --git a/addons/weather/functions/fnc_updateHumidity.sqf b/addons/weather/functions/fnc_updateHumidity.sqf index 66a351096c..acd103615b 100644 --- a/addons/weather/functions/fnc_updateHumidity.sqf +++ b/addons/weather/functions/fnc_updateHumidity.sqf @@ -2,10 +2,10 @@ * Author: ACE2 Team * Updates GVAR(currentHumidity) * - * Argument: + * Arguments: * Nothing * - * Return value: + * Return Value: * Nothing * * Example: diff --git a/addons/weather/functions/fnc_updateRain.sqf b/addons/weather/functions/fnc_updateRain.sqf index ccacb09955..b073a6a24c 100644 --- a/addons/weather/functions/fnc_updateRain.sqf +++ b/addons/weather/functions/fnc_updateRain.sqf @@ -2,10 +2,10 @@ * Author: ACE2 Team, Ruthberg * Updates rain based on ACE_RAIN_PARAMS * - * Argument: + * Arguments: * Nothing * - * Return value: + * Return Value: * Nothing * * Example: diff --git a/addons/weather/functions/fnc_updateTemperature.sqf b/addons/weather/functions/fnc_updateTemperature.sqf index 9ff11859f4..6f2d911c15 100644 --- a/addons/weather/functions/fnc_updateTemperature.sqf +++ b/addons/weather/functions/fnc_updateTemperature.sqf @@ -2,10 +2,10 @@ * Author: ACE2 Team * Updates GVAR(currentTemperature) based on the map data * - * Argument: + * Arguments: * Nothing * - * Return value: + * Return Value: * Nothing * * Example: diff --git a/addons/weather/functions/fnc_updateWind.sqf b/addons/weather/functions/fnc_updateWind.sqf index 75724e3674..72ae0470ba 100644 --- a/addons/weather/functions/fnc_updateWind.sqf +++ b/addons/weather/functions/fnc_updateWind.sqf @@ -2,10 +2,10 @@ * Author: ACE2 Team, Ruthberg * Updates wind, gusts and waves based on ACE_wind * - * Argument: + * Arguments: * Nothing * - * Return value: + * Return Value: * Nothing * * Example: From bc90a85bcd6a402921e83802ee1ca64f9ac6fdc6 Mon Sep 17 00:00:00 2001 From: GitHawk Date: Tue, 7 Jun 2016 10:26:22 +0200 Subject: [PATCH 014/826] Improvements --- .../fnc_addVehicleMagazinesToSupply.sqf | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf index f5496ca343..6d87c81823 100644 --- a/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf +++ b/addons/rearm/functions/fnc_addVehicleMagazinesToSupply.sqf @@ -4,10 +4,7 @@ * * Arguments: * 0: Ammo Truck - * 1: Vehicle - * or - * 0: Ammo Truck - * 1: Vehicle class + * 1: Vehicle or Vehicle class * * Return Value: * None @@ -26,16 +23,12 @@ params [ ]; if (isNull _truck || - {typeName _vehicle == "OBJECT" && {isNull _vehicle}}) exitWith {}; + {_vehicle isEqualType objNull}) exitWith {}; -private _string = ""; -if (typeName _vehicle == "OBJECT") then { - _string = typeOf _vehicle; +private _string = [_vehicle, typeOf _vehicle] select (_vehicle isEqualType objNull); +if (_string == "") exitWith { + ACE_ERRORFORMAT("_string is empty in ace_rearm_fnc_addVehicleMagazinesToSupply"); }; -if (typeName _vehicle == "STRING") then { - _string = _vehicle; -}; -if (_string == "") exitWith {}; { private _turretPath = _x; private _magazines = [_string, _turretPath] call FUNC(getConfigMagazines); From 8e004741b92ed4a0b92a15d76645485071a0a8e7 Mon Sep 17 00:00:00 2001 From: GitHawk Date: Tue, 7 Jun 2016 11:13:42 +0200 Subject: [PATCH 015/826] Cleanup --- README.md | 10 +- .../fnc_getChildrenAttachActions.sqf | 2 +- .../functions/fnc_canStopEscorting.sqf | 1 + addons/cargo/functions/fnc_canUnloadItem.sqf | 2 +- .../functions/fnc_displayTextStructured.sqf | 2 +- addons/common/functions/fnc_dumpArray.sqf | 2 +- .../functions/fnc_findUnloadPosition.sqf | 6 +- addons/common/functions/fnc_showHud.sqf | 4 +- .../functions/fnc_unloadPersonLocal.sqf | 2 +- .../functions/fnc_disarmDropItems.sqf | 2 +- addons/hearing/functions/fnc_updateVolume.sqf | 2 +- .../functions/fnc_createAction.sqf | 12 +- .../microdagr/functions/fnc_openDisplay.sqf | 2 +- .../functions/fnc_loadMagazineTimer.sqf | 2 +- addons/rearm/CfgVehicles.hpp | 4 +- optionals/compat_adr_97/$PBOPREFIX$ | 1 + optionals/compat_adr_97/CfgAmmo.hpp | 14 ++ optionals/compat_adr_97/CfgMagazines.hpp | 7 + optionals/compat_adr_97/CfgWeapons.hpp | 67 ++++++ optionals/compat_adr_97/config.cpp | 18 ++ optionals/compat_adr_97/script_component.hpp | 5 + optionals/compat_adr_97/stringtable.xml | 221 ++++++++++++++++++ optionals/compat_r3f/config.cpp | 4 +- optionals/compat_rh_acc/config.cpp | 4 +- optionals/compat_rh_de/config.cpp | 4 +- optionals/compat_rh_m4/config.cpp | 4 +- optionals/compat_rh_pdw/config.cpp | 4 +- optionals/compat_rhs_afrf3/CfgAmmo.hpp | 18 +- .../compat_rhs_afrf3/CfgEventHandlers.hpp | 11 + optionals/compat_rhs_afrf3/CfgVehicles.hpp | 56 ++++- optionals/compat_rhs_afrf3/XEH_PREP.hpp | 2 + optionals/compat_rhs_afrf3/XEH_preInit.sqf | 7 + optionals/compat_rhs_afrf3/XEH_preStart.sqf | 3 + optionals/compat_rhs_afrf3/config.cpp | 5 +- .../compat_rhs_afrf3/functions/fnc_onCut.sqf | 23 ++ .../functions/fnc_onPrepare.sqf | 23 ++ .../functions/script_component.hpp | 1 + .../compat_rhs_afrf3/script_component.hpp | 2 +- optionals/compat_rhs_usf3/CfgAmmo.hpp | 3 +- .../compat_rhs_usf3/CfgEventHandlers.hpp | 11 + optionals/compat_rhs_usf3/CfgVehicles.hpp | 115 ++++++++- optionals/compat_rhs_usf3/CfgWeapons.hpp | 4 +- optionals/compat_rhs_usf3/XEH_PREP.hpp | 3 + optionals/compat_rhs_usf3/XEH_preInit.sqf | 7 + optionals/compat_rhs_usf3/XEH_preStart.sqf | 3 + optionals/compat_rhs_usf3/config.cpp | 5 +- .../functions/fnc_canCloseDoor.sqf | 30 +++ .../compat_rhs_usf3/functions/fnc_onCut.sqf | 36 +++ .../functions/fnc_onPrepare.sqf | 38 +++ .../functions/script_component.hpp | 1 + .../compat_rhs_usf3/script_component.hpp | 2 +- optionals/compat_rksl_pm_ii/config.cpp | 4 +- optionals/compat_sma3_iansky/config.cpp | 4 +- optionals/noactionmenu/config.cpp | 5 +- optionals/server/config.cpp | 5 +- optionals/tracers/config.cpp | 5 +- tools/config_style_checker.py | 157 +++++++++++++ tools/setup.py | 18 +- tools/sqf_validator.py | 6 +- 59 files changed, 954 insertions(+), 67 deletions(-) create mode 100644 optionals/compat_adr_97/$PBOPREFIX$ create mode 100644 optionals/compat_adr_97/CfgAmmo.hpp create mode 100644 optionals/compat_adr_97/CfgMagazines.hpp create mode 100644 optionals/compat_adr_97/CfgWeapons.hpp create mode 100644 optionals/compat_adr_97/config.cpp create mode 100644 optionals/compat_adr_97/script_component.hpp create mode 100644 optionals/compat_adr_97/stringtable.xml create mode 100644 optionals/compat_rhs_afrf3/CfgEventHandlers.hpp create mode 100644 optionals/compat_rhs_afrf3/XEH_PREP.hpp create mode 100644 optionals/compat_rhs_afrf3/XEH_preInit.sqf create mode 100644 optionals/compat_rhs_afrf3/XEH_preStart.sqf create mode 100644 optionals/compat_rhs_afrf3/functions/fnc_onCut.sqf create mode 100644 optionals/compat_rhs_afrf3/functions/fnc_onPrepare.sqf create mode 100644 optionals/compat_rhs_afrf3/functions/script_component.hpp create mode 100644 optionals/compat_rhs_usf3/CfgEventHandlers.hpp create mode 100644 optionals/compat_rhs_usf3/XEH_PREP.hpp create mode 100644 optionals/compat_rhs_usf3/XEH_preInit.sqf create mode 100644 optionals/compat_rhs_usf3/XEH_preStart.sqf create mode 100644 optionals/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf create mode 100644 optionals/compat_rhs_usf3/functions/fnc_onCut.sqf create mode 100644 optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf create mode 100644 optionals/compat_rhs_usf3/functions/script_component.hpp create mode 100644 tools/config_style_checker.py diff --git a/README.md b/README.md index f91634f6d4..37b5f2a626 100644 --- a/README.md +++ b/README.md @@ -3,15 +3,15 @@

- - ACE3 Version - - - ACE3 Download + + ACE3 Version ACE3 Issues + + ACE3 Downloads + BIF Thread diff --git a/addons/attach/functions/fnc_getChildrenAttachActions.sqf b/addons/attach/functions/fnc_getChildrenAttachActions.sqf index 0b2e4e705c..a903250b05 100644 --- a/addons/attach/functions/fnc_getChildrenAttachActions.sqf +++ b/addons/attach/functions/fnc_getChildrenAttachActions.sqf @@ -8,7 +8,7 @@ * 1: Player * * Return Value: - * ChildActiosn + * ChildActions * * Example: * [player, player] call ace_attach_fnc_getChildrenAttachActions diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index 28b018491b..3ecaffecab 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -4,6 +4,7 @@ * * Arguments: * 0: caller (player) + * 1: target (optional) * * Return Value: * The return value diff --git a/addons/cargo/functions/fnc_canUnloadItem.sqf b/addons/cargo/functions/fnc_canUnloadItem.sqf index be14f71a76..da8ced5557 100644 --- a/addons/cargo/functions/fnc_canUnloadItem.sqf +++ b/addons/cargo/functions/fnc_canUnloadItem.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: loaded Object * 1: Object - * 2: Unloader (player) (optional) + * 2: Unloader (player) (optional) * * Return Value: * Can be unloaded diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 5d42f00875..3037a218cc 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -6,7 +6,7 @@ * 0: Text * 1: Size of the textbox (default: 1.5) * 2: Target Unit. Will only display if target is the player controlled object (default: ACE_player) - * 3: Custom Width (optional) + * 3: Custom Width (optional) * * Return Value: * None diff --git a/addons/common/functions/fnc_dumpArray.sqf b/addons/common/functions/fnc_dumpArray.sqf index b60cede087..4fd26ef099 100644 --- a/addons/common/functions/fnc_dumpArray.sqf +++ b/addons/common/functions/fnc_dumpArray.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Array to be dumped - * 1: Depth (optional) + * 1: Depth (optional) * * Return Value: * None diff --git a/addons/common/functions/fnc_findUnloadPosition.sqf b/addons/common/functions/fnc_findUnloadPosition.sqf index dbb554d6d3..7433873b0b 100644 --- a/addons/common/functions/fnc_findUnloadPosition.sqf +++ b/addons/common/functions/fnc_findUnloadPosition.sqf @@ -6,9 +6,9 @@ * Arguments: * 0: Source Vehicle * 1: Cargo Classname - * 2: Unloader (player) (optional) - * 3: Max Distance (meters) (optional) - * 4: Check Vehicle is Stable (optional) + * 2: Unloader (player) (optional) + * 3: Max Distance (meters) (optional) + * 4: Check Vehicle is Stable (optional) * * Return Value: * Unload PositionAGL (Can Be [] if no valid pos found) diff --git a/addons/common/functions/fnc_showHud.sqf b/addons/common/functions/fnc_showHud.sqf index a79636ed16..23d7e9638e 100644 --- a/addons/common/functions/fnc_showHud.sqf +++ b/addons/common/functions/fnc_showHud.sqf @@ -4,8 +4,8 @@ * Bitwise AND Logic (a single false in a mask will make it false) * * Arguments: - * 0: Source ID (optional) - * 1: Show Hud Bool Array (8 to set, empty to remove) (optional) + * 0: Source ID (optional) + * 1: Show Hud Bool Array (8 to set, empty to remove) (optional) * - [hud, info, radar, compass, direction, menu, group, cursors] * - hud: Boolean - show scripted HUD (same as normal showHUD true/false) * - info: Boolean - show vehicle + soldier info (hides weapon info from the HUD as well) diff --git a/addons/common/functions/fnc_unloadPersonLocal.sqf b/addons/common/functions/fnc_unloadPersonLocal.sqf index 280c9875d7..9c7d73c154 100644 --- a/addons/common/functions/fnc_unloadPersonLocal.sqf +++ b/addons/common/functions/fnc_unloadPersonLocal.sqf @@ -5,7 +5,7 @@ * Arguments: * 0: unit to unload * 1: Vehicle - * 2: Unloader (player) (optional) + * 2: Unloader (player) (optional) * * Return Value: * Returns true if succesfully unloaded person diff --git a/addons/disarming/functions/fnc_disarmDropItems.sqf b/addons/disarming/functions/fnc_disarmDropItems.sqf index 9e9829dd0f..d063d4bcd3 100644 --- a/addons/disarming/functions/fnc_disarmDropItems.sqf +++ b/addons/disarming/functions/fnc_disarmDropItems.sqf @@ -7,7 +7,7 @@ * 0: caller (player) * 1: target * 2: classnamess - * 3: Do Not Drop Ammo (optional) + * 3: Do Not Drop Ammo (optional) * * Return Value: * Nothing diff --git a/addons/hearing/functions/fnc_updateVolume.sqf b/addons/hearing/functions/fnc_updateVolume.sqf index af0483ae9c..aa2181ade0 100644 --- a/addons/hearing/functions/fnc_updateVolume.sqf +++ b/addons/hearing/functions/fnc_updateVolume.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Args - * -----0: Just update volume (skip ringing/recovery) (optional) + * -----0: Just update volume (skip ringing/recovery) (optional) * * Return Value: * None diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf index b7616b9718..9d86f81d16 100644 --- a/addons/interact_menu/functions/fnc_createAction.sqf +++ b/addons/interact_menu/functions/fnc_createAction.sqf @@ -9,12 +9,12 @@ * 2: Icon * 3: Statement * 4: Condition - * 5: Insert children code (Optional) - * 6: Action parameters (Optional) - * 7: Position (Position array, Position code or Selection Name) , or (Optional) - * 8: Distance (Optional) - * 9: Other parameters [showDisabled,enableInside,canCollapse,runOnHover,doNotCheckLOS] (Optional) - * 10: Modifier function (Optional) + * 5: Insert children code (optional) + * 6: Action parameters (optional) + * 7: Position (Position array, Position code or Selection Name) , or (optional) + * 8: Distance (optional) + * 9: Other parameters [showDisabled,enableInside,canCollapse,runOnHover,doNotCheckLOS] (optional) + * 10: Modifier function (optional) * * Return Value: * Action diff --git a/addons/microdagr/functions/fnc_openDisplay.sqf b/addons/microdagr/functions/fnc_openDisplay.sqf index 21ddf884c6..90aeabdb78 100644 --- a/addons/microdagr/functions/fnc_openDisplay.sqf +++ b/addons/microdagr/functions/fnc_openDisplay.sqf @@ -3,7 +3,7 @@ * Changes the display mode of the microDAGR * * Arguments: - * 0: Display Mode to show the microDAGR in (optional) + * 0: Display Mode to show the microDAGR in (optional) * * Return Value: * None diff --git a/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf b/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf index 5116a44d71..866aea6206 100644 --- a/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf +++ b/addons/mk6mortar/functions/fnc_loadMagazineTimer.sqf @@ -6,7 +6,7 @@ * 0: static * 1: unit * 2: time to load - * 3: magazineClassOptional (optional) + * 3: magazineClassOptional (optional) * * Return Value: * None diff --git a/addons/rearm/CfgVehicles.hpp b/addons/rearm/CfgVehicles.hpp index 2da86c27fc..b02d9a280f 100644 --- a/addons/rearm/CfgVehicles.hpp +++ b/addons/rearm/CfgVehicles.hpp @@ -14,8 +14,8 @@ }; #define MACRO_REARM_TRUCK_ACTIONS \ - class ACE_Actions : ACE_Actions { \ - class ACE_MainActions : ACE_MainActions { \ + class ACE_Actions: ACE_Actions { \ + class ACE_MainActions: ACE_MainActions { \ class GVAR(ReadSupplyCounter) { \ displayName = CSTRING(ReadSupplyCounter); \ distance = REARM_ACTION_DISTANCE; \ diff --git a/optionals/compat_adr_97/$PBOPREFIX$ b/optionals/compat_adr_97/$PBOPREFIX$ new file mode 100644 index 0000000000..55c01af3d5 --- /dev/null +++ b/optionals/compat_adr_97/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\compat_adr_90 \ No newline at end of file diff --git a/optionals/compat_adr_97/CfgAmmo.hpp b/optionals/compat_adr_97/CfgAmmo.hpp new file mode 100644 index 0000000000..32d4deb076 --- /dev/null +++ b/optionals/compat_adr_97/CfgAmmo.hpp @@ -0,0 +1,14 @@ +class CfgAmmo { + class BulletBase; + class B_570x28_Ball: BulletBase { + ACE_caliber = 5.7; + ACE_bulletLength = 21.6; // http://blog.thejustnation.org/2011/04/5-7x28mm-ammo-review/ + ACE_bulletMass = 2; // based on the SS190 + ACE_ballisticCoefficients[] = {0.177}; //http://m.delphiforums.com/autogun/messages/5267/7 + ACE_velocityBoundaries[] = {}; + ACE_standardAtmosphere = "ASM"; // 50/50 chance to get it right + ACE_dragModel = 7; + ACE_muzzleVelocities[] = {716,776}; + ACE_barrelLengths[] = {264,407}; + }; +}; diff --git a/optionals/compat_adr_97/CfgMagazines.hpp b/optionals/compat_adr_97/CfgMagazines.hpp new file mode 100644 index 0000000000..fe88f128fd --- /dev/null +++ b/optionals/compat_adr_97/CfgMagazines.hpp @@ -0,0 +1,7 @@ +class CfgMagazines { + class CA_Magazine; + class 50Rnd_570x28_SMG_03: CA_Magazine { + displayName = CSTRING(P90_Mag_Name); + descriptionShort = CSTRING(P90_Mag_DescriptionShort); + }; +}; \ No newline at end of file diff --git a/optionals/compat_adr_97/CfgWeapons.hpp b/optionals/compat_adr_97/CfgWeapons.hpp new file mode 100644 index 0000000000..d77dcf562e --- /dev/null +++ b/optionals/compat_adr_97/CfgWeapons.hpp @@ -0,0 +1,67 @@ +class CfgWeapons { + + class Rifle_Base_F; + class SMG_03_TR_BASE: Rifle_Base_F { + ACE_barrelTwist = 228.6; // 1:9 inch twist + ACE_barrelLenght = 407; + ACE_twistDirection = 1; + modes[]= { + "Single" + }; + }; + class SMG_03_TR_black: SMG_03_TR_BASE{ + displayName = CSTRING(PS90_TR_Black_Name); + }; + class SMG_03_TR_khaki: SMG_03_TR_black { + displayName = CSTRING(PS90_TR_Khaki_Name); + }; + class SMG_03_TR_camo: SMG_03_TR_black { + displayName = CSTRING(PS90_TR_Camo_Name); + }; + class SMG_03_TR_hex: SMG_03_TR_BASE { + displayName = CSTRING(PS90_TR_Hex_Name); + }; + class SMG_03_black: SMG_03_TR_BASE { + displayName = CSTRING(PS90_Black_Name); + }; + class SMG_03_khaki: SMG_03_black { + displayName = CSTRING(PS90_Khaki_Name); + }; + class SMG_03_camo: SMG_03_black { + displayName = CSTRING(PS90_Camo_Name); + }; + class SMG_03_hex: SMG_03_black { + displayName = CSTRING(PS90_Hex_Name); + }; + class SMG_03C_BASE: SMG_03_TR_BASE { + ACE_barrelLenght = 264; + modes[]= { + "Single", + "FullAuto" + }; + }; + class SMG_03C_TR_black: SMG_03C_BASE { + displayName = CSTRING(P90_TR_Black_Name); + }; + class SMG_03C_TR_khaki: SMG_03C_TR_black { + displayName = CSTRING(P90_TR_Khaki_Name); + }; + class SMG_03C_TR_camo: SMG_03C_TR_black { + displayName = CSTRING(P90_TR_Camo_Name); + }; + class SMG_03C_TR_hex: SMG_03C_TR_black { + displayName = CSTRING(P90_TR_Hex_Name); + }; + class SMG_03C_black: SMG_03C_Base { + displayName = CSTRING(P90_Black_Name); + }; + class SMG_03C_khaki: SMG_03C_black { + displayName = CSTRING(P90_Khaki_Name); + }; + class SMG_03C_camo: SMG_03C_black { + displayName = CSTRING(P90_Camo_Name); + }; + class SMG_03C_hex: SMG_03C_black { + displayName = CSTRING(P90_Hex_Name); + }; +}; diff --git a/optionals/compat_adr_97/config.cpp b/optionals/compat_adr_97/config.cpp new file mode 100644 index 0000000000..aca323c98c --- /dev/null +++ b/optionals/compat_adr_97/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"A3_Weapons_F_Mod"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Nic547"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" +#include "CfgAmmo.hpp" +#include "CfgMagazines.hpp" diff --git a/optionals/compat_adr_97/script_component.hpp b/optionals/compat_adr_97/script_component.hpp new file mode 100644 index 0000000000..4b2da4eadb --- /dev/null +++ b/optionals/compat_adr_97/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT compat_adr_97 + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_adr_97/stringtable.xml b/optionals/compat_adr_97/stringtable.xml new file mode 100644 index 0000000000..bd91b18fa3 --- /dev/null +++ b/optionals/compat_adr_97/stringtable.xml @@ -0,0 +1,221 @@ + + + + + P90 TR (Black) + P90 TR (Černá) + P90 TR (Noir) + P90 TR (Negro) + P90 TR (Чёрный) + P90 TR (czarny) + P90 TR (Schwarz) + P90 TR (Nero) + P90 TR (Fekete) + P90 TR (Preto) + + + P90 TR (Khaki) + P90 TR (Khaki) + P90 TR (Kaki) + P90 TR (Caqui) + P90 TR (Хаки) + P90 TR (khaki) + P90 TR (Khaki) + P90 TR (Khaki) + P90 TR (Khaki) + P90 TR (Caqui) + + + P90 TR (Camo) + P90 TR (Kamufláž) + P90 TR (Camo) + P90 TR (Camuflaje) + P90 TR (Камо) + P90 TR (kamuflaż) + P90 TR (Camo) + P90 TR (Camo) + P90 TR (Terepmintás) + P90 TR (Camuflagem) + + + P90 TR (Hex) + P90 TR (Hex) + P90 TR (Hex) + P90 TR (Hex) + P90 TR (Гекс) + P90 TR (Hex) + P90 TR (hex) + P90 TR (Hex) + P90 TR (Hex) + P90 TR (Hex) + + + P90 (Black) + P90 (Černá) + P90 (Noir) + P90 (Negro) + P90 (Чёрный) + P90 (czarny) + P90 (Schwarz) + P90 (Nero) + P90 (Fekete) + P90 (Preto) + + + P90 (Khaki) + P90 (Khaki) + P90 (Kaki) + P90 (Caqui) + P90 (Хаки) + P90 (khaki) + P90 (Khaki) + P90 (Khaki) + P90 (Khaki) + P90 (Caqui) + + + P90 (Camo) + P90 (Kamufláž) + P90 (Camo) + P90 (Camuflaje) + P90 (Камо) + P90 (kamuflaż) + P90 (Camo) + P90 (Camo) + P90 (Terepmintás) + P90 (Camuflagem) + + + P90 (Hex) + P90 (Hex) + P90 (Hex) + P90 (Hex) + P90 (Гекс) + P90 (Hex) + P90 (hex) + P90 (Hex) + P90 (Hex) + P90 (Hex) + + + PS90 TR (Black) + PS90 TR (Černá) + PS90 TR (Noir) + PS90 TR (Negro) + PS90 TR (Чёрный) + PS90 TR (czarny) + PS90 TR (Schwarz) + PS90 TR (Nero) + PS90 TR (Fekete) + PS90 TR (Preto) + + + PS90 TR (Khaki) + PS90 TR (Khaki) + PS90 TR (Kaki) + PS90 TR (Caqui) + PS90 TR (Хаки) + PS90 TR (khaki) + PS90 TR (Khaki) + PS90 TR (Khaki) + PS90 TR (Khaki) + PS90 TR (Caqui) + + + PS90 TR (Camo) + PS90 TR (Kamufláž) + PS90 TR (Camo) + PS90 TR (Camuflaje) + PS90 TR (Камо) + PS90 TR (kamuflaż) + PS90 TR (Camo) + PS90 TR (Camo) + PS90 TR (Terepmintás) + PS90 TR (Camuflagem) + + + PS90 TR (Hex) + PS90 TR (Hex) + PS90 TR (Hex) + PS90 TR (Hex) + PS90 TR (Гекс) + PS90 TR (Hex) + PS90 TR (hex) + PS90 TR (Hex) + PS90 TR (Hex) + PS90 TR (Hex) + + + PS90 (Black) + PS90 (Černá) + PS90 (Noir) + PS90 (Negro) + PS90 (Чёрный) + PS90 (czarny) + PS90 (Schwarz) + PS90 (Nero) + PS90 (Fekete) + PS90 (Preto) + + + PS90 (Khaki) + PS90 (Khaki) + PS90 (Kaki) + PS90 (Caqui) + PS90 (Хаки) + PS90 (khaki) + PS90 (Khaki) + PS90 (Khaki) + PS90 (Khaki) + PS90 (Caqui) + + + PS90 (Camo) + PS90 (Kamufláž) + PS90 (Camo) + PS90 (Camuflaje) + PS90 (Камо) + PS90 (kamuflaż) + PS90 (Camo) + PS90 (Camo) + PS90 (Terepmintás) + PS90 (Camuflagem) + + + PS90 (Hex) + PS90 (Hex) + PS90 (Hex) + PS90 (Hex) + PS90 (Гекс) + PS90 (Hex) + PS90 (hex) + PS90 (Hex) + PS90 (Hex) + PS90 (Hex) + + + 5.7mm 50Rnd Mag + 5,7mm 50-as Tár + 5,7mm 50-Patronen-Magazin + Cargador de 50 balas SD de 5,7mm + Ch. 5,7mm 50Cps + Magazynek 5,7mm 50rd + 5.7mm 50náb. Zásobník + Carregador de 50 projéteis de 5.7mm + Caricatore 5.7mm 50Rnd + Магазин из 50-ти 5,7 мм + + + Caliber: 5.7mm<br />Rounds: 50<br />Used in: P90 + Kaliber: 5,7mm<br />Patronen: 50<br />Eingesetzt von: P90 + Kaliber: 5,7mm<br />Pociski: 50<br />Używany w: P90 + Calibre: 5.7mm<br />Cartouches: 50<br />Utilisé avec: P90 + Calibre: 5.7mm<br />Balas: 50<br />Se usa en: P90 + Калибр: 5,7 мм<br />Патронов: 50<br />Используются с: P90 + Calibro: 5.7mm<br />Munizioni: 50<br />In uso su: P90 + Ráže: 5.7mm<br />Nábojů: 50<br />Použití u: P90 + Calibre: 5.7mm<br />Cartuchos: 50<br />Usado em: P90 + Kaliber: 5,7mm<br />Lövedékek: 50<br />Használható: P90 + + + diff --git a/optionals/compat_r3f/config.cpp b/optionals/compat_r3f/config.cpp index d5dbc8e68c..c7e42c35ad 100644 --- a/optionals/compat_r3f/config.cpp +++ b/optionals/compat_r3f/config.cpp @@ -6,7 +6,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"R3F_Armes", "R3F_Acc"}; - author[]={"Ruthberg"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/optionals/compat_rh_acc/config.cpp b/optionals/compat_rh_acc/config.cpp index 9f563bd157..b66be68593 100644 --- a/optionals/compat_rh_acc/config.cpp +++ b/optionals/compat_rh_acc/config.cpp @@ -6,7 +6,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"RH_acc"}; - author[]={"Ruthberg"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/optionals/compat_rh_de/config.cpp b/optionals/compat_rh_de/config.cpp index 3d82eab05a..77dc828105 100644 --- a/optionals/compat_rh_de/config.cpp +++ b/optionals/compat_rh_de/config.cpp @@ -6,7 +6,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"RH_de_cfg"}; - author[]={"Ruthberg"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/optionals/compat_rh_m4/config.cpp b/optionals/compat_rh_m4/config.cpp index 9c28be4f89..4bacb9dedf 100644 --- a/optionals/compat_rh_m4/config.cpp +++ b/optionals/compat_rh_m4/config.cpp @@ -6,7 +6,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"RH_m4_cfg"}; - author[]={"Ruthberg"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/optionals/compat_rh_pdw/config.cpp b/optionals/compat_rh_pdw/config.cpp index 4aed0e6241..e3c5d15a07 100644 --- a/optionals/compat_rh_pdw/config.cpp +++ b/optionals/compat_rh_pdw/config.cpp @@ -6,7 +6,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"RH_PDW"}; - author[]={"Ruthberg"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/optionals/compat_rhs_afrf3/CfgAmmo.hpp b/optionals/compat_rhs_afrf3/CfgAmmo.hpp index ead78866c1..0ab559f96c 100644 --- a/optionals/compat_rhs_afrf3/CfgAmmo.hpp +++ b/optionals/compat_rhs_afrf3/CfgAmmo.hpp @@ -39,7 +39,7 @@ class CfgAmmo { ACE_muzzleVelocities[]={700, 800, 820, 833}; ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; - class rhs_B_762x54_Ball_Tracer_Green: B_762x51_Ball { + class rhs_B_762x54_Ball_Tracer_Green: rhs_B_762x54_Ball { ACE_caliber=7.925; ACE_bulletLength=28.956; ACE_bulletMass=9.6552; @@ -202,4 +202,20 @@ class CfgAmmo { ace_frag_skip = 1; ace_frag_force = 0; }; + + class G_40mm_HE; + class rhs_g_vog25: G_40mm_HE {}; + class rhs_g_vg40tb: rhs_g_vog25 { //Thermobaric + ace_frag_force = 0; + }; + class rhs_g_vg40sz: rhs_g_vog25 { //Flashbang + ace_frag_force = 0; + }; + class rhs_GDM40: rhs_g_vog25 { //Smoke + ace_frag_force = 0; + }; + class rhs_g_vg40md_white: rhs_g_vog25 { //Smoke + ace_frag_force = 0; + }; + }; diff --git a/optionals/compat_rhs_afrf3/CfgEventHandlers.hpp b/optionals/compat_rhs_afrf3/CfgEventHandlers.hpp new file mode 100644 index 0000000000..93e3311cf2 --- /dev/null +++ b/optionals/compat_rhs_afrf3/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/optionals/compat_rhs_afrf3/CfgVehicles.hpp b/optionals/compat_rhs_afrf3/CfgVehicles.hpp index d0486ecd0e..34effc0a58 100644 --- a/optionals/compat_rhs_afrf3/CfgVehicles.hpp +++ b/optionals/compat_rhs_afrf3/CfgVehicles.hpp @@ -1,4 +1,4 @@ -class cfgVehicles { +class CfgVehicles { class LandVehicle; class Tank: LandVehicle { class NewTurret; @@ -201,18 +201,70 @@ class cfgVehicles { EGVAR(refuel,fuelCapacity) = 3600; }; - class Heli_Light_02_base_F; + class Helicopter_Base_F; + class Helicopter_Base_H: Helicopter_Base_F { + class EventHandlers; + }; + class Heli_Light_02_base_F: Helicopter_Base_H {}; class RHS_Mi8_base : Heli_Light_02_base_F { EGVAR(refuel,fuelCapacity) = 3700; + EGVAR(fastroping,enabled) = 0; + class EventHandlers: EventHandlers { + class RHS_EventHandlers; + }; + }; + + class RHS_Mi8amt_base: RHS_Mi8_base { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{-1.13, 4.67, -0.89}}; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + + class UserActions { + class openDoor; + class closeDoor_L: openDoor { + condition = QUOTE((this doorPhase 'LeftDoor' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + }; + }; + + class EventHandlers: EventHandlers { + class RHS_EventHandlers: RHS_EventHandlers { + getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_mi8_doors}); + }; + }; + }; + + class RHS_Mi8_VVS_Base: RHS_Mi8_base {}; + class RHS_Mi8mt_vvs: RHS_Mi8_VVS_Base {}; + class RHS_Mi8mt_Cargo_vvs: RHS_Mi8mt_vvs { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{-1.13, 4.67, -0.89}}; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + + class UserActions { + class openDoor_L; + class closeDoor_L: openDoor_L { + condition = QUOTE((this doorPhase 'LeftDoor' > 0.5) && {alive this} && {!(this getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)])}); + }; + }; + + class EventHandlers: EventHandlers { + class RHS_EventHandlers: RHS_EventHandlers { + getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_mi8_doors}); + }; + }; }; class Heli_Attack_02_base_F; class RHS_Ka52_base : Heli_Attack_02_base_F { EGVAR(refuel,fuelCapacity) = 1870; + EGVAR(fastroping,enabled) = 0; }; class RHS_Mi24_base : Heli_Attack_02_base_F { EGVAR(refuel,fuelCapacity) = 1851; + EGVAR(fastroping,enabled) = 0; }; class rhs_t80b : rhs_tank_base { diff --git a/optionals/compat_rhs_afrf3/XEH_PREP.hpp b/optionals/compat_rhs_afrf3/XEH_PREP.hpp new file mode 100644 index 0000000000..cb5a1268d9 --- /dev/null +++ b/optionals/compat_rhs_afrf3/XEH_PREP.hpp @@ -0,0 +1,2 @@ +PREP(onCut); +PREP(onPrepare); diff --git a/optionals/compat_rhs_afrf3/XEH_preInit.sqf b/optionals/compat_rhs_afrf3/XEH_preInit.sqf new file mode 100644 index 0000000000..a7feade1c3 --- /dev/null +++ b/optionals/compat_rhs_afrf3/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +#include "XEH_PREP.hpp" + +ADDON = true; diff --git a/optionals/compat_rhs_afrf3/XEH_preStart.sqf b/optionals/compat_rhs_afrf3/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/optionals/compat_rhs_afrf3/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/optionals/compat_rhs_afrf3/config.cpp b/optionals/compat_rhs_afrf3/config.cpp index 4840f8da82..bf36181ce8 100644 --- a/optionals/compat_rhs_afrf3/config.cpp +++ b/optionals/compat_rhs_afrf3/config.cpp @@ -6,12 +6,15 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"rhs_c_weapons", "rhs_c_troops", "rhs_c_bmd", "rhs_c_bmp", "rhs_c_bmp3", "rhs_c_a2port_armor", "rhs_c_btr", "rhs_c_sprut", "rhs_c_t72", "rhs_c_tanks", "rhs_c_a2port_air", "rhs_c_a2port_car", "rhs_c_cars", "rhs_c_2s3", "rhs_c_rva"}; - author[]={"Ruthberg", "GitHawk"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; #include "CfgAmmo.hpp" +#include "CfgEventHandlers.hpp" #include "CfgMagazines.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" diff --git a/optionals/compat_rhs_afrf3/functions/fnc_onCut.sqf b/optionals/compat_rhs_afrf3/functions/fnc_onCut.sqf new file mode 100644 index 0000000000..6a249a55c4 --- /dev/null +++ b/optionals/compat_rhs_afrf3/functions/fnc_onCut.sqf @@ -0,0 +1,23 @@ +/* + * Author: BaerMitUmlaut + * Function for closing doors and retracting the hooks for RHS USF helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before cutting ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_afrf3_fnc_onCut + * + * Public: No + */ + +#include "script_component.hpp" +params ["_vehicle"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), false, true]; +_vehicle animateDoor ["LeftDoor", 0]; + +2 diff --git a/optionals/compat_rhs_afrf3/functions/fnc_onPrepare.sqf b/optionals/compat_rhs_afrf3/functions/fnc_onPrepare.sqf new file mode 100644 index 0000000000..8a9dc9471e --- /dev/null +++ b/optionals/compat_rhs_afrf3/functions/fnc_onPrepare.sqf @@ -0,0 +1,23 @@ +/* + * Author: BaerMitUmlaut + * Function for opening doors and extending the hook for most vanilla helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before deploying ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_afrf3_fnc_onPrepare + * + * Public: No + */ + +#include "script_component.hpp" +params ["_vehicle"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), true, true]; +_vehicle animateDoor ["LeftDoor", 1]; + +2 diff --git a/optionals/compat_rhs_afrf3/functions/script_component.hpp b/optionals/compat_rhs_afrf3/functions/script_component.hpp new file mode 100644 index 0000000000..afabd202be --- /dev/null +++ b/optionals/compat_rhs_afrf3/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\compat_rhs_afrf3\script_component.hpp" diff --git a/optionals/compat_rhs_afrf3/script_component.hpp b/optionals/compat_rhs_afrf3/script_component.hpp index edf3963b1f..307b1f8de6 100644 --- a/optionals/compat_rhs_afrf3/script_component.hpp +++ b/optionals/compat_rhs_afrf3/script_component.hpp @@ -1,4 +1,4 @@ -#define COMPONENT rhs_c_weapons_comp +#define COMPONENT compat_rhs_afrf3 #include "\z\ace\addons\main\script_mod.hpp" diff --git a/optionals/compat_rhs_usf3/CfgAmmo.hpp b/optionals/compat_rhs_usf3/CfgAmmo.hpp index b830d5e564..930976bf33 100644 --- a/optionals/compat_rhs_usf3/CfgAmmo.hpp +++ b/optionals/compat_rhs_usf3/CfgAmmo.hpp @@ -2,7 +2,8 @@ class CfgAmmo { class BulletBase; - class rhsusf_B_300winmag: BulletBase { + class B_762x54_Ball; + class rhsusf_B_300winmag: B_762x54_Ball { ACE_caliber=7.823; ACE_bulletLength=37.821; ACE_bulletMass=14.256; diff --git a/optionals/compat_rhs_usf3/CfgEventHandlers.hpp b/optionals/compat_rhs_usf3/CfgEventHandlers.hpp new file mode 100644 index 0000000000..93e3311cf2 --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp index 87c66f7212..2d3b28fbae 100644 --- a/optionals/compat_rhs_usf3/CfgVehicles.hpp +++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp @@ -1,4 +1,17 @@ -class cfgVehicles { +#define EQUIP_FRIES_ATTRIBUTE class Attributes { \ + class EGVAR(fastroping,equipFRIES) { \ + property = QEGVAR(fastroping,equipFRIES); \ + control = "Checkbox"; \ + displayName = ECSTRING(fastroping,Eden_equipFRIES); \ + tooltip = ECSTRING(fastroping,Eden_equipFRIES_Tooltip); \ + expression = QUOTE([_this] call EFUNC(fastroping,equipFRIES)); \ + typeName = "BOOL"; \ + condition = "objectVehicle"; \ + defaultValue = false; \ + }; \ +} + +class CfgVehicles { class LandVehicle; class Tank: LandVehicle { class NewTurret; @@ -44,21 +57,117 @@ class cfgVehicles { ace_repair_hitpointGroups[] = {{"era_1_hitpoint", {"era_2_hitpoint", "era_3_hitpoint", "era_4_hitpoint", "era_5_hitpoint", "era_6_hitpoint", "era_7_hitpoint", "era_8_hitpoint", "era_9_hitpoint", "era_10_hitpoint", "era_11_hitpoint", "era_12_hitpoint", "era_13_hitpoint", "era_14_hitpoint", "era_15_hitpoint", "era_16_hitpoint", "era_17_hitpoint", "era_18_hitpoint", "era_19_hitpoint", "era_20_hitpoint", "era_21_hitpoint", "era_22_hitpoint", "era_23_hitpoint", "era_24_hitpoint", "era_25_hitpoint", "era_26_hitpoint", "era_27_hitpoint", "era_28_hitpoint", "era_29_hitpoint", "era_30_hitpoint", "era_31_hitpoint", "era_32_hitpoint", "era_33_hitpoint", "era_34_hitpoint", "era_35_hitpoint", "era_36_hitpoint", "era_37_hitpoint", "era_38_hitpoint", "era_39_hitpoint", "era_40_hitpoint", "era_41_hitpoint", "era_42_hitpoint", "era_43_hitpoint", "era_44_hitpoint", "era_45_hitpoint", "era_46_hitpoint"}}}; }; - class Heli_light_03_base_F; + class Helicopter; + class Helicopter_Base_F: Helicopter { + class Eventhandlers; + }; + class Heli_Light_03_base_F: Helicopter_Base_F {}; class RHS_UH1_Base: Heli_light_03_base_F { EGVAR(refuel,fuelCapacity) = 1447; }; - class Heli_Transport_01_base_F; + class RHS_UH1Y_base: RHS_UH1_Base {}; + class RHS_UH1Y_US_base: RHS_UH1Y_base {}; + class RHS_UH1Y: RHS_UH1Y_US_base { + EGVAR(fastroping,enabled) = 2; + EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 2.38, -0.135}; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; + + class UserActions; + class EventHandlers: EventHandlers { + class RHSUSF_EventHandlers; + }; + + EQUIP_FRIES_ATTRIBUTE; + }; + class RHS_UH1Y_FFAR: RHS_UH1Y { + class UserActions: UserActions { + class OpenCargoDoor; + class CloseCargoDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorRB')] call FUNC(canCloseDoor)); + }; + class CloseCargoLDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorLB')] call FUNC(canCloseDoor)); + }; + }; + + class EventHandlers: EventHandlers { + class RHSUSF_EventHandlers: RHSUSF_EventHandlers { + getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_uh60_doors}); + }; + }; + }; + + class Helicopter_Base_H: Helicopter_Base_F { + class Eventhandlers; + }; + class Heli_Transport_01_base_F: Helicopter_Base_H {}; class RHS_UH60_Base: Heli_Transport_01_base_F { EGVAR(refuel,fuelCapacity) = 1360; }; + class RHS_UH60M_base: RHS_UH60_Base {}; + class RHS_UH60M_US_base: RHS_UH60M_base {}; + class RHS_UH60M: RHS_UH60M_US_base { + EGVAR(fastroping,enabled) = 2; + EGVAR(fastroping,friesType) = "ACE_friesAnchorBar"; + EGVAR(fastroping,friesAttachmentPoint)[] = {0, 1.25, -0.65}; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {"ropeOriginLeft", "ropeOriginRight"}; + + class UserActions { + class OpenCargoDoor; + class CloseCargoDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorRB')] call FUNC(canCloseDoor)); + }; + class CloseCargoLDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'doorLB')] call FUNC(canCloseDoor)); + }; + }; + class EventHandlers: EventHandlers { + class RHSUSF_EventHandlers { + getOut = QUOTE(if !((_this select 0) getVariable [ARR_2(QUOTE(QEGVAR(fastroping,doorsLocked)),false)]) then {_this call rhs_fnc_uh60_doors}); + }; + }; + + EQUIP_FRIES_ATTRIBUTE; + }; + + class RHS_UH60M_MEV: RHS_UH60M { + EGVAR(fastroping,enabled) = 0; + class Attributes { + delete EGVAR(fastroping,equipFRIES); + }; + }; + + class RHS_UH60M_MEV2: RHS_UH60M_MEV { + EGVAR(fastroping,enabled) = 2; + EQUIP_FRIES_ATTRIBUTE; + }; + class Heli_Transport_02_base_F; class RHS_CH_47F_base: Heli_Transport_02_base_F { EGVAR(refuel,fuelCapacity) = 3914; }; + class RHS_CH_47F: RHS_CH_47F_base { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,ropeOrigins)[] = {{0.5, -7.15, -0.95}, {-0.5, -7.15, -0.95}}; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + + class UserActions { + class OpenCargoDoor; + class CloseCargoDoor: OpenCargoDoor { + condition = QUOTE([ARR_2(this,'ramp_anim')] call FUNC(canCloseDoor)); + }; + }; + }; + class Heli_Attack_01_base_F; class RHS_AH1Z_base: Heli_Attack_01_base_F { EGVAR(refuel,fuelCapacity) = 1600; diff --git a/optionals/compat_rhs_usf3/CfgWeapons.hpp b/optionals/compat_rhs_usf3/CfgWeapons.hpp index c49b9bc5e4..8ef39bd666 100644 --- a/optionals/compat_rhs_usf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_usf3/CfgWeapons.hpp @@ -111,8 +111,8 @@ class CfgWeapons }; }; }; - class rhs_weap_m4a1; - class rhs_weap_mk18: rhs_weap_m4a1 { + class rhs_weap_m4a1_blockII; + class rhs_weap_mk18: rhs_weap_m4a1_blockII { ACE_barrelTwist = 177.8; ACE_barrelLength = 261.62; ACE_Overheating_dispersion = 1; diff --git a/optionals/compat_rhs_usf3/XEH_PREP.hpp b/optionals/compat_rhs_usf3/XEH_PREP.hpp new file mode 100644 index 0000000000..821ee657be --- /dev/null +++ b/optionals/compat_rhs_usf3/XEH_PREP.hpp @@ -0,0 +1,3 @@ +PREP(canCloseDoor); +PREP(onCut); +PREP(onPrepare); diff --git a/optionals/compat_rhs_usf3/XEH_preInit.sqf b/optionals/compat_rhs_usf3/XEH_preInit.sqf new file mode 100644 index 0000000000..a7feade1c3 --- /dev/null +++ b/optionals/compat_rhs_usf3/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +#include "XEH_PREP.hpp" + +ADDON = true; diff --git a/optionals/compat_rhs_usf3/XEH_preStart.sqf b/optionals/compat_rhs_usf3/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/optionals/compat_rhs_usf3/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp index ce847e969e..e218f77d2e 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/optionals/compat_rhs_usf3/config.cpp @@ -6,12 +6,15 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"rhsusf_c_weapons", "rhsusf_c_troops", "rhsusf_c_m1a1", "rhsusf_c_m1a2", "RHS_US_A2_AirImport", "rhsusf_c_m109", "rhsusf_c_hmmwv", "rhsusf_c_rg33", "rhsusf_c_fmtv", "rhsusf_c_m113", "RHS_US_A2Port_Armor"}; - author[]={"Ruthberg", "GitHawk"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; #include "CfgAmmo.hpp" +#include "CfgEventHandlers.hpp" #include "CfgMagazines.hpp" #include "CfgWeapons.hpp" #include "CfgVehicles.hpp" diff --git a/optionals/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf b/optionals/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf new file mode 100644 index 0000000000..61269519ed --- /dev/null +++ b/optionals/compat_rhs_usf3/functions/fnc_canCloseDoor.sqf @@ -0,0 +1,30 @@ +/* + * Author: BaerMitUmlaut + * Checks if the door can be closed. + * + * Arguments: + * 0: Helicopter + * 1: Door + * + * Return Value: + * Door can be closed + * + * Example: + * [_vehicle, "DoorLB"] call ace_compat_rhs_usf3_fnc_canCloseDoor + * + * Public: No + */ + +#include "script_component.hpp" +params ["_vehicle", "_door"]; + +(_vehicle doorPhase _door > 0) && +{alive _vehicle} && +{!(_vehicle getVariable [QEGVAR(fastroping,doorsLocked),false])} && +{ + if (_vehicle isKindOf "RHS_CH_47F") then { + ACE_player in [driver _vehicle, _vehicle turretUnit [3], _vehicle turretUnit [4]] + } else { + ACE_player in _vehicle + } +} diff --git a/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf b/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf new file mode 100644 index 0000000000..3663a10bd5 --- /dev/null +++ b/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf @@ -0,0 +1,36 @@ +/* + * Author: BaerMitUmlaut + * Function for closing doors and retracting the hooks for RHS USF helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before cutting ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_usf3_fnc_onCut + * + * Public: No + */ + +#include "script_component.hpp" +params ["_vehicle"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), false, true]; + +private _fries = _vehicle getVariable [QEGVAR(fastroping,FRIES), objNull]; +if !(isNull _fries) then { + _fries animate ["extendHookRight", 0]; + _fries animate ["extendHookLeft", 0]; + [{ + _this animateDoor ["doorRB", 0]; + _this animateDoor ["doorLB", 0]; + }, _vehicle, 2] call EFUNC(common,waitAndExecute); + + 4 +} else { + _vehicle animateDoor ["ramp_anim", 0]; + + 2 +}; diff --git a/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf b/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf new file mode 100644 index 0000000000..3e655a0aca --- /dev/null +++ b/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf @@ -0,0 +1,38 @@ +/* + * Author: BaerMitUmlaut + * Function for opening doors and extending the hook for most vanilla helos. + * + * Arguments: + * 0: Helicopter + * + * Return Value: + * Amount of time to wait before deploying ropes + * + * Example: + * [_vehicle] call ace_compat_rhs_usf3_fnc_onPrepare + * + * Public: No + */ + +#include "script_component.hpp" +params ["_vehicle"]; +private ["_fries", "_waitTime"]; + +_vehicle setVariable [QEGVAR(fastroping,doorsLocked), true, true]; + +_waitTime = 2; + +_vehicle animateDoor ["doorRB", 1]; +_vehicle animateDoor ["doorLB", 1]; +_vehicle animateDoor ["ramp_anim", 1]; + +_fries = _vehicle getVariable [QEGVAR(fastroping,FRIES), objNull]; +if !(isNull _fries) then { + [{ + _this animate ["extendHookRight", 1]; + _this animate ["extendHookLeft", 1]; + }, _fries, 2] call EFUNC(common,waitAndExecute); + _waitTime = 4; +}; + +_waitTime diff --git a/optionals/compat_rhs_usf3/functions/script_component.hpp b/optionals/compat_rhs_usf3/functions/script_component.hpp new file mode 100644 index 0000000000..c2cdf03c81 --- /dev/null +++ b/optionals/compat_rhs_usf3/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\compat_rhs_usf3\script_component.hpp" diff --git a/optionals/compat_rhs_usf3/script_component.hpp b/optionals/compat_rhs_usf3/script_component.hpp index c0a5bbf1f4..32aecef74e 100644 --- a/optionals/compat_rhs_usf3/script_component.hpp +++ b/optionals/compat_rhs_usf3/script_component.hpp @@ -1,4 +1,4 @@ -#define COMPONENT rhsusf_c_weapons_comp +#define COMPONENT compat_rhs_usf3 #include "\z\ace\addons\main\script_mod.hpp" diff --git a/optionals/compat_rksl_pm_ii/config.cpp b/optionals/compat_rksl_pm_ii/config.cpp index c3ed720f8b..ca0a7189f2 100644 --- a/optionals/compat_rksl_pm_ii/config.cpp +++ b/optionals/compat_rksl_pm_ii/config.cpp @@ -6,7 +6,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"RKSL_PMII"}; - author[]={"Ruthberg"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/optionals/compat_sma3_iansky/config.cpp b/optionals/compat_sma3_iansky/config.cpp index 4dfda50805..5611c2d4af 100644 --- a/optionals/compat_sma3_iansky/config.cpp +++ b/optionals/compat_sma3_iansky/config.cpp @@ -6,7 +6,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"iansky_opt"}; - author[]={"Ruthberg"}; + author = ECSTRING(common,ACETeam); + authors[] = {"Ruthberg"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/optionals/noactionmenu/config.cpp b/optionals/noactionmenu/config.cpp index 763665660b..77e0457643 100644 --- a/optionals/noactionmenu/config.cpp +++ b/optionals/noactionmenu/config.cpp @@ -7,8 +7,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {"commy2"}; - authorUrl = "https://github.com/commy2"; + author = ECSTRING(common,ACETeam); + authors[] = {"commy2"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/optionals/server/config.cpp b/optionals/server/config.cpp index 9cfcb35012..ab354fa4d8 100644 --- a/optionals/server/config.cpp +++ b/optionals/server/config.cpp @@ -6,8 +6,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {"Glowbal"}; - authorUrl = "https://github.com/Glowbal/"; + author = ECSTRING(common,ACETeam); + authors[] = {"Glowbal"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/optionals/tracers/config.cpp b/optionals/tracers/config.cpp index 7ea5992f14..b2f88ca8a9 100644 --- a/optionals/tracers/config.cpp +++ b/optionals/tracers/config.cpp @@ -6,8 +6,9 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_ballistics"}; - author[] = {"ACE2 Team"}; - authorUrl = "https://www.ace3mod.com"; + author = ECSTRING(common,ACETeam); + authors[] = {"ACE2 Team"}; + url = ECSTRING(main,URL); VERSION_CONFIG; }; }; diff --git a/tools/config_style_checker.py b/tools/config_style_checker.py new file mode 100644 index 0000000000..03d8f222fe --- /dev/null +++ b/tools/config_style_checker.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 + +import fnmatch +import os +import re +import ntpath +import sys +import argparse + +def check_config_style(filepath): + bad_count_file = 0 + def pushClosing(t): + closingStack.append(closing.expr) + closing << Literal( closingFor[t[0]] ) + + def popClosing(): + closing << closingStack.pop() + + with open(filepath, 'r', encoding='utf-8', errors='ignore') as file: + content = file.read() + + # Store all brackets we find in this file, so we can validate everything on the end + brackets_list = [] + + # To check if we are in a comment block + isInCommentBlock = False + checkIfInComment = False + # Used in case we are in a line comment (//) + ignoreTillEndOfLine = False + # Used in case we are in a comment block (/* */). This is true if we detect a * inside a comment block. + # If the next character is a /, it means we end our comment block. + checkIfNextIsClosingBlock = False + + # We ignore everything inside a string + isInString = False + # Used to store the starting type of a string, so we can match that to the end of a string + inStringType = ''; + + lastIsCurlyBrace = False + checkForSemiColumn = False + + # Extra information so we know what line we find errors at + lineNumber = 1 + + indexOfCharacter = 0 + # Parse all characters in the content of this file to search for potential errors + for c in content: + if (lastIsCurlyBrace): + lastIsCurlyBrace = False + if c == '\n': # Keeping track of our line numbers + lineNumber += 1 # so we can print accurate line number information when we detect a possible error + if (isInString): # while we are in a string, we can ignore everything else, except the end of the string + if (c == inStringType): + isInString = False + # if we are not in a comment block, we will check if we are at the start of one or count the () {} and [] + elif (isInCommentBlock == False): + + # This means we have encountered a /, so we are now checking if this is an inline comment or a comment block + if (checkIfInComment): + checkIfInComment = False + if c == '*': # if the next character after / is a *, we are at the start of a comment block + isInCommentBlock = True + elif (c == '/'): # Otherwise, will check if we are in an line comment + ignoreTillEndOfLine = True # and an line comment is a / followed by another / (//) We won't care about anything that comes after it + + if (isInCommentBlock == False): + if (ignoreTillEndOfLine): # we are in a line comment, just continue going through the characters until we find an end of line + if (c == '\n'): + ignoreTillEndOfLine = False + else: # validate brackets + if (c == '"' or c == "'"): + isInString = True + inStringType = c + elif (c == '/'): + checkIfInComment = True + elif (c == '('): + brackets_list.append('(') + elif (c == ')'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '[']): + print("ERROR: Possible missing round bracket ')' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(')') + elif (c == '['): + brackets_list.append('[') + elif (c == ']'): + if (len(brackets_list) > 0 and brackets_list[-1] in ['{', '(']): + print("ERROR: Possible missing square bracket ']' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append(']') + elif (c == '{'): + brackets_list.append('{') + elif (c == '}'): + lastIsCurlyBrace = True + if (len(brackets_list) > 0 and brackets_list[-1] in ['(', '[']): + print("ERROR: Possible missing curly brace '}}' detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + brackets_list.append('}') + elif (c== '\t'): + print("ERROR: Tab detected at {0} Line number: {1}".format(filepath,lineNumber)) + bad_count_file += 1 + + else: # Look for the end of our comment block + if (c == '*'): + checkIfNextIsClosingBlock = True; + elif (checkIfNextIsClosingBlock): + if (c == '/'): + isInCommentBlock = False + elif (c != '*'): + checkIfNextIsClosingBlock = False + indexOfCharacter += 1 + + if brackets_list.count('[') != brackets_list.count(']'): + print("ERROR: A possible missing square bracket [ or ] in file {0} [ = {1} ] = {2}".format(filepath,brackets_list.count('['),brackets_list.count(']'))) + bad_count_file += 1 + if brackets_list.count('(') != brackets_list.count(')'): + print("ERROR: A possible missing round bracket ( or ) in file {0} ( = {1} ) = {2}".format(filepath,brackets_list.count('('),brackets_list.count(')'))) + bad_count_file += 1 + if brackets_list.count('{') != brackets_list.count('}'): + print("ERROR: A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}'))) + bad_count_file += 1 + return bad_count_file + +def main(): + + print("Validating Config Style") + + sqf_list = [] + bad_count = 0 + + parser = argparse.ArgumentParser() + parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="") + args = parser.parse_args() + + # Allow running from root directory as well as from inside the tools directory + rootDir = "../addons" + if (os.path.exists("addons")): + rootDir = "addons" + + for root, dirnames, filenames in os.walk(rootDir + '/' + args.module): + for filename in fnmatch.filter(filenames, '*.cpp'): + sqf_list.append(os.path.join(root, filename)) + for filename in fnmatch.filter(filenames, '*.hpp'): + sqf_list.append(os.path.join(root, filename)) + + for filename in sqf_list: + bad_count = bad_count + check_config_style(filename) + + print("------\nChecked {0} files\nErrors detected: {1}".format(len(sqf_list), bad_count)) + if (bad_count == 0): + print("Config validation PASSED") + else: + print("Config validation FAILED") + + return bad_count + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/setup.py b/tools/setup.py index 62925a6066..af1b224cbb 100644 --- a/tools/setup.py +++ b/tools/setup.py @@ -25,19 +25,19 @@ def main(): ###################################### This script will create your ACE3 dev environment for you. - + Before you run this, you should already have: - The Arma 3 Tools installed properly via Steam - A properly set up P-drive - + If you have not done those things yet, please abort this script in the next step and do so first. - + This script will create two hard links on your system, both pointing to your ACE3 project folder: [Arma 3 installation directory]\\{} => ACE3 project folder P:\\{} => ACE3 project folder - + It will also copy the required CBA includes to {}, if you do not have the CBA source code already.""".format(FULLDIR,FULLDIR,CBA)) - print("\n") + print("\n") try: reg = winreg.ConnectRegistry(None, winreg.HKEY_LOCAL_MACHINE) @@ -79,12 +79,8 @@ def main(): if not os.path.exists(os.path.join(armapath, MAINDIR)): os.mkdir(os.path.join(armapath, MAINDIR)) - if platform.win32_ver()[0] == "7": - subprocess.call(["cmd", "/c", "mklink", "/D", "P:\\{}\\{}".format(MAINDIR,PROJECTDIR), projectpath]) - subprocess.call(["cmd", "/c", "mklink", "/D", os.path.join(armapath, MAINDIR, PROJECTDIR), projectpath]) - else: - subprocess.call(["cmd", "/c", "mklink", "/D", "/J", "P:\\{}\\{}".format(MAINDIR,PROJECTDIR), projectpath]) - subprocess.call(["cmd", "/c", "mklink", "/D", "/J", os.path.join(armapath, MAINDIR, PROJECTDIR), projectpath]) + subprocess.call(["cmd", "/c", "mklink", "/J", "P:\\{}\\{}".format(MAINDIR,PROJECTDIR), projectpath]) + subprocess.call(["cmd", "/c", "mklink", "/J", os.path.join(armapath, MAINDIR, PROJECTDIR), projectpath]) except: raise print("Something went wrong during the link creation. Please finish the setup manually.") diff --git a/tools/sqf_validator.py b/tools/sqf_validator.py index 7414d7d715..c824b35268 100644 --- a/tools/sqf_validator.py +++ b/tools/sqf_validator.py @@ -8,7 +8,7 @@ import sys import argparse def validKeyWordAfterCode(content, index): - keyWords = ["for", "do", "count", "each", "forEach", "else", "and", "not", "isEqualTo", "in", "call", "spawn", "execVM", "catch"]; + keyWords = ["for", "do", "count", "each", "forEach", "else", "and", "not", "isEqualTo", "in", "call", "spawn", "execVM", "catch", "param", "select", "apply"]; for word in keyWords: try: subWord = content.index(word, index, index+len(word)) @@ -50,7 +50,7 @@ def check_sqf_syntax(filepath): checkForSemiColumn = False # Extra information so we know what line we find errors at - lineNumber = 0 + lineNumber = 1 indexOfCharacter = 0 # Parse all characters in the content of this file to search for potential errors @@ -112,7 +112,7 @@ def check_sqf_syntax(filepath): elif (c== '\t'): print("ERROR: Tab detected at {0} Line number: {1}".format(filepath,lineNumber)) bad_count_file += 1 - + if (checkForSemiColumn): if (c not in [' ', '\t', '\n', '/']): # keep reading until no white space or comments checkForSemiColumn = False From 8e72d89ef6d771bb97cc0f74fefdca276a2f2f54 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 8 Oct 2016 13:10:34 +0200 Subject: [PATCH 016/826] Prepare 3.80 RC1 --- README.md | 2 +- addons/main/script_mod.hpp | 4 ++-- docs/README_DE.md | 2 +- docs/README_PL.md | 2 +- mod.cpp | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d9c6a41678..cd73c8bae7 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Issues diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 6f9d0e5a6b..7b1cfd7551 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -4,9 +4,9 @@ #define PREFIX ace #define MAJOR 3 -#define MINOR 7 +#define MINOR 8 #define PATCHLVL 0 -#define BUILD 6 +#define BUILD 7 #define VERSION MAJOR.MINOR.PATCHLVL.BUILD #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD diff --git a/docs/README_DE.md b/docs/README_DE.md index 36f52c5fa8..a0141f38d1 100644 --- a/docs/README_DE.md +++ b/docs/README_DE.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Fehlermeldungen diff --git a/docs/README_PL.md b/docs/README_PL.md index 27428eed5d..ac936ae16f 100644 --- a/docs/README_PL.md +++ b/docs/README_PL.md @@ -3,7 +3,7 @@

- ACE3 Wersja + ACE3 Wersja ACE3 Zagadnienia diff --git a/mod.cpp b/mod.cpp index dfd76d44c4..78457aa3dd 100644 --- a/mod.cpp +++ b/mod.cpp @@ -1,8 +1,8 @@ -name = "Advanced Combat Environment 3.7.0"; +name = "Advanced Combat Environment 3.8.0"; picture = "logo_ace3_ca.paa"; actionName = "GitHub"; action = "https://github.com/acemod/ACE3"; -description = "ACE3 - Version 3.7.0"; +description = "ACE3 - Version 3.8.0"; logo = "logo_ace3_ca.paa"; logoOver = "logo_ace3_ca.paa"; tooltip = "ACE3"; From a3bbc848a7c3f99846f2cf1dd4286878100489ac Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 9 Oct 2016 04:57:29 -0500 Subject: [PATCH 017/826] Fix ammo box cookoff strings (#4528) --- addons/cookoff/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index 21ddb96a7a..2642b931f4 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -31,10 +31,10 @@ 잔해(포탑) 残骸(タレット) - + Enable ammo box cook off - + Enables cooking off of ammo boxes. From 627a11545a8ef50f942470b0caed848d8595a0ba Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 11 Oct 2016 14:18:58 +0200 Subject: [PATCH 018/826] Fix documentation README commands --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index 9c20ecb281..e5cd08ac19 100644 --- a/docs/README.md +++ b/docs/README.md @@ -32,10 +32,10 @@ - Install `make` and `gcc` ``` - sudo apt-get make gcc + sudo apt-get install make gcc ``` -- Install `ruby 2.0`, `rbuy2.0-dev` and `ruby-switch` +- Install `ruby2.0`, `rbuy2.0-dev` and `ruby-switch` ``` sudo apt-add-repository ppa:brightbox/ruby-ng sudo apt update From cbbdd6f9392aa0a0a33416a9a4f6a04c503f9a0b Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 11 Oct 2016 14:21:54 +0200 Subject: [PATCH 019/826] Use apt-get consitently instead of new apt only --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index e5cd08ac19..d3bd41e20e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -38,8 +38,8 @@ - Install `ruby2.0`, `rbuy2.0-dev` and `ruby-switch` ``` sudo apt-add-repository ppa:brightbox/ruby-ng - sudo apt update - sudo apt install ruby2.0 ruby2.0-dev ruby-switch + sudo apt-get update + sudo apt-get install ruby2.0 ruby2.0-dev ruby-switch ``` - Set Ruby version From 4fb5d230acab62f75a5fd11b9ca5c6a820f9da66 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 11 Oct 2016 18:44:27 +0200 Subject: [PATCH 020/826] remove civilian rank icons from nametags (#4538) --- addons/nametags/XEH_postInit.sqf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index bebe840b47..594fe595ff 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -35,3 +35,6 @@ GVAR(showNamesTime) = -10; call FUNC(updateSettings); }; }] call CBA_fnc_addEventHandler; + +// civilians don't use military ranks +["CIV_F", ["","","","","","",""]] call FUNC(setFactionRankIcons); From c390b6c1fca866cc6ca98b9ded7b36367628279e Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 11 Oct 2016 05:06:37 +0200 Subject: [PATCH 021/826] increase red laser alpha, close #4535 --- addons/laserpointer/functions/fnc_drawLaserpoint.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf b/addons/laserpointer/functions/fnc_drawLaserpoint.sqf index 3ea9ed158b..f5320d2c63 100644 --- a/addons/laserpointer/functions/fnc_drawLaserpoint.sqf +++ b/addons/laserpointer/functions/fnc_drawLaserpoint.sqf @@ -85,7 +85,7 @@ private _size = 2 * sqrt (1 / _distance) * (call EFUNC(common,getZoom)); drawIcon3D [ format ["\a3\weapons_f\acc\data\collimdot_%1_ca.paa", ["red", "green"] select _isGreen], - [[1,0.25,0.25,0.5*_brightness], [0.25,1,0.25,0.5*_brightness]] select _isGreen, + [[1,0.25,0.25,0.6*_brightness], [0.25,1,0.25,0.5*_brightness]] select _isGreen, _pL, _size, _size, From 2ba0137a1e181e9cc9a93bee53b9a57c73c8b392 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Tue, 11 Oct 2016 18:48:20 +0200 Subject: [PATCH 022/826] Fix going unconscious while fastroping (#4531) --- addons/fastroping/functions/fnc_fastRopeServerPFH.sqf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf b/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf index 2ebffe680e..0011e0ecf9 100644 --- a/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf +++ b/addons/fastroping/functions/fnc_fastRopeServerPFH.sqf @@ -53,7 +53,12 @@ if (_hasBeenAttached && {isNull attachedTo _unit}) exitWith { _dummy setVelocity [0,0,-6]; //Check if fast rope is finished -if (((getPos _unit select 2) < 0.2) || {ropeLength _ropeTop == 34.5} || {vectorMagnitude (velocity _vehicle) > 5} || {!(alive _unit)} || {captive _unit}) exitWith { +if ( + ((getPos _unit select 2) < 0.2) + || {ropeLength _ropeTop == 34.5} + || {vectorMagnitude (velocity _vehicle) > 5} + || {!([_unit] call EFUNC(common,isAwake))} +) exitWith { detach _unit; //Reset rope From cd79ebe3ceaa45d27b9bec14c1a191a109fa9aca Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 8 Oct 2016 10:41:25 -0500 Subject: [PATCH 023/826] Bump REQUIRED_VERSION to 1.64 --- addons/main/script_mod.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 6f9d0e5a6b..9e687174ab 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -12,7 +12,7 @@ #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD // MINIMAL required version for the Mod. Components can specify others.. -#define REQUIRED_VERSION 1.62 +#define REQUIRED_VERSION 1.64 #define REQUIRED_CBA_VERSION {3,1,0} #ifdef COMPONENT_BEAUTIFIED From 130265fd9fef594cbbe891fe580daf41458e83da Mon Sep 17 00:00:00 2001 From: commy2 Date: Mon, 10 Oct 2016 19:35:34 +0200 Subject: [PATCH 024/826] add function to disable dogtags for factions, and disable for civilians --- addons/dogtags/XEH_PREP.hpp | 2 ++ addons/dogtags/XEH_postInit.sqf | 3 +++ .../dogtags/functions/fnc_canCheckDogtag.sqf | 3 +++ .../dogtags/functions/fnc_canTakeDogtag.sqf | 3 +++ .../functions/fnc_disableFactionDogtags.sqf | 24 +++++++++++++++++++ 5 files changed, 35 insertions(+) create mode 100644 addons/dogtags/functions/fnc_disableFactionDogtags.sqf diff --git a/addons/dogtags/XEH_PREP.hpp b/addons/dogtags/XEH_PREP.hpp index 33e42ba191..5917600139 100644 --- a/addons/dogtags/XEH_PREP.hpp +++ b/addons/dogtags/XEH_PREP.hpp @@ -1,3 +1,4 @@ + PREP(addDogtagActions); PREP(addDogtagItem); PREP(bloodType); @@ -11,3 +12,4 @@ PREP(sendDogtagData); PREP(showDogtag); PREP(ssn); PREP(takeDogtag); +PREP(disableFactionDogtags); diff --git a/addons/dogtags/XEH_postInit.sqf b/addons/dogtags/XEH_postInit.sqf index b0352c39ef..6a50ce61cf 100644 --- a/addons/dogtags/XEH_postInit.sqf +++ b/addons/dogtags/XEH_postInit.sqf @@ -45,3 +45,6 @@ if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { }] call CBA_fnc_addEventHandler; }; }; + +// disable dogtags for civilians +"CIV_F" call FUNC(disableFactionDogtags); diff --git a/addons/dogtags/functions/fnc_canCheckDogtag.sqf b/addons/dogtags/functions/fnc_canCheckDogtag.sqf index 66a25c94b0..b31911a0c6 100644 --- a/addons/dogtags/functions/fnc_canCheckDogtag.sqf +++ b/addons/dogtags/functions/fnc_canCheckDogtag.sqf @@ -20,4 +20,7 @@ params ["_player", "_target"]; if (isNull _target) exitWith {false}; +// check if disabled for faction +if ([GVAR(disabledFactions) getVariable faction _target] param [0, false]) exitWith {false}; + (!alive _target) || {_target getVariable ["ACE_isUnconscious", false]} diff --git a/addons/dogtags/functions/fnc_canTakeDogtag.sqf b/addons/dogtags/functions/fnc_canTakeDogtag.sqf index 33a3ef055f..37163f68c7 100644 --- a/addons/dogtags/functions/fnc_canTakeDogtag.sqf +++ b/addons/dogtags/functions/fnc_canTakeDogtag.sqf @@ -20,4 +20,7 @@ params ["_player", "_target"]; if (isNull _target) exitWith {false}; +// check if disabled for faction +if ([GVAR(disabledFactions) getVariable faction _target] param [0, false]) exitWith {false}; + (!alive _target) || {_target getVariable ["ACE_isUnconscious", false]} diff --git a/addons/dogtags/functions/fnc_disableFactionDogtags.sqf b/addons/dogtags/functions/fnc_disableFactionDogtags.sqf new file mode 100644 index 0000000000..3100ffb269 --- /dev/null +++ b/addons/dogtags/functions/fnc_disableFactionDogtags.sqf @@ -0,0 +1,24 @@ +/* + * Author: commy2 + * Disable this faction from using dogtags. + * + * Arguments: + * 0: Faction + * + * Return Value: + * None + * + * Example: + * "CIV_F" call ace_dogtags_fnc_disableFactionDogtags + * + * Public: Yes + */ +#include "script_component.hpp" + +params [["_faction", "", [""]]]; + +if (isNil QGVAR(disabledFactions)) then { + GVAR(disabledFactions) = [] call CBA_fnc_createNamespace; +}; + +GVAR(disabledFactions) setVariable [_faction, true]; From 5d610cf14854078886976177a3d3c38d2b67a8e0 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 11 Oct 2016 11:54:25 -0500 Subject: [PATCH 025/826] Always create namespace at preInit --- addons/dogtags/XEH_preInit.sqf | 2 ++ addons/dogtags/functions/fnc_disableFactionDogtags.sqf | 4 ---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/addons/dogtags/XEH_preInit.sqf b/addons/dogtags/XEH_preInit.sqf index a7feade1c3..434496058f 100644 --- a/addons/dogtags/XEH_preInit.sqf +++ b/addons/dogtags/XEH_preInit.sqf @@ -4,4 +4,6 @@ ADDON = false; #include "XEH_PREP.hpp" +GVAR(disabledFactions) = [] call CBA_fnc_createNamespace; + ADDON = true; diff --git a/addons/dogtags/functions/fnc_disableFactionDogtags.sqf b/addons/dogtags/functions/fnc_disableFactionDogtags.sqf index 3100ffb269..2418b31f4e 100644 --- a/addons/dogtags/functions/fnc_disableFactionDogtags.sqf +++ b/addons/dogtags/functions/fnc_disableFactionDogtags.sqf @@ -17,8 +17,4 @@ params [["_faction", "", [""]]]; -if (isNil QGVAR(disabledFactions)) then { - GVAR(disabledFactions) = [] call CBA_fnc_createNamespace; -}; - GVAR(disabledFactions) setVariable [_faction, true]; From b8cc10fecbdd8b09c1a019c543fb68bd303118be Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 8 Oct 2016 15:31:39 +0200 Subject: [PATCH 026/826] Fix #4523 - fuel nozzle disconnect at maximum hose distance --- addons/refuel/XEH_PREP.hpp | 1 + .../functions/fnc_maxDistanceDropNozzle.sqf | 54 +++++++++++++++++++ addons/refuel/functions/fnc_takeNozzle.sqf | 41 +++----------- 3 files changed, 63 insertions(+), 33 deletions(-) create mode 100644 addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf diff --git a/addons/refuel/XEH_PREP.hpp b/addons/refuel/XEH_PREP.hpp index dac451da17..806d861a69 100644 --- a/addons/refuel/XEH_PREP.hpp +++ b/addons/refuel/XEH_PREP.hpp @@ -16,6 +16,7 @@ PREP(handleDisconnect); PREP(handleKilled); PREP(handleUnconscious); PREP(makeJerryCan); +PREP(maxDistanceDropNozzle); PREP(moduleRefuelSettings); PREP(readFuelCounter); PREP(refuel); diff --git a/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf new file mode 100644 index 0000000000..90231a30f2 --- /dev/null +++ b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf @@ -0,0 +1,54 @@ +/* + * Author: GitHawk, Jonpas + * Drops the nozzle at maximum hose distance. + * + * Arguments: + * 0: Unit + * 1: Fuel Truck + * 2: End Pos Offset + * 3: Nozzle (optional) + * + * Return Value: + * None + * + * Example: + * [player, fuelTruck, [0, 0, 0], nozzle] call ace_refuel_fnc_maxDistanceDropNozzle + * + * Public: No + */ +#include "script_component.hpp" + +params ["_unit", "_source", "_endPosOffset", "_nozzle"]; + +// Exit if jerry can (no maximum distance there as it's not connected to anything) +if (_nozzle getVariable [QGVAR(jerryCan), false]) exitWith {}; + +// Check distance periodically to drop it at maximum hose length +[{ + params ["_args", "_pfID"]; + _args params [ + ["_unit", player, [objNull]], + ["_source", objNull, [objNull]], + ["_endPosOffset", [0, 0, 0], [[]], 3], + ["_nozzle", (_args select 0) getVariable [QGVAR(nozzle), objNull], [objNull]] + ]; + + if (isNull _source || {_unit distance (_source modelToWorld _endPosOffset) > (REFUEL_HOSE_LENGTH - 2)} || {!alive _source}) exitWith { + if !(isNull _nozzle) then { + [_unit, _nozzle] call FUNC(dropNozzle); + REFUEL_UNHOLSTER_WEAPON + + [_unit, "forceWalk", "ACE_refuel", false] call EFUNC(common,statusEffect_set); + if (isNull _source || {!alive _source}) then { + private _rope = _nozzle getVariable [QGVAR(rope), objNull]; + if !(isNull _rope) then { + ropeDestroy _rope; + }; + deleteVehicle _nozzle; + } else { + [LSTRING(Hint_TooFar), 2, _unit] call EFUNC(common,displayTextStructured); + }; + }; + [_pfID] call CBA_fnc_removePerFrameHandler; + }; +}, 0, [_unit, _target, _endPosOffset, _nozzle]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/refuel/functions/fnc_takeNozzle.sqf b/addons/refuel/functions/fnc_takeNozzle.sqf index 9548b2ed2f..006c5e0942 100644 --- a/addons/refuel/functions/fnc_takeNozzle.sqf +++ b/addons/refuel/functions/fnc_takeNozzle.sqf @@ -82,6 +82,9 @@ if (isNull _nozzle) then { // func is called on fuel truck '!isNull (_target getVariable [QGVAR(nozzle), objNull])' ]; _unit setVariable [QGVAR(ReleaseActionID), _actionID]; + + // Drop nozzle at maximum hose distance + [_unit, _target, _endPosOffset, _nozzle] call FUNC(maxDistanceDropNozzle); }, "", localize LSTRING(TakeNozzleAction), @@ -123,43 +126,15 @@ if (isNull _nozzle) then { // func is called on fuel truck '!isNull (_target getVariable [QGVAR(nozzle), objNull])' ]; _unit setVariable [QGVAR(ReleaseActionID), _actionID]; + + // Drop nozzle at maximum hose distance + private _target = _nozzle getVariable QGVAR(source); + private _endPosOffset = _nozzle getVariable QGVAR(attachPos); + [_unit, _target, _endPosOffset, _nozzle] call FUNC(maxDistanceDropNozzle); }, "", localize LSTRING(TakeNozzleAction), {true}, ["isnotinside"] ] call EFUNC(common,progressBar); - - _target = _nozzle getVariable QGVAR(source); - _endPosOffset = _nozzle getVariable QGVAR(attachPos); -}; -if !(_nozzle getVariable [QGVAR(jerryCan), false]) then { - [{ - params ["_args", "_pfID"]; - _args params [ - ["_unit", player, [objNull]], - ["_source", objNull, [objNull]], - ["_endPosOffset", [0, 0, 0], [[]], 3], - ["_nozzle", _unit getVariable [QGVAR(nozzle), objNull], [objNull]] - ]; - - if (isNull _source || {_unit distance (_source modelToWorld _endPosOffset) > (REFUEL_HOSE_LENGTH - 2)} || {!alive _source}) exitWith { - if !(isNull _nozzle) then { - [_unit, _nozzle] call FUNC(dropNozzle); - REFUEL_UNHOLSTER_WEAPON - - [_unit, "forceWalk", "ACE_refuel", false] call EFUNC(common,statusEffect_set); - if (isNull _source || {!alive _source}) then { - private _rope = _nozzle getVariable [QGVAR(rope), objNull]; - if !(isNull _rope) then { - ropeDestroy _rope; - }; - deleteVehicle _nozzle; - } else { - [LSTRING(Hint_TooFar), 2, _unit] call EFUNC(common,displayTextStructured); - }; - }; - [_pfID] call cba_fnc_removePerFrameHandler; - }; - }, 0, [_unit, _target, _endPosOffset]] call cba_fnc_addPerFrameHandler; }; From 8822cb1b907a48f80550a5a59e9b801f09b55f63 Mon Sep 17 00:00:00 2001 From: commy2 Date: Tue, 11 Oct 2016 19:04:08 +0200 Subject: [PATCH 027/826] emulate frag grenade ai behaviour for incendiaries (#4534) --- addons/grenades/functions/fnc_incendiary.sqf | 21 ++++++++++++++++++- .../grenades/functions/fnc_throwGrenade.sqf | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/addons/grenades/functions/fnc_incendiary.sqf b/addons/grenades/functions/fnc_incendiary.sqf index 098e2d5e20..6081daa8af 100644 --- a/addons/grenades/functions/fnc_incendiary.sqf +++ b/addons/grenades/functions/fnc_incendiary.sqf @@ -16,6 +16,8 @@ */ #include "script_component.hpp" +#define ALERT_NEAR_ENEMY_RANGE 60 + #define PARTICLE_LIFE_TIME 2 #define PARTICLE_DENSITY 20 #define PARTICLE_SIZE 1 @@ -32,12 +34,29 @@ #define ORIENTATION 5.4 #define EXPANSION 1 -params ["_projectile", "_timeToLive"]; +params ["_projectile", "_timeToLive", "_center"]; if (isNull _projectile) exitWith {TRACE_1("null",_projectile);}; private _position = position _projectile; +// --- AI +private _nearLocalEnemies = []; + +{ + { + if (local _x && {[_center, side _x] call BIS_fnc_sideIsEnemy}) then { // WE WANT THE OBJECTS SIDE HERE! + _nearLocalEnemies pushBackUnique _x; + }; + } forEach crew _x; +} forEach (_position nearObjects ALERT_NEAR_ENEMY_RANGE); + +{ + if (behaviour _x in ["SAFE", "AWARE"]) then { + _x setBehaviour "COMBAT"; + }; +} forEach _nearLocalEnemies; + // --- fire private _fire = "#particlesource" createVehicleLocal _position; diff --git a/addons/grenades/functions/fnc_throwGrenade.sqf b/addons/grenades/functions/fnc_throwGrenade.sqf index 8db3cf3829..92c2639826 100644 --- a/addons/grenades/functions/fnc_throwGrenade.sqf +++ b/addons/grenades/functions/fnc_throwGrenade.sqf @@ -56,7 +56,7 @@ if (getNumber (_config >> QGVAR(incendiary)) == 1) then { private _fuzeTime = getNumber (_config >> "explosionTime"); private _timeToLive = getNumber (_config >> "timeToLive"); - [FUNC(incendiary), [_projectile, _timeToLive], _fuzeTime] call CBA_fnc_waitAndExecute; + [FUNC(incendiary), [_projectile, _timeToLive, side _unit], _fuzeTime] call CBA_fnc_waitAndExecute; // WE WANT THE OBJECTS SIDE HERE! }; // handle throw modes From 4d31c8f148c06dae93cf3c91ab4baa12ffd4e7ac Mon Sep 17 00:00:00 2001 From: bux578 Date: Wed, 12 Oct 2016 04:42:16 +0200 Subject: [PATCH 028/826] add missing line in medical doc (#4545) --- docs/wiki/feature/medical-system.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/wiki/feature/medical-system.md b/docs/wiki/feature/medical-system.md index a60a60aa77..7f0b6ebbd6 100644 --- a/docs/wiki/feature/medical-system.md +++ b/docs/wiki/feature/medical-system.md @@ -339,6 +339,7 @@ For the following procedure to work revive needs to be enabled. - Each successful round of CPR (filled up completion bar) increases the time left in the revive state. ## 3. Guides + ### 3.1 Example loadouts #### 3.1.1 Basic From 99d910d6c9ce4786ba20b5780efcf9a0a61a1a72 Mon Sep 17 00:00:00 2001 From: bux578 Date: Fri, 14 Oct 2016 07:55:46 +0200 Subject: [PATCH 029/826] fix spelling of ruby --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index d3bd41e20e..4565d796e0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -35,7 +35,7 @@ sudo apt-get install make gcc ``` -- Install `ruby2.0`, `rbuy2.0-dev` and `ruby-switch` +- Install `ruby2.0`, `ruby2.0-dev` and `ruby-switch` ``` sudo apt-add-repository ppa:brightbox/ruby-ng sudo apt-get update From fe35e64696826411fbb564f25ea2c228681c89c5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 15 Oct 2016 04:41:03 -0500 Subject: [PATCH 030/826] Reset animation speed when not swimming (#4546) --- addons/advanced_fatigue/functions/fnc_handleEffects.sqf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf index e23b9d86cd..1ecfb34a88 100644 --- a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf @@ -60,6 +60,9 @@ if (GVAR(ppeBlackoutLast) == 1) then { if (GVAR(isSwimming)) exitWith { _unit setAnimSpeedCoef (1 - _fatigue / 3); }; +if ((getAnimSpeedCoef _unit) != 1) then { + _unit setAnimSpeedCoef 1; +}; if (_overexhausted) then { [_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); From 6fce923783595cdcf739606064fac028dd1fa7a7 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 12 Oct 2016 18:44:49 -0500 Subject: [PATCH 031/826] Fix mortar changes for laser shootRay changes Ref #4478 --- .../functions/fnc_handlePlayerVehicleChanged.sqf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf index 69a71c63ca..3f2a8c1f0d 100644 --- a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -86,10 +86,10 @@ if (_lastFireMode != -1) then { // With no ammo, distance display will be empty, but gun will still fire at wonky angle if aimed at ground private _testSeekerPosASL = AGLtoASL (positionCameraToWorld [0,0,0]); private _testSeekerDir = _testSeekerPosASL vectorFromTo (AGLtoASL (positionCameraToWorld [0,0,1])); - private _laserRange = [_testSeekerPosASL, _testSeekerDir, _mortarVeh] call EFUNC(laser,shootRay); - _laserRange params ["", ["_rayDistance", -5]]; // ToDo: move shootRay to common - TRACE_2("",_rayDistance,viewDistance); - _useRealWeaponDir = _rayDistance > viewDistance; // If we are looking at infinity (based on viewDistance) + private _testPoint = _testSeekerPosASL vectorAdd (_testSeekerDir vectorMultiply viewDistance); + if ((terrainIntersectASL [_testSeekerPosASL, _testPoint]) || {lineIntersects [_testSeekerPosASL, _testPoint]}) then { + _useRealWeaponDir = false; // If we are not looking at infinity (based on viewDistance) + }; }; if (_useRealWeaponDir) then { From 8afb3c72795af2cd78cb46fcee9e81a661f10e7e Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 15 Oct 2016 11:44:26 +0200 Subject: [PATCH 032/826] Update CBA required version --- addons/main/script_mod.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 253fe72ea8..d4244e2f12 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -13,7 +13,7 @@ // MINIMAL required version for the Mod. Components can specify others.. #define REQUIRED_VERSION 1.64 -#define REQUIRED_CBA_VERSION {3,1,0} +#define REQUIRED_CBA_VERSION {3,1,1} #ifdef COMPONENT_BEAUTIFIED #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED) From d9a199b942999d87d2b2686e20dfe441ea75b231 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 15 Oct 2016 11:44:43 +0200 Subject: [PATCH 033/826] Increment build number --- addons/main/script_mod.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index d4244e2f12..766a4ef25e 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -6,7 +6,7 @@ #define MAJOR 3 #define MINOR 8 #define PATCHLVL 0 -#define BUILD 7 +#define BUILD 8 #define VERSION MAJOR.MINOR.PATCHLVL.BUILD #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD From 846b7f26f727392709ae0f20cde5759d458253b7 Mon Sep 17 00:00:00 2001 From: bux578 Date: Sun, 16 Oct 2016 10:48:14 +0200 Subject: [PATCH 034/826] Dockerfile (#4550) * add init dockerfile * add dockerfile documentation * gitignore gemfile.lock * improve Dockerfile * add docker-compose file * change readme to use docker-compose * improve readme * Fix readme - Debian != Windows * Small wording improvement * copy contents into dockerfile To be able to run it without a volume (but with `docker-compose up` who would do that :) ) --- docs/.dockerignore | 1 + docs/.gitignore | 2 + docs/Dockerfile | 14 +++++ docs/Gemfile.lock | 135 ---------------------------------------- docs/README.md | 69 +++++++++++++------- docs/docker-compose.yml | 10 +++ 6 files changed, 74 insertions(+), 157 deletions(-) create mode 100644 docs/.dockerignore create mode 100644 docs/Dockerfile delete mode 100644 docs/Gemfile.lock create mode 100644 docs/docker-compose.yml diff --git a/docs/.dockerignore b/docs/.dockerignore new file mode 100644 index 0000000000..85de9cf933 --- /dev/null +++ b/docs/.dockerignore @@ -0,0 +1 @@ +src diff --git a/docs/.gitignore b/docs/.gitignore index 3232b5a935..7836aaf3f3 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -18,3 +18,5 @@ addons CNAME tools/temp + +Gemfile.lock diff --git a/docs/Dockerfile b/docs/Dockerfile new file mode 100644 index 0000000000..aecfb1aa33 --- /dev/null +++ b/docs/Dockerfile @@ -0,0 +1,14 @@ +# Build: +# docker build -t ace3mod/jekyll . +# +# Run: +# docker run -p 4000:4000 -it ace3mod/jekyll + +FROM starefossen/github-pages:latest +MAINTAINER bux + +COPY . /usr/src/app + +VOLUME "/usr/src/app" + +CMD ["jekyll", "serve", "--future", "--incremental", "--config", "_config_dev.yml", "-H", "0.0.0.0", "-P", "4000"] diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock deleted file mode 100644 index faafb3cd3d..0000000000 --- a/docs/Gemfile.lock +++ /dev/null @@ -1,135 +0,0 @@ -GEM - remote: http://rubygems.org/ - specs: - RedCloth (4.2.9) - RedCloth (4.2.9-x86-mingw32) - activesupport (4.2.5.2) - i18n (~> 0.7) - json (~> 1.7, >= 1.7.7) - minitest (~> 5.1) - thread_safe (~> 0.3, >= 0.3.4) - tzinfo (~> 1.1) - addressable (2.3.8) - coffee-script (2.4.1) - coffee-script-source - execjs - coffee-script-source (1.10.0) - colorator (0.1) - ethon (0.8.1) - ffi (>= 1.3.0) - execjs (2.6.0) - faraday (0.9.2) - multipart-post (>= 1.2, < 3) - ffi (1.9.10) - ffi (1.9.10-x86-mingw32) - gemoji (2.1.0) - github-pages (52) - RedCloth (= 4.2.9) - github-pages-health-check (= 1.0.1) - jekyll (= 3.0.3) - jekyll-coffeescript (= 1.0.1) - jekyll-feed (= 0.4.0) - jekyll-gist (= 1.4.0) - jekyll-mentions (= 1.0.1) - jekyll-paginate (= 1.1.0) - jekyll-redirect-from (= 0.9.1) - jekyll-sass-converter (= 1.3.0) - jekyll-seo-tag (= 1.3.1) - jekyll-sitemap (= 0.10.0) - jekyll-textile-converter (= 0.1.0) - jemoji (= 0.5.1) - kramdown (= 1.9.0) - liquid (= 3.0.6) - mercenary (~> 0.3) - rdiscount (= 2.1.8) - redcarpet (= 3.3.3) - rouge (= 1.10.1) - terminal-table (~> 1.4) - github-pages-health-check (1.0.1) - addressable (~> 2.3) - net-dns (~> 0.8) - octokit (~> 4.0) - public_suffix (~> 1.4) - typhoeus (~> 0.7) - html-pipeline (2.3.0) - activesupport (>= 2, < 5) - nokogiri (>= 1.4) - i18n (0.7.0) - jekyll (3.0.3) - colorator (~> 0.1) - jekyll-sass-converter (~> 1.0) - jekyll-watch (~> 1.1) - kramdown (~> 1.3) - liquid (~> 3.0) - mercenary (~> 0.3.3) - rouge (~> 1.7) - safe_yaml (~> 1.0) - jekyll-coffeescript (1.0.1) - coffee-script (~> 2.2) - jekyll-feed (0.4.0) - jekyll-gist (1.4.0) - octokit (~> 4.2) - jekyll-mentions (1.0.1) - html-pipeline (~> 2.3) - jekyll (~> 3.0) - jekyll-paginate (1.1.0) - jekyll-redirect-from (0.9.1) - jekyll (>= 2.0) - jekyll-sass-converter (1.3.0) - sass (~> 3.2) - jekyll-seo-tag (1.3.1) - jekyll (~> 3.0) - jekyll-sitemap (0.10.0) - jekyll-textile-converter (0.1.0) - RedCloth (~> 4.0) - jekyll-watch (1.3.1) - listen (~> 3.0) - jemoji (0.5.1) - gemoji (~> 2.0) - html-pipeline (~> 2.2) - jekyll (>= 2.0) - json (1.8.3) - kramdown (1.9.0) - liquid (3.0.6) - listen (3.0.6) - rb-fsevent (>= 0.9.3) - rb-inotify (>= 0.9.7) - mercenary (0.3.5) - mini_portile2 (2.0.0) - minitest (5.8.4) - multipart-post (2.0.0) - net-dns (0.8.0) - nokogiri (1.6.7.2) - mini_portile2 (~> 2.0.0.rc2) - nokogiri (1.6.7.2-x86-mingw32) - mini_portile2 (~> 2.0.0.rc2) - octokit (4.2.0) - sawyer (~> 0.6.0, >= 0.5.3) - public_suffix (1.5.3) - rb-fsevent (0.9.7) - rb-inotify (0.9.7) - ffi (>= 0.5.0) - rdiscount (2.1.8) - redcarpet (3.3.3) - rouge (1.10.1) - safe_yaml (1.0.4) - sass (3.4.21) - sawyer (0.6.0) - addressable (~> 2.3.5) - faraday (~> 0.8, < 0.10) - terminal-table (1.5.2) - thread_safe (0.3.5) - typhoeus (0.8.0) - ethon (>= 0.8.0) - tzinfo (1.2.2) - thread_safe (~> 0.1) - -PLATFORMS - ruby - x86-mingw32 - -DEPENDENCIES - github-pages - -BUNDLED WITH - 1.12.5 diff --git a/docs/README.md b/docs/README.md index 4565d796e0..24e1a1ff8a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,10 +1,52 @@ # Source of http://ace3mod.com/ -## Setting up the development environment +## Updating compiled JavaScript and CSS files -### Installing prerequisites +- Install [Node.js](https://nodejs.org/download/) +- Open Command Prompt and navigate to `src` directory + ``` + cd /docs/src + ``` -#### Windows (CMD) +- Install Node packages + ``` + npm install + ``` + _On Bash on Ubuntu on Windows also install `nodejs-legacy` in case of errors._ + +- Update files + ``` + grunt + ``` + +## Setting up the Jekyll environment + +### Using Docker + +We include files for [Docker](https://www.docker.com/) to run Jekyll in a separate container. This allows you to not having to install anything apart from Docker on your computer. + +#### Running the Dockerfile + +- Install [Docker](https://www.docker.com/) +- cd into the `/docs/` directory +- Open Command Prompt and navigate to this directory + ``` + cd /docs + ``` + +- Build and run the container + ``` + docker-compose up + ``` + +- Navigate to [http://localhost:4000](http://localhost:4000) + + +### Manually + +#### Installing prerequisites + +##### Windows (CMD) - Install [Ruby 2.0.0-p648 (x64)](http://rubyinstaller.org/downloads/) - Install [Ruby DevKit for 2.0 (x64)](http://rubyinstaller.org/downloads/) @@ -23,6 +65,7 @@ bundle install ``` + #### Debian / Bash on Ubuntu on Windows - Open Bash and navigate to this directory @@ -62,7 +105,7 @@ find ~/.bundle/cache -type d -exec chmod 0755 {} + ``` -### Running +#### Running - Run Jekyll through bundler ``` @@ -72,21 +115,3 @@ - Navigate to http://localhost:4000 -### Updating compiled JavaScript and CSS files - -- Install [Node.js](https://nodejs.org/download/) -- Open Command Prompt and navigate to `src` directory - ``` - cd /docs/src - ``` - -- Install Node packages - ``` - npm install - ``` - _On Bash on Ubuntu on Windows also install `nodejs-legacy` in case of errors._ - -- Update files - ``` - grunt - ``` diff --git a/docs/docker-compose.yml b/docs/docker-compose.yml new file mode 100644 index 0000000000..9999a5b6e8 --- /dev/null +++ b/docs/docker-compose.yml @@ -0,0 +1,10 @@ +version: '2' + +services: + docs: + build: . + restart: always + ports: + - "4000:4000" + volumes: + - ./:/usr/src/app From 5ae81452340c63de5b353ee98c3cca1bb1114829 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 17 Oct 2016 03:55:42 -0500 Subject: [PATCH 035/826] Don't show dogtag ID in action menu (#4558) #4476 --- addons/dogtags/functions/fnc_addDogtagActions.sqf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/dogtags/functions/fnc_addDogtagActions.sqf b/addons/dogtags/functions/fnc_addDogtagActions.sqf index 05f136830c..7cd7529bcc 100644 --- a/addons/dogtags/functions/fnc_addDogtagActions.sqf +++ b/addons/dogtags/functions/fnc_addDogtagActions.sqf @@ -32,8 +32,7 @@ private _unitDogtagIDs = []; //Create action children for all dogtags private _actions = []; { - private _tagID = _unitDogtagIDs select _forEachIndex; - private _displayName = format ["%1 #%2", getText (configFile >> "CfgWeapons" >> _x >> "displayName"), _tagID]; + private _displayName = format ["%1", getText (configFile >> "CfgWeapons" >> _x >> "displayName")]; private _picture = getText (configFile >> "CfgWeapons" >> _x >> "picture"); private _action = [_x, _displayName, _picture, {_this call FUNC(checkDogtagItem)}, {true}, {}, _x] call EFUNC(interact_menu,createAction); From 63f3673a658766520c9241439baea0975656df90 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 12 Oct 2016 17:35:24 -0500 Subject: [PATCH 036/826] Missile Guidance Overhaul --- .../fnc_dev_drawVisibleLaserTargets.sqf | 2 +- .../functions/fnc_seekerFindLaserSpot.sqf | 19 +- addons/missileguidance/ACE_Settings.hpp | 3 +- addons/missileguidance/CfgAmmo.hpp | 2 + addons/missileguidance/XEH_PREP.hpp | 10 +- .../functions/fnc_attackProfile_AIR.sqf | 22 ++- .../functions/fnc_attackProfile_DIR.sqf | 22 ++- .../functions/fnc_attackProfile_HI.sqf | 22 ++- .../functions/fnc_attackProfile_JAV_DIR.sqf | 64 ++++--- .../functions/fnc_attackProfile_JAV_TOP.sqf | 75 ++++---- .../functions/fnc_attackProfile_LIN.sqf | 71 +++++--- .../functions/fnc_attackProfile_MID.sqf | 22 ++- .../functions/fnc_changeMissileDirection.sqf | 27 ++- .../functions/fnc_checkLos.sqf | 20 ++- .../functions/fnc_checkSeekerAngle.sqf | 38 ++-- .../functions/fnc_doAttackProfile.sqf | 51 +++--- .../functions/fnc_doHandoff.sqf | 3 +- .../functions/fnc_doSeekerSearch.sqf | 63 ++++--- .../functions/fnc_guidancePFH.sqf | 167 +++++++++--------- .../functions/fnc_handleHandoff.sqf | 5 +- .../missileguidance/functions/fnc_onFired.sqf | 122 ++++++++----- .../functions/fnc_onIncomingMissile.sqf | 27 ++- .../functions/fnc_rotateVectLine.sqf | 39 ---- .../functions/fnc_rotateVectLineGetMap.sqf | 37 ---- .../functions/fnc_seekerType_Optic.sqf | 74 ++++---- .../functions/fnc_seekerType_SALH.sqf | 45 ++--- addons/missileguidance/script_component.hpp | 3 +- 27 files changed, 600 insertions(+), 455 deletions(-) delete mode 100644 addons/missileguidance/functions/fnc_rotateVectLine.sqf delete mode 100644 addons/missileguidance/functions/fnc_rotateVectLineGetMap.sqf diff --git a/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf b/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf index 00a4e8a5e6..7598bf8f46 100644 --- a/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf +++ b/addons/laser/functions/fnc_dev_drawVisibleLaserTargets.sqf @@ -14,7 +14,7 @@ private _testSeekerPosASL = AGLtoASL (_seekerVehicle modelToWorldVisual [0,0,1]) private _testSeekerDir = vectorDirVisual _seekerVehicle; { private _code = _x; - private _results = [_testSeekerPosASL, _testSeekerDir, 45, [1550,1550], _code, _seekerVehicle] call FUNC(seekerFindLaserSpot); + private _results = [_testSeekerPosASL, _testSeekerDir, 45, 10000, [1550,1550], _code, _seekerVehicle] call FUNC(seekerFindLaserSpot); private _resultPos = _results select 0; if (!isNil "_resultPos") then { // Draw lock results diff --git a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf index c16e4389e2..612cc17fe5 100644 --- a/addons/laser/functions/fnc_seekerFindLaserSpot.sqf +++ b/addons/laser/functions/fnc_seekerFindLaserSpot.sqf @@ -7,9 +7,10 @@ * 0: Position of seeker (ASL) * 1: Direction vector (will be normalized) * 2: Seeker FOV in degrees - * 3: Seeker wavelength sensitivity range, [1550,1550] is common eye safe. - * 4: Seeker laser code. - * 5: Ignore 1 (e.g. Player's vehicle) + * 3: Seeker max distance in meters + * 4: Seeker wavelength sensitivity range, [1550,1550] is common eye safe. + * 5: Seeker laser code. + * 6: Ignore 1 (e.g. Player's vehicle) * * Return Value: * Array, [Strongest compatible laser spot ASL pos, owner object] Nil array values if nothing found. @@ -24,13 +25,15 @@ BEGIN_COUNTER(seekerFindLaserSpot); -params ["_posASL", "_dir", "_seekerFov", "_seekerWavelengths", "_seekerCode", ["_ignoreObj1", objNull]]; +params ["_posASL", "_dir", "_seekerFov", "_seekerMaxDistnace", "_seekerWavelengths", "_seekerCode", ["_ignoreObj1", objNull]]; _dir = vectorNormalized _dir; _seekerWavelengths params ["_seekerWavelengthMin", "_seekerWavelengthMax"]; -private _seekerCos = cos _seekerFov; -TRACE_5("",_posASL,_dir,_seekerFov,_seekerWavelengths,_seekerCode); +private _seekerCos = cos _seekerFov; +private _seekerMaxDistSq = _seekerMaxDistnace ^ 2; + +TRACE_6("",_posASL,_dir,_seekerFov,_seekerMaxDistnace,_seekerWavelengths,_seekerCode); private _spots = []; private _finalPos = nil; @@ -76,7 +79,7 @@ private _finalOwner = objNull; _testPoint = _x select 0; private _testPointVector = _posASL vectorFromTo _testPoint; private _testDotProduct = _dir vectorDotProduct _testPointVector; - if (_testDotProduct > _seekerCos) then { + if ((_testDotProduct > _seekerCos) && {(_testPoint vectorDistanceSqr _posASL) < _seekerMaxDistSq}) then { _spots pushBack [_testPoint, _owner]; }; } forEach _resultPositions; @@ -87,7 +90,7 @@ private _finalOwner = objNull; if (_distance > 0) then { private _testPointVector = _posASL vectorFromTo _resultPos; private _testDotProduct = _dir vectorDotProduct _testPointVector; - if (_testDotProduct > _seekerCos) then { + if ((_testDotProduct > _seekerCos) && {(_testPoint vectorDistanceSqr _posASL) < _seekerMaxDistSq}) then { _spots pushBack [_resultPos, _owner]; }; }; diff --git a/addons/missileguidance/ACE_Settings.hpp b/addons/missileguidance/ACE_Settings.hpp index e73d533c08..6394e75390 100644 --- a/addons/missileguidance/ACE_Settings.hpp +++ b/addons/missileguidance/ACE_Settings.hpp @@ -2,9 +2,8 @@ class ACE_Settings { class GVAR(enabled) { value = 2; typeName = "SCALAR"; - isClientSettable = 1; displayName = CSTRING(Title); description = CSTRING(Desc); values[] = {CSTRING(Off), CSTRING(PlayerOnly), CSTRING(PlayerAndAi)}; }; -}; \ No newline at end of file +}; diff --git a/addons/missileguidance/CfgAmmo.hpp b/addons/missileguidance/CfgAmmo.hpp index 1d2c58ad93..343b911f23 100644 --- a/addons/missileguidance/CfgAmmo.hpp +++ b/addons/missileguidance/CfgAmmo.hpp @@ -108,6 +108,8 @@ class CfgAmmo { seekerMinRange = 0; seekerMaxRange = 2500; // Range from the missile which the seeker can visually search + seekLastTargetPos = 1; // seek last target position [if seeker loses LOS of target, continue to last known pos] + // Attack profile type selection defaultAttackProfile = "JAV_TOP"; attackProfiles[] = { "JAV_TOP", "JAV_DIR" }; diff --git a/addons/missileguidance/XEH_PREP.hpp b/addons/missileguidance/XEH_PREP.hpp index 55948e7171..8d13e2b499 100644 --- a/addons/missileguidance/XEH_PREP.hpp +++ b/addons/missileguidance/XEH_PREP.hpp @@ -1,6 +1,4 @@ -PREP(rotateVectLineGetMap); -PREP(rotateVectLine); PREP(changeMissileDirection); PREP(checkSeekerAngle); @@ -17,11 +15,11 @@ PREP(doHandoff); PREP(handleHandoff); // Attack Profiles -PREP(attackProfile_LIN); -PREP(attackProfile_DIR); -PREP(attackProfile_MID); -PREP(attackProfile_HI); PREP(attackProfile_AIR); +PREP(attackProfile_DIR); +PREP(attackProfile_HI); +PREP(attackProfile_LIN); +PREP(attackProfile_MID); // Javelin profiles PREP(attackProfile_JAV_DIR); diff --git a/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf index 9909124e2f..3d2b5f36b8 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_AIR.sqf @@ -1,4 +1,22 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Attack profile: AIR + * TODO: falls back to Linear + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Seeker State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_AIR; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -_this call FUNC(attackProfile_LIN); \ No newline at end of file +_this call FUNC(attackProfile_LIN); diff --git a/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf index 9909124e2f..8e049a9fe2 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_DIR.sqf @@ -1,4 +1,22 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Attack profile: DIR + * TODO: falls back to Linear + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Seeker State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_DIR; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -_this call FUNC(attackProfile_LIN); \ No newline at end of file +_this call FUNC(attackProfile_LIN); diff --git a/addons/missileguidance/functions/fnc_attackProfile_HI.sqf b/addons/missileguidance/functions/fnc_attackProfile_HI.sqf index 9909124e2f..279196a888 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_HI.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_HI.sqf @@ -1,4 +1,22 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Attack profile: HI + * TODO: falls back to Linear + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Attack Profile State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_HI; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -_this call FUNC(attackProfile_LIN); \ No newline at end of file +_this call FUNC(attackProfile_LIN); diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf index adcdc703de..4740bf6f0f 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf @@ -1,4 +1,21 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Attack profile: Javelin Dir + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Attack Profile State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_JAV_DIR; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" #define STAGE_LAUNCH 1 @@ -6,48 +23,41 @@ #define STAGE_COAST 3 #define STAGE_TERMINAL 4 -EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -private["_targetPos", "_projectilePos", "_target", "_seekerTargetPos", "_launchParams", "_targetLaunchParams"]; -private["_distanceToTarget", "_distanceToShooter", "_addHeight", "_returnTargetPos", "_state"]; -private["_cruisAlt", "_distanceShooterToTarget", "_shooterPos"]; -_seekerTargetPos = _this select 0; -_launchParams = _this select 1; +params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; +_args params ["_firedEH"]; +_firedEH params ["_shooter","","","","","","_projectile"]; -_target = _launchParams select 0; -_targetLaunchParams = _launchParams select 1; - -_state = _this select 2; -if( (count _state) < 1) then { - _state set[0, STAGE_LAUNCH]; +if (_attackProfileStateParams isEqualTo []) then { + _attackProfileStateParams set [0, STAGE_LAUNCH]; }; -_shooterPos = getPosASL _shooter; -_projectilePos = getPosASL _projectile; +private _shooterPos = getPosASL _shooter; +private _projectilePos = getPosASL _projectile; -_distanceToTarget = _projectilePos vectorDistance _seekerTargetPos; -_distanceToShooter = _projectilePos vectorDistance _shooterPos; -_distanceShooterToTarget = _shooterPos vectorDistance _seekerTargetPos; +private _distanceToTarget = _projectilePos vectorDistance _seekerTargetPos; +private _distanceToShooter = _projectilePos vectorDistance _shooterPos; +private _distanceShooterToTarget = _shooterPos vectorDistance _seekerTargetPos; TRACE_2("", _distanceToTarget, _distanceToShooter); // Add height depending on distance for compensate -_returnTargetPos = _seekerTargetPos; +private _returnTargetPos = _seekerTargetPos; -switch( (_state select 0) ) do { +switch (_attackProfileStateParams select 0) do { case STAGE_LAUNCH: { TRACE_1("STAGE_LAUNCH",""); - if(_distanceToShooter < 10) then { + if (_distanceToShooter < 10) then { _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*2]; } else { - _state set[0, STAGE_CLIMB]; + _attackProfileStateParams set [0, STAGE_CLIMB]; }; }; case STAGE_CLIMB: { TRACE_1("STAGE_CLIMB",""); - _cruisAlt = 60 * (_distanceShooterToTarget/2000); + private _cruisAlt = 60 * (_distanceShooterToTarget/2000); - if( ((ASLToAGL _projectilePos) select 2) - ((ASLToAGL _seekerTargetPos) select 2) >= _cruisAlt) then { - _state set[0, STAGE_TERMINAL]; + if ( ((ASLToAGL _projectilePos) select 2) - ((ASLToAGL _seekerTargetPos) select 2) >= _cruisAlt) then { + _attackProfileStateParams set [0, STAGE_TERMINAL]; } else { _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*1.5]; }; @@ -58,9 +68,5 @@ switch( (_state select 0) ) do { }; }; -#ifdef DEBUG_MODE_FULL -drawLine3D [(ASLtoAGL _returnTargetPos), (ASLtoAGL _seekerTargetPos), [0,1,0,1]]; -#endif - TRACE_1("Adjusted target position", _returnTargetPos); _returnTargetPos; diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf index b3361ede9f..06ef934ea5 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf @@ -1,4 +1,21 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Attack profile: Javelin Top + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Attack Profile State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_JAV_TOP; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" #define STAGE_LAUNCH 1 @@ -6,55 +23,47 @@ #define STAGE_COAST 3 #define STAGE_TERMINAL 4 -EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -private["_targetPos", "_projectilePos", "_target", "_seekerTargetPos", "_launchParams", "_targetLaunchParams"]; -private["_distanceToTarget", "_distanceToShooter", "_addHeight", "_returnTargetPos", "_state"]; -private["_cruisAlt", "_distanceShooterToTarget", "_shooterPos"]; +params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; +_args params ["_firedEH"]; +_firedEH params ["_shooter","","","","","","_projectile"]; -_seekerTargetPos = _this select 0; -_launchParams = _this select 1; - -_target = _launchParams select 0; -_targetLaunchParams = _launchParams select 1; - -_state = _this select 2; -if( (count _state) < 1) then { - _state set[0, STAGE_LAUNCH]; +if (_attackProfileStateParams isEqualTo []) then { + _attackProfileStateParams set [0, STAGE_LAUNCH]; }; -_shooterPos = getPosASL _shooter; -_projectilePos = getPosASL _projectile; +private _shooterPos = getPosASL _shooter; +private _projectilePos = getPosASL _projectile; -_distanceToTarget = _projectilePos vectorDistance _seekerTargetPos; -_distanceToShooter = _projectilePos vectorDistance _shooterPos; -_distanceShooterToTarget = _shooterPos vectorDistance _seekerTargetPos; +private _distanceToTarget = _projectilePos vectorDistance _seekerTargetPos; +private _distanceToShooter = _projectilePos vectorDistance _shooterPos; +private _distanceShooterToTarget = _shooterPos vectorDistance _seekerTargetPos; TRACE_2("", _distanceToTarget, _distanceToShooter); // Add height depending on distance for compensate -_returnTargetPos = _seekerTargetPos; +private _returnTargetPos = _seekerTargetPos; -switch( (_state select 0) ) do { +switch( (_attackProfileStateParams select 0) ) do { case STAGE_LAUNCH: { TRACE_1("STAGE_LAUNCH",""); - if(_distanceToShooter < 10) then { + if (_distanceToShooter < 10) then { _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*2]; } else { - _state set[0, STAGE_CLIMB]; + _attackProfileStateParams set [0, STAGE_CLIMB]; }; }; case STAGE_CLIMB: { TRACE_1("STAGE_CLIMB",""); _cruisAlt = 140; - if(_distanceShooterToTarget < 1250) then { - _cruisAlt = 140 * (_distanceShooterToTarget/1250); + if (_distanceShooterToTarget < 1250) then { + private _cruisAlt = 140 * (_distanceShooterToTarget/1250); TRACE_1("_cruisAlt", _cruisAlt); }; - if( ((ASLToAGL _projectilePos) select 2) - ((ASLToAGL _seekerTargetPos) select 2) >= _cruisAlt) then { - if(_cruisAlt < 140) then { - _state set[0, STAGE_TERMINAL]; + if ( ((ASLToAGL _projectilePos) select 2) - ((ASLToAGL _seekerTargetPos) select 2) >= _cruisAlt) then { + if (_cruisAlt < 140) then { + _attackProfileStateParams set [0, STAGE_TERMINAL]; } else { - _state set[0, STAGE_COAST]; + _attackProfileStateParams set [0, STAGE_COAST]; }; } else { _returnTargetPos = _seekerTargetPos vectorAdd [0,0,_distanceToTarget*1.5]; @@ -63,8 +72,8 @@ switch( (_state select 0) ) do { case STAGE_COAST: { TRACE_1("STAGE_COAST",""); TRACE_1("", ((ASLToAGL _projectilePos) select 2) - (( ASLToAGL _seekerTargetPos) select 2) ); - if(_distanceToTarget < ( ((ASLToAGL _projectilePos) select 2) - (( ASLToAGL _seekerTargetPos) select 2) ) * 1.5) then { - _state set[0, STAGE_TERMINAL]; + if (_distanceToTarget < ( ((ASLToAGL _projectilePos) select 2) - (( ASLToAGL _seekerTargetPos) select 2) ) * 2) then { + _attackProfileStateParams set [0, STAGE_TERMINAL]; } else { _returnTargetPos = _seekerTargetPos vectorAdd [0,0,(_projectilePos select 2)]; }; @@ -76,9 +85,5 @@ switch( (_state select 0) ) do { }; }; -#ifdef DEBUG_MODE_FULL -drawLine3D [(ASLtoAGL _returnTargetPos), (ASLtoAGL _seekerTargetPos), [0,1,0,1]]; -#endif - TRACE_1("Adjusted target position", _returnTargetPos); _returnTargetPos; diff --git a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf index b399f9553d..58d2768607 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf @@ -1,50 +1,63 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Attack profile: Linear (used by DAGR) + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Attack Profile State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_LIN; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -private["_targetPos", "_projectilePos", "_target", "_seekerTargetPos", "_launchParams", "_targetLaunchParams"]; -private["_distanceToTarget", "_distanceToShooter", "_addHeight", "_returnTargetPos", "_shooterPos"]; -_seekerTargetPos = _this select 0; -_launchParams = _this select 1; +params ["_seekerTargetPos", "_args"]; +_args params ["_firedEH"]; +_firedEH params ["_shooter","","","","","","_projectile"]; -_target = _launchParams select 0; -_targetLaunchParams = _launchParams select 1; +private _shooterPos = getPosASL _shooter; +private _projectilePos = getPosASL _projectile; -_shooterPos = getPosASL _shooter; -_projectilePos = getPosASL _projectile; +private _distanceToTarget = _projectilePos vectorDistance _seekerTargetPos; +private _distanceToShooter = _projectilePos vectorDistance _shooterPos; +private _distanceShooterToTarget = _shooterPos vectorDistance _seekerTargetPos; -_distanceToTarget = _projectilePos vectorDistance _seekerTargetPos; -_distanceToShooter = _projectilePos vectorDistance _shooterPos; - -TRACE_3("", _distanceToTarget, _distanceToShooter, _seekerTargetPos); +TRACE_2("", _distanceToTarget, _distanceToShooter); // Add height depending on distance for compensate -_addHeight = [0,0,0]; +private _addHeight = [0,0,0]; // Always climb an arc on initial launch if we are close to the round -if( ((ASLtoAGL _projectilePos) select 2) < 5 && _distanceToShooter < 15) then { - _addHeight = _addHeight vectorAdd [0,0,_distanceToTarget]; +if ((((ASLtoAGL _projectilePos) select 2) < 5) && {_distanceToShooter < 15}) then { + _addHeight = _addHeight vectorAdd [0,0,_distanceToTarget]; + TRACE_1("climb - near shooter",_addHeight); } else { // If we are below the target, increase the climbing arc - if((_projectilePos select 2) < (_seekerTargetPos select 2) && _distanceToTarget > 100) then { + if (((_projectilePos select 2) < (_seekerTargetPos select 2)) && {_distanceToTarget > 100}) then { _addHeight = _addHeight vectorAdd [0,0, ((_seekerTargetPos select 2) - (_projectilePos select 2))]; + TRACE_1("climb - below target and far",_addHeight); }; }; -// Handle arcing terminal low for high decent -if( (_projectilePos select 2) > (_seekerTargetPos select 2) && _distanceToTarget < 100) then { - _addHeight = _addHeight vectorDiff [0,0, ((_projectilePos select 2) - (_seekerTargetPos select 2)) * 0.5]; -} else { - if((_projectilePos select 2) > (_seekerTargetPos select 2) && _distanceToTarget > 100) then { +// Handle arcing terminal low for high decent (when projectile above target) +if ((_projectilePos select 2) > (_seekerTargetPos select 2)) then { + if (_distanceToTarget < 100) then { + _addHeight = _addHeight vectorDiff [0,0, ((_projectilePos select 2) - (_seekerTargetPos select 2)) * 0.5]; + TRACE_1("above - close",_addHeight); + } else { + TRACE_1("above - far",_addHeight); _addHeight = _addHeight vectorAdd [0,0, _distanceToTarget*0.02]; }; }; -_returnTargetPos = _seekerTargetPos vectorAdd _addHeight; +private _returnTargetPos = _seekerTargetPos vectorAdd _addHeight; -#ifdef DEBUG_MODE_FULL -drawLine3D [(ASLtoAGL _returnTargetPos) vectorAdd _addHeight, ASLtoAGL _returnTargetPos, [0,1,0,1]]; -#endif - -TRACE_1("Adjusted target position", _returnTargetPos); +TRACE_2("Adjusted target position",_returnTargetPos,_addHeight); _returnTargetPos; diff --git a/addons/missileguidance/functions/fnc_attackProfile_MID.sqf b/addons/missileguidance/functions/fnc_attackProfile_MID.sqf index 9909124e2f..0349a101e4 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_MID.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_MID.sqf @@ -1,4 +1,22 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Attack profile: MID + * TODO: falls back to Linear + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Attack Profile State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_attackProfile_MID; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -_this call FUNC(attackProfile_LIN); \ No newline at end of file +_this call FUNC(attackProfile_LIN); diff --git a/addons/missileguidance/functions/fnc_changeMissileDirection.sqf b/addons/missileguidance/functions/fnc_changeMissileDirection.sqf index f5fdee95a0..28fb46fe28 100644 --- a/addons/missileguidance/functions/fnc_changeMissileDirection.sqf +++ b/addons/missileguidance/functions/fnc_changeMissileDirection.sqf @@ -1,11 +1,26 @@ +/* + * Author: jaynus / nou + * Change a projectile's direction, maintaing speed + * + * Arguments: + * 0: Projectile + * 1: Direction (unit vector) + * + * Return Value: + * None + * + * Example: + * [missile, [0,1,0]] call ace_missileguidance_fnc_changeMissileDirection; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -private ["_projectile", "_v", "_l", "_r"]; -_projectile = _this select 0; -_v = _this select 1; +params ["_projectile", "_v"]; -_l = sqrt ((_v select 0) ^ 2 + (_v select 1) ^ 2); -_r = -(_v select 2) / _l; +private _l = sqrt ((_v select 0) ^ 2 + (_v select 1) ^ 2); +private _r = -(_v select 2) / _l; _projectile setVectorDirAndUp [ _v, [(_v select 0) * _r,(_v select 1) * _r, _l] ]; -_projectile setVelocity (_v vectorMultiply (vectorMagnitude (velocity _projectile))); \ No newline at end of file +_projectile setVelocity (_v vectorMultiply (vectorMagnitude (velocity _projectile))); diff --git a/addons/missileguidance/functions/fnc_checkLos.sqf b/addons/missileguidance/functions/fnc_checkLos.sqf index d41554dc65..1e1d3c7d3e 100644 --- a/addons/missileguidance/functions/fnc_checkLos.sqf +++ b/addons/missileguidance/functions/fnc_checkLos.sqf @@ -3,17 +3,25 @@ * Returns whether the seeker object can see the target position with lineIntersect * * Arguments: - * 0: Seeker [Object] - * 1: Target [Object] + * 0: Seeker + * 1: Target * * Return Value: - * Boolean + * Has LOS + * + * Example: + * [player, cursorTarget] call ace_missileguidance_fnc_checkLOS; + * + * Public: No */ #include "script_component.hpp" params ["_seeker", "_target"]; -if ((isNil "_seeker") || {isNil "_target"}) exitWith {false}; +if ((isNil "_seeker") || {isNil "_target"}) exitWith { + ERROR_2("nil",_seeker,_target); + false +}; private _targetPos = getPosASL _target; private _targetAimPos = aimPos _target; @@ -21,11 +29,11 @@ private _seekerPos = getPosASL _seeker; private _return = true; if (!((terrainIntersectASL [_seekerPos, _targetPos]) && {terrainIntersectASL [_seekerPos, _targetAimPos]})) then { - if(lineIntersects [_seekerPos, _targetPos, _seeker, _target]) then { + if (lineIntersects [_seekerPos, _targetPos, _seeker, _target]) then { _return = false; }; } else { _return = false; }; -_return; \ No newline at end of file +_return; diff --git a/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf b/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf index 9415f347b6..8ddc848594 100644 --- a/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf +++ b/addons/missileguidance/functions/fnc_checkSeekerAngle.sqf @@ -1,31 +1,35 @@ /* * Author: jaynus - * Returns whether the target position is within the maximum angle FOV of the provided seeker + * Returns whether the target position is within the maximum angle FOV of the provided seeker * objects current direction. * * Arguments: - * 0: Seeker [Object] - * 1: Target [Position] - * 2: Max Angle [Degrees] - * + * 0: Seeker + * 1: Target PosASL + * 2: Max Angle (degrees) + * * Return Value: - * Boolean + * Can See + * + * Example: + * [player, cursorTarget, 45] call ace_missileguidance_fnc_checkSeekerAngle; + * + * Public: No */ - +// #define DEBUG_MODE_FULL #include "script_component.hpp" -private ["_seeker", "_targetPos", "_seekerMaxAngle", "_sensorPos", "_testPointVector", "_testDotProduct"]; -_seeker = _this select 0; -_targetPos = _this select 1; -_seekerMaxAngle = _this select 2; +params ["_seeker", "_targetPos", "_seekerMaxAngle"]; -_sensorPos = getPosASL _seeker; +private _sensorPos = getPosASL _seeker; -_testPointVector = vectorNormalized (_targetPos vectorDiff _sensorPos); -_testDotProduct = (vectorNormalized (velocity _seeker)) vectorDotProduct _testPointVector; +private _testPointVector = vectorNormalized (_targetPos vectorDiff _sensorPos); +private _testDotProduct = (vectorNormalized (velocity _seeker)) vectorDotProduct _testPointVector; -if(_testDotProduct < (cos _seekerMaxAngle)) exitWith { - false +TRACE_2("fov",acos _testDotProduct,_seekerMaxAngle); + +if (_testDotProduct < (cos _seekerMaxAngle)) exitWith { + false }; -true \ No newline at end of file +true diff --git a/addons/missileguidance/functions/fnc_doAttackProfile.sqf b/addons/missileguidance/functions/fnc_doAttackProfile.sqf index 1c589838f5..3f390a39a2 100644 --- a/addons/missileguidance/functions/fnc_doAttackProfile.sqf +++ b/addons/missileguidance/functions/fnc_doAttackProfile.sqf @@ -1,29 +1,40 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou, PabstMirror + * Do attack profile with a valid seeker target location + * + * Arguments: + * 0: Seeker Target PosASL + * 1: Guidance Arg Array + * 2: Seeker State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[1,2,3], [], []] call ace_missileguidance_fnc_doAttackProfile; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -private ["_testName", "_attackProfilePos", "_attackProfile", "_attackProfileName", "_attackProfilesCfg", "_i", "_launchParams", "_testame", "_testProfile"]; -_launchParams = ((_this select 1) select 1); -_attackProfileName = _launchParams select 3; +params ["_seekerTargetPos", "_args"]; +_args params ["", "_launchParams"]; +_launchParams params ["", "", "", "_attackProfileName"]; -TRACE_1("Attacking profile", _attackProfileName); +private _attackProfileFunction = getText (configFile >> QGVAR(AttackProfiles) >> _attackProfileName >> "functionName"); -_attackProfilesCfg = ( configFile >> QGVAR(AttackProfiles) ); +private _attackProfilePos = _this call (missionNamespace getVariable _attackProfileFunction); -_attackProfile = nil; -for [{_i=0}, {_i< (count _attackProfilesCfg) }, {_i=_i+1}] do { - _testProfile = _attackProfilesCfg select _i; - _testName = configName _testProfile; - TRACE_3("", _testName, _testProfile, _attackProfilesCfg); - - if( _testName == _attackProfileName) exitWith { - _attackProfile = _attackProfilesCfg select _i; - }; +if ((isNil "_attackProfilePos") || {(vectorMagnitude _attackProfilePos) == 0}) exitWith { + ERROR_1("attack profile returned bad pos",_attackProfilePos); + [0,0,0] }; -_attackProfilePos = [0,0,0]; -if(!isNil "_attackProfile") then { - _attackProfilePos = _this call (missionNamespace getVariable (getText (_attackProfile >> "functionName"))); -}; +#ifdef DRAW_GUIDANCE_INFO +drawLine3D [(ASLtoAGL _attackProfilePos), (ASLtoAGL _seekerTargetPos), [0,1,1,1]]; +drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,0,1,1], ASLtoAGL _attackProfilePos, 0.5, 0.5, 0, _attackProfileName, 1, 0.025, "TahomaB"]; +#endif +TRACE_2("return",_attackProfilePos,_attackProfileName); _attackProfilePos; diff --git a/addons/missileguidance/functions/fnc_doHandoff.sqf b/addons/missileguidance/functions/fnc_doHandoff.sqf index 011c3d52d1..db722713e1 100644 --- a/addons/missileguidance/functions/fnc_doHandoff.sqf +++ b/addons/missileguidance/functions/fnc_doHandoff.sqf @@ -1,4 +1,5 @@ +// Not currently used #include "script_component.hpp" PARAMS_2(_target,_args); -[QGVAR(handoff), [_target, _args]] call CBA_fnc_globalEvent; \ No newline at end of file +[QGVAR(handoff), [_target, _args]] call CBA_fnc_globalEvent; diff --git a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf index 4eaefb6656..3b36aeaf58 100644 --- a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf +++ b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf @@ -1,30 +1,51 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou, PabstMirror + * Do seeker search + * Handles a nil/bad return and will attempt to use last known position if enabled on ammo + * + * Arguments: + * 1: Guidance Arg Array + * 3: Last known pos state array + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[], [], []] call ace_missileguidance_fnc_seekerType_Optic; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -private ["_seekerProfilePos", "_i", "_launchParams", "_seekerType", "_seekerTypeName", "_seekerTypesCfg", "_testName", "_testProfile"]; +params ["", "_args", "", "_lastKnownPosState"]; +_args params ["", "_launchParams"]; +_launchParams params ["", "", "_seekerTypeName"]; +_lastKnownPosState params ["_seekLastTargetPos", "_lastKnownPos"]; -_launchParams = ((_this select 1) select 1); -_seekerTypeName = _launchParams select 2; +private _seekerFunction = getText (configFile >> QGVAR(SeekerTypes) >> _seekerTypeName >> "functionName"); -TRACE_1("Seeker type", _seekerTypeName); +private _seekerTargetPos = _this call (missionNamespace getVariable _seekerFunction); -_seekerTypesCfg = ( configFile >> QGVAR(SeekerTypes) ); - -_seekerType = nil; -for [{_i = 0}, {_i< (count _seekerTypesCfg) }, {_i=_i + 1}] do { - _testProfile = _seekerTypesCfg select _i; - _testName = configName _testProfile; - TRACE_3("", _testName, _testProfile, _seekerTypesCfg); - - if( _testName == _seekerTypeName) exitWith { - _seekerType = _seekerTypesCfg select _i; +if ((isNil "_seekerTargetPos") || {(vectorMagnitude _seekerTargetPos) == 0}) then { + // Seeker returned nil / bad pos + if (_seekLastTargetPos && {(vectorMagnitude _lastKnownPos) != 0}) then { + TRACE_2("seeker returned bad pos - using last known",_seekLastTargetPos,_lastKnownPos); + _seekerTargetPos = _lastKnownPos; + } else { + TRACE_1("seeker returned no pos",_seekerTargetPos); + _seekerTargetPos = [0,0,0]; + }; +} else { + if (_seekLastTargetPos) then { + TRACE_1("saving current pos",_seekLastTargetPos); + _lastKnownPosState set [1, _seekerTargetPos]; }; }; -_seekerProfilePos = [0, 0, 0]; -if(!isNil "_seekerType") then { - _seekerProfilePos = _this call (missionNamespace getVariable (getText (_seekerType >> "functionName"))); -}; +#ifdef DRAW_GUIDANCE_INFO +drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,1,0,1], ASLtoAGL _seekerTargetPos, 0.5, 0.5, 0, _seekerTypeName, 1, 0.025, "TahomaB"]; +#endif -_seekerProfilePos; +TRACE_2("return",_seekerTargetPos,_seekerTypeName); +_seekerTargetPos; diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf index e7fa5a4fd1..e7fe71ca39 100644 --- a/addons/missileguidance/functions/fnc_guidancePFH.sqf +++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf @@ -1,33 +1,41 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Guidance Per Frame Handler + * + * Arguments: + * 0: Guidance Arg Array + * 1: PFID + * + * Return Value: + * Nothing + * + * Example: + * [[], 0] call ace_missileguidance_fnc_guidancePFH; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" +BEGIN_COUNTER(guidancePFH); + #define TIMESTEP_FACTOR 0.01 -private ["_launchParams", "_targetLaunchParams", "_flightParams", "_seekerParams", "_stateParams"]; -private ["_lastRunTime", "_runtimeDelta", "_adjustTime", "_args", "_seekerTargetPos", "_projectilePos"]; -private ["_profileAdjustedTargetPos", "_incDeflection", "_minDeflection", "_maxDeflection"]; -private ["_targetVector", "_adjustVector", "_finalAdjustVector", "_changeVector", "_pitch", "_yaw", "_roll"]; -private ["_PS", "_distanceToTarget", "_targetRelativeVector", "_vectorTo"]; +params ["_args", "_pfID"]; +_args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams"]; +_firedEH params ["_shooter","","","","_ammo","","_projectile"]; +_launchParams params ["","_targetLaunchParams"]; +_stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState"]; -_args = _this select 0; -EXPLODE_7_PVT((_args select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - -if(!alive _projectile || isNull _projectile || isNull _shooter) exitWith { - [(_this select 1)] call CBA_fnc_removePerFrameHandler; +if (!alive _projectile || isNull _projectile || isNull _shooter) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + END_COUNTER(guidancePFH); }; -_launchParams = _args select 1; -_targetLaunchParams = _launchParams select 1; -_flightParams = _args select 2; -_seekerParams = _args select 3; +private _runtimeDelta = diag_tickTime - _lastRunTime; +private _adjustTime = 1; -_stateParams = _args select 4; - -_lastRunTime = _stateParams select 0; -_runtimeDelta = diag_tickTime - _lastRunTime; -_adjustTime = 1; - -if(accTime > 0) then { +if (accTime > 0) then { _adjustTime = 1/accTime; _adjustTime = _adjustTime * (_runtimeDelta / TIMESTEP_FACTOR); TRACE_4("Adjust timing", 1/accTime, _adjustTime, _runtimeDelta, (_runtimeDelta / TIMESTEP_FACTOR) ); @@ -35,72 +43,71 @@ if(accTime > 0) then { _adjustTime = 0; }; -_minDeflection = ((_flightParams select 0) - ((_flightParams select 0) * _adjustTime)) max 0; -_maxDeflection = (_flightParams select 1) * _adjustTime; -_incDeflection = _flightParams select 2; +private _minDeflection = ((_flightParams select 0) - ((_flightParams select 0) * _adjustTime)) max 0; +private _maxDeflection = (_flightParams select 1) * _adjustTime; +// private _incDeflection = _flightParams select 2; // todo -_projectilePos = getPosASL _projectile; +private _projectilePos = getPosASL _projectile; -// @TODO: placeholder for "last seek target position" -// Last target pos should be optional based on the seeker unit -_seekerTargetPos = [ [0,0,0], _args, (_stateParams select 1)] call FUNC(doSeekerSearch); -if(isNil "_seekerTargetPos") then { - _seekerTargetPos = _seekerTargetPos vectorAdd ((velocity _projectile) vectorMultiply 5); -} else { - if( (vectorMagnitude _seekerTargetPos) == 0) then { - _seekerTargetPos = _seekerTargetPos vectorAdd ((velocity _projectile) vectorMultiply 5); +// Run seeker function: +private _seekerTargetPos = [[0,0,0], _args, _seekerStateParams, _lastKnownPosState] call FUNC(doSeekerSearch); + +// If we have no seeker target, then do not change anything +if (!(_seekerTargetPos isEqualTo [0,0,0])) then { + // Run attack profile function: + private _profileAdjustedTargetPos = [_seekerTargetPos, _args, _attackProfileStateParams] call FUNC(doAttackProfile); + + private _targetVector = _projectilePos vectorFromTo _profileAdjustedTargetPos; + private _adjustVector = _targetVector vectorDiff (vectorDir _projectile); + _adjustVector params ["_adjustVectorX", "_adjustVectorY", "_adjustVectorZ"]; + + private _yaw = 0; + private _pitch = 0; + private _roll = 0; + + if (_adjustVectorX < 0) then { + _yaw = - ( (_minDeflection max ((abs _adjustVectorX) min _maxDeflection) ) ); + } else { + if (_adjustVectorX > 0) then { + _yaw = ( (_minDeflection max (_adjustVectorX min _maxDeflection) ) ); + }; + }; + if (_adjustVectorY < 0) then { + _roll = - ( (_minDeflection max ((abs _adjustVectorY) min _maxDeflection) ) ); + } else { + if (_adjustVectorY > 0) then { + _roll = ( (_minDeflection max (_adjustVectorY min _maxDeflection) ) ); + }; + }; + if (_adjustVectorZ < 0) then { + _pitch = - ( (_minDeflection max ((abs _adjustVectorZ) min _maxDeflection) ) ); + } else { + if (_adjustVectorZ > 0) then { + _pitch = ( (_minDeflection max (_adjustVectorZ min _maxDeflection) ) ); + }; + }; + private _finalAdjustVector = [_yaw, _roll, _pitch]; + + TRACE_3("", _pitch, _yaw, _roll); + TRACE_3("", _targetVector, _adjustVector, _finalAdjustVector); + + if (accTime > 0) then { + private _changeVector = (vectorDir _projectile) vectorAdd _finalAdjustVector; + TRACE_2("",_projectile,_changeVector); + [_projectile, _changeVector] call FUNC(changeMissileDirection); }; }; -_profileAdjustedTargetPos = [_seekerTargetPos,_args, (_stateParams select 2)] call FUNC(doAttackProfile); -_targetVector = _projectilePos vectorFromTo _profileAdjustedTargetPos; -_adjustVector = _targetVector vectorDiff (vectorDir _projectile); +#ifdef DRAW_GUIDANCE_INFO +TRACE_3("",_projectilePos,_seekerTargetPos,_profileAdjustedTargetPos); +drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], ASLtoAGL _projectilePos, 0.75, 0.75, 0, _ammo, 1, 0.025, "TahomaB"]; -_yaw = 0; -_pitch = 0; -_roll = 0; -if((_adjustVector select 0) < 0) then { - _yaw = - ( (_minDeflection max (abs(_adjustVector select 0) min _maxDeflection) ) ); -} else { - if((_adjustVector select 0) > 0) then { - _yaw = ( (_minDeflection max ((_adjustVector select 0) min _maxDeflection) ) ); - }; -}; -if((_adjustVector select 1) < 0) then { - _roll = - ( (_minDeflection max (abs(_adjustVector select 1) min _maxDeflection) ) ); -} else { - if((_adjustVector select 1) > 0) then { - _roll = ( (_minDeflection max ((_adjustVector select 1) min _maxDeflection) ) ); - }; -}; -if((_adjustVector select 2) < 0) then { - _pitch = - ( (_minDeflection max (abs(_adjustVector select 2) min _maxDeflection) ) ); -} else { - if((_adjustVector select 2) > 0) then { - _pitch = ( (_minDeflection max ((_adjustVector select 2) min _maxDeflection) ) ); - }; -}; -_finalAdjustVector = [_yaw, _roll, _pitch]; -TRACE_2("", _pitch, _yaw); -TRACE_4("", _targetVector, _targetRelativeVector, _adjustVector, _finalAdjustVector); - -if(accTime > 0) then { - _changeVector = (vectorDir _projectile) vectorAdd _finalAdjustVector; - [_projectile, _changeVector] call FUNC(changeMissileDirection); -}; - -#ifdef DEBUG_MODE_FULL -drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,1,1], ASLtoAGL _projectilePos, 0.75, 0.75, 0, str _vectorTo, 1, 0.025, "TahomaB"]; -drawLine3D [ASLtoAGL _projectilePos, ASLtoAGL _profileAdjustedTargetPos, [1,0,0,1]]; - -_ps = "#particlesource" createVehicleLocal (ASLtoAGL _projectilePos); +private _ps = "#particlesource" createVehicleLocal (ASLtoAGL _projectilePos); _PS setParticleParams [["\A3\Data_f\cl_basic", 8, 3, 1], "", "Billboard", 1, 3.0141, [0, 0, 2], [0, 0, 0], 1, 1.275, 1, 0, [1, 1], [[1, 0, 0, 1], [1, 0, 0, 1], [1, 0, 0, 1]], [1], 1, 0, "", "", nil]; _PS setDropInterval 3.0; - -//hintSilent format["d: %1", _distanceToTarget]; #endif -_stateParams set[0, diag_tickTime]; +_stateParams set [0, diag_tickTime]; -_args set[4, _stateParams]; -_this set[0, _args]; +END_COUNTER(guidancePFH); + diff --git a/addons/missileguidance/functions/fnc_handleHandoff.sqf b/addons/missileguidance/functions/fnc_handleHandoff.sqf index af23ed84d8..25c01694eb 100644 --- a/addons/missileguidance/functions/fnc_handleHandoff.sqf +++ b/addons/missileguidance/functions/fnc_handleHandoff.sqf @@ -1,6 +1,7 @@ +// Not currently used #include "script_component.hpp" PARAMS_2(_target,_args); -if(isNil "_target" || {isNull _target} || {!local _target} ) exitWith { false }; +if (isNil "_target" || {isNull _target} || {!local _target} ) exitWith { false }; -[FUNC(guidancePFH), 0, _args] call CBA_fnc_addPerFrameHandler; \ No newline at end of file +[FUNC(guidancePFH), 0, _args] call CBA_fnc_addPerFrameHandler; diff --git a/addons/missileguidance/functions/fnc_onFired.sqf b/addons/missileguidance/functions/fnc_onFired.sqf index 2269810b94..224cfb14ec 100644 --- a/addons/missileguidance/functions/fnc_onFired.sqf +++ b/addons/missileguidance/functions/fnc_onFired.sqf @@ -1,44 +1,58 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Fired event handler, starts guidance if enabled for ammo + * + * Arguments: + * 0: Shooter (Man/Vehicle) + * 4: Ammo + * 6: Projectile + * + * Return Value: + * Nothing + * + * Example: + * [player, "", "", "", "ACE_Javelin_FGM148", "", theMissile] call ace_missileguidance_fnc_onFired; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -PARAMS_7(_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); - -// Bail if guidance is disabled -// Bail on locality of the projectile, it should be local to us -if(GVAR(enabled) < 1 || {!local _projectile} ) exitWith { false }; - -//Bail if shooter isn't player AND system not enabled for AI: -if( !isPlayer _shooter && { GVAR(enabled) < 2 } ) exitWith { false }; +params ["_shooter","","","","_ammo","","_projectile"]; // Bail on not missile -if(! (_ammo isKindOf "MissileBase") ) exitWith { false }; +if (!(_ammo isKindOf "MissileBase")) exitWith {}; -private ["_config", "_configs", "_enabled", "_target", "_seekerType", "_attackProfile"]; -private ["_args", "_canUseLock", "_guidingUnit", "_launchPos", "_lockMode", "_targetPos", "_vanillaTarget"]; +// Bail if guidance is disabled for this ammo +if ((getNumber (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON) >> "enabled")) != 1) exitWith {}; -//Verify ammo has explicity added guidance config (ignore inheritances) -_configs = configProperties [(configFile >> "CfgAmmo" >> _ammo), QUOTE(configName _x == QUOTE(QUOTE(ADDON))), false]; -if( (count _configs) < 1) exitWith {}; +// Bail on locality of the projectile, it should be local to us +if (GVAR(enabled) < 1 || {!local _projectile} ) exitWith {}; -_config = (configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON)); -_enabled = getNumber ( _config >> "enabled"); +// Bail if shooter isn't player AND system not enabled for AI: +if ( !isPlayer _shooter && { GVAR(enabled) < 2 } ) exitWith {}; -// Bail if guidance is not enabled -if(isNil "_enabled" || {_enabled != 1}) exitWith { false }; +// Verify ammo has explicity added guidance config (ignore inheritances) +private _configs = configProperties [(configFile >> "CfgAmmo" >> _ammo), QUOTE(configName _x == QUOTE(QUOTE(ADDON))), false]; +if ((count _configs) < 1) exitWith {}; -_target = (vehicle _shooter) getVariable [QGVAR(target), nil]; -_targetPos = (vehicle _shooter) getVariable [QGVAR(targetPosition), nil]; -_seekerType = (vehicle _shooter) getVariable [QGVAR(seekerType), nil]; -_attackProfile = (vehicle _shooter) getVariable [QGVAR(attackProfile), nil]; -_lockMode = (vehicle _shooter) getVariable [QGVAR(lockMode), nil]; +// MissileGuidance is enabled for this shot +TRACE_4("enabled",_shooter,_ammo,_projectile,typeOf _shooter); -// @TODO: make this vehicle shooter, but we need to differentiate where its set in ace_laser -_laserCode = _shooter getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE]; -_laserInfo = [_laserCode, ACE_DEFAULT_LASER_WAVELENGTH, ACE_DEFAULT_LASER_WAVELENGTH]; +private _config = configFile >> "CfgAmmo" >> _ammo >> QUOTE(ADDON); -_launchPos = getPosASL (vehicle _shooter); +private _target = _shooter getVariable [QGVAR(target), nil]; +private _targetPos = _shooter getVariable [QGVAR(targetPosition), nil]; +private _seekerType = _shooter getVariable [QGVAR(seekerType), nil]; +private _attackProfile = _shooter getVariable [QGVAR(attackProfile), nil]; +private _lockMode = _shooter getVariable [QGVAR(lockMode), nil]; -TRACE_3("Begin guidance", _target, _seekerType, _attackProfile); +private _laserCode = _shooter getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE]; +private _laserInfo = [_laserCode, ACE_DEFAULT_LASER_WAVELENGTH, ACE_DEFAULT_LASER_WAVELENGTH]; + +TRACE_6("getVars",_target,_targetPos,_seekerType,_attackProfile,_lockMode,_laserCode); + +private _launchPos = getPosASL (vehicle _shooter); if (isNil "_seekerType" || {!(_seekerType in (getArray (_config >> "seekerTypes")))}) then { _seekerType = getText (_config >> "defaultSeekerType"); @@ -51,28 +65,37 @@ if (isNil "_lockMode" || {!(_lockMode in (getArray (_config >> "seekerLockModes" }; // If we didn't get a target, try to fall back on tab locking -if(isNil "_target") then { - if(!isPlayer _shooter) then { +if (isNil "_target") then { + if (!isPlayer _shooter) then { // This was an AI shot, lets still guide it on the AI target - _target = _shooter getVariable[QGVAR(vanilla_target), nil]; + _target = _shooter getVariable [QGVAR(vanilla_target), nil]; TRACE_1("Detected AI Shooter!", _target); } else { - _canUseLock = getNumber (_config >> "canVanillaLock"); + private _canUseLock = getNumber (_config >> "canVanillaLock"); // @TODO: Get vanilla target - if(_canUseLock > 0 || difficulty < 1) then { - _vanillaTarget = cursorTarget; + if (_canUseLock > 0 || difficulty < 1) then { + private _vanillaTarget = cursorTarget; TRACE_1("Using Vanilla Locking", _vanillaTarget); - if(!isNil "_vanillaTarget") then { + if (!isNil "_vanillaTarget") then { _target = _vanillaTarget; }; }; }; }; +// Array for seek last target position +private _seekLastTargetPos = (getNumber ( _config >> "seekLastTargetPos")) == 1; +private _lastKnownPosState = [_seekLastTargetPos]; +if (_seekLastTargetPos && {!isNil "_target"}) then { + _lastKnownPosState set [1, (getPosASL _target)]; +} else { + _lastKnownPosState set [1, [0,0,0]]; +}; + TRACE_4("Beginning ACE guidance system",_target,_ammo,_seekerType,_attackProfile); -_args = [_this, - [_shooter, +private _args = [_this, + [ _shooter, [_target, _targetPos, _launchPos], _seekerType, _attackProfile, @@ -89,30 +112,41 @@ _args = [_this, getNumber ( _config >> "seekerAccuracy" ), getNumber ( _config >> "seekerMaxRange" ) ], - [ diag_tickTime, [], [] ] + [ diag_tickTime, [], [], _lastKnownPosState] ]; +// Reverse: +// _args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams"]; +// _firedEH params ["_shooter","","","","_ammo","","_projectile"]; +// _launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo"]; +// _targetLaunchParams params ["_target", "_targetPos", "_launchPos"]; +// _stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState"]; +// _seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange"]; + + // Hand off to the guiding unit. We just use local player so local PFH fires for now // Laser code needs to give us a shooter for LOBL, or the seeker unit needs to be able to shift locality // Based on its homing laser // Lasers need to be handled in a special LOAL/LOBL case -//if(isPlayer _shooter) then { -// _guidingUnit = ACE_player; +//if (isPlayer _shooter) then { +// private _guidingUnit = ACE_player; // -// if(local _guidingUnit) then { +// if (local _guidingUnit) then { // [FUNC(guidancePFH), 0, _args ] call CBA_fnc_addPerFrameHandler; // } else { // [QGVAR(handoff), [_guidingUnit, _args] ] call FUNC(doHandoff); // }; //} else { - [FUNC(guidancePFH), 0, _args ] call CBA_fnc_addPerFrameHandler; + // [FUNC(guidancePFH), 0, _args ] call CBA_fnc_addPerFrameHandler; //}; +[FUNC(guidancePFH), 0, _args ] call CBA_fnc_addPerFrameHandler; + /* Clears locking settings (vehicle _shooter) setVariable [QGVAR(target), nil]; (vehicle _shooter) setVariable [QGVAR(seekerType), nil]; (vehicle _shooter) setVariable [QGVAR(attackProfile), nil]; (vehicle _shooter) setVariable [QGVAR(lockMode), nil]; -*/ + */ diff --git a/addons/missileguidance/functions/fnc_onIncomingMissile.sqf b/addons/missileguidance/functions/fnc_onIncomingMissile.sqf index 14902c32a5..2dcc93b793 100644 --- a/addons/missileguidance/functions/fnc_onIncomingMissile.sqf +++ b/addons/missileguidance/functions/fnc_onIncomingMissile.sqf @@ -1,8 +1,27 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Handles AI shooting a locking missile + * + * Arguments: + * 0: Target + * 1: Ammo + * 2: Shooter + * + * Return Value: + * None + * + * Example: + * [cursorTarget, "x", player] call ace_missileguidance_fnc_changeMissileDirection; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -PARAMS_3(_target,_ammo,_shooter); -if(GVAR(enabled) < 1) exitWith {}; // bail if enabled +params ["_target", "_ammo", "_shooter"]; + +if (GVAR(enabled) < 1) exitWith {}; // bail if enabled if !(local (gunner _shooter) || {local _shooter}) exitWith {}; // bail if not shooter -_shooter setVariable [QGVAR(vanilla_target),_target, false]; \ No newline at end of file +_shooter setVariable [QGVAR(vanilla_target),_target, false]; +TRACE_2("setting vanilla target",_shooter,_target); diff --git a/addons/missileguidance/functions/fnc_rotateVectLine.sqf b/addons/missileguidance/functions/fnc_rotateVectLine.sqf deleted file mode 100644 index 9adb283cae..0000000000 --- a/addons/missileguidance/functions/fnc_rotateVectLine.sqf +++ /dev/null @@ -1,39 +0,0 @@ -#include "script_component.hpp" -private ["_d", "_map", "_p", "_theta", "_u"]; - -_map = _this select 0; -_theta = _this select 1; - -_p = _map select 0; -_p1 = _map select 1; -_p2 = _map select 2; - -_q1 = +(_map select 3); -_q2 = +(_map select 4); -_u = _map select 5; -_d = _map select 6; - -/* Step 4 */ -_q2 set[0, (_q1 select 0) * cos(_theta) - (_q1 select 1) * sin(_theta)]; -_q2 set[1, (_q1 select 0) * sin(_theta) + (_q1 select 1) * cos(_theta)]; -_q2 set[2, (_q1 select 2)]; - -/* Inverse of step 3 */ -_q1 set[0, (_q2 select 0) * _d + (_q2 select 2) * (_u select 0)]; -_q1 set[1, (_q2 select 1)]; -_q1 set[2, - (_q2 select 0) * (_u select 0) + (_q2 select 2) * _d]; - -/* Inverse of step 2 */ -if (_d != 0) then { - _q2 set[0, (_q1 select 0)]; - _q2 set[1, (_q1 select 1) * (_u select 2) / _d + (_q1 select 2) * (_u select 1) / _d]; - _q2 set[2, - (_q1 select 1) * (_u select 1) / _d + (_q1 select 2) * (_u select 2) / _d]; -} else { - _q2 = _q1; -}; - -/* Inverse of step 1 */ -_q1 set[0, (_q2 select 0) + (_p1 select 0)]; -_q1 set[1, (_q2 select 1) + (_p1 select 1)]; -_q1 set[2, (_q2 select 2) + (_p1 select 2)]; -_q1; \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_rotateVectLineGetMap.sqf b/addons/missileguidance/functions/fnc_rotateVectLineGetMap.sqf deleted file mode 100644 index 258cc93ae2..0000000000 --- a/addons/missileguidance/functions/fnc_rotateVectLineGetMap.sqf +++ /dev/null @@ -1,37 +0,0 @@ -#include "script_component.hpp" - -private ["_p", "_theta", "_p1", "_p2", "_q1", "_q2", "_u", "_d"]; -_p = _this select 0; -_p1 = _this select 1; -_p2 = _this select 2; - -_q1 = []; -_q2 = []; -_u = []; - -/* Step 1 */ -_q1 set[0, (_p select 0) - (_p1 select 0)]; -_q1 set[1, (_p select 1) - (_p1 select 1)]; -_q1 set[2, (_p select 2) - (_p1 select 2)]; - -_u set[0, (_p2 select 0) - (_p1 select 0)]; -_u set[1, (_p2 select 1) - (_p1 select 1)]; -_u set[2, (_p2 select 2) - (_p1 select 2)]; -_u = _u call BIS_fnc_unitVector; -_d = sqrt((_u select 1)*(_u select 1) + (_u select 2)*(_u select 2)); - -/* Step 2 */ -if (_d != 0) then { - _q2 set[0, (_q1 select 0)]; - _q2 set[1, (_q1 select 1) * (_u select 2) / _d - (_q1 select 2) * (_u select 1) / _d]; - _q2 set[2, (_q1 select 1) * (_u select 1) / _d + (_q1 select 2) * (_u select 2) / _d]; -} else { - _q2 = _q1; -}; - -/* Step 3 */ -_q1 set[0, (_q2 select 0) * _d - (_q2 select 2) * (_u select 0)]; -_q1 set[1, (_q2 select 1)]; -_q1 set[2, (_q2 select 0) * (_u select 0) + (_q2 select 2) * _d]; - -[_p, _p1, _p2, _q1, _q2, _u, _d] \ No newline at end of file diff --git a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf index b491110ac6..173b6ba708 100644 --- a/addons/missileguidance/functions/fnc_seekerType_Optic.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_Optic.sqf @@ -1,52 +1,54 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus / nou + * Seeker Type: Optic + * + * Arguments: + * 1: Guidance Arg Array + * 2: Seeker State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[], [], []] call ace_missileguidance_fnc_seekerType_Optic; + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -EXPLODE_7_PVT(((_this select 1) select 0),_shooter,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); -private ["_targets", "_foundTargetPos", "_launchParams", "_seekerParams", "_targetLaunchParams"]; -private ["_angleFov", "_angleOkay", "_losOkay", "_seekerTargetPos", "_sensorPos", "_target"]; +params ["", "_args"]; +_args params ["_firedEH", "_launchParams", "", "_seekerParams", "_stateParams"]; +_firedEH params ["","","","","","","_projectile"]; +_launchParams params ["", "_targetParams"]; +_targetParams params ["_target"]; +_seekerParams params ["_seekerAngle", "", "_seekerMaxRange"]; -_seekerTargetPos = _this select 0; +if (isNil "_target") exitWith {[0,0,0]}; -_launchParams = _this select 1; -_target = (((_launchParams select 1) select 1) select 0); -_seekerParams = _launchParams select 3; - -TRACE_1("", _this); -TRACE_1("", _launchParams); - -// TODO:: Make sure the missile maintains LOS -_foundTargetPos = [0,0,0]; -if(!isNil "_target") then { - _foundTargetPos = aimPos _target ; - //_foundTargetPos = (_target modelToWorldVisual (getCenterOfMass _target)); -}; +private _foundTargetPos = aimPos _target; // @TODO: This is seeker LOS and angle checks for LOAL only; LOBL does not need visual -_angleFov = _seekerParams select 0; -_angleOkay = [_projectile, _foundTargetPos, _angleFov] call FUNC(checkSeekerAngle); +private _angleOkay = [_projectile, _foundTargetPos, _seekerAngle] call FUNC(checkSeekerAngle); -_losOkay = false; -if(_angleOkay) then { +private _losOkay = false; +if (_angleOkay) then { _losOkay = [_projectile, _target] call FUNC(checkLos); }; TRACE_2("", _angleOkay, _losOkay); -// If we got here, it was an invalid target, just return a spot 5m in front of the missile -if(!_angleOkay || !_losOkay) then { - _foundTargetPos = _sensorPos vectorAdd ((velocity _projectile) vectorMultiply 5); -} else { - TRACE_2("", _target, _foundTargetPos); - private ["_projectileSpeed", "_distanceToTarget", "_eta", "_adjustDistance"]; - // @TODO: Configurable lead for seekers - _projectileSpeed = (vectorMagnitude velocity _projectile); - _distanceToTarget = (getPosASL _projectile) vectorDistance _foundTargetPos; +// Can't see target, return [0,0,0] and let doSeekerSearch handle it +if (!_angleOkay || !_losOkay) exitWith {[0,0,0]}; - _eta = _distanceToTarget / _projectileSpeed; +TRACE_2("", _target, _foundTargetPos); +// @TODO: Configurable lead for seekers +private _projectileSpeed = (vectorMagnitude velocity _projectile); +private _distanceToTarget = (getPosASL _projectile) vectorDistance _foundTargetPos; +private _eta = _distanceToTarget / _projectileSpeed; - _adjustDistance = (velocity _target) vectorMultiply _eta; - TRACE_3("leading target",_distanceToTarget,_eta,_adjustDistance); - _foundTargetPos = _foundTargetPos vectorAdd _adjustDistance; -}; +private _adjustDistance = (velocity _target) vectorMultiply _eta; +TRACE_3("leading target",_distanceToTarget,_eta,_adjustDistance); +_foundTargetPos = _foundTargetPos vectorAdd _adjustDistance; TRACE_2("return",_foundTargetPos,(aimPos _target) distance _foundTargetPos); _foundTargetPos; diff --git a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf index eda26fe358..3f78f5d3c5 100644 --- a/addons/missileguidance/functions/fnc_seekerType_SALH.sqf +++ b/addons/missileguidance/functions/fnc_seekerType_SALH.sqf @@ -1,32 +1,33 @@ +/* + * Author: jaynus / nou + * Seeker Type: SALH (Laser) + * Wrapper for ace_laser_fnc_seekerFindLaserSpot + * + * Arguments: + * 1: Guidance Arg Array + * 2: Seeker State + * + * Return Value: + * Missile Aim PosASL + * + * Example: + * [[], [], []] call ace_missileguidance_fnc_seekerType_SALH; + * + * Public: No + */ // #define DEBUG_MODE_FULL #include "script_component.hpp" -params ["_lastSeekTargetPos", "_args"]; -_args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams"]; -_firedEH params ["_shooter","_weapon","_muzzle","_mode","_ammo","_magazine","_projectile"]; +params ["", "_args"]; +_args params ["_firedEH", "_launchParams", "", "_seekerParams"]; +_firedEH params ["","","","","","","_projectile"]; _launchParams params ["","","","","","_laserParams"]; _seekerParams params ["_seekerAngle", "", "_seekerMaxRange"]; _laserParams params ["_code", "_wavelengthMin", "_wavelengthMax"]; -private "_foundTargetPos"; -if (!isNil "_target") then { - // Handle AI or moving vanilla lasers - _foundTargetPos = getPosASL _target; -} else { - private _laserResult = [(getPosASL _projectile), (velocity _projectile), _seekerAngle, [_wavelengthMin, _wavelengthMax], _code, _projectile] call EFUNC(laser,seekerFindLaserSpot); - _foundTargetPos = _laserResult select 0; - TRACE_1("Search", _laserResult); -}; - -if(!isNil "_foundTargetPos") then { - // Fov is already checked by laser func, check if distance - - private _canSeeTarget = _seekerMaxRange >= (_foundTargetPos vectorDistance (getPosASL _projectile)); - // If we got here, it was an invalid target, just return a spot 5m in front of the missile - if(!_canSeeTarget) then { - _foundTargetPos = _sensorPos vectorAdd ((velocity _projectile) vectorMultiply 5); - }; -}; +private _laserResult = [(getPosASL _projectile), (velocity _projectile), _seekerAngle, _seekerMaxRange, [_wavelengthMin, _wavelengthMax], _code, _projectile] call EFUNC(laser,seekerFindLaserSpot); +private _foundTargetPos = _laserResult select 0; +TRACE_1("Search", _laserResult); _foundTargetPos; diff --git a/addons/missileguidance/script_component.hpp b/addons/missileguidance/script_component.hpp index d09e1e3113..298de3a051 100644 --- a/addons/missileguidance/script_component.hpp +++ b/addons/missileguidance/script_component.hpp @@ -2,6 +2,7 @@ #define COMPONENT_BEAUTIFIED Missile Guidance #include "\z\ace\addons\main\script_mod.hpp" +// #define DRAW_GUIDANCE_INFO // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS @@ -15,5 +16,3 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" - -#define FIREMODE_DIRECT_LOAL 1 From d33219b9ba72bddfae4536277239b330757aceaa Mon Sep 17 00:00:00 2001 From: classicarma Date: Wed, 19 Oct 2016 03:19:27 +0900 Subject: [PATCH 037/826] Japanese translations (#4553) --- addons/cookoff/stringtable.xml | 4 ++++ addons/laser/stringtable.xml | 3 ++- addons/map/stringtable.xml | 2 ++ addons/maptools/stringtable.xml | 2 ++ addons/medical_blood/stringtable.xml | 3 +++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index 21ddb96a7a..9e1511733a 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -33,15 +33,19 @@ Enable ammo box cook off + 弾薬箱に誘爆を有効化 Enables cooking off of ammo boxes. + 弾薬箱が誘爆するようになります。 Enable Ammunition cook off + 弾薬の誘爆を有効化 Enables Ammunition cook off. Fires ammunition projectiles while vehicle is on fire and has ammunition. + 弾薬が誘爆します。車両が燃えると、搭載している弾薬が激しく燃え上がりす。 diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index b6ccb247d9..5fd9f21ae7 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -3,6 +3,7 @@ Laser Dispersion Simulation Count + レーザーの分散シミュレート数 Laser Code @@ -44,4 +45,4 @@ レーザ - コードの数値を減らす - \ No newline at end of file + diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 440d376f0e..6f9aaee1fe 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -409,10 +409,12 @@ Disable BFT BFT deaktivieren + BFTを無効化 Always disable Blue Force Tracking for this group. Blue Force Tracking für diese Gruppe immer deaktivieren. + このグループへのブルー フォース トラッキングを常に無効化します。 diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index 59ab5db0d0..18b3a91aaf 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -160,9 +160,11 @@ Draw straight lines with maptools + マップ ツールを使って直線を書く Draw on the edge of maptools to draw straight lines. Note: Must hover at midpoint to delete. + マップ ツールの端から直線を書きます。メモ:線の中央ホバーすると削除します。 diff --git a/addons/medical_blood/stringtable.xml b/addons/medical_blood/stringtable.xml index 35902a1a06..6eb21c3aca 100644 --- a/addons/medical_blood/stringtable.xml +++ b/addons/medical_blood/stringtable.xml @@ -3,12 +3,15 @@ Only Players + プレイヤーのみ Enable Blood Drops + 血の滴下を有効化 Enable or disable Blood Drops created on bleeding and taking damage + ダメージを受けたり、出血していると血が滴る様子の有効か無効化 From 19fe4016e5018ed675461dff5cf7d884fd43027b Mon Sep 17 00:00:00 2001 From: classicarma Date: Wed, 19 Oct 2016 03:19:27 +0900 Subject: [PATCH 038/826] Japanese translations (#4553) --- addons/cookoff/stringtable.xml | 4 ++++ addons/laser/stringtable.xml | 3 ++- addons/map/stringtable.xml | 2 ++ addons/maptools/stringtable.xml | 2 ++ addons/medical_blood/stringtable.xml | 3 +++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index 2642b931f4..8b08b1e3ff 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -33,15 +33,19 @@ Enable ammo box cook off + 弾薬箱に誘爆を有効化 Enables cooking off of ammo boxes. + 弾薬箱が誘爆するようになります。 Enable Ammunition cook off + 弾薬の誘爆を有効化 Enables Ammunition cook off. Fires ammunition projectiles while vehicle is on fire and has ammunition. + 弾薬が誘爆します。車両が燃えると、搭載している弾薬が激しく燃え上がりす。 diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index b6ccb247d9..5fd9f21ae7 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -3,6 +3,7 @@ Laser Dispersion Simulation Count + レーザーの分散シミュレート数 Laser Code @@ -44,4 +45,4 @@ レーザ - コードの数値を減らす - \ No newline at end of file + diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 440d376f0e..6f9aaee1fe 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -409,10 +409,12 @@ Disable BFT BFT deaktivieren + BFTを無効化 Always disable Blue Force Tracking for this group. Blue Force Tracking für diese Gruppe immer deaktivieren. + このグループへのブルー フォース トラッキングを常に無効化します。 diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index 59ab5db0d0..18b3a91aaf 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -160,9 +160,11 @@ Draw straight lines with maptools + マップ ツールを使って直線を書く Draw on the edge of maptools to draw straight lines. Note: Must hover at midpoint to delete. + マップ ツールの端から直線を書きます。メモ:線の中央ホバーすると削除します。 diff --git a/addons/medical_blood/stringtable.xml b/addons/medical_blood/stringtable.xml index 35902a1a06..6eb21c3aca 100644 --- a/addons/medical_blood/stringtable.xml +++ b/addons/medical_blood/stringtable.xml @@ -3,12 +3,15 @@ Only Players + プレイヤーのみ Enable Blood Drops + 血の滴下を有効化 Enable or disable Blood Drops created on bleeding and taking damage + ダメージを受けたり、出血していると血が滴る様子の有効か無効化 From 877944ddce9c1e641dad2a53ac04965a1321a4ac Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 18 Oct 2016 20:21:28 +0200 Subject: [PATCH 039/826] Fix 3rd party air and sea vehicle fuel capacity (#4554) * Fix fuel capacity for air vehicles * Sea vehicles as well, minor empty classes cleanup --- addons/refuel/CfgVehicles.hpp | 26 +------------------------- addons/refuel/functions/fnc_refuel.sqf | 12 ++++++++++-- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/addons/refuel/CfgVehicles.hpp b/addons/refuel/CfgVehicles.hpp index 7162ab454a..df857066cd 100644 --- a/addons/refuel/CfgVehicles.hpp +++ b/addons/refuel/CfgVehicles.hpp @@ -180,18 +180,13 @@ class CfgVehicles { class Helicopter: Air { MACRO_CONNECT_ACTIONS - GVAR(fuelCapacity) = 1500; }; class Helicopter_Base_F: Helicopter {}; - - class Helicopter_Base_H: Helicopter_Base_F { - GVAR(fuelCapacity) = 3000; - }; + class Helicopter_Base_H: Helicopter_Base_F {}; class Plane: Air { MACRO_CONNECT_ACTIONS - GVAR(fuelCapacity) = 2000; GVAR(flowRate) = 16; }; @@ -201,7 +196,6 @@ class CfgVehicles { class Ship_F: Ship { MACRO_CONNECT_ACTIONS - GVAR(fuelCapacity) = 2000; GVAR(flowRate) = 4; }; @@ -373,19 +367,6 @@ class CfgVehicles { GVAR(fuelCapacity) = 830; }; - class Heli_Attack_01_base_F: Helicopter_Base_F { - // Commanche - }; - - class Heli_Attack_02_base_F: Helicopter_Base_F { - // Mi-48 Kajman - }; - - class Heli_Light_01_base_F: Helicopter_Base_H { - // MH-6 - GVAR(fuelCapacity) = 242; - }; - class Heli_Light_02_base_F: Helicopter_Base_H { // Ka-60 Kasatka GVAR(fuelCapacity) = 1450; @@ -439,11 +420,6 @@ class CfgVehicles { GVAR(fuelCapacity) = 270; }; - class UGV_01_base_F: Car_F { - // Stomper - GVAR(fuelCapacity) = 100; - }; - class Plane_Fighter_03_base_F: Plane_Base_F { // L-159 ALCA GVAR(fuelCapacity) = 1914; diff --git a/addons/refuel/functions/fnc_refuel.sqf b/addons/refuel/functions/fnc_refuel.sqf index ae17ce8d02..773d85e08d 100644 --- a/addons/refuel/functions/fnc_refuel.sqf +++ b/addons/refuel/functions/fnc_refuel.sqf @@ -18,8 +18,16 @@ params [["_unit", objNull, [objNull]], ["_target", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_connectToPoint", [0,0,0], [[]], 3]]; -private _rate = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(flowRate)) * GVAR(rate); -private _maxFuel = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(fuelCapacity)); +private _config = configFile >> "CfgVehicles" >> typeOf _target; + +private _rate = getNumber (_config >> QGVAR(flowRate)) * GVAR(rate); +private _maxFuel = getNumber (_config >> QGVAR(fuelCapacity)); + +// Fall back to vanilla fuelCapacity value (only air and sea vehicles don't have this defined by default by us) +// Air and sea vehicles have that value properly defined in liters, unlike ground vehicles which is is formula of (range * tested factor) - different fuel consumption system than ground vehicles +if (_maxFuel == 0) then { + _maxFuel = getNumber (_config >> "fuelCapacity"); +}; [{ params ["_args", "_pfID"]; From 5922aad91c5dd29799f42bbb181d44e48d43e7ca Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 18 Oct 2016 20:21:28 +0200 Subject: [PATCH 040/826] Fix 3rd party air and sea vehicle fuel capacity (#4554) * Fix fuel capacity for air vehicles * Sea vehicles as well, minor empty classes cleanup --- addons/refuel/CfgVehicles.hpp | 26 +------------------------- addons/refuel/functions/fnc_refuel.sqf | 12 ++++++++++-- 2 files changed, 11 insertions(+), 27 deletions(-) diff --git a/addons/refuel/CfgVehicles.hpp b/addons/refuel/CfgVehicles.hpp index 7162ab454a..df857066cd 100644 --- a/addons/refuel/CfgVehicles.hpp +++ b/addons/refuel/CfgVehicles.hpp @@ -180,18 +180,13 @@ class CfgVehicles { class Helicopter: Air { MACRO_CONNECT_ACTIONS - GVAR(fuelCapacity) = 1500; }; class Helicopter_Base_F: Helicopter {}; - - class Helicopter_Base_H: Helicopter_Base_F { - GVAR(fuelCapacity) = 3000; - }; + class Helicopter_Base_H: Helicopter_Base_F {}; class Plane: Air { MACRO_CONNECT_ACTIONS - GVAR(fuelCapacity) = 2000; GVAR(flowRate) = 16; }; @@ -201,7 +196,6 @@ class CfgVehicles { class Ship_F: Ship { MACRO_CONNECT_ACTIONS - GVAR(fuelCapacity) = 2000; GVAR(flowRate) = 4; }; @@ -373,19 +367,6 @@ class CfgVehicles { GVAR(fuelCapacity) = 830; }; - class Heli_Attack_01_base_F: Helicopter_Base_F { - // Commanche - }; - - class Heli_Attack_02_base_F: Helicopter_Base_F { - // Mi-48 Kajman - }; - - class Heli_Light_01_base_F: Helicopter_Base_H { - // MH-6 - GVAR(fuelCapacity) = 242; - }; - class Heli_Light_02_base_F: Helicopter_Base_H { // Ka-60 Kasatka GVAR(fuelCapacity) = 1450; @@ -439,11 +420,6 @@ class CfgVehicles { GVAR(fuelCapacity) = 270; }; - class UGV_01_base_F: Car_F { - // Stomper - GVAR(fuelCapacity) = 100; - }; - class Plane_Fighter_03_base_F: Plane_Base_F { // L-159 ALCA GVAR(fuelCapacity) = 1914; diff --git a/addons/refuel/functions/fnc_refuel.sqf b/addons/refuel/functions/fnc_refuel.sqf index ae17ce8d02..773d85e08d 100644 --- a/addons/refuel/functions/fnc_refuel.sqf +++ b/addons/refuel/functions/fnc_refuel.sqf @@ -18,8 +18,16 @@ params [["_unit", objNull, [objNull]], ["_target", objNull, [objNull]], ["_nozzle", objNull, [objNull]], ["_connectToPoint", [0,0,0], [[]], 3]]; -private _rate = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(flowRate)) * GVAR(rate); -private _maxFuel = getNumber (configFile >> "CfgVehicles" >> (typeOf _target) >> QGVAR(fuelCapacity)); +private _config = configFile >> "CfgVehicles" >> typeOf _target; + +private _rate = getNumber (_config >> QGVAR(flowRate)) * GVAR(rate); +private _maxFuel = getNumber (_config >> QGVAR(fuelCapacity)); + +// Fall back to vanilla fuelCapacity value (only air and sea vehicles don't have this defined by default by us) +// Air and sea vehicles have that value properly defined in liters, unlike ground vehicles which is is formula of (range * tested factor) - different fuel consumption system than ground vehicles +if (_maxFuel == 0) then { + _maxFuel = getNumber (_config >> "fuelCapacity"); +}; [{ params ["_args", "_pfID"]; From d8678054064e053dcfd88b7fd1db2a98b484a1ba Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 18 Oct 2016 20:25:45 +0200 Subject: [PATCH 041/826] Prepare v3.8.0 RC3 --- addons/main/script_mod.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 766a4ef25e..4aaf2d61f3 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -6,7 +6,7 @@ #define MAJOR 3 #define MINOR 8 #define PATCHLVL 0 -#define BUILD 8 +#define BUILD 9 #define VERSION MAJOR.MINOR.PATCHLVL.BUILD #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD From b150f440e663644d68d06ac30af85397abd319fd Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 18 Oct 2016 21:57:40 +0200 Subject: [PATCH 042/826] Prep 3.8.0 Release --- addons/main/script_mod.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 4aaf2d61f3..5e3c717d89 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -6,7 +6,7 @@ #define MAJOR 3 #define MINOR 8 #define PATCHLVL 0 -#define BUILD 9 +#define BUILD 10 #define VERSION MAJOR.MINOR.PATCHLVL.BUILD #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD From d5160b436fe33bc042c94f3c9061b1c9daa703fb Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 18 Oct 2016 22:14:19 +0200 Subject: [PATCH 043/826] Fix build tools not working with two digit build numbers --- tools/make.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/make.py b/tools/make.py index f694791634..530eeaf032 100644 --- a/tools/make.py +++ b/tools/make.py @@ -583,8 +583,8 @@ def set_version_in_files(): newVersionShort = newVersion[:-2] # MAJOR.MINOR.PATCH # Regex patterns - pattern = re.compile(r"(\b[0\.-9]+\b\.[0\.-9]+\b\.[0\.-9]+\b\.[0\.-9]+)") # MAJOR.MINOR.PATCH.BUILD - patternShort = re.compile(r"(\b[0\.-9]+\b\.[0\.-9]+\b\.[0\.-9]+)") # MAJOR.MINOR.PATCH + pattern = re.compile(r"([\d]+\.[\d]+\.[\d]+\.[\d]+)") # MAJOR.MINOR.PATCH.BUILD + patternShort = re.compile(r"([\d]+\.[\d]+\.[\d]+)") # MAJOR.MINOR.PATCH # Change versions in files containing version for i in versionFiles: @@ -608,6 +608,7 @@ def set_version_in_files(): # First item in the list findall returns versionFound = versionFound[0] + newVersionUsed = "" # Use the same version length as the one found if len(versionFound) == len(newVersion): newVersionUsed = newVersion From e5c59b56fb86a42ebeed9715bd4e7aabd7b58aa5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 19 Oct 2016 15:52:46 -0500 Subject: [PATCH 044/826] Update wiki version to 3.8 (#4570) --- docs/_config.yml | 10 +++++----- docs/_config_dev.yml | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index 9dd11e9a3b..8babdb2525 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -10,17 +10,17 @@ ace: githubUrl: https://github.com/acemod/ACE3 version: major: 3 - minor: 7 + minor: 8 patch: 0 - build: 6 + build: 10 acex: githubUrl: https://github.com/acemod/ACEX version: major: 3 - minor: 0 - patch: 0 - build: 0 + minor: 1 + patch: 1 + build: 3 markdown: kramdown diff --git a/docs/_config_dev.yml b/docs/_config_dev.yml index 31d20e5439..6eba5ae628 100644 --- a/docs/_config_dev.yml +++ b/docs/_config_dev.yml @@ -10,17 +10,17 @@ ace: githubUrl: https://github.com/acemod/ACE3 version: major: 3 - minor: 7 + minor: 8 patch: 0 - build: 6 + build: 10 acex: githubUrl: https://github.com/acemod/ACEX version: major: 3 - minor: 0 - patch: 0 - build: 0 + minor: 1 + patch: 1 + build: 3 markdown: kramdown From f2746891af690109ee0fdefcdcd175853c4a5964 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 20 Oct 2016 12:43:52 -0500 Subject: [PATCH 045/826] Sanatize damage value used for blood creation (#4574) Fix #4571 --- addons/medical_blood/functions/fnc_spurt.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/medical_blood/functions/fnc_spurt.sqf b/addons/medical_blood/functions/fnc_spurt.sqf index d17139988d..aaaa75894e 100644 --- a/addons/medical_blood/functions/fnc_spurt.sqf +++ b/addons/medical_blood/functions/fnc_spurt.sqf @@ -23,6 +23,7 @@ #define OFFSET 0.25 params ["_unit", "_dir", "_damage"]; +_damage = _damage min 1; private _distanceBetweenDrops = DISTANCE_BETWEEN_DROPS * _damage; private _offset = OFFSET + _distanceBetweenDrops; From 89d6fefff1d8133ce43bc4ba35fb40454a12ca4c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 20 Oct 2016 12:43:52 -0500 Subject: [PATCH 046/826] Sanatize damage value used for blood creation (#4574) Fix #4571 --- addons/medical_blood/functions/fnc_spurt.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/medical_blood/functions/fnc_spurt.sqf b/addons/medical_blood/functions/fnc_spurt.sqf index d17139988d..aaaa75894e 100644 --- a/addons/medical_blood/functions/fnc_spurt.sqf +++ b/addons/medical_blood/functions/fnc_spurt.sqf @@ -23,6 +23,7 @@ #define OFFSET 0.25 params ["_unit", "_dir", "_damage"]; +_damage = _damage min 1; private _distanceBetweenDrops = DISTANCE_BETWEEN_DROPS * _damage; private _offset = OFFSET + _distanceBetweenDrops; From 1390b845d4b34045be42b5791ea74fd8e2d925cf Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 20 Oct 2016 19:45:40 +0200 Subject: [PATCH 047/826] Prep 3.8.1 patch --- addons/main/script_mod.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 5e3c717d89..af81b0745d 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -5,7 +5,7 @@ #define MAJOR 3 #define MINOR 8 -#define PATCHLVL 0 +#define PATCHLVL 1 #define BUILD 10 #define VERSION MAJOR.MINOR.PATCHLVL.BUILD From 23568609a697f914fdd6948b861b53988682e65f Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 20 Oct 2016 16:44:34 -0500 Subject: [PATCH 048/826] Faster, non movment blocking gesture for tap shoulder (#4578) Close #4577 --- addons/interaction/functions/fnc_tapShoulder.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/interaction/functions/fnc_tapShoulder.sqf b/addons/interaction/functions/fnc_tapShoulder.sqf index 3926503746..483498329d 100644 --- a/addons/interaction/functions/fnc_tapShoulder.sqf +++ b/addons/interaction/functions/fnc_tapShoulder.sqf @@ -23,6 +23,6 @@ if (_unit == ACE_player) then { addCamShake [4, 0.5, 5]; }; -[_unit, "PutDown"] call EFUNC(common,doGesture); +[_unit, "gesturePoint"] call EFUNC(common,doGesture); [QGVAR(tapShoulder), [_target, _shoulderNum], [_target]] call CBA_fnc_targetEvent; From fc15ab9cf0b3e9c9ad0777f8d68cdaffc6fc9b48 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 22 Oct 2016 03:56:26 -0500 Subject: [PATCH 049/826] #4557 - Fix warning about bad func type (#4582) --- addons/vehiclelock/functions/fnc_lockpick.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/vehiclelock/functions/fnc_lockpick.sqf b/addons/vehiclelock/functions/fnc_lockpick.sqf index bf15a6eadd..3ac7385a04 100644 --- a/addons/vehiclelock/functions/fnc_lockpick.sqf +++ b/addons/vehiclelock/functions/fnc_lockpick.sqf @@ -51,6 +51,7 @@ if (!([[_unit, _veh]] call _condition)) exitWith {false}; _returnValue = _funcType in ["canLockpick", "startLockpick", "finishLockpick"]; switch (_funcType) do { + case "canLockpick": {}; case "startLockpick": { [_vehLockpickStrenth, [_unit, _veh, "finishLockpick"], {(_this select 0) call FUNC(lockpick)}, {}, (localize LSTRING(Action_LockpickInUse)), _condition] call EFUNC(common,progressBar); }; From eeb482eb7e472ddc2e9b7c9a2ab08e46d020bb1c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 22 Oct 2016 03:56:26 -0500 Subject: [PATCH 050/826] #4557 - Fix warning about bad func type (#4582) --- addons/vehiclelock/functions/fnc_lockpick.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/vehiclelock/functions/fnc_lockpick.sqf b/addons/vehiclelock/functions/fnc_lockpick.sqf index bf15a6eadd..3ac7385a04 100644 --- a/addons/vehiclelock/functions/fnc_lockpick.sqf +++ b/addons/vehiclelock/functions/fnc_lockpick.sqf @@ -51,6 +51,7 @@ if (!([[_unit, _veh]] call _condition)) exitWith {false}; _returnValue = _funcType in ["canLockpick", "startLockpick", "finishLockpick"]; switch (_funcType) do { + case "canLockpick": {}; case "startLockpick": { [_vehLockpickStrenth, [_unit, _veh, "finishLockpick"], {(_this select 0) call FUNC(lockpick)}, {}, (localize LSTRING(Action_LockpickInUse)), _condition] call EFUNC(common,progressBar); }; From 07068260fe6a86eac18c9eaa955b303497e3d986 Mon Sep 17 00:00:00 2001 From: Rory Date: Mon, 24 Oct 2016 08:45:21 +0200 Subject: [PATCH 051/826] Wiki update (#4589) * Wiki update - Updated class-names.md entries for chemlights, incendiary grenade and spraypaint. Added chemlights feature with usage info. Added spraypaint feature with usage info. * correct version of spray paint in class-names.md * Correction removed spraypaint.md since tagging.md was already present updated chemlights with removal of 1.1 (adding throw possibilities) * Reworked chemlights.md removed usage => already referred to advanced grenades Changed description * removed tagging addition from class-names.md * added | --- docs/wiki/class-names.md | 23 +++++++++++++++++++---- docs/wiki/feature/chemlights.md | 27 +++++++++++++++++++++++++++ docs/wiki/feature/grenades.md | 5 ++++- 3 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 docs/wiki/feature/chemlights.md diff --git a/docs/wiki/class-names.md b/docs/wiki/class-names.md index a3c270ef5b..0cdc24978a 100644 --- a/docs/wiki/class-names.md +++ b/docs/wiki/class-names.md @@ -73,6 +73,19 @@ Class Name | In-Game Name | Type | ---------- | --------- | --------- ACE_CableTie | cable tie | ACE_ItemCore | +### Chemlights +`Added in 3.7.0` + +Class Name | In-Game Name | Type | +---------- | --------- | --------- +ACE_Chemlight_HiOrange | Chemlight (Hi Orange) | Throwable | +ACE_Chemlight_HiRed | Chemlight (Hi Red) | Throwable | +ACE_Chemlight_HiYellow | Chemlight (Hi Yellow) | Throwable | +ACE_Chemlight_HiWhite | Chemlight (Hi White) | Throwable | +ACE_Chemlight_Orange | Chemlight (Orange) | Throwable | +ACE_Chemlight_White | Chemlight (White) | Throwable | +ACE_Chemlight_IR | Chemlight (IR) | Throwable | + ### Common `Added in 3.0.0` @@ -131,6 +144,7 @@ ACE_HandFlare_White | M127A1 Hand Held Signal (White) | Grenade | ACE_HandFlare_Red | M127A1 Hand Held Signal (Red | Grenade | ACE_HandFlare_Green | M127A1 Hand Held Signal (Green) | Grenade | ACE_HandFlare_Yellow | M127A1 Hand Held Signal (Yellow) | Grenade | +ACE_M14 | AN-M14 Incendiary Grenade | Grenade | ACE_M84 | M84 Stun Grenade | Grenade | ### Gun Bag @@ -339,6 +353,7 @@ Class Name | In-Game Name | Type | ACE_SpottingScope | Spotting Scope | ACE_ItemCore | ACE_SpottingScopeObject | Spotting Scope (placed) | StaticATWeapon | + ### Tactical Ladder `Added in 3.1.1` @@ -352,10 +367,10 @@ ACE_Tactical_Ladder | Telescopic Ladder (placed) | house | Class Name | In-Game Name | Type | ---------- | --------- | --------- -ACE_SpraypaintBlack | Spraypaint Black | ACE_ItemCore | -ACE_SpraypaintBlue | Spraypaint Blue | ACE_ItemCore | -ACE_SpraypaintGreen | Spraypaint Green | ACE_ItemCore | -ACE_SpraypaintRed | Spraypaint Red | ACE_ItemCore | +ACE_SpraypaintBlack | Black spray paint | ACE_ItemCore | +ACE_SpraypaintBlue | Blue spray paint | ACE_ItemCore | +ACE_SpraypaintGreen | Green spray paint | ACE_ItemCore | +ACE_SpraypaintRed | Red spray paint | ACE_ItemCore | ### Trenches `Added in 3.5.0` diff --git a/docs/wiki/feature/chemlights.md b/docs/wiki/feature/chemlights.md new file mode 100644 index 0000000000..e384dc9e16 --- /dev/null +++ b/docs/wiki/feature/chemlights.md @@ -0,0 +1,27 @@ +--- +layout: wiki +title: Chemlights +description: Adds enhanced types of chemlights. +group: feature +category: equipment +parent: wiki +mod: ace +version: + major: 3 + minor: 7 + patch: 0 +--- + +
+
Note:
+

Check out the Advanced Throwing page for the new alternative system introduced in version 3.7.0.

+
+ +## 1. Overview + +### 1.1 Chemlights +Adds throwable chemlights in the colors white, red, green and yellow. Additionally "Hi" chemlights are added that emit a brighter glow. + +## 2. Dependencies + +{% include dependencies_list.md component="chemlights" %} diff --git a/docs/wiki/feature/grenades.md b/docs/wiki/feature/grenades.md index 348425d3d9..508ff9d246 100644 --- a/docs/wiki/feature/grenades.md +++ b/docs/wiki/feature/grenades.md @@ -1,7 +1,7 @@ --- layout: wiki title: Grenades -description: Different throwing modes for grenades, a flashbang and hand flares. +description: Different throwing modes for grenades, a flashbang, incendiary grenade and hand flares. group: feature category: equipment parent: wiki @@ -28,6 +28,9 @@ Adds throwable hand flares in the colors white, red, green and yellow. Additiona ### 1.3 M84 stun grenade Adds the M84 stun grenade. The stun effect will also affect AI. +### 1.4 M14 Incendiary grenade +Adds the AN-M14 incendiary grenade. This grenade has a thermate filler and is primarily used for the destruction of material. + ## 2. Usage ### 2.1 Switching between throw modes From ffd1f0aff218c31cc07771849cc097cc2a3c7af2 Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 25 Oct 2016 20:11:05 +0200 Subject: [PATCH 052/826] Update make.py to 0.8 (#4579) * Update make.py to 0.8 * Remove redundant extras folder obsolete handling * Fix version updating in files when version changes number of digits * Satisfy bux --- addons/main/script_mod.hpp | 5 +- addons/main/script_version.hpp | 4 + .../setting-up-the-development-environment.md | 73 ++++-- tools/make.py | 234 +++++++++++------- 4 files changed, 189 insertions(+), 127 deletions(-) create mode 100644 addons/main/script_version.hpp diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index 5e3c717d89..78fcc0c665 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -3,10 +3,7 @@ #define MAINPREFIX z #define PREFIX ace -#define MAJOR 3 -#define MINOR 8 -#define PATCHLVL 0 -#define BUILD 10 +#include "script_version.hpp" #define VERSION MAJOR.MINOR.PATCHLVL.BUILD #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp new file mode 100644 index 0000000000..edc3cf0bbb --- /dev/null +++ b/addons/main/script_version.hpp @@ -0,0 +1,4 @@ +#define MAJOR 3 +#define MINOR 8 +#define PATCHLVL 0 +#define BUILD 10 diff --git a/docs/wiki/development/setting-up-the-development-environment.md b/docs/wiki/development/setting-up-the-development-environment.md index 10c515a76d..c0333ac590 100644 --- a/docs/wiki/development/setting-up-the-development-environment.md +++ b/docs/wiki/development/setting-up-the-development-environment.md @@ -16,9 +16,10 @@ This page describes how you can setup your development environment for ACE3, all - A proper installation of the Arma 3 Tools (available on Steam) - A properly setup P-drive - Run Arma 3 and Arma 3 Tools directly from steam once to install registry entries (and again after every update) -- Python 3.x, available [here](http://www.python.org) -- The following Mikero's Tools (available [here](https://dev.withsix.com/projects/mikero-pbodll/files)): DePbo, DeRap, DeOgg, Rapify, MakePbo, pboProject -- A properly setup PATH variable (containing Python, the Mikero's Tools and git) +- [Python 3.x](https://www.python.org/) +- [Mikero Tools](https://dev.withsix.com/projects/mikero-pbodll/files): DePbo, DeRap, DeOgg, Rapify, MakePbo, PboProject +- Python, Mikero Tools and Git in PATH environment variable +- [CBA](https://github.com/CBATeam/CBA_A3/releases/latest) mod (release or development version) ## 2. Why so complicated? @@ -28,24 +29,29 @@ If you have contributed to AGM you might be used to an easier build process, whe Not offering .exes for the Python scripts we use allows us to make easy changes without the hassle of compiling self-extracting exes all the time. -## 3. Getting ACE +## 3. Getting Source Code -To actually get the ACE source code on your machine, it is recommended that you use Git. Tutorials for this are all around the web, and it allows you to track your changes and easily update your local copy. +To actually get the ACE3 source code on your machine, it is recommended that you use Git. Tutorials for this are all around the web, and it allows you to track your changes and easily update your local copy. If you just want to create a quick and dirty build, you can also directly download the source code using the "Download ZIP" button on the front page of the GitHub repo. -## 4. Initial Setup +## 4. Setup and Building -After ensuring that you have installed all requirements, execute the `setup.py` script found in the `tools` folder. This will do most of the heavy lifting for you, create the links you need and copy the required CBA code to the proper place. Please note that these links are tied to the location of your ACE3 source code, so make sure that the project folder is where you want it to be. We recommend that you store the ACE3 project on your P-drive. +### 4.1 Initial Setup -### 4.1 Manual Setup +Navigate to `tools` folder in command line. -Should the script fail, here is how you create the required links manually: +``` +cd "[location of the ACE3 project]\tools" +``` -First, to set up the links, create `z` folders both in your Arma 3 directory and on your P-drive. Then run the following commands as admin, replacing the text in brackets with the appropriate paths: +Execute `setup.py` to create symbolic links to P-drive and Arma 3 directory required for building. -```sh + +Should the script fail, you can create the required links manually. First, create `z` folders both in your Arma 3 directory and on your P-drive. Then run the following commands as admin, replacing the text in brackets with the appropriate paths: + +```bat mklink /J "[Arma 3 installation folder]\z\ace" "[location of the ACE3 project]" mklink /J "P:\z\ace" "[location of the ACE3 project]" ``` @@ -53,33 +59,50 @@ mklink /J "P:\z\ace" "[location of the ACE3 project]" Then, copy the `cba` folder from the `tools` folder to `P:\x\cba`. Create the `x` folder if needed. That folder contains the parts of the CBA source code that are required for the macros to work. -## 5. Creating a Test Build +## 4.2 Creating a Test Build -To create a development build of ACE to test changes or to debug something, run the `build.py` file in the `tools` folder. This will populate the `addons` folder with binarized PBOs. These PBOs still point to the source files in their respective folders however, which allows you to use [file patching](#file-patching). - -This also means that you cannot distribute this build to others. +To create a development build of ACE3 to test changes or to debug something, run the `build.py` file in the `tools` folder. This will populate the `addons` folder with binarized PBOs. These PBOs still point to the source files in their respective folders however, which allows you to use [file patching](#file-patching). This also means that you cannot distribute this build to others. To start the game using this build, you can use the following modline: ```sh --mod=@cba_a3;z\ace +-mod=@CBA_A3;z\ace ``` +## 4.3 Creating a Release Build -## 6. Creating a Release Build +To create a complete build of ACE3 that you can use without the source files you will need to: +- Ensure `.hpp` is **NOT** in pboProject's "Exclude From Pbo" list -To create a complete build of ACE that you can use without the source files, run the `make.py` file in the `tools` folder. This will populate the `release` folder with binarized PBOs that you can redistribute. These handle like those of any other mod. +When the requirements are met: +- Execute `make.py version increment_build force check_external release` in the `tools` folder, replacing `` with the part of version you want to increment (options described below) + +This will populate the `release` folder with binarized PBOs, compiled extensions, copied extras, bisigns and a bikey. Additionally, an archive file will also be created in the folder. The folder and archive handle like those of any other mod. + +Different `make.py` command line options include: +- `version` - update version number in all files and leave them in working directory (leaving this out will still update the version in all files present in the `release` folder, but they will be reverted to not disturb the working directory) +- `increment_build` - increments _build_ version number +- `increment_patch` - increments _patch_ version number (ignored with `increment_minor` or `increment_major`) +- `increment_minor` - increments _minor_ version number and resets _patch_ version number to `0` (ignored with `increment_major`) +- `increment_major` - increments _major_ version number and resets _minor_ and _patch_ version numbers to `0` +- `force` - force rebuild all PBOs, even those already present in the `release` directory (combined with `compile` it will also rebuild all extensions) +- `check_external` - check external references (incompatible only with ` ` and `force `) +- `release` - create release packages/archives +- ` ` - build only specified component(s) (incompatible with `release`) +- `force ` - force rebuild specified component(s) (incompatible with `release`) ## 7. File Patching -File Patching allows you to change the files in an addon while the game is running, requiring only a restart of the mission. This makes it great for debugging, as it cuts down the time required between tests. Note that this only works with PBOs created using MakePBO, as outlined in [Creating a Test Build](#creating-a-test-build). +File Patching allows you to change the files in an addon while the game is running, requiring only a restart of the mission. This makes it great for debugging, as it cuts down the time required between tests. Note that this only works with PBOs created using MakePBO, which `build.py` uses. + +To run Arma 3 with file patching add the `-filePatching` startup parameter (since Arma 3 v1.50, file patching is disabled by default). ### 7.1 Disabling CBA Function Caching By default CBA caches a compiled version of functions to reduce mission load times. This interferes with file patching. There are three ways to disable function caching: -- Load `cba_cache_disable.pbo` (included in CBA's optional folder) +- Load `cba_cache_disable.pbo` (included in CBA's optional folder - simply move it to `addons` folder for the time being) - Add the following to your test missions description.ext: ```cpp @@ -94,20 +117,16 @@ class CfgSettings { }; ``` -- To only disable caching for a single module, hence greatly improving mission restart time, add the following line to the `script_component.hpp` file of said module: +- To only disable caching for a single module, hence greatly improving mission restart time, add the following line to the `script_component.hpp` file of said module (prepared in each ACE3 component, simply uncomment): ```cpp #define DISABLE_COMPILE_CACHE ``` -### 7.2 Running Arma 3 with File Patching Enabled - -Starting from version 1.50, Arma 3 was changed to disable file patching by default, making the feature opt-in. To execute the game with file patching enabled add the `-filePatching` flag to the command line. - -### 7.3 Restrictions of File Patching +### 7.2 Restrictions Files must exist in the built PBOs for file patching to work. If you create a new file you must rebuild the PBO or Arma will not find it in your file paths. Configs are not patched during run time, only at load time. You do not have have to rebuild a PBO to make config changes, just restart Arma. You can get around this though if you are on the dev branch of Arma 3 and running the [diagnostic exe](https://community.bistudio.com/wiki/Arma_3_Diagnostics_Exe). That includes `diag_mergeConfigFile` which takes a full system path (as in `diag_mergeConfigFile ["p:\z\ace\addons\my_module\config.cpp"]`) and allows you selectively reload config files. -If you need to add/remove files, then you'll need to run build.py again without the game running, and restart. That is all that is required to add new files to then further use in testing. +If you need to add/remove files, then you'll need to run `build.py` again without the game running, and restart. That is all that is required to add new files for further use in testing. diff --git a/tools/make.py b/tools/make.py index 530eeaf032..e7d5adbd68 100644 --- a/tools/make.py +++ b/tools/make.py @@ -30,7 +30,7 @@ ############################################################################### -__version__ = "0.7" +__version__ = "0.8" import sys @@ -51,8 +51,7 @@ import traceback import time import timeit import re - -from tempfile import mkstemp +import fileinput if sys.platform == "win32": import winreg @@ -329,7 +328,6 @@ def print_yellow(msg): def copy_important_files(source_dir,destination_dir): - originalDir = os.getcwd() # Copy importantFiles @@ -340,17 +338,17 @@ def copy_important_files(source_dir,destination_dir): for file in importantFiles: filePath = os.path.join(module_root_parent, file) - # Take only file name for destination path (to put it into root of release dir) - if "\\" in file: - count = file.count("\\") - file = file.split("\\", count)[-1] - print_green("Copying file => {}".format(os.path.join(source_dir,file))) - shutil.copyfile(os.path.join(source_dir,filePath),os.path.join(destination_dir,file)) + if os.path.exists(filePath): + print_green("Copying file => {}".format(filePath)) + shutil.copy(os.path.join(source_dir,filePath), destination_dir) + else: + missingFiles.append("{}".format(filePath)) + print_error("Failed copying file => {}".format(filePath)) except: print_error("COPYING IMPORTANT FILES.") raise - #copy all extension dlls + # Copy all extension DLL's try: os.chdir(os.path.join(source_dir)) print_blue("\nSearching for DLLs in {}".format(os.getcwd())) @@ -370,13 +368,13 @@ def copy_important_files(source_dir,destination_dir): os.chdir(originalDir) + def copy_optionals_for_building(mod,pbos): src_directories = os.listdir(optionals_root) current_dir = os.getcwd() - print_blue("\nChecking Optionals folder...") + print_blue("\nChecking optionals folder...") try: - #special server.pbo processing files = glob.glob(os.path.join(release_dir, project, "optionals", "*.pbo")) for file in files: @@ -400,7 +398,6 @@ def copy_optionals_for_building(mod,pbos): finally: os.chdir(current_dir) - print("") try: for dir_name in src_directories: mod.append(dir_name) @@ -467,9 +464,10 @@ def cleanup_optionals(mod): def purge(dir, pattern, friendlyPattern="files"): print_green("Deleting {} files from directory: {}".format(friendlyPattern,dir)) - for f in os.listdir(dir): - if re.search(pattern, f): - os.remove(os.path.join(dir, f)) + if os.path.exists(dir): + for f in os.listdir(dir): + if re.search(pattern, f): + os.remove(os.path.join(dir, f)) def build_signature_file(file_name): @@ -525,13 +523,13 @@ def addon_restore(modulePath): return True -def get_project_version(): +def get_project_version(version_increments=[]): global project_version versionStamp = project_version #do the magic based on https://github.com/acemod/ACE3/issues/806#issuecomment-95639048 try: - scriptModPath = os.path.join(work_drive, prefix, "main\script_mod.hpp") + scriptModPath = os.path.join(module_root, "main\script_version.hpp") if os.path.isfile(scriptModPath): f = open(scriptModPath, "r") @@ -541,11 +539,36 @@ def get_project_version(): if hpptext: majorText = re.search(r"#define MAJOR (.*\b)", hpptext).group(1) minorText = re.search(r"#define MINOR (.*\b)", hpptext).group(1) - patchlvlText = re.search(r"#define PATCHLVL (.*\b)", hpptext).group(1) + patchText = re.search(r"#define PATCHLVL (.*\b)", hpptext).group(1) buildText = re.search(r"#define BUILD (.*\b)", hpptext).group(1) + # Increment version (reset all below except build) + if version_increments != []: + if "major" in version_increments: + majorText = int(majorText) + 1 + minorText = 0 + patchText = 0 + elif "minor" in version_increments: + minorText = int(minorText) + 1 + patchText = 0 + elif "patch" in version_increments: + patchText = int(patchText) + 1 + + # Always increment build + if "build" in version_increments: + buildText = int(buildText) + 1 + + print_green("Incrementing version to {}.{}.{}.{}".format(majorText,minorText,patchText,buildText)) + with open(scriptModPath, "w", newline="\n") as file: + file.writelines([ + "#define MAJOR {}\n".format(majorText), + "#define MINOR {}\n".format(minorText), + "#define PATCHLVL {}\n".format(patchText), + "#define BUILD {}\n".format(buildText) + ]) + if majorText: - versionStamp = "{major}.{minor}.{patchlvl}.{build}".format(major=majorText,minor=minorText,patchlvl=patchlvlText,build=buildText) + versionStamp = "{}.{}.{}.{}".format(majorText,minorText,patchText,buildText) else: print_error("A Critical file seems to be missing or inaccessible: {}".format(scriptModPath)) @@ -565,22 +588,15 @@ def get_project_version(): def replace_file(filePath, oldSubstring, newSubstring): - #Create temp file - fh, absPath = mkstemp() - with open(absPath,'w') as newFile: - with open(filePath) as oldFile: - for line in oldFile: - newFile.write(line.replace(oldSubstring, newSubstring)) - newFile.close() - #Remove original file - os.remove(filePath) - #Move new file - shutil.move(absPath, filePath) + for line in fileinput.input(filePath, inplace=True): + # Use stdout directly, print() adds newlines automatically + sys.stdout.write(line.replace(oldSubstring,newSubstring)) def set_version_in_files(): newVersion = project_version # MAJOR.MINOR.PATCH.BUILD - newVersionShort = newVersion[:-2] # MAJOR.MINOR.PATCH + newVersionArr = newVersion.split(".") + newVersionShort = ".".join((newVersionArr[0],newVersionArr[1],newVersionArr[2])) # MAJOR.MINOR.PATCH # Regex patterns pattern = re.compile(r"([\d]+\.[\d]+\.[\d]+\.[\d]+)") # MAJOR.MINOR.PATCH.BUILD @@ -598,28 +614,26 @@ def set_version_in_files(): f.close() if fileText: - # Search and save version stamp, search short if long not found - versionFound = re.findall(pattern, fileText) - if not versionFound: - versionFound = re.findall(patternShort, fileText) + # Version string files + # Search and save version stamp + versionsFound = re.findall(pattern, fileText) + re.findall(patternShort, fileText) + # Filter out sub-versions of other versions + versionsFound = [j for i, j in enumerate(versionsFound) if all(j not in k for k in versionsFound[i + 1:])] # Replace version stamp if any of the new version parts is higher than the one found - if versionFound: - # First item in the list findall returns - versionFound = versionFound[0] - - newVersionUsed = "" - # Use the same version length as the one found - if len(versionFound) == len(newVersion): - newVersionUsed = newVersion - if len(versionFound) == len(newVersionShort): - newVersionUsed = newVersionShort - - # Print change and modify the file if changed - if versionFound != newVersionUsed: - print_green("Changing version {} => {} in {}".format(versionFound, newVersionUsed, filePath)) - replace_file(filePath, versionFound, newVersionUsed) + for versionFound in versionsFound: + if versionFound: + # Use the same version length as the one found + newVersionUsed = "" # In case undefined + if versionFound.count(".") == newVersion.count("."): + newVersionUsed = newVersion + if versionFound.count(".") == newVersionShort.count("."): + newVersionUsed = newVersionShort + # Print change and modify the file if changed + if newVersionUsed and versionFound != newVersionUsed: + print_green("Changing version {} => {} in {}".format(versionFound, newVersionUsed, filePath)) + replace_file(filePath, versionFound, newVersionUsed) except WindowsError as e: # Temporary file is still "in use" by Python, pass this exception pass @@ -634,13 +648,17 @@ def stash_version_files_for_building(): try: for file in versionFiles: filePath = os.path.join(module_root_parent, file) - # Take only file name for stash location if in subfolder (otherwise it gets removed when removing folders from release dir) - if "\\" in file: - count = file.count("\\") - file = file.split("\\", count)[-1] - stashPath = os.path.join(release_dir, file) - print("Temporarily stashing {} => {}.bak for version update".format(filePath, stashPath)) - shutil.copy(filePath, "{}.bak".format(stashPath)) + if os.path.exists(filePath): + # Take only file name for stash location if in subfolder (otherwise it gets removed when removing folders from release dir) + if "\\" in file: + count = file.count("\\") + file = file.split("\\", count)[-1] + stashPath = os.path.join(release_dir, file) + print("Temporarily stashing {} => {}.bak for version update".format(filePath, stashPath)) + shutil.copy(filePath, "{}.bak".format(stashPath)) + else: + print_error("Failed temporarily stashing {} for version update".format(filePath)) + missingFiles.append("{}".format(filePath)) except: print_error("Stashing version files failed") raise @@ -652,6 +670,8 @@ def stash_version_files_for_building(): def restore_version_files(): try: + print_blue("\nRestoring version files...") + for file in versionFiles: filePath = os.path.join(module_root_parent, file) # Take only file name for stash path if in subfolder (otherwise it gets removed when removing folders from release dir) @@ -659,8 +679,9 @@ def restore_version_files(): count = file.count("\\") file = file.split("\\", count)[-1] stashPath = os.path.join(release_dir, file) - print("Restoring {}".format(filePath)) - shutil.move("{}.bak".format(stashPath), filePath) + if os.path.exists(filePath): + print("Restoring {}".format(filePath)) + shutil.move("{}.bak".format(stashPath), filePath) except: print_error("Restoring version files failed") raise @@ -669,9 +690,9 @@ def restore_version_files(): def get_private_keyname(commitID,module="main"): global pbo_name_prefix + global project_version - aceVersion = get_project_version() - keyName = str("{prefix}{version}-{commit_id}".format(prefix=pbo_name_prefix,version=aceVersion,commit_id=commitID)) + keyName = str("{prefix}{version}-{commit_id}".format(prefix=pbo_name_prefix,version=project_version,commit_id=commitID)) return keyName @@ -786,6 +807,7 @@ def main(argv): global prefix global pbo_name_prefix global ciBuild + global missingFiles if sys.platform != "win32": print_error("Non-Windows platform (Cygwin?). Please re-run from cmd.") @@ -854,12 +876,9 @@ See the make.cfg file for additional build options. if "release" in argv: make_release_zip = True - release_version = argv[argv.index("release") + 1] - argv.remove(release_version) argv.remove("release") else: make_release_zip = False - release_version = project_version if "target" in argv: make_target = argv[argv.index("target") + 1] @@ -889,8 +908,22 @@ See the make.cfg file for additional build options. else: version_update = False - if "--ci" in argv: - argv.remove("--ci") + version_increments = [] + if "increment_build" in argv: + argv.remove("increment_build") + version_increments.append("build") + if "increment_patch" in argv: + argv.remove("increment_patch") + version_increments.append("patch") + if "increment_minor" in argv: + argv.remove("increment_minor") + version_increments.append("minor") + if "increment_major" in argv: + argv.remove("increment_major") + version_increments.append("major") + + if "ci" in argv: + argv.remove("ci") ciBuild = True print_yellow("\nCheck external references is set to {}".format(str(check_external))) @@ -956,21 +989,21 @@ See the make.cfg file for additional build options. optionals_root = os.path.join(module_root_parent, "optionals") extensions_root = os.path.join(module_root_parent, "extensions") - commit_id = get_commit_ID() - key_name = versionStamp = get_private_keyname(commit_id) - print_green ("module_root: {}".format(module_root)) - if (os.path.isdir(module_root)): os.chdir(module_root) else: print_error ("Directory {} does not exist.".format(module_root)) - sys.exit() + sys.exit(1) + + commit_id = get_commit_ID() + get_project_version(version_increments) + key_name = versionStamp = get_private_keyname(commit_id) + print_green ("module_root: {}".format(module_root)) if (os.path.isdir(optionals_root)): print_green ("optionals_root: {}".format(optionals_root)) else: - print_error ("Directory {} does not exist.".format(optionals_root)) - sys.exit() + print("optionals_root does not exist: {}".format(optionals_root)) print_green ("release_dir: {}".format(release_dir)) @@ -1022,7 +1055,6 @@ See the make.cfg file for additional build options. cache = {} # Check the build version (from main) with cached version - forces a full rebuild when version changes - project_version = get_project_version() cacheVersion = "None"; if 'cacheVersion' in cache: cacheVersion = cache['cacheVersion'] @@ -1046,6 +1078,9 @@ See the make.cfg file for additional build options. print_error("Cannot create release directory") raise + failedBuilds = [] + missingFiles = [] + # Update version stamp in all files that contain it # Update version only for release if full update not requested (backup and restore files) print_blue("\nChecking for obsolete version numbers...") @@ -1056,14 +1091,12 @@ See the make.cfg file for additional build options. set_version_in_files(); print("Version in files has been changed, make sure you commit and push the updates!") - amountOfBuildsFailed = 0 - namesOfBuildsFailed = [] - try: # Temporarily copy optionals_root for building. They will be removed later. - optionals_modules = [] - optional_files = [] - copy_optionals_for_building(optionals_modules,optional_files) + if (os.path.isdir(optionals_root)): + optionals_modules = [] + optional_files = [] + copy_optionals_for_building(optionals_modules,optional_files) # Get list of subdirs in make root. dirs = next(os.walk(module_root))[1] @@ -1128,15 +1161,14 @@ See the make.cfg file for additional build options. if (file.endswith(".pbo") and os.path.isfile(os.path.join(obsolete_check_path,file))): if check_for_obsolete_pbos(module_root, file): fileName = os.path.splitext(file)[0] - print_yellow("Removing obsolete file => {}".format(file)) + print_yellow("Removing obsolete pbo => {}".format(file)) purge(obsolete_check_path, "{}\..".format(fileName), "{}.*".format(fileName)) obsolete_check_path = os.path.join(module_root, release_dir, project) for file in os.listdir(obsolete_check_path): if (file.endswith(".dll") and os.path.isfile(os.path.join(obsolete_check_path,file))): - if check_for_obsolete_pbos(extensions_root, file): - fileName = os.path.splitext(file)[0] - print_yellow("Removing obsolete file => {}".format(file)) + if not os.path.exists(os.path.join(module_root_parent, file)): + print_yellow("Removing obsolete dll => {}".format(file)) try: os.remove(os.path.join(obsolete_check_path,file)) except: @@ -1282,8 +1314,7 @@ See the make.cfg file for additional build options. print_error("pboProject return code == {}".format(str(ret))) print_error("Module not successfully built/signed. Check your {}temp\{}_packing.log for more info.".format(work_drive,module)) print ("Resuming build...") - amountOfBuildsFailed += 1 - namesOfBuildsFailed.append("{}".format(module)) + failedBuilds.append("{}".format(module)) continue # Back to the root @@ -1379,7 +1410,8 @@ See the make.cfg file for additional build options. finally: copy_important_files(module_root_parent,os.path.join(release_dir, project)) - cleanup_optionals(optionals_modules) + if (os.path.isdir(optionals_root)): + cleanup_optionals(optionals_modules) if not version_update: restore_version_files() @@ -1399,8 +1431,7 @@ See the make.cfg file for additional build options. # Make release if make_release_zip: - release_name = "{}_{}".format(zipPrefix, release_version) - print_blue("\nMaking release: {}.zip".format(release_name)) + release_name = "{}_{}".format(zipPrefix, project_version) try: # Delete all log files @@ -1415,7 +1446,10 @@ See the make.cfg file for additional build options. os.remove(os.path.join(release_dir, file)) # Create a zip with the contents of release folder in it + print_blue("\nMaking release: {}.zip ...".format(release_name)) + print("Packing...") release_zip = shutil.make_archive("{}".format(release_name), "zip", release_dir) + # Move release zip to release folder shutil.copy(release_zip, release_dir) os.remove(release_zip) @@ -1450,15 +1484,23 @@ See the make.cfg file for additional build options. except: print_error("Could not copy files. Is Arma 3 running?") - if amountOfBuildsFailed > 0: - print_error("Build failed. {} pbos failed.".format(amountOfBuildsFailed)) + if len(failedBuilds) > 0 or len(missingFiles) > 0: + if len(failedBuilds) > 0: + print() + print_error("Build failed! {} PBOs failed!".format(len(failedBuilds))) + for failedBuild in failedBuilds: + print("- {} failed.".format(failedBuild)) - for failedModuleName in namesOfBuildsFailed: - print("- {} failed.".format(failedModuleName)) + if len(missingFiles) > 0: + missingFiles = set(missingFiles) + print() + print_error("Missing files! {} files not found!".format(len(missingFiles))) + for missingFile in missingFiles: + print("- {} failed.".format(missingFile)) sys.exit(1) else: - print_green("\Completed with 0 errors.") + print_green("\nCompleted with 0 errors.") if __name__ == "__main__": start_time = timeit.default_timer() From d2f485329fab89bbb5e56b6f47a4ce6992c2a022 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 25 Oct 2016 20:11:39 +0200 Subject: [PATCH 053/826] Update make.py to 0.8 (#4579) --- addons/main/script_mod.hpp | 5 +- addons/main/script_version.hpp | 4 + .../setting-up-the-development-environment.md | 73 ++++-- tools/make.py | 234 +++++++++++------- 4 files changed, 189 insertions(+), 127 deletions(-) create mode 100644 addons/main/script_version.hpp diff --git a/addons/main/script_mod.hpp b/addons/main/script_mod.hpp index af81b0745d..78fcc0c665 100644 --- a/addons/main/script_mod.hpp +++ b/addons/main/script_mod.hpp @@ -3,10 +3,7 @@ #define MAINPREFIX z #define PREFIX ace -#define MAJOR 3 -#define MINOR 8 -#define PATCHLVL 1 -#define BUILD 10 +#include "script_version.hpp" #define VERSION MAJOR.MINOR.PATCHLVL.BUILD #define VERSION_AR MAJOR,MINOR,PATCHLVL,BUILD diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp new file mode 100644 index 0000000000..edc3cf0bbb --- /dev/null +++ b/addons/main/script_version.hpp @@ -0,0 +1,4 @@ +#define MAJOR 3 +#define MINOR 8 +#define PATCHLVL 0 +#define BUILD 10 diff --git a/docs/wiki/development/setting-up-the-development-environment.md b/docs/wiki/development/setting-up-the-development-environment.md index 10c515a76d..c0333ac590 100644 --- a/docs/wiki/development/setting-up-the-development-environment.md +++ b/docs/wiki/development/setting-up-the-development-environment.md @@ -16,9 +16,10 @@ This page describes how you can setup your development environment for ACE3, all - A proper installation of the Arma 3 Tools (available on Steam) - A properly setup P-drive - Run Arma 3 and Arma 3 Tools directly from steam once to install registry entries (and again after every update) -- Python 3.x, available [here](http://www.python.org) -- The following Mikero's Tools (available [here](https://dev.withsix.com/projects/mikero-pbodll/files)): DePbo, DeRap, DeOgg, Rapify, MakePbo, pboProject -- A properly setup PATH variable (containing Python, the Mikero's Tools and git) +- [Python 3.x](https://www.python.org/) +- [Mikero Tools](https://dev.withsix.com/projects/mikero-pbodll/files): DePbo, DeRap, DeOgg, Rapify, MakePbo, PboProject +- Python, Mikero Tools and Git in PATH environment variable +- [CBA](https://github.com/CBATeam/CBA_A3/releases/latest) mod (release or development version) ## 2. Why so complicated? @@ -28,24 +29,29 @@ If you have contributed to AGM you might be used to an easier build process, whe Not offering .exes for the Python scripts we use allows us to make easy changes without the hassle of compiling self-extracting exes all the time. -## 3. Getting ACE +## 3. Getting Source Code -To actually get the ACE source code on your machine, it is recommended that you use Git. Tutorials for this are all around the web, and it allows you to track your changes and easily update your local copy. +To actually get the ACE3 source code on your machine, it is recommended that you use Git. Tutorials for this are all around the web, and it allows you to track your changes and easily update your local copy. If you just want to create a quick and dirty build, you can also directly download the source code using the "Download ZIP" button on the front page of the GitHub repo. -## 4. Initial Setup +## 4. Setup and Building -After ensuring that you have installed all requirements, execute the `setup.py` script found in the `tools` folder. This will do most of the heavy lifting for you, create the links you need and copy the required CBA code to the proper place. Please note that these links are tied to the location of your ACE3 source code, so make sure that the project folder is where you want it to be. We recommend that you store the ACE3 project on your P-drive. +### 4.1 Initial Setup -### 4.1 Manual Setup +Navigate to `tools` folder in command line. -Should the script fail, here is how you create the required links manually: +``` +cd "[location of the ACE3 project]\tools" +``` -First, to set up the links, create `z` folders both in your Arma 3 directory and on your P-drive. Then run the following commands as admin, replacing the text in brackets with the appropriate paths: +Execute `setup.py` to create symbolic links to P-drive and Arma 3 directory required for building. -```sh + +Should the script fail, you can create the required links manually. First, create `z` folders both in your Arma 3 directory and on your P-drive. Then run the following commands as admin, replacing the text in brackets with the appropriate paths: + +```bat mklink /J "[Arma 3 installation folder]\z\ace" "[location of the ACE3 project]" mklink /J "P:\z\ace" "[location of the ACE3 project]" ``` @@ -53,33 +59,50 @@ mklink /J "P:\z\ace" "[location of the ACE3 project]" Then, copy the `cba` folder from the `tools` folder to `P:\x\cba`. Create the `x` folder if needed. That folder contains the parts of the CBA source code that are required for the macros to work. -## 5. Creating a Test Build +## 4.2 Creating a Test Build -To create a development build of ACE to test changes or to debug something, run the `build.py` file in the `tools` folder. This will populate the `addons` folder with binarized PBOs. These PBOs still point to the source files in their respective folders however, which allows you to use [file patching](#file-patching). - -This also means that you cannot distribute this build to others. +To create a development build of ACE3 to test changes or to debug something, run the `build.py` file in the `tools` folder. This will populate the `addons` folder with binarized PBOs. These PBOs still point to the source files in their respective folders however, which allows you to use [file patching](#file-patching). This also means that you cannot distribute this build to others. To start the game using this build, you can use the following modline: ```sh --mod=@cba_a3;z\ace +-mod=@CBA_A3;z\ace ``` +## 4.3 Creating a Release Build -## 6. Creating a Release Build +To create a complete build of ACE3 that you can use without the source files you will need to: +- Ensure `.hpp` is **NOT** in pboProject's "Exclude From Pbo" list -To create a complete build of ACE that you can use without the source files, run the `make.py` file in the `tools` folder. This will populate the `release` folder with binarized PBOs that you can redistribute. These handle like those of any other mod. +When the requirements are met: +- Execute `make.py version increment_build force check_external release` in the `tools` folder, replacing `` with the part of version you want to increment (options described below) + +This will populate the `release` folder with binarized PBOs, compiled extensions, copied extras, bisigns and a bikey. Additionally, an archive file will also be created in the folder. The folder and archive handle like those of any other mod. + +Different `make.py` command line options include: +- `version` - update version number in all files and leave them in working directory (leaving this out will still update the version in all files present in the `release` folder, but they will be reverted to not disturb the working directory) +- `increment_build` - increments _build_ version number +- `increment_patch` - increments _patch_ version number (ignored with `increment_minor` or `increment_major`) +- `increment_minor` - increments _minor_ version number and resets _patch_ version number to `0` (ignored with `increment_major`) +- `increment_major` - increments _major_ version number and resets _minor_ and _patch_ version numbers to `0` +- `force` - force rebuild all PBOs, even those already present in the `release` directory (combined with `compile` it will also rebuild all extensions) +- `check_external` - check external references (incompatible only with ` ` and `force `) +- `release` - create release packages/archives +- ` ` - build only specified component(s) (incompatible with `release`) +- `force ` - force rebuild specified component(s) (incompatible with `release`) ## 7. File Patching -File Patching allows you to change the files in an addon while the game is running, requiring only a restart of the mission. This makes it great for debugging, as it cuts down the time required between tests. Note that this only works with PBOs created using MakePBO, as outlined in [Creating a Test Build](#creating-a-test-build). +File Patching allows you to change the files in an addon while the game is running, requiring only a restart of the mission. This makes it great for debugging, as it cuts down the time required between tests. Note that this only works with PBOs created using MakePBO, which `build.py` uses. + +To run Arma 3 with file patching add the `-filePatching` startup parameter (since Arma 3 v1.50, file patching is disabled by default). ### 7.1 Disabling CBA Function Caching By default CBA caches a compiled version of functions to reduce mission load times. This interferes with file patching. There are three ways to disable function caching: -- Load `cba_cache_disable.pbo` (included in CBA's optional folder) +- Load `cba_cache_disable.pbo` (included in CBA's optional folder - simply move it to `addons` folder for the time being) - Add the following to your test missions description.ext: ```cpp @@ -94,20 +117,16 @@ class CfgSettings { }; ``` -- To only disable caching for a single module, hence greatly improving mission restart time, add the following line to the `script_component.hpp` file of said module: +- To only disable caching for a single module, hence greatly improving mission restart time, add the following line to the `script_component.hpp` file of said module (prepared in each ACE3 component, simply uncomment): ```cpp #define DISABLE_COMPILE_CACHE ``` -### 7.2 Running Arma 3 with File Patching Enabled - -Starting from version 1.50, Arma 3 was changed to disable file patching by default, making the feature opt-in. To execute the game with file patching enabled add the `-filePatching` flag to the command line. - -### 7.3 Restrictions of File Patching +### 7.2 Restrictions Files must exist in the built PBOs for file patching to work. If you create a new file you must rebuild the PBO or Arma will not find it in your file paths. Configs are not patched during run time, only at load time. You do not have have to rebuild a PBO to make config changes, just restart Arma. You can get around this though if you are on the dev branch of Arma 3 and running the [diagnostic exe](https://community.bistudio.com/wiki/Arma_3_Diagnostics_Exe). That includes `diag_mergeConfigFile` which takes a full system path (as in `diag_mergeConfigFile ["p:\z\ace\addons\my_module\config.cpp"]`) and allows you selectively reload config files. -If you need to add/remove files, then you'll need to run build.py again without the game running, and restart. That is all that is required to add new files to then further use in testing. +If you need to add/remove files, then you'll need to run `build.py` again without the game running, and restart. That is all that is required to add new files for further use in testing. diff --git a/tools/make.py b/tools/make.py index 530eeaf032..e7d5adbd68 100644 --- a/tools/make.py +++ b/tools/make.py @@ -30,7 +30,7 @@ ############################################################################### -__version__ = "0.7" +__version__ = "0.8" import sys @@ -51,8 +51,7 @@ import traceback import time import timeit import re - -from tempfile import mkstemp +import fileinput if sys.platform == "win32": import winreg @@ -329,7 +328,6 @@ def print_yellow(msg): def copy_important_files(source_dir,destination_dir): - originalDir = os.getcwd() # Copy importantFiles @@ -340,17 +338,17 @@ def copy_important_files(source_dir,destination_dir): for file in importantFiles: filePath = os.path.join(module_root_parent, file) - # Take only file name for destination path (to put it into root of release dir) - if "\\" in file: - count = file.count("\\") - file = file.split("\\", count)[-1] - print_green("Copying file => {}".format(os.path.join(source_dir,file))) - shutil.copyfile(os.path.join(source_dir,filePath),os.path.join(destination_dir,file)) + if os.path.exists(filePath): + print_green("Copying file => {}".format(filePath)) + shutil.copy(os.path.join(source_dir,filePath), destination_dir) + else: + missingFiles.append("{}".format(filePath)) + print_error("Failed copying file => {}".format(filePath)) except: print_error("COPYING IMPORTANT FILES.") raise - #copy all extension dlls + # Copy all extension DLL's try: os.chdir(os.path.join(source_dir)) print_blue("\nSearching for DLLs in {}".format(os.getcwd())) @@ -370,13 +368,13 @@ def copy_important_files(source_dir,destination_dir): os.chdir(originalDir) + def copy_optionals_for_building(mod,pbos): src_directories = os.listdir(optionals_root) current_dir = os.getcwd() - print_blue("\nChecking Optionals folder...") + print_blue("\nChecking optionals folder...") try: - #special server.pbo processing files = glob.glob(os.path.join(release_dir, project, "optionals", "*.pbo")) for file in files: @@ -400,7 +398,6 @@ def copy_optionals_for_building(mod,pbos): finally: os.chdir(current_dir) - print("") try: for dir_name in src_directories: mod.append(dir_name) @@ -467,9 +464,10 @@ def cleanup_optionals(mod): def purge(dir, pattern, friendlyPattern="files"): print_green("Deleting {} files from directory: {}".format(friendlyPattern,dir)) - for f in os.listdir(dir): - if re.search(pattern, f): - os.remove(os.path.join(dir, f)) + if os.path.exists(dir): + for f in os.listdir(dir): + if re.search(pattern, f): + os.remove(os.path.join(dir, f)) def build_signature_file(file_name): @@ -525,13 +523,13 @@ def addon_restore(modulePath): return True -def get_project_version(): +def get_project_version(version_increments=[]): global project_version versionStamp = project_version #do the magic based on https://github.com/acemod/ACE3/issues/806#issuecomment-95639048 try: - scriptModPath = os.path.join(work_drive, prefix, "main\script_mod.hpp") + scriptModPath = os.path.join(module_root, "main\script_version.hpp") if os.path.isfile(scriptModPath): f = open(scriptModPath, "r") @@ -541,11 +539,36 @@ def get_project_version(): if hpptext: majorText = re.search(r"#define MAJOR (.*\b)", hpptext).group(1) minorText = re.search(r"#define MINOR (.*\b)", hpptext).group(1) - patchlvlText = re.search(r"#define PATCHLVL (.*\b)", hpptext).group(1) + patchText = re.search(r"#define PATCHLVL (.*\b)", hpptext).group(1) buildText = re.search(r"#define BUILD (.*\b)", hpptext).group(1) + # Increment version (reset all below except build) + if version_increments != []: + if "major" in version_increments: + majorText = int(majorText) + 1 + minorText = 0 + patchText = 0 + elif "minor" in version_increments: + minorText = int(minorText) + 1 + patchText = 0 + elif "patch" in version_increments: + patchText = int(patchText) + 1 + + # Always increment build + if "build" in version_increments: + buildText = int(buildText) + 1 + + print_green("Incrementing version to {}.{}.{}.{}".format(majorText,minorText,patchText,buildText)) + with open(scriptModPath, "w", newline="\n") as file: + file.writelines([ + "#define MAJOR {}\n".format(majorText), + "#define MINOR {}\n".format(minorText), + "#define PATCHLVL {}\n".format(patchText), + "#define BUILD {}\n".format(buildText) + ]) + if majorText: - versionStamp = "{major}.{minor}.{patchlvl}.{build}".format(major=majorText,minor=minorText,patchlvl=patchlvlText,build=buildText) + versionStamp = "{}.{}.{}.{}".format(majorText,minorText,patchText,buildText) else: print_error("A Critical file seems to be missing or inaccessible: {}".format(scriptModPath)) @@ -565,22 +588,15 @@ def get_project_version(): def replace_file(filePath, oldSubstring, newSubstring): - #Create temp file - fh, absPath = mkstemp() - with open(absPath,'w') as newFile: - with open(filePath) as oldFile: - for line in oldFile: - newFile.write(line.replace(oldSubstring, newSubstring)) - newFile.close() - #Remove original file - os.remove(filePath) - #Move new file - shutil.move(absPath, filePath) + for line in fileinput.input(filePath, inplace=True): + # Use stdout directly, print() adds newlines automatically + sys.stdout.write(line.replace(oldSubstring,newSubstring)) def set_version_in_files(): newVersion = project_version # MAJOR.MINOR.PATCH.BUILD - newVersionShort = newVersion[:-2] # MAJOR.MINOR.PATCH + newVersionArr = newVersion.split(".") + newVersionShort = ".".join((newVersionArr[0],newVersionArr[1],newVersionArr[2])) # MAJOR.MINOR.PATCH # Regex patterns pattern = re.compile(r"([\d]+\.[\d]+\.[\d]+\.[\d]+)") # MAJOR.MINOR.PATCH.BUILD @@ -598,28 +614,26 @@ def set_version_in_files(): f.close() if fileText: - # Search and save version stamp, search short if long not found - versionFound = re.findall(pattern, fileText) - if not versionFound: - versionFound = re.findall(patternShort, fileText) + # Version string files + # Search and save version stamp + versionsFound = re.findall(pattern, fileText) + re.findall(patternShort, fileText) + # Filter out sub-versions of other versions + versionsFound = [j for i, j in enumerate(versionsFound) if all(j not in k for k in versionsFound[i + 1:])] # Replace version stamp if any of the new version parts is higher than the one found - if versionFound: - # First item in the list findall returns - versionFound = versionFound[0] - - newVersionUsed = "" - # Use the same version length as the one found - if len(versionFound) == len(newVersion): - newVersionUsed = newVersion - if len(versionFound) == len(newVersionShort): - newVersionUsed = newVersionShort - - # Print change and modify the file if changed - if versionFound != newVersionUsed: - print_green("Changing version {} => {} in {}".format(versionFound, newVersionUsed, filePath)) - replace_file(filePath, versionFound, newVersionUsed) + for versionFound in versionsFound: + if versionFound: + # Use the same version length as the one found + newVersionUsed = "" # In case undefined + if versionFound.count(".") == newVersion.count("."): + newVersionUsed = newVersion + if versionFound.count(".") == newVersionShort.count("."): + newVersionUsed = newVersionShort + # Print change and modify the file if changed + if newVersionUsed and versionFound != newVersionUsed: + print_green("Changing version {} => {} in {}".format(versionFound, newVersionUsed, filePath)) + replace_file(filePath, versionFound, newVersionUsed) except WindowsError as e: # Temporary file is still "in use" by Python, pass this exception pass @@ -634,13 +648,17 @@ def stash_version_files_for_building(): try: for file in versionFiles: filePath = os.path.join(module_root_parent, file) - # Take only file name for stash location if in subfolder (otherwise it gets removed when removing folders from release dir) - if "\\" in file: - count = file.count("\\") - file = file.split("\\", count)[-1] - stashPath = os.path.join(release_dir, file) - print("Temporarily stashing {} => {}.bak for version update".format(filePath, stashPath)) - shutil.copy(filePath, "{}.bak".format(stashPath)) + if os.path.exists(filePath): + # Take only file name for stash location if in subfolder (otherwise it gets removed when removing folders from release dir) + if "\\" in file: + count = file.count("\\") + file = file.split("\\", count)[-1] + stashPath = os.path.join(release_dir, file) + print("Temporarily stashing {} => {}.bak for version update".format(filePath, stashPath)) + shutil.copy(filePath, "{}.bak".format(stashPath)) + else: + print_error("Failed temporarily stashing {} for version update".format(filePath)) + missingFiles.append("{}".format(filePath)) except: print_error("Stashing version files failed") raise @@ -652,6 +670,8 @@ def stash_version_files_for_building(): def restore_version_files(): try: + print_blue("\nRestoring version files...") + for file in versionFiles: filePath = os.path.join(module_root_parent, file) # Take only file name for stash path if in subfolder (otherwise it gets removed when removing folders from release dir) @@ -659,8 +679,9 @@ def restore_version_files(): count = file.count("\\") file = file.split("\\", count)[-1] stashPath = os.path.join(release_dir, file) - print("Restoring {}".format(filePath)) - shutil.move("{}.bak".format(stashPath), filePath) + if os.path.exists(filePath): + print("Restoring {}".format(filePath)) + shutil.move("{}.bak".format(stashPath), filePath) except: print_error("Restoring version files failed") raise @@ -669,9 +690,9 @@ def restore_version_files(): def get_private_keyname(commitID,module="main"): global pbo_name_prefix + global project_version - aceVersion = get_project_version() - keyName = str("{prefix}{version}-{commit_id}".format(prefix=pbo_name_prefix,version=aceVersion,commit_id=commitID)) + keyName = str("{prefix}{version}-{commit_id}".format(prefix=pbo_name_prefix,version=project_version,commit_id=commitID)) return keyName @@ -786,6 +807,7 @@ def main(argv): global prefix global pbo_name_prefix global ciBuild + global missingFiles if sys.platform != "win32": print_error("Non-Windows platform (Cygwin?). Please re-run from cmd.") @@ -854,12 +876,9 @@ See the make.cfg file for additional build options. if "release" in argv: make_release_zip = True - release_version = argv[argv.index("release") + 1] - argv.remove(release_version) argv.remove("release") else: make_release_zip = False - release_version = project_version if "target" in argv: make_target = argv[argv.index("target") + 1] @@ -889,8 +908,22 @@ See the make.cfg file for additional build options. else: version_update = False - if "--ci" in argv: - argv.remove("--ci") + version_increments = [] + if "increment_build" in argv: + argv.remove("increment_build") + version_increments.append("build") + if "increment_patch" in argv: + argv.remove("increment_patch") + version_increments.append("patch") + if "increment_minor" in argv: + argv.remove("increment_minor") + version_increments.append("minor") + if "increment_major" in argv: + argv.remove("increment_major") + version_increments.append("major") + + if "ci" in argv: + argv.remove("ci") ciBuild = True print_yellow("\nCheck external references is set to {}".format(str(check_external))) @@ -956,21 +989,21 @@ See the make.cfg file for additional build options. optionals_root = os.path.join(module_root_parent, "optionals") extensions_root = os.path.join(module_root_parent, "extensions") - commit_id = get_commit_ID() - key_name = versionStamp = get_private_keyname(commit_id) - print_green ("module_root: {}".format(module_root)) - if (os.path.isdir(module_root)): os.chdir(module_root) else: print_error ("Directory {} does not exist.".format(module_root)) - sys.exit() + sys.exit(1) + + commit_id = get_commit_ID() + get_project_version(version_increments) + key_name = versionStamp = get_private_keyname(commit_id) + print_green ("module_root: {}".format(module_root)) if (os.path.isdir(optionals_root)): print_green ("optionals_root: {}".format(optionals_root)) else: - print_error ("Directory {} does not exist.".format(optionals_root)) - sys.exit() + print("optionals_root does not exist: {}".format(optionals_root)) print_green ("release_dir: {}".format(release_dir)) @@ -1022,7 +1055,6 @@ See the make.cfg file for additional build options. cache = {} # Check the build version (from main) with cached version - forces a full rebuild when version changes - project_version = get_project_version() cacheVersion = "None"; if 'cacheVersion' in cache: cacheVersion = cache['cacheVersion'] @@ -1046,6 +1078,9 @@ See the make.cfg file for additional build options. print_error("Cannot create release directory") raise + failedBuilds = [] + missingFiles = [] + # Update version stamp in all files that contain it # Update version only for release if full update not requested (backup and restore files) print_blue("\nChecking for obsolete version numbers...") @@ -1056,14 +1091,12 @@ See the make.cfg file for additional build options. set_version_in_files(); print("Version in files has been changed, make sure you commit and push the updates!") - amountOfBuildsFailed = 0 - namesOfBuildsFailed = [] - try: # Temporarily copy optionals_root for building. They will be removed later. - optionals_modules = [] - optional_files = [] - copy_optionals_for_building(optionals_modules,optional_files) + if (os.path.isdir(optionals_root)): + optionals_modules = [] + optional_files = [] + copy_optionals_for_building(optionals_modules,optional_files) # Get list of subdirs in make root. dirs = next(os.walk(module_root))[1] @@ -1128,15 +1161,14 @@ See the make.cfg file for additional build options. if (file.endswith(".pbo") and os.path.isfile(os.path.join(obsolete_check_path,file))): if check_for_obsolete_pbos(module_root, file): fileName = os.path.splitext(file)[0] - print_yellow("Removing obsolete file => {}".format(file)) + print_yellow("Removing obsolete pbo => {}".format(file)) purge(obsolete_check_path, "{}\..".format(fileName), "{}.*".format(fileName)) obsolete_check_path = os.path.join(module_root, release_dir, project) for file in os.listdir(obsolete_check_path): if (file.endswith(".dll") and os.path.isfile(os.path.join(obsolete_check_path,file))): - if check_for_obsolete_pbos(extensions_root, file): - fileName = os.path.splitext(file)[0] - print_yellow("Removing obsolete file => {}".format(file)) + if not os.path.exists(os.path.join(module_root_parent, file)): + print_yellow("Removing obsolete dll => {}".format(file)) try: os.remove(os.path.join(obsolete_check_path,file)) except: @@ -1282,8 +1314,7 @@ See the make.cfg file for additional build options. print_error("pboProject return code == {}".format(str(ret))) print_error("Module not successfully built/signed. Check your {}temp\{}_packing.log for more info.".format(work_drive,module)) print ("Resuming build...") - amountOfBuildsFailed += 1 - namesOfBuildsFailed.append("{}".format(module)) + failedBuilds.append("{}".format(module)) continue # Back to the root @@ -1379,7 +1410,8 @@ See the make.cfg file for additional build options. finally: copy_important_files(module_root_parent,os.path.join(release_dir, project)) - cleanup_optionals(optionals_modules) + if (os.path.isdir(optionals_root)): + cleanup_optionals(optionals_modules) if not version_update: restore_version_files() @@ -1399,8 +1431,7 @@ See the make.cfg file for additional build options. # Make release if make_release_zip: - release_name = "{}_{}".format(zipPrefix, release_version) - print_blue("\nMaking release: {}.zip".format(release_name)) + release_name = "{}_{}".format(zipPrefix, project_version) try: # Delete all log files @@ -1415,7 +1446,10 @@ See the make.cfg file for additional build options. os.remove(os.path.join(release_dir, file)) # Create a zip with the contents of release folder in it + print_blue("\nMaking release: {}.zip ...".format(release_name)) + print("Packing...") release_zip = shutil.make_archive("{}".format(release_name), "zip", release_dir) + # Move release zip to release folder shutil.copy(release_zip, release_dir) os.remove(release_zip) @@ -1450,15 +1484,23 @@ See the make.cfg file for additional build options. except: print_error("Could not copy files. Is Arma 3 running?") - if amountOfBuildsFailed > 0: - print_error("Build failed. {} pbos failed.".format(amountOfBuildsFailed)) + if len(failedBuilds) > 0 or len(missingFiles) > 0: + if len(failedBuilds) > 0: + print() + print_error("Build failed! {} PBOs failed!".format(len(failedBuilds))) + for failedBuild in failedBuilds: + print("- {} failed.".format(failedBuild)) - for failedModuleName in namesOfBuildsFailed: - print("- {} failed.".format(failedModuleName)) + if len(missingFiles) > 0: + missingFiles = set(missingFiles) + print() + print_error("Missing files! {} files not found!".format(len(missingFiles))) + for missingFile in missingFiles: + print("- {} failed.".format(missingFile)) sys.exit(1) else: - print_green("\Completed with 0 errors.") + print_green("\nCompleted with 0 errors.") if __name__ == "__main__": start_time = timeit.default_timer() From 27eb30bdd83255e5d42c999f236d2c864f9f4029 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 25 Oct 2016 20:16:16 +0200 Subject: [PATCH 054/826] Prep 3.8.1 --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index edc3cf0bbb..ac597f49d4 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 8 -#define PATCHLVL 0 +#define PATCHLVL 1 #define BUILD 10 From 36085ebd9c30d70a29dd2919c8beb95aa11d30fa Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 25 Oct 2016 20:20:26 +0200 Subject: [PATCH 055/826] Prep 3.8.1 release --- README.md | 2 +- docs/README_DE.md | 2 +- docs/README_PL.md | 2 +- mod.cpp | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index cd73c8bae7..7a170d1e15 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Issues diff --git a/docs/README_DE.md b/docs/README_DE.md index a0141f38d1..90d5eb578e 100644 --- a/docs/README_DE.md +++ b/docs/README_DE.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Fehlermeldungen diff --git a/docs/README_PL.md b/docs/README_PL.md index ac936ae16f..a224f84277 100644 --- a/docs/README_PL.md +++ b/docs/README_PL.md @@ -3,7 +3,7 @@

- ACE3 Wersja + ACE3 Wersja ACE3 Zagadnienia diff --git a/mod.cpp b/mod.cpp index 78457aa3dd..45ec7fbbcf 100644 --- a/mod.cpp +++ b/mod.cpp @@ -1,8 +1,8 @@ -name = "Advanced Combat Environment 3.8.0"; +name = "Advanced Combat Environment 3.8.1"; picture = "logo_ace3_ca.paa"; actionName = "GitHub"; action = "https://github.com/acemod/ACE3"; -description = "ACE3 - Version 3.8.0"; +description = "ACE3 - Version 3.8.1"; logo = "logo_ace3_ca.paa"; logoOver = "logo_ace3_ca.paa"; tooltip = "ACE3"; From e1aa5b42927933618353961889083f6a1040b315 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 25 Oct 2016 20:27:34 +0200 Subject: [PATCH 056/826] Increment build --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index ac597f49d4..1bc29e4831 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 8 #define PATCHLVL 1 -#define BUILD 10 +#define BUILD 11 From 029b68526f15234c3b072974b339d34820761a75 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Thu, 27 Oct 2016 01:16:31 +0300 Subject: [PATCH 057/826] Cleanup Frag Component (#4581) * Cleanup frag component * Optimize fnc_addTrack * Add additional cleanup * Please work? * Add more cleanup * Fix script errors * Fix/optimize spalling * Add missing changes --- addons/frag/$PBOPREFIX$ | 2 +- addons/frag/ACE_Settings.hpp | 1 - addons/frag/CfgAmmo.hpp | 14 +- addons/frag/CfgAmmoReflections.hpp | 2 - addons/frag/CfgEventhandlers.hpp | 1 - addons/frag/XEH_PREP.hpp | 1 - addons/frag/XEH_postInit.sqf | 12 +- addons/frag/XEH_preInit.sqf | 3 +- addons/frag/config.cpp | 1 + addons/frag/functions/fnc_addBlackList.sqf | 4 +- addons/frag/functions/fnc_addPfhRound.sqf | 64 ++--- addons/frag/functions/fnc_addTrack.sqf | 12 +- addons/frag/functions/fnc_dev_debugAmmo.sqf | 38 +-- addons/frag/functions/fnc_doExplosions.sqf | 16 +- addons/frag/functions/fnc_doReflections.sqf | 10 +- addons/frag/functions/fnc_doSpall.sqf | 247 ++++++++---------- addons/frag/functions/fnc_drawTraces.sqf | 26 +- addons/frag/functions/fnc_findReflections.sqf | 108 ++++---- addons/frag/functions/fnc_fired.sqf | 2 +- addons/frag/functions/fnc_frago.sqf | 199 +++++++------- addons/frag/functions/fnc_masterPFH.sqf | 35 ++- addons/frag/functions/fnc_pfhRound.sqf | 26 +- addons/frag/functions/fnc_removePfhRound.sqf | 6 +- addons/frag/functions/fnc_removeTrack.sqf | 9 +- addons/frag/functions/fnc_spallHP.sqf | 48 ++-- addons/frag/functions/fnc_spallTrack.sqf | 28 +- addons/frag/functions/fnc_startTracing.sqf | 8 +- addons/frag/functions/fnc_stopTracing.sqf | 8 +- addons/frag/functions/fnc_trackTrace.sqf | 8 +- addons/frag/functions/script_component.hpp | 2 +- addons/frag/script_component.hpp | 2 +- addons/frag/stringtable.xml | 2 +- 32 files changed, 441 insertions(+), 504 deletions(-) diff --git a/addons/frag/$PBOPREFIX$ b/addons/frag/$PBOPREFIX$ index ddf45c738b..bc4c9e8dc9 100644 --- a/addons/frag/$PBOPREFIX$ +++ b/addons/frag/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\addons\frag \ No newline at end of file +z\ace\addons\frag diff --git a/addons/frag/ACE_Settings.hpp b/addons/frag/ACE_Settings.hpp index 4dfa172bb3..eb0beea661 100644 --- a/addons/frag/ACE_Settings.hpp +++ b/addons/frag/ACE_Settings.hpp @@ -34,7 +34,6 @@ class ACE_Settings { typeName = "SCALAR"; value = 50; }; - class GVAR(enableDebugTrace) { category = CSTRING(Module_DisplayName); displayName = CSTRING(EnableDebugTrace); diff --git a/addons/frag/CfgAmmo.hpp b/addons/frag/CfgAmmo.hpp index 3da01ac29b..501ce8880b 100644 --- a/addons/frag/CfgAmmo.hpp +++ b/addons/frag/CfgAmmo.hpp @@ -1,6 +1,6 @@ -#define BASE_DRAG -0.01 -#define HD_MULT 5 -#define BASE_DRAG_HD (BASE_DRAG*HD_MULT) +#define BASE_DRAG -0.01 +#define HD_MULT 5 +#define BASE_DRAG_HD (BASE_DRAG * HD_MULT) class CfgAmmo { //class ace_arty_105mm_m1_m782_time; @@ -104,10 +104,8 @@ class CfgAmmo { GVAR(gurney_k) = 1/2; }; - class ACE_G_40mm_HEDP: G_40mm_HEDP { - }; - class ACE_G_40mm_HE: G_40mm_HE { - }; + class ACE_G_40mm_HEDP: G_40mm_HEDP {}; + class ACE_G_40mm_HE: G_40mm_HE {}; class ACE_G_40mm_Practice: ACE_G_40mm_HE { GVAR(skip) = 1; GVAR(force) = 0; @@ -438,8 +436,6 @@ class CfgAmmo { indirectHitRange = 0.25; airFriction = BASE_DRAG_HD*0.65; caliber = 2; - - }; class GVAR(huge): GVAR(large) { diff --git a/addons/frag/CfgAmmoReflections.hpp b/addons/frag/CfgAmmoReflections.hpp index fdaac6dd90..513b58d544 100644 --- a/addons/frag/CfgAmmoReflections.hpp +++ b/addons/frag/CfgAmmoReflections.hpp @@ -1,5 +1,3 @@ -//CfgAmmoReflections.hpp - #define ACE_EXPLOSION_REFLECTION(range, hit)\ class ace_explosion_reflection_##range##_##hit : ace_explosion_reflection_base {\ indirectHitRange = range;\ diff --git a/addons/frag/CfgEventhandlers.hpp b/addons/frag/CfgEventhandlers.hpp index becf395052..0d3301d6e0 100644 --- a/addons/frag/CfgEventhandlers.hpp +++ b/addons/frag/CfgEventhandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preStart)); diff --git a/addons/frag/XEH_PREP.hpp b/addons/frag/XEH_PREP.hpp index 2fed1630f2..a9a9d43c5b 100644 --- a/addons/frag/XEH_PREP.hpp +++ b/addons/frag/XEH_PREP.hpp @@ -22,7 +22,6 @@ PREP(addPfhRound); PREP(removePfhRound); // THIS SHOULD ABE USED SPARINGLY // Explosive Reflection -GVAR(replacedBisArtyWrapper) = true; PREP(findReflections); PREP(doExplosions); PREP(doReflections); diff --git a/addons/frag/XEH_postInit.sqf b/addons/frag/XEH_postInit.sqf index feb4be05b6..17c0c14035 100644 --- a/addons/frag/XEH_postInit.sqf +++ b/addons/frag/XEH_postInit.sqf @@ -1,16 +1,15 @@ #include "script_component.hpp" -if(GVAR(EnableDebugTrace) && !isMultiplayer) then { +if (GVAR(EnableDebugTrace) && {!isMultiplayer}) then { GVAR(traceFrags) = true; GVAR(autoTrace) = true; }; -if(isServer) then { - [QGVAR(frag_eh), { _this call FUNC(frago); }] call CBA_fnc_addEventHandler; +if (isServer) then { + [QGVAR(frag_eh), {_this call FUNC(frago);}] call CBA_fnc_addEventHandler; }; ["ace_settingsInitialized", { - //If not enabled, exit if (!GVAR(enabled)) exitWith {}; // Register fire event handler @@ -20,9 +19,8 @@ if(isServer) then { ["ace_firedNonPlayerVehicle", DFUNC(fired)] call CBA_fnc_addEventHandler; [FUNC(masterPFH), 0, []] call CBA_fnc_addPerFrameHandler; - }] call CBA_fnc_addEventHandler; -//Cache for ammo type configs -GVAR(cacheRoundsTypesToTrack) = createLocation ["ACE_HashLocation", [-10000,-10000,-10000], 0, 0]; +// Cache for ammo type configs +GVAR(cacheRoundsTypesToTrack) = createLocation ["ACE_HashLocation", [-10000, -10000, -10000], 0, 0]; GVAR(cacheRoundsTypesToTrack) setText QGVAR(cacheRoundsTypesToTrack); diff --git a/addons/frag/XEH_preInit.sqf b/addons/frag/XEH_preInit.sqf index 9c03491a4e..b07f1df773 100644 --- a/addons/frag/XEH_preInit.sqf +++ b/addons/frag/XEH_preInit.sqf @@ -4,10 +4,11 @@ ADDON = false; #include "XEH_PREP.hpp" +GVAR(replacedBisArtyWrapper) = true; GVAR(blackList) = []; GVAR(traceFrags) = false; -GVAR(TOTALFRAGS) = 0; +GVAR(totalFrags) = 0; GVAR(spallHPData) = []; GVAR(spallIsTrackingCount) = 0; diff --git a/addons/frag/config.cpp b/addons/frag/config.cpp index 7ac109d29f..f3b409dbd0 100644 --- a/addons/frag/config.cpp +++ b/addons/frag/config.cpp @@ -1,4 +1,5 @@ #include "script_component.hpp" + class CfgPatches { class ADDON { name = COMPONENT_NAME; diff --git a/addons/frag/functions/fnc_addBlackList.sqf b/addons/frag/functions/fnc_addBlackList.sqf index 1a7d7cb253..9950cab2b0 100644 --- a/addons/frag/functions/fnc_addBlackList.sqf +++ b/addons/frag/functions/fnc_addBlackList.sqf @@ -1,3 +1,5 @@ #include "script_component.hpp" + params ["_round"]; -GVAR(blackList) set [(count GVAR(blackList)), _round]; + +GVAR(blackList) pushBack _round; diff --git a/addons/frag/functions/fnc_addPfhRound.sqf b/addons/frag/functions/fnc_addPfhRound.sqf index f0047bb24d..a211752e98 100644 --- a/addons/frag/functions/fnc_addPfhRound.sqf +++ b/addons/frag/functions/fnc_addPfhRound.sqf @@ -1,73 +1,67 @@ //#define DEBUG_MODE_FULL #include "script_component.hpp" -private ["_enabled", "_doSpall", "_spallTrack", "_spallTrackID"]; -PARAMS_3(_gun,_type,_round); -DEFAULT_PARAM(3,_doFragTrack,false); +params ["_gun", "_type", "_round", ["_doFragTrack", false]]; if (!GVAR(enabled)) exitWith {}; //_enabled = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(enabled)); -//if(_enabled < 1) exitWith {}; +//if (_enabled < 1) exitWith {}; -if(_round in GVAR(blackList)) exitWith { - GVAR(blackList) = GVAR(blackList) - [_round]; +if (_round in GVAR(blackList)) exitWith { + REM(GVAR(blackList),_round); }; // Exit on max track -if( (count GVAR(objects)) > GVAR(MaxTrack)) exitWith { }; +if ((count GVAR(objects)) > GVAR(MaxTrack)) exitWith {}; -if(_gun == ACE_player) then { +if ( + _gun == ACE_player || + {(gunner _gun) == ACE_player} || + {local _gun && {!(isPlayer (gunner _gun))} && {!(isPlayer _gun)}} +) then { _doFragTrack = true; -} else { - if((gunner _gun) == ACE_player) then { - _doFragTrack = true; - } else { - if(local _gun && {!(isPlayer (gunner _gun))} && {!(isPlayer _gun)}) then { - _doFragTrack = true; - }; - }; }; -_doSpall = false; -if(GVAR(SpallEnabled)) then { - if(GVAR(spallIsTrackingCount) <= 0) then { +private _doSpall = false; +if (GVAR(SpallEnabled)) then { + if (GVAR(spallIsTrackingCount) <= 0) then { GVAR(spallHPData) = []; }; - if(GVAR(spallIsTrackingCount) > 5) then { + if (GVAR(spallIsTrackingCount) > 5) then { // ACE_player sideChat "LIMT!"; } else { _doSpall = true; - GVAR(spallIsTrackingCount) = GVAR(spallIsTrackingCount) + 1; + INC(GVAR(spallIsTrackingCount)); }; }; -// ACE_player sideChat format["c: %1", GVAR(spallIsTrackingCount)]; +// ACE_player sideChat format ["c: %1", GVAR(spallIsTrackingCount)]; -if(GVAR(autoTrace)) then { - [ACE_player, _round, [1,0,0,1]] call FUNC(addTrack); +if (GVAR(autoTrace)) then { + [ACE_player, _round, [1, 0, 0, 1]] call FUNC(addTrack); }; // We only do the single track object check here. // We should do an {!(_round in GVAR(objects))} // But we leave that out here for optimization. So this cannot be a framework function // Otherwise, it should only be added once and from the FiredEH -if(_doFragTrack && {alive _round}) then { - _spallTrack = []; - _spallTrackID = []; +if (_doFragTrack && {alive _round}) then { + private _spallTrack = []; + private _spallTrackID = []; - private ["_args"]; - _args = [_round, (getPosASL _round), (velocity _round), _type, diag_frameno, _gun, _doSpall, _spallTrack, _spallTrackID, - (getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip))), - (getNumber (configFile >> "CfgAmmo" >> _type >> "explosive")), - (getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange")), - (getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force))), - (getNumber(configFile >> "CfgAmmo" >> _type >> "indirecthit")*(sqrt((getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"))))) + private _args = [ + _round, getPosASL _round, velocity _round, _type, diag_frameno, _gun, _doSpall, _spallTrack, _spallTrackID, + getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip)), + getNumber (configFile >> "CfgAmmo" >> _type >> "explosive"), + getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"), + getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force)), + getNumber (configFile >> "CfgAmmo" >> _type >> "indirecthit") * (sqrt (getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"))) ]; TRACE_1("Initializing track", _round); GVAR(objects) pushBack _round; GVAR(arguments) pushBack _args; - if(_doSpall) then { + if (_doSpall) then { [_round, 1, _spallTrack, _spallTrackID] call FUNC(spallTrack); }; // ACE_player sideChat "WTF2"; diff --git a/addons/frag/functions/fnc_addTrack.sqf b/addons/frag/functions/fnc_addTrack.sqf index 4270e15996..a93106d518 100644 --- a/addons/frag/functions/fnc_addTrack.sqf +++ b/addons/frag/functions/fnc_addTrack.sqf @@ -5,16 +5,12 @@ if (GVAR(autoTrace)) then { }; // setAccTime 0.05; -private _index = count GVAR(traces); -params ["_origin", "_obj"]; -private _color = [1,0,0,1]; -if((count _this) > 2) then { - _color = _this select 2; -}; +params ["_origin", "_obj", ["_color", [1, 0, 0, 1]]]; + private _positions = []; private _objSpd = vectorMagnitude (velocity _obj); -_positions set[(count _positions), [(getPos _obj), _objSpd]]; +_positions pushBack [getPos _obj, _objSpd]; private _data = [_origin, typeOf _origin, typeOf _obj, _objSpd, _positions, _color]; -GVAR(traces) set[_index, _data]; +private _index = GVAR(traces) pushBack _data; [DFUNC(trackTrace), 0, [_obj, _index, CBA_missionTime]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/frag/functions/fnc_dev_debugAmmo.sqf b/addons/frag/functions/fnc_dev_debugAmmo.sqf index 297113f5af..14b190c8c3 100644 --- a/addons/frag/functions/fnc_dev_debugAmmo.sqf +++ b/addons/frag/functions/fnc_dev_debugAmmo.sqf @@ -1,7 +1,11 @@ #define DEBUG_MODE_FULL #include "script_component.hpp" -params [["_debugMissing", true, [false]], ["_debugForce", false, [false]], ["_debugNonFrag", false, [false]]]; +params [ + ["_debugMissing", true, [false]], + ["_debugForce", false, [false]], + ["_debugNonFrag", false, [false]] +]; diag_log text format ["~~~~~~~~~~~~~Start [%1]~~~~~~~~~~~~~", _this]; @@ -10,7 +14,7 @@ private _processedCfgAmmos = []; { private _ammo = toLower getText (_x >> "ammo"); - if ((_ammo != "") && {!(_ammo in _processedCfgAmmos)}) then { + if (_ammo != "" && {!(_ammo in _processedCfgAmmos)}) then { _processedCfgAmmos pushBack _ammo; //Ignore mines/bombs @@ -23,37 +27,37 @@ private _processedCfgAmmos = []; private _explosive = getNumber (_ammoConfig >> "explosive"); private _indirectRange = getNumber (_ammoConfig >> "indirectHitRange"); private _force = getNumber (_ammoConfig >> QGVAR(force)); - private _fragPower = getNumber(_ammoConfig >> "indirecthit")*(sqrt((getNumber (_ammoConfig >> "indirectHitRange")))); + private _fragPower = getNumber (_ammoConfig >> "indirecthit") * (sqrt ((getNumber (_ammoConfig >> "indirectHitRange")))); private _shouldAdd = (_skip == 0) && {(_force == 1) || {_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}}}; if (_shouldAdd) then { if (_debugForce && {((getNumber(_ammoConfig >> "hit")) < 5) || {_fragPower < 10}}) then { - diag_log text format ["Ammo [%1] from Mag [%2] - Weak but will still frag!",_ammo,configName _x]; - diag_log text format [" - _force=%1,_fragPower=%2",_force,_fragPower]; + diag_log text format ["Ammo [%1] from Mag [%2] - Weak but will still frag!", _ammo, configName _x]; + diag_log text format [" - _force=%1,_fragPower=%2", _force, _fragPower]; }; - - _warn = false; + + private _warn = false; _fragTypes = getArray (_ammoConfig >> QGVAR(CLASSES)); - if(_fragTypes isEqualTo []) then {_warn = true;}; + if (_fragTypes isEqualTo []) then {_warn = true;}; _c = getNumber(_ammoConfig >> QGVAR(CHARGE)); - if(_c == 0) then {_warn = true;}; + if (_c == 0) then {_warn = true;}; _m = getNumber(_ammoConfig >> QGVAR(METAL)); - if(_m == 0) then {_warn = true;}; + if (_m == 0) then {_warn = true;}; _k = getNumber(_ammoConfig >> QGVAR(GURNEY_K)); - if(_k == 0) then {_warn = true;}; + if (_k == 0) then {_warn = true;}; _gC = getNumber(_ammoConfig >> QGVAR(GURNEY_C)); - if(_gC == 0) then { _warn = true;}; + if (_gC == 0) then {_warn = true;}; - if(_debugMissing && _warn) then { - diag_log text format ["Ammo [%1] from Mag [%2] MISSING frag configs:",_ammo,configName _x]; - diag_log text format [" - _c=%1,_m=%2,_k=%3,_gC=%4,_fragTypes=%5",_c,_m,_k,_gC,_fragTypes]; + if (_debugMissing && {_warn}) then { + diag_log text format ["Ammo [%1] from Mag [%2] MISSING frag configs:", _ammo, configName _x]; + diag_log text format [" - _c=%1,_m=%2,_k=%3,_gC=%4,_fragTypes=%5", _c, _m, _k, _gC, _fragTypes]; }; } else { if (_debugNonFrag && {isArray (_ammoConfig >> QGVAR(CLASSES))}) then { - diag_log text format ["Ammo [%1] from Mag [%2] has frag configs but will NOT frag:",_ammo,configName _x]; - diag_log text format ["- skip=%1,explosive=%2,indirectHitRange=%3,force=%4,fragPower=%5",_skip,_explosive,_indirectRange,_force,_fragPower]; + diag_log text format ["Ammo [%1] from Mag [%2] has frag configs but will NOT frag:", _ammo, configName _x]; + diag_log text format ["- skip=%1,explosive=%2,indirectHitRange=%3,force=%4,fragPower=%5", _skip, _explosive, _indirectRange, _force, _fragPower]; }; }; }; diff --git a/addons/frag/functions/fnc_doExplosions.sqf b/addons/frag/functions/fnc_doExplosions.sqf index 03ad4d1dec..85074bdb13 100644 --- a/addons/frag/functions/fnc_doExplosions.sqf +++ b/addons/frag/functions/fnc_doExplosions.sqf @@ -1,20 +1,22 @@ //fnc_doExplosions.sqf #include "script_component.hpp" -params ["_args"]; +params ["_args", "_pfhID"]; _args params ["_explosions", "_index"]; -for "_i" from _index to ((_index+2) min (count _explosions)) do { +for "_i" from _index to ((_index + 2) min (count _explosions)) do { private _exp = _explosions select _i; _exp params ["_refExp", "_bpos", "_hit", "_distance", "_indirectHitRange", "_depth"]; _refExp createVehicle (ASLtoATL _bpos); - // if(_hit >= 150 && _distance > _indirectHitRange) then { + // if (_hit >= 150 && _distance > _indirectHitRange) then { // [_bpos, _refExp, _depth] call FUNC(doReflections); // }; }; -_index = _index + 2; -if(_index >= (count _explosions)) then { - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + +ADD(_index,2); + +if (_index >= count _explosions) then { + [_pfhID] call CBA_fnc_removePerFrameHandler; } else { - _params set[1, _index]; + _args set [1, _index]; }; diff --git a/addons/frag/functions/fnc_doReflections.sqf b/addons/frag/functions/fnc_doReflections.sqf index de5bac1b62..b4bec189f7 100644 --- a/addons/frag/functions/fnc_doReflections.sqf +++ b/addons/frag/functions/fnc_doReflections.sqf @@ -1,14 +1,10 @@ //fnc_doReflections.sqf #include "script_component.hpp" -params ["_pos", "_ammo"]; +params ["_pos", "_ammo", ["_depth", 1]]; -private _depth = 1; -if(count _this > 2) then { - _depth = _this select 2; -}; -// TEST_ICONS pushBack [_pos, format["EXP!", _hit, _range, _hitFactor]]; -if(_depth <= 2) then { +// TEST_ICONS pushBack [_pos, format ["EXP!", _hit, _range, _hitFactor]]; +if (_depth <= 2) then { private _indirectHitRange = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange"); private _indirectHit = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirectHit"); private _testParams = [_pos, [_indirectHitRange, _indirectHit], [], [], -4, _depth, 0]; diff --git a/addons/frag/functions/fnc_doSpall.sqf b/addons/frag/functions/fnc_doSpall.sqf index 2eb118004b..5b9bf757c4 100644 --- a/addons/frag/functions/fnc_doSpall.sqf +++ b/addons/frag/functions/fnc_doSpall.sqf @@ -2,145 +2,126 @@ #include "script_component.hpp" // ACE_player sideChat "WAAAAAAAAAAAAAAAAAAAAA"; -params ["_hitData"]; +params ["_hitData", "_hitPartDataIndex"]; private _initialData = GVAR(spallHPData) select (_hitData select 0); -private _hpData = (_hitData select 1) select (_this select 1); +_initialData params ["_hpId", "_object", "_roundType", "_round", "_curPos", "_velocity"]; -_hpData params ["_object"]; -_object removeEventHandler ["hitPart", _initialData select 0]; -private _foundObjects = _initialData select 7; -private _index = _foundObjects find _object; -if(_index != -1) then { - _foundObjects set[_index, nil]; -}; +private _hpData = (_hitData select 1) select _hitPartDataIndex; +(_hpData select 0) removeEventHandler ["hitPart", _hpId]; -_initialData params ["", "_object", "_roundType", "_round"]; +private _caliber = getNumber (configFile >> "CfgAmmo" >> _roundType >> "caliber"); +private _explosive = getNumber (configFile >> "CfgAmmo" >> _roundType >> "explosive"); +private _idh = getNumber (configFile >> "CfgAmmo" >> _roundType >> "indirectHitRange"); -private _caliber = getNumber(configFile >> "CfgAmmo" >> _roundType >> "caliber"); -private _explosive = getNumber(configFile >> "CfgAmmo" >> _roundType >> "explosive"); -private _idh = getNumber(configFile >> "CfgAmmo" >> _roundType >> "indirectHitRange"); +if !(_caliber >= 2.5 || {(_explosive > 0 && {_idh >= 1})}) exitWith {}; +// ACE_player sideChat format ["BBBB"]; +private _exit = false; +private _vm = 1; -private _alive = true; -if(!alive _round && (_initialData select 6) isEqualTo 1) then { - _alive = false; -}; +private _oldVelocity = vectorMagnitude _velocity; +private _curVelocity = vectorMagnitude (velocity _round); -if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { - // ACE_player sideChat format["BBBB"]; - private _exit = false; - private _vm = 1; - private _velocity = _initialData select 5; - - private _oldVelocity = vectorMagnitude _velocity; - private _curVelocity = vectorMagnitude (velocity _round); - - if(alive _round) then { - private _diff = _velocity vectorDiff (velocity _round); - private _polar = _diff call CBA_fnc_vect2polar; - // ACE_player sideChat format["polar: %1", _polar]; - if((abs(_polar select 1) > 45 || abs(_polar select 2) > 45)) then { - if(_caliber < 2.5) then { - // ACE_player sideChat format["exit!"]; - _exit = true; - } else { - _vm = 1-(_curVelocity/_oldVelocity); - }; - }; - }; - if(!_exit) then { - private _unitDir = vectorNormalized _velocity; - private _pos = _hpData select 3; - private _spallPos = nil; - for "_i" from 0 to 100 do { - private _pos1 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * _i)); - private _pos2 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * (_i + 1))); - // _blah = [_object, "FIRE"] intersect [_object worldToModel (ASLtoATL _pos1), _object worldToModel (ASLtoATL _pos2)]; - // diag_log text format["b: %1", _blah]; - - // _data = [nil, nil, nil, 1, [[ASLtoATL _pos1, 1], [ASLtoATL _pos2, 1]]]; - // NOU_TRACES set[(count NOU_TRACES), _data]; - - if(!lineIntersects [_pos1, _pos2]) exitWith { - // ACE_player sideChat format["FOUND!"]; - _spallPos = _pos2; - }; - }; - if(!isNil "_spallPos") then { - private _spallPolar = _velocity call CBA_fnc_vect2polar; - - if(_explosive > 0) then { - // ACE_player sideChat format["EXPLOSIVE!"]; - private _warn = false; - private _c = getNumber(configFile >> "CfgAmmo" >> _roundType >> QGVAR(CHARGE)); - if(_c == 0) then { _c = 1; _warn = true;}; - private _m = getNumber(configFile >> "CfgAmmo" >> _roundType >> QGVAR(METAL)); - if(_m == 0) then { _m = 2; _warn = true;}; - private _k = getNumber(configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_K)); - if(_k == 0) then { _k = 1/2; _warn = true;}; - private _gC = getNumber(configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_C)); - if(_gC == 0) then { _gC = 2440; _warn = true;}; - - if(_warn) then { - WARNING_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_roundType); //TODO: turn this off when we get closer to release - }; - - private _fragPower = (((_m/_c)+_k)^-(1/2))*_gC; - _spallPolar set[0, _fragPower*0.66]; - }; - - private _fragTypes = [ - QGVAR(spall_small), QGVAR(spall_small), QGVAR(spall_small), - QGVAR(spall_small),QGVAR(spall_medium),QGVAR(spall_medium),QGVAR(spall_medium), - QGVAR(spall_medium), QGVAR(spall_large), QGVAR(spall_large), QGVAR(spall_huge), - QGVAR(spall_huge) - - ]; - - // diag_log text format["SPALL POWER: %1", _spallPolar select 0]; - private _spread = 15+(random 25); - private _spallCount = 5+(random 10); - for "_i" from 1 to _spallCount do { - private _elev = ((_spallPolar select 2)-_spread)+(random (_spread*2)); - private _dir = ((_spallPolar select 1)-_spread)+(random (_spread*2)); - if(abs _elev > 90) then { - _dir = _dir + 180; - }; - _dir = _dir % 360; - private _vel = (_spallPolar select 0)*0.33*_vm; - _vel = (_vel-(_vel*0.25))+(random (_vel*0.5)); - - private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; - private _fragType = round (random ((count _fragTypes)-1)); - private _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; - _fragment setPosASL _spallPos; - _fragment setVelocity _spallFragVect; - - if(GVAR(traceFrags)) then { - [ACE_player, _fragment, [1,0.5,0,1]] call FUNC(addTrack); - }; - }; - _spread = 5+(random 5); - _spallCount = 3+(random 5); - for "_i" from 1 to _spallCount do { - private _elev = ((_spallPolar select 2)-_spread)+(random (_spread*2)); - private _dir = ((_spallPolar select 1)-_spread)+(random (_spread*2)); - if(abs _elev > 90) then { - _dir = _dir + 180; - }; - _dir = _dir % 360; - private _vel = (_spallPolar select 0)*0.55*_vm; - _vel = (_vel-(_vel*0.25))+(random (_vel*0.5)); - - private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; - private _fragType = round (random ((count _fragTypes)-1)); - private _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; - _fragment setPosASL _spallPos; - _fragment setVelocity _spallFragVect; - - if(GVAR(traceFrags)) then { - [ACE_player, _fragment, [1,0,0,1]] call FUNC(addTrack); - }; - }; +if (alive _round) then { + private _diff = _velocity vectorDiff (velocity _round); + private _polar = _diff call CBA_fnc_vect2polar; + // ACE_player sideChat format ["polar: %1", _polar]; + if (abs (_polar select 1) > 45 || {abs (_polar select 2) > 45}) then { + if (_caliber < 2.5) then { + // ACE_player sideChat format ["exit!"]; + _exit = true; + } else { + SUB(_vm,_curVelocity / _oldVelocity); }; }; }; +if (_exit) exitWith {}; +private _unitDir = vectorNormalized _velocity; +private _pos = _hpData select 3; +private _spallPos = []; +for "_i" from 0 to 100 do { + private _pos1 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * _i)); + private _pos2 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * (_i + 1))); + // _data = [nil, nil, nil, 1, [[ASLtoATL _pos1, 1], [ASLtoATL _pos2, 1]]]; + // NOU_TRACES pushBack _data; + + if (!lineIntersects [_pos1, _pos2]) exitWith { + // ACE_player sideChat format ["FOUND!"]; + _spallPos = _pos2; + }; +}; +if (_spallPos isEqualTo []) exitWith {}; +private _spallPolar = _velocity call CBA_fnc_vect2polar; + +if (_explosive > 0) then { + // ACE_player sideChat format ["EXPLOSIVE!"]; + private _warn = false; + private _c = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(CHARGE)); + if (_c == 0) then {_c = 1; _warn = true;}; + private _m = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(METAL)); + if (_m == 0) then {_m = 2; _warn = true;}; + private _k = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_K)); + if (_k == 0) then {_k = 1 / 2; _warn = true;}; + private _gC = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_C)); + if (_gC == 0) then {_gC = 2440; _warn = true;}; + + if (_warn) then { + WARNING_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_roundType); //TODO: turn this off when we get closer to release + }; + + private _fragPower = (((_m / _c) + _k) ^ - (1 / 2)) * _gC; + _spallPolar set [0, _fragPower * 0.66]; +}; + +private _fragTypes = [ + QGVAR(spall_small), QGVAR(spall_small), QGVAR(spall_small), + QGVAR(spall_small),QGVAR(spall_medium),QGVAR(spall_medium),QGVAR(spall_medium), + QGVAR(spall_medium), QGVAR(spall_large), QGVAR(spall_large), QGVAR(spall_huge), + QGVAR(spall_huge) + +]; + +// diag_log text format ["SPALL POWER: %1", _spallPolar select 0]; +private _spread = 15 + (random 25); +private _spallCount = 5 + (random 10); +for "_i" from 1 to _spallCount do { + private _elev = ((_spallPolar select 2) - _spread) + (random (_spread * 2)); + private _dir = ((_spallPolar select 1) - _spread) + (random (_spread * 2)); + if (abs _elev > 90) then { + ADD(_dir,180); + }; + _dir = _dir % 360; + private _vel = (_spallPolar select 0) * 0.33 * _vm; + _vel = (_vel - (_vel * 0.25)) + (random (_vel * 0.5)); + + private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; + private _fragType = round (random ((count _fragTypes) - 1)); + private _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; + _fragment setPosASL _spallPos; + _fragment setVelocity _spallFragVect; + + if (GVAR(traceFrags)) then { + [ACE_player, _fragment, [1, 0.5, 0, 1]] call FUNC(addTrack); + }; +}; +_spread = 5 + (random 5); +_spallCount = 3 + (random 5); +for "_i" from 1 to _spallCount do { + private _elev = ((_spallPolar select 2) - _spread) + (random (_spread * 2)); + private _dir = ((_spallPolar select 1) - _spread) + (random (_spread * 2)); + if (abs _elev > 90) then { + ADD(_dir,180); + }; + _dir = _dir % 360; + private _vel = (_spallPolar select 0) * 0.55 * _vm; + _vel = (_vel - (_vel * 0.25)) + (random (_vel * 0.5)); + + private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; + private _fragType = round (random ((count _fragTypes) - 1)); + private _fragment = (_fragTypes select _fragType) createVehicleLocal [0, 0, 10000]; + _fragment setPosASL _spallPos; + _fragment setVelocity _spallFragVect; + + if (GVAR(traceFrags)) then { + [ACE_player, _fragment, [1, 0, 0, 1]] call FUNC(addTrack); + }; +}; diff --git a/addons/frag/functions/fnc_drawTraces.sqf b/addons/frag/functions/fnc_drawTraces.sqf index 790d53491f..6dd710f61c 100644 --- a/addons/frag/functions/fnc_drawTraces.sqf +++ b/addons/frag/functions/fnc_drawTraces.sqf @@ -1,31 +1,23 @@ #include "script_component.hpp" -private ["_color", "_index", "_lastPos", "_lastSpd", "_max", "_positions", "_startSpeed"]; - { - _positions = _x select 4; - _color = _x select 5; - _index = 0; - _max = count _positions; - _startSpeed = 0.01 max ((_positions select 0) select 1); - _lastSpd = []; - _lastPos = []; + private _positions = _x select 4; + private _color = _x select 5; + private _index = 0; + private _max = count _positions; + private _lastSpd = []; + private _lastPos = []; while {_index < _max} do { _data1 = _positions select _index; - _data2 = nil; - if(_index + ACE_TRACE_DRAW_INC >= _max) then { - _data2 = _positions select (_max - 1); - } else { - _data2 = _positions select (_index + ACE_TRACE_DRAW_INC); - }; + _data2 = _positions select ([_index + ACE_TRACE_DRAW_INC, _max - 1] select (_index + ACE_TRACE_DRAW_INC >= _max)); _pos1 = _data1 select 0; _pos2 = _data2 select 0; - _index = _index + ACE_TRACE_DRAW_INC; + ADD(_index,ACE_TRACE_DRAW_INC); drawLine3D [_pos1, _pos2, _color]; _lastPos = _pos2; _lastSpd = _data1 select 1; }; - // drawIcon3D ["", [1,0,0,1], _lastPos, 0, 0, 0, format["%1m/s", _lastSpd], 1, 0.05, "RobotoCondensed"]; + // drawIcon3D ["", [1,0,0,1], _lastPos, 0, 0, 0, format ["%1m/s", _lastSpd], 1, 0.05, "RobotoCondensed"]; } forEach GVAR(traces); diff --git a/addons/frag/functions/fnc_findReflections.sqf b/addons/frag/functions/fnc_findReflections.sqf index 3020cd9c12..f8c9685bda 100644 --- a/addons/frag/functions/fnc_findReflections.sqf +++ b/addons/frag/functions/fnc_findReflections.sqf @@ -1,61 +1,58 @@ //fnc_findReflections.sqf #include "script_component.hpp" -private ["_lastPos", "_test", "_vec", "_testPos", "_buckets", "_excludes", "_bucketIndex", "_bucketPos", "_bucketList", "_c", "_index", "_blist", "_avgX", "_avgY", "_avgZ", "_bpos", "_distance", "_hitFactor", "_hit", "_range", "_refExp", "_i", "_x", "_res", "_forEachIndex", "_explosions", "_can", "_dirvec", "_zAng"]; - BEGIN_COUNTER(fnc_findReflections); -params ["_args"]; +params ["_args", "_pfhID"]; _args params ["_pos", "_explosiveInfo", "_los", "_nlos", "_zIndex", "_depth", "_rand"]; private _split = 15; -private _radi = (360/_split*_depth); +private _radi = 360 / _split * _depth; -// player sideChat format["p: %1", _explosiveInfo]; +// player sideChat format ["p: %1", _explosiveInfo]; _explosiveInfo params ["_indirectHitRange", "_indirectHit"]; -private _distanceCount = (floor _indirectHitRange*4) min 100; +private _distanceCount = (floor _indirectHitRange * 4) min 100; -if(_zIndex < 5) then { - _lastPos = _pos; - _zAng = _zIndex*20+2; - if(_zAng > 80) then { +if (_zIndex < 5) then { + private _lastPos = _pos; + private _zAng = _zIndex * 20 + 2; + if (_zAng > 80) then { _radi = 1; _zAng = 90; }; for "_i" from 0 to _radi do { - _test = true; - _vec = [1, ((_i*_split)+_rand) mod 360, _zAng] call CBA_fnc_polar2vect; + private _test = true; + private _vec = [1, ((_i * _split) + _rand) % 360, _zAng] call CBA_fnc_polar2vect; for "_x" from 1 to _distanceCount do { - _testPos = _pos vectorAdd (_vec vectorMultiply _x); + private _testPos = _pos vectorAdd (_vec vectorMultiply _x); // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _testPos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; - _res = lineIntersectsWith [_pos, _testPos]; - if(count _res > 0) exitWith { + private _res = lineIntersectsWith [_pos, _testPos]; + if (count _res > 0) exitWith { _test = false; _nlos pushBack _lastPos; // { - // _x addEventHandler ["HandleDamage", { diag_log text format["this: %1", _this]; }]; + // _x addEventHandler ["HandleDamage", { diag_log text format ["this: %1", _this]; }]; // } forEach _res; // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _testPos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; // TEST_PAIRS pushBack [_pos, _lastPos, [1,0,0,1]]; }; - // if(terrainIntersectASL [_pos, _testPos]) exitWith {}; + // if (terrainIntersectASL [_pos, _testPos]) exitWith {}; _lastPos = _testPos; }; }; - _args set[4, _zIndex+1]; + _args set [4, _zIndex + 1]; } else { - _depth = _depth + 1; - _buckets = []; - _excludes = []; - _bucketIndex = 0; - _bucketPos = nil; - _bucketList = nil; - _c = 0; - while { count(_nlos) != count(_excludes) && _c < (count _nlos) } do { + INC(_depth); + private _buckets = []; + private _excludes = []; + private _bucketPos = nil; + private _bucketList = nil; + private _c = 0; + while {count _nlos != count _excludes && {_c < (count _nlos)}} do { scopeName "mainSearch"; { - if(!(_forEachIndex in _excludes)) then { - _index = _buckets pushBack [_x, [_x]]; + if (!(_forEachIndex in _excludes)) then { + private _index = _buckets pushBack [_x, [_x]]; _excludes pushBack _forEachIndex; _bucketPos = _x; _bucketList = (_buckets select _index) select 1; @@ -63,59 +60,58 @@ if(_zIndex < 5) then { }; } forEach _nlos; { - if(!(_forEachIndex in _excludes)) then { + if (!(_forEachIndex in _excludes)) then { _testPos = _x; - if(_testPos vectorDistanceSqr _bucketPos <= 30) then { + if (_testPos vectorDistanceSqr _bucketPos <= 30) then { _bucketList pushBack _x; _excludes pushBack _forEachIndex; }; }; } forEach _nlos; - _c = _c + 1; + INC(_c); }; - // player sideChat format["c: %1", count _buckets]; - _explosions = []; + // player sideChat format ["c: %1", count _buckets]; + private _explosions = []; { - _blist = _x select 1; - _avgX = 0; - _avgY = 0; - _avgZ = 0; + private _blist = _x select 1; + private _avgX = 0; + private _avgY = 0; + private _avgZ = 0; { - _avgX = _avgX + (_x select 0); - _avgY = _avgY + (_x select 1); - _avgZ = _avgZ + (_x select 2); + ADD(_avgX,_x select 0); + ADD(_avgY,_x select 1); + ADD(_avgZ,_x select 2); } forEach _blist; _c = count _blist; - _bpos = [_avgX/_c, _avgY/_c, _avgZ/_c]; + private _bpos = [_avgX / _c, _avgY / _c, _avgZ / _c]; - _distance = _pos vectorDistance _bpos; - _hitFactor = 1-(((_distance/(_indirectHitRange*4)) min 1) max 0); - // _hitFactor = 1/(_distance^2); - _hit = _indirectHit*_hitFactor; - _hit = (floor (_hit/4)) min 500; - _hit = _hit - (_hit%10); - _range = (floor (_indirectHitRange-(_distance/4))) min 100; - _range = _range - (_range%2); + private _distance = _pos vectorDistance _bpos; + private _hitFactor = 1 - (((_distance / (_indirectHitRange * 4)) min 1) max 0); + // _hitFactor = 1 / (_distance ^ 2); + private _hit = _indirectHit * _hitFactor; + _hit = (floor (_hit / 4)) min 500; + SUB(_hit,_hit % 10); + private _range = (floor (_indirectHitRange - (_distance / 4))) min 100; + SUB(_range,_range % 2); - if(_hit >= 10 && _range > 0) then { - // TEST_ICONS pushBack [_bpos, format["h: %1, r: %2, hf: %3 d: %4 ihr: %5", _hit, _range, _hitFactor, _distance, _indirectHitRange*4]]; + if (_hit >= 10 && {_range > 0}) then { + // TEST_ICONS pushBack [_bpos, format ["h: %1, r: %2, hf: %3 d: %4 ihr: %5", _hit, _range, _hitFactor, _distance, _indirectHitRange*4]]; // TEST_PAIRS pushBack [_pos, _bpos, [1,0,0,1]]; - _refExp = format["ace_explosion_reflection_%1_%2", _range, _hit]; + private _refExp = format ["ace_explosion_reflection_%1_%2", _range, _hit]; // _refExp createVehicle (ASLtoATL _bpos); // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _bpos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; - _explosions pushBack [_refExp, _bpos, _hit, _distance, _indirectHitRange/4, _depth]; - + _explosions pushBack [_refExp, _bpos, _hit, _distance, _indirectHitRange / 4, _depth]; }; - if(count _explosions > (_radi*2)/_depth) exitWith {}; + if (count _explosions > (_radi * 2) / _depth) exitWith {}; } forEach _buckets; // _can = "Land_Bricks_V4_F" createVehicle (ASLtoATL _pos); // _dirvec = _pos vectorFromTo ((ATLtoASL (player modelToWorldVisual (player selectionPosition "Spine3")))); // _dirvec = _dirvec vectorMultiply 100; // _can setVelocity _dirvec; [DFUNC(doExplosions), 0, [_explosions, 0]] call CBA_fnc_addPerFrameHandler; - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_pfhID] call CBA_fnc_removePerFrameHandler; }; END_COUNTER(fnc_findReflections); diff --git a/addons/frag/functions/fnc_fired.sqf b/addons/frag/functions/fnc_fired.sqf index dbe1ab6347..6b12e09d76 100644 --- a/addons/frag/functions/fnc_fired.sqf +++ b/addons/frag/functions/fnc_fired.sqf @@ -42,7 +42,7 @@ if (isNil "_shouldAdd") then { private _explosive = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosive"); private _indirectRange = getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange"); private _force = getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(force)); - private _fragPower = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirecthit")*(sqrt((getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange")))); + private _fragPower = getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirecthit") * (sqrt (getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange"))); _shouldAdd = (_skip == 0) && {(_force == 1) || {_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}}}; TRACE_6("SettingCache[willFrag?]",_skip,_explosive,_indirectRange,_force,_fragPower,_shouldAdd); diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf index 8e6c6ca7e9..389ab73842 100644 --- a/addons/frag/functions/fnc_frago.sqf +++ b/addons/frag/functions/fnc_frago.sqf @@ -6,44 +6,36 @@ #define MAX_FRAG_COUNT 50 -if(!isServer) exitWith { }; +if (!isServer) exitWith {}; BEGIN_COUNTER(frago); // _startTime = diag_tickTime; -private ["_fuseDist", "_indirectHitRange", "_fragRange", "_c", "_m", "_k", "_gC", "_fragPower", "_fragPowerRandom", "_manObjects", "_objects", "_crew", "_fragCount", "_fragArcs", "_doRandom", "_boundingBox", "_targetPos", "_distance", "_add", "_bbX", "_bbY", "_bbZ", "_cubic", "_targetVel", "_baseVec", "_dir", "_currentCount", "_count", "_vecVar", "_vec", "_fp", "_vel", "_fragType", "_fragObj", "_randomCount", "_sectorSize", "_sectorOffset", "_i", "_randomDir", "_endTime", "_target"]; - -params ["_round", "_lastPos", "_lastVel", "_shellType"]; -private _gun = nil; -if((count _this) > 5) then { - _gun = _this select 5; -}; +params ["_round", "_lastPos", "_lastVel", "_shellType", "_firedFrame", "_gun"]; private _fragTypes = [ QGVAR(tiny), QGVAR(tiny), QGVAR(tiny), QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(tiny_HD), - QGVAR(small),QGVAR(small),QGVAR(small),QGVAR(small), - QGVAR(small_HD),QGVAR(small_HD),QGVAR(small_HD),QGVAR(small_HD), + QGVAR(small), QGVAR(small), QGVAR(small), QGVAR(small), + QGVAR(small_HD), QGVAR(small_HD), QGVAR(small_HD), QGVAR(small_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD) ]; private _warn = false; -if(isArray (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CLASSES))) then { +if (isArray (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CLASSES))) then { _fragTypes = getArray (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CLASSES)); } else { _warn = true; }; -private _atlPos = ASLtoATL _lastPos; - private _isArmed = true; -if(!isNil "_gun") then { - _fuseDist = getNumber(configFile >> "CfgAmmo" >> _shellType >> "fuseDistance"); +if (!isNil "_gun") then { + private _fuseDist = getNumber(configFile >> "CfgAmmo" >> _shellType >> "fuseDistance"); _isArmed = ((getPosASL _gun) distance _lastPos > _fuseDist); }; -_indirectHitRange = getNumber(configFile >> "CfgAmmo" >> _shellType >> "indirecthitrange"); -_fragRange = 20 * _indirectHitRange * 4; +private _indirectHitRange = getNumber(configFile >> "CfgAmmo" >> _shellType >> "indirecthitrange"); +private _fragRange = 20 * _indirectHitRange * 4; // _c = 185; // grams of comp-b // _m = 210; // grams of fragmentating metal // _k = 3/5; // spherical K factor @@ -54,26 +46,27 @@ _fragRange = 20 * _indirectHitRange * 4; // _k = 1/2; // spherical K factor // _gC = 2320; // Gurney constant of tritonal in /ms +private _c = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CHARGE)); +if (_c == 0) then {_c = 1; _warn = true;}; +private _m = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(METAL)); +if (_m == 0) then {_m = 2; _warn = true;}; +private _k = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_K)); +if (_k == 0) then {_k = 0.5; _warn = true;}; +private _gC = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_C)); +if (_gC == 0) then {_gC = 2440; _warn = true;}; -_c = getNumber(configFile >> "CfgAmmo" >> _shellType >> QGVAR(CHARGE)); -if(_c == 0) then { _c = 1; _warn = true;}; -_m = getNumber(configFile >> "CfgAmmo" >> _shellType >> QGVAR(METAL)); -if(_m == 0) then { _m = 2; _warn = true;}; -_k = getNumber(configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_K)); -if(_k == 0) then { _k = 1/2; _warn = true;}; -_gC = getNumber(configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_C)); -if(_gC == 0) then { _gC = 2440; _warn = true;}; - -if(_warn) then { +if (_warn) then { WARNING_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_shellType); //TODO: turn this off when we get closer to release }; -_fragPower = (((_m/_c)+_k)^-(1/2))*_gC; +private _fragPower = (((_m / _c) + _k) ^ - (1 / 2)) * _gC; _fragPower = _fragPower * 0.8; // Gunery equation is for a non-fragmenting metal, imperical value of 80% represents fragmentation -_fragPowerRandom = _fragPower * 0.5; -if((_atlPos select 2) < 0.5) then { - _lastPos set[2, (_lastPos select 2)+0.5]; +private _atlPos = ASLtoATL _lastPos; + +private _fragPowerRandom = _fragPower * 0.5; +if ((_atlPos select 2) < 0.5) then { + _lastPos set [2, (_lastPos select 2) + 0.5]; }; // _manObjects = _atlPos nearEntities ["CaManBase", _fragRange]; @@ -81,134 +74,130 @@ if((_atlPos select 2) < 0.5) then { // setAccTime 0.01; //_objects = nearestObjects [_atlPos, ["AllVehicles"], _fragRange]; // Not sure if tracking "ReammoBox" is required, if so revert this change for _objects -_objects = _atlPos nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], _fragRange]; +private _objects = _atlPos nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], _fragRange]; // _objects = _manObjects; -// Target also people inside vehicles or manning weapons -_crew = []; +// Add unique crews in faster way { { - _crew set [count _crew,_x] + _objects pushBackUnique _x; } forEach (crew _x); } forEach _objects; -_objects = _objects - _crew; -_objects = _objects + _crew; +private _fragCount = 0; -_fragCount = 0; - -_fragArcs = []; -_fragArcs set[360, 0]; +private _fragArcs = []; +_fragArcs set [360, 0]; #ifdef DEBUG_MODE_FULL - ACE_player sideChat format["_fragRange: %1", _fragRange]; - ACE_player sideChat format["_objects: %1", _objects]; + ACE_player sideChat format ["_fragRange: %1", _fragRange]; + ACE_player sideChat format ["_objects: %1", _objects]; #endif -_doRandom = true; -if(_isArmed && (count _objects) > 0) then { + +private _doRandom = true; +if (_isArmed && {!(_objects isEqualTo [])}) then { if (GVAR(ReflectionsEnabled)) then { [_lastPos, _shellType] call FUNC(doReflections); }; { - //if(random(1) > 0.5) then { - _target = _x; - if(alive _target) then { - _boundingBox = boundingBox _target; - _targetPos = (getPosASL _target); - _distance = _targetPos distance _lastPos; - _add = (((_boundingBox select 1) select 2)/2)+((((_distance-(_fragpower/8)) max 0)/_fragPower)*10); - _bbX = (abs((_boundingBox select 0) select 0))+((_boundingBox select 1) select 0); - _bbY = (abs((_boundingBox select 0) select 1))+((_boundingBox select 1) select 1); - _bbZ = (abs((_boundingBox select 0) select 2))+((_boundingBox select 1) select 2); - _cubic = _bbX * _bbY * _bbZ; - if(_cubic > 1) then { + //if (random(1) > 0.5) then { + private _target = _x; + if (alive _target) then { + private _boundingBox = boundingBox _target; + private _targetPos = getPosASL _target; + private _distance = _targetPos distance _lastPos; + private _add = (((_boundingBox select 1) select 2) / 2) + ((((_distance - (_fragpower / 8)) max 0) / _fragPower) * 10); + private _bbX = (abs ((_boundingBox select 0) select 0)) + ((_boundingBox select 1) select 0); + private _bbY = (abs ((_boundingBox select 0) select 1)) + ((_boundingBox select 1) select 1); + private _bbZ = (abs ((_boundingBox select 0) select 2)) + ((_boundingBox select 1) select 2); + private _cubic = _bbX * _bbY * _bbZ; + if (_cubic > 1) then { _doRandom = true; - _targetVel = (velocity _target); + private _targetVel = velocity _target; + _targetPos = _targetPos vectorAdd [ + (_targetVel select 0) * (_distance / _fragPower), + (_targetVel select 1) * (_distance / _fragPower), + _add + ]; - _targetPos set[0, (_targetPos select 0)+((_targetVel select 0)*(_distance/_fragPower))]; - _targetPos set[1, (_targetPos select 1)+((_targetVel select 1)*(_distance/_fragPower))]; - _targetPos set[2, (_targetPos select 2)+_add]; + private _baseVec = _lastPos vectorFromTo _targetPos; - _baseVec = _lastPos vectorFromTo _targetPos; - - _dir = floor(_baseVec call CBA_fnc_vectDir); - _currentCount = _fragArcs select _dir; - if(isNil "_currentCount") then { - _currentCount = 0; - }; - if(_currentCount < 20) then { - _count = ceil(random(sqrt(_m/1000))); - _vecVar = FRAG_VEC_VAR; - if(!(_target isKindOf "Man")) then { - _vecVar = ((sqrt _cubic)/2000)+FRAG_VEC_VAR; - if((count (crew _target)) == 0 && _count > 0) then { - _count = 0 max (_count/2); + private _dir = floor (_baseVec call CBA_fnc_vectDir); + private _currentCount = _fragArcs select _dir; + ISNILS(_currentCount,0); + if (_currentCount < 20) then { + private _count = ceil (random (sqrt (_m / 1000))); + private _vecVar = FRAG_VEC_VAR; + if (!(_target isKindOf "Man")) then { + _vecVar = ((sqrt _cubic) / 2000) + FRAG_VEC_VAR; + if ((crew _target) isEqualTo [] && {_count > 0}) then { + _count = 0 max (_count / 2); }; }; for "_i" from 1 to _count do { - _vec = +_baseVec; + private _vec = _baseVec vectorDiff [ + (_vecVar / 2) + (random _vecVar), + (_vecVar / 2) + (random _vecVar), + (_vecVar / 2) + (random _vecVar) + ]; - _vec set[0, (_vec select 0)-(_vecVar/2)+(random _vecVar)]; - _vec set[1, (_vec select 1)-(_vecVar/2)+(random _vecVar)]; - _vec set[2, (_vec select 2)-(_vecVar/2)+(random _vecVar)]; + private _fp = _fragPower - (random (_fragPowerRandom)); + private _vel = _vec vectorMultiply _fp; - _fp = (_fragPower-(random (_fragPowerRandom))); - _vel = _vec vectorMultiply _fp; - - _fragType = round (random ((count _fragTypes)-1)); - _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; - // diag_log text format["fp: %1 %2", _fp, typeOf _fragObj]; + private _fragType = round (random ((count _fragTypes) - 1)); + private _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; + // diag_log text format ["fp: %1 %2", _fp, typeOf _fragObj]; _fragObj setPosASL _lastPos; _fragObj setVectorDir _vec; _fragObj setVelocity _vel; - if(GVAR(traceFrags)) then { - GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; + if (GVAR(traceFrags)) then { + INC(GVAR(totalFrags)); [ACE_player, _fragObj, [1,0,0,1]] call FUNC(addTrack); }; - _fragCount = _fragCount + 1; - _currentCount = _currentCount + 1; + INC(_fragCount); + INC(_currentCount); }; - _fragArcs set[_dir, _currentCount]; + _fragArcs set [_dir, _currentCount]; }; }; }; //}; - if(_fragCount > MAX_FRAG_COUNT) exitWith {}; + if (_fragCount > MAX_FRAG_COUNT) exitWith {}; } forEach _objects; - if(_fragCount > MAX_FRAG_COUNT) exitWith {}; - _randomCount = ((ceil((MAX_FRAG_COUNT - _fragCount)*0.1)) max 0)+20; - _sectorSize = 360 / (_randomCount max 1); + if (_fragCount > MAX_FRAG_COUNT) exitWith {}; + private _randomCount = ((ceil ((MAX_FRAG_COUNT - _fragCount) * 0.1)) max 0) + 20; + private _sectorSize = 360 / (_randomCount max 1); // _doRandom = false; - if(_doRandom) then { + if (_doRandom) then { for "_i" from 1 to _randomCount do { // Distribute evenly - _sectorOffset = 360 * (_i - 1) / (_randomCount max 1); - _randomDir = random(_sectorSize); - _vec = [cos(_sectorOffset + _randomDir), sin(_sectorOffset + _randomDir), sin(30 - (random 45))]; + private _sectorOffset = 360 * (_i - 1) / (_randomCount max 1); + private _randomDir = random (_sectorSize); + _vec = [cos (_sectorOffset + _randomDir), sin (_sectorOffset + _randomDir), sin (30 - (random 45))]; - _fp = (_fragPower-(random (_fragPowerRandom))); + _fp = (_fragPower - (random (_fragPowerRandom))); _vel = _vec vectorMultiply _fp; - _fragType = round (random ((count _fragTypes)-1)); - _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; + _fragType = round (random ((count _fragTypes) - 1)); + _fragObj = (_fragTypes select _fragType) createVehicleLocal [0, 0, 10000]; _fragObj setPosASL _lastPos; _fragObj setVectorDir _vec; _fragObj setVelocity _vel; - if(GVAR(traceFrags)) then { - GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; + if (GVAR(traceFrags)) then { + INC(GVAR(totalFrags)); [ACE_player, _fragObj, [1,0.5,0,1]] call FUNC(addTrack); }; - _fragCount = _fragCount + 1; + INC(_fragCount); }; }; }; // #ifdef DEBUG_MODE_FULL - // ACE_player sideChat format["total frags: %1", GVAR(TOTALFRAGS)]; + // ACE_player sideChat format["total frags: %1", GVAR(totalFrags)]; // ACE_player sideChat format["tracks: %1", (count GVAR(trackedObjects))]; // #endif // _endTime = diag_tickTime; diff --git a/addons/frag/functions/fnc_masterPFH.sqf b/addons/frag/functions/fnc_masterPFH.sqf index 722590a391..d543c35bf7 100644 --- a/addons/frag/functions/fnc_masterPFH.sqf +++ b/addons/frag/functions/fnc_masterPFH.sqf @@ -15,36 +15,35 @@ if (!GVAR(enabled)) exitWith {}; -private ["_gcIndex", "_iter"]; -_gcIndex = []; +private _gcIndex = []; -_iter = 0; -while { (count GVAR(objects)) > 0 && { _iter < (GVAR(MaxTrackPerFrame) min (count GVAR(objects))) } } do { - private ["_object", "_args"]; - if(GVAR(lastIterationIndex) >= (count GVAR(objects))) then { +private _iter = 0; +private _objectCount = count GVAR(objects); +while {_objectCount > 0 && {_iter < (GVAR(MaxTrackPerFrame) min _objectCount)}} do { + + if (GVAR(lastIterationIndex) >= _objectCount) then { GVAR(lastIterationIndex) = 0; }; - _object = GVAR(objects) select GVAR(lastIterationIndex); + private _object = GVAR(objects) select GVAR(lastIterationIndex); - if(!isNil "_object") then { - _args = GVAR(arguments) select GVAR(lastIterationIndex); + if (!isNil "_object") then { + private _args = GVAR(arguments) select GVAR(lastIterationIndex); - if(!(_args call FUNC(pfhRound))) then { - _gcIndex pushBack GVAR(lastIterationIndex); // Add it to the GC if it returns false + if (!(_args call FUNC(pfhRound))) then { + _gcIndex pushBack GVAR(lastIterationIndex); // Add it to the GC if it returns false }; }; - _iter = _iter + 1; - GVAR(lastIterationIndex) = GVAR(lastIterationIndex) + 1; + INC(_iter); + INC(GVAR(lastIterationIndex)); }; -// clean up dead object references -private ["_deletionCount", "_deleteIndex"]; -_deletionCount = 0; +// Clean up dead object references +private _deletionCount = 0; { TRACE_1("GC Projectile", _x); - _deleteIndex = _x - _deletionCount; + private _deleteIndex = _x - _deletionCount; GVAR(objects) deleteAt _deleteIndex; GVAR(arguments) deleteAt _deleteIndex; - _deletionCount = _deletionCount + 1; + INC(_deletionCount); } forEach _gcIndex; diff --git a/addons/frag/functions/fnc_pfhRound.sqf b/addons/frag/functions/fnc_pfhRound.sqf index cbbd75b633..1338e8fef9 100644 --- a/addons/frag/functions/fnc_pfhRound.sqf +++ b/addons/frag/functions/fnc_pfhRound.sqf @@ -1,26 +1,26 @@ #include "script_component.hpp" -params ["_round", "_lastPos", "_lastVel", "_type", "_firedFrame", "", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; +params ["_round", "_lastPos", "_lastVel", "_type", "_firedFrame", "_gun", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; -if(_round in GVAR(blackList)) exitWith { +if (_round in GVAR(blackList)) exitWith { false }; if (!alive _round) exitWith { - if((diag_frameno - _firedFrame) > 1) then { //skip if deleted within a single frame - if(_skip == 0) then { - if((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1} ) then { + if ((diag_frameno - _firedFrame) > 1) then { //skip if deleted within a single frame + if (_skip == 0) then { + if ((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1}) then { // shotbullet, shotShell don't seem to explode when touching water, so don't create frags if (((_lastPos select 2) < 0) && {(toLower getText (configFile >> "CfgAmmo" >> _type >> "simulation")) in ["shotbullet", "shotshell"]}) exitWith {}; [QGVAR(frag_eh), _this] call CBA_fnc_serverEvent; }; }; }; - if(_doSpall) then { - GVAR(spallIsTrackingCount) = GVAR(spallIsTrackingCount) - 1; - // diag_log text format["F: %1", _foundObjectHPIds]; + if (_doSpall) then { + DEC(GVAR(spallIsTrackingCount)); + // diag_log text format ["F: %1", _foundObjectHPIds]; { - if(!isNil "_x") then { + if (!isNil "_x") then { _x removeEventHandler ["hitPart", _foundObjectHPIds select _forEachIndex]; }; } forEach _spallTrack; @@ -28,12 +28,12 @@ if (!alive _round) exitWith { false }; -_this set[1, (getPosASL _round)]; -_this set[2, (velocity _round)]; +_this set [1, getPosASL _round]; +_this set [2, velocity _round]; -if(_doSpall) then { +if (_doSpall) then { private ["_scale"]; - _scale = ( (count GVAR(objects)) / GVAR(MaxTrackPerFrame) ) max 0.1; + _scale = ((count GVAR(objects)) / GVAR(MaxTrackPerFrame)) max 0.1; [_round, _scale, _spallTrack, _foundObjectHPIds] call FUNC(spallTrack); }; diff --git a/addons/frag/functions/fnc_removePfhRound.sqf b/addons/frag/functions/fnc_removePfhRound.sqf index d186da1e17..b9df275643 100644 --- a/addons/frag/functions/fnc_removePfhRound.sqf +++ b/addons/frag/functions/fnc_removePfhRound.sqf @@ -4,8 +4,8 @@ PARAMS_1(_round); -if(_round in GVAR(blackList)) then { - GVAR(blackList) = GVAR(blackList) - [_round]; +if (_round in GVAR(blackList)) then { + REM(GVAR(blackList),_round); }; -GVAR(objects) = GVAR(objects) - [_round]; +REM(GVAR(objects),_round); diff --git a/addons/frag/functions/fnc_removeTrack.sqf b/addons/frag/functions/fnc_removeTrack.sqf index 914a90602c..8c0f7e3736 100644 --- a/addons/frag/functions/fnc_removeTrack.sqf +++ b/addons/frag/functions/fnc_removeTrack.sqf @@ -1,12 +1,11 @@ #include "script_component.hpp" -private ["_ret"]; -_ret = true; -if(IS_ARRAY((_this select 0))) then { +private _ret = true; +if (IS_ARRAY(_this select 0)) then { _ret = false; } else { - if((_this select 0) in GVAR(trackedObjects)) then { - GVAR(trackedObjects) = GVAR(trackedObjects) - [(_this select 0)]; + if ((_this select 0) in GVAR(trackedObjects)) then { + REM(GVAR(trackedObjects),_this select 0); } else { _ret = false; }; diff --git a/addons/frag/functions/fnc_spallHP.sqf b/addons/frag/functions/fnc_spallHP.sqf index 5bdde6eee9..085e037e70 100644 --- a/addons/frag/functions/fnc_spallHP.sqf +++ b/addons/frag/functions/fnc_spallHP.sqf @@ -1,29 +1,27 @@ #include "script_component.hpp" -private ["_initialData", "_hpData", "_round", "_hpRound", "_hpDirect"]; -//player sideChat format["f: %1 c: %2", (_this select 0), (count GVAR(spallHPData))]; +//player sideChat format ["f: %1 c: %2", (_this select 0), (count GVAR(spallHPData))]; -if ((_this select 0) <= (count GVAR(spallHPData))) then { - _initialData = GVAR(spallHPData) select (_this select 0); - if (!isNil "_initialData") then { - _hpRound = ((_this select 1) select 0) select 2; - _round = _initialData select 3; - _hpDirect = ((_this select 1) select 0) select 10; - if (_hpDirect && {_round == _hpRound}) then { - { - _hpData = _x; - _round = _initialData select 3; - // diag_log text format["HPDUMP-------------------------------------"]; - // { - // _hp = _x; - // diag_log text format["%1 --", _forEachIndex]; - // { - // diag_log text format["%1: %2", _forEachIndex, _x]; - // } forEach _hp; - // } forEach (_this select 1); - [DFUNC(doSpall), [_this, _forEachIndex]] call CBA_fnc_execNextFrame; - // player sideChat "WEEE"; - } forEach (_this select 1); - }; - }; +params ["_index", "_hitPartData"]; + +private _initialData = GVAR(spallHPData) param [_index, []]; +if (_initialData isEqualTo []) exitWith {}; + +private _hpRound = (_hitPartData select 0) select 2; +private _round = _initialData select 3; +private _hpDirect = (_hitPartData select 0) select 10; + +if (_hpDirect && {_round == _hpRound}) then { + { + // diag_log text format ["HPDUMP-------------------------------------"]; + // { + // _hp = _x; + // diag_log text format ["%1 --", _forEachIndex]; + // { + // diag_log text format ["%1: %2", _forEachIndex, _x]; + // } forEach _hp; + // } forEach (_this select 1); + [DFUNC(doSpall), [_this, _forEachIndex]] call CBA_fnc_execNextFrame; + // player sideChat "WEEE"; + } forEach _hitPartData; }; diff --git a/addons/frag/functions/fnc_spallTrack.sqf b/addons/frag/functions/fnc_spallTrack.sqf index 91c7dee511..aedcf56cf8 100644 --- a/addons/frag/functions/fnc_spallTrack.sqf +++ b/addons/frag/functions/fnc_spallTrack.sqf @@ -3,7 +3,7 @@ params ["_round", "_multiplier", "_foundObjects", "_foundObjectHPIds"]; -private _delta = (1/diag_fps) * _multiplier; +private _delta = (1 / diag_fps) * _multiplier; private _curPos = getPosASL _round; private _velocity = velocity _round; @@ -12,17 +12,15 @@ private _forwardPos = _curPos vectorAdd _velocityStep; private _intersectsWith = lineIntersectsWith [_curPos, _forwardPos]; -if (count _intersectsWith > 0) then { - // player sideChat format["inter: %1", _intersectsWith]; - { - if(!(_x in _foundObjects)) then { - // diag_log text format["Adding HP: %1", _x]; - private _index = count GVAR(spallHPData); - private _hpId = _x addEventHandler ["hitPart", compile format["[%1, _this] call " + QFUNC(spallHP), _index]]; - _foundObjects set[(count _foundObjects), _x]; - _foundObjectHPIds set[(count _foundObjectHPIds), _hpId]; - private _data = [_hpId, _x, typeOf _round, _round, _curPos, _velocity, 0, _foundObjects, _foundObjectHPIds]; - GVAR(spallHPData) set[_index, _data]; - }; - } forEach _intersectsWith; -}; +if (_intersectsWith isEqualTo []) exitWith {}; + +// player sideChat format ["inter: %1", _intersectsWith]; +{ + // diag_log text format ["Adding HP: %1", _x]; + private _index = count GVAR(spallHPData); + private _hpId = _x addEventHandler ["hitPart", compile format ["[%1, _this] call " + QFUNC(spallHP), _index]]; + _foundObjects pushBack _x; + _foundObjectHPIds pushBack _hpId; + private _data = [_hpId, _x, typeOf _round, _round, _curPos, _velocity, 0, _foundObjects, _foundObjectHPIds]; + GVAR(spallHPData) pushBack _data; +} forEach (_intersectsWith select {!(_x in _foundObjects)}); diff --git a/addons/frag/functions/fnc_startTracing.sqf b/addons/frag/functions/fnc_startTracing.sqf index ca9aa8c84e..d860d6635e 100644 --- a/addons/frag/functions/fnc_startTracing.sqf +++ b/addons/frag/functions/fnc_startTracing.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -if(!GVAR(tracesStarted)) then { - GVAR(tracesStarted) = true; - GVAR(traceID) = [FUNC(drawTraces), 0, []] call CBA_fnc_addPerFrameHandler; -}; + +if (GVAR(tracesStarted)) exitWith {}; +GVAR(tracesStarted) = true; +GVAR(traceID) = [FUNC(drawTraces)] call CBA_fnc_addPerFrameHandler; diff --git a/addons/frag/functions/fnc_stopTracing.sqf b/addons/frag/functions/fnc_stopTracing.sqf index b58352c897..e06a9a2b46 100644 --- a/addons/frag/functions/fnc_stopTracing.sqf +++ b/addons/frag/functions/fnc_stopTracing.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -if(GVAR(tracesStarted)) then { - GVAR(tracesStarted) = false; - [GVAR(traceID)] call CBA_fnc_removePerFrameHandler; -}; + +if (!GVAR(tracesStarted)) exitWith {}; +GVAR(tracesStarted) = false; +[GVAR(traceID)] call CBA_fnc_removePerFrameHandler; diff --git a/addons/frag/functions/fnc_trackTrace.sqf b/addons/frag/functions/fnc_trackTrace.sqf index d57eaa8c5c..07867ba1ff 100644 --- a/addons/frag/functions/fnc_trackTrace.sqf +++ b/addons/frag/functions/fnc_trackTrace.sqf @@ -1,12 +1,12 @@ #include "script_component.hpp" -params ["_args"]; +params ["_args", "_pfhID"]; _args params ["_tracerObj", "_index"]; -if (alive _tracerObj && (count GVAR(traces)) > 0) then { +if (alive _tracerObj && {!(GVAR(traces) isEqualTo [])}) then { private _data = GVAR(traces) select _index; private _positions = _data select 4; - _positions pushBack [(getPos _tracerObj), vectorMagnitude (velocity _tracerObj)]; + _positions pushBack [getPos _tracerObj, vectorMagnitude (velocity _tracerObj)]; } else { - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_pfhID] call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/frag/functions/script_component.hpp b/addons/frag/functions/script_component.hpp index 8312313751..0903b3ba1e 100644 --- a/addons/frag/functions/script_component.hpp +++ b/addons/frag/functions/script_component.hpp @@ -1 +1 @@ -#include "\z\ace\addons\frag\script_component.hpp" \ No newline at end of file +#include "\z\ace\addons\frag\script_component.hpp" diff --git a/addons/frag/script_component.hpp b/addons/frag/script_component.hpp index ed94fac8f0..59868e36cf 100644 --- a/addons/frag/script_component.hpp +++ b/addons/frag/script_component.hpp @@ -17,4 +17,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ACE_TRACE_DRAW_INC 1 +#define ACE_TRACE_DRAW_INC 1 diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 3a4fff2711..1202c18ed7 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -167,4 +167,4 @@ (SP のみ) ミッションとエディタの再起動が必要です。有効化すると、シングルプレイでのみ破片と剥離の弾頭が見えるようになります。 - \ No newline at end of file + From 49b5a0ea867dacbfe2a6f8a1261d0b6674bc5fe0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Thu, 27 Oct 2016 01:16:31 +0300 Subject: [PATCH 058/826] Cleanup Frag Component (#4581) * Cleanup frag component * Optimize fnc_addTrack * Add additional cleanup * Please work? * Add more cleanup * Fix script errors * Fix/optimize spalling * Add missing changes --- addons/frag/$PBOPREFIX$ | 2 +- addons/frag/ACE_Settings.hpp | 1 - addons/frag/CfgAmmo.hpp | 14 +- addons/frag/CfgAmmoReflections.hpp | 2 - addons/frag/CfgEventhandlers.hpp | 1 - addons/frag/XEH_PREP.hpp | 1 - addons/frag/XEH_postInit.sqf | 12 +- addons/frag/XEH_preInit.sqf | 3 +- addons/frag/config.cpp | 1 + addons/frag/functions/fnc_addBlackList.sqf | 4 +- addons/frag/functions/fnc_addPfhRound.sqf | 64 ++--- addons/frag/functions/fnc_addTrack.sqf | 12 +- addons/frag/functions/fnc_dev_debugAmmo.sqf | 38 +-- addons/frag/functions/fnc_doExplosions.sqf | 16 +- addons/frag/functions/fnc_doReflections.sqf | 10 +- addons/frag/functions/fnc_doSpall.sqf | 247 ++++++++---------- addons/frag/functions/fnc_drawTraces.sqf | 26 +- addons/frag/functions/fnc_findReflections.sqf | 108 ++++---- addons/frag/functions/fnc_fired.sqf | 2 +- addons/frag/functions/fnc_frago.sqf | 199 +++++++------- addons/frag/functions/fnc_masterPFH.sqf | 35 ++- addons/frag/functions/fnc_pfhRound.sqf | 26 +- addons/frag/functions/fnc_removePfhRound.sqf | 6 +- addons/frag/functions/fnc_removeTrack.sqf | 9 +- addons/frag/functions/fnc_spallHP.sqf | 48 ++-- addons/frag/functions/fnc_spallTrack.sqf | 28 +- addons/frag/functions/fnc_startTracing.sqf | 8 +- addons/frag/functions/fnc_stopTracing.sqf | 8 +- addons/frag/functions/fnc_trackTrace.sqf | 8 +- addons/frag/functions/script_component.hpp | 2 +- addons/frag/script_component.hpp | 2 +- addons/frag/stringtable.xml | 2 +- 32 files changed, 441 insertions(+), 504 deletions(-) diff --git a/addons/frag/$PBOPREFIX$ b/addons/frag/$PBOPREFIX$ index ddf45c738b..bc4c9e8dc9 100644 --- a/addons/frag/$PBOPREFIX$ +++ b/addons/frag/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\addons\frag \ No newline at end of file +z\ace\addons\frag diff --git a/addons/frag/ACE_Settings.hpp b/addons/frag/ACE_Settings.hpp index 4dfa172bb3..eb0beea661 100644 --- a/addons/frag/ACE_Settings.hpp +++ b/addons/frag/ACE_Settings.hpp @@ -34,7 +34,6 @@ class ACE_Settings { typeName = "SCALAR"; value = 50; }; - class GVAR(enableDebugTrace) { category = CSTRING(Module_DisplayName); displayName = CSTRING(EnableDebugTrace); diff --git a/addons/frag/CfgAmmo.hpp b/addons/frag/CfgAmmo.hpp index 3da01ac29b..501ce8880b 100644 --- a/addons/frag/CfgAmmo.hpp +++ b/addons/frag/CfgAmmo.hpp @@ -1,6 +1,6 @@ -#define BASE_DRAG -0.01 -#define HD_MULT 5 -#define BASE_DRAG_HD (BASE_DRAG*HD_MULT) +#define BASE_DRAG -0.01 +#define HD_MULT 5 +#define BASE_DRAG_HD (BASE_DRAG * HD_MULT) class CfgAmmo { //class ace_arty_105mm_m1_m782_time; @@ -104,10 +104,8 @@ class CfgAmmo { GVAR(gurney_k) = 1/2; }; - class ACE_G_40mm_HEDP: G_40mm_HEDP { - }; - class ACE_G_40mm_HE: G_40mm_HE { - }; + class ACE_G_40mm_HEDP: G_40mm_HEDP {}; + class ACE_G_40mm_HE: G_40mm_HE {}; class ACE_G_40mm_Practice: ACE_G_40mm_HE { GVAR(skip) = 1; GVAR(force) = 0; @@ -438,8 +436,6 @@ class CfgAmmo { indirectHitRange = 0.25; airFriction = BASE_DRAG_HD*0.65; caliber = 2; - - }; class GVAR(huge): GVAR(large) { diff --git a/addons/frag/CfgAmmoReflections.hpp b/addons/frag/CfgAmmoReflections.hpp index fdaac6dd90..513b58d544 100644 --- a/addons/frag/CfgAmmoReflections.hpp +++ b/addons/frag/CfgAmmoReflections.hpp @@ -1,5 +1,3 @@ -//CfgAmmoReflections.hpp - #define ACE_EXPLOSION_REFLECTION(range, hit)\ class ace_explosion_reflection_##range##_##hit : ace_explosion_reflection_base {\ indirectHitRange = range;\ diff --git a/addons/frag/CfgEventhandlers.hpp b/addons/frag/CfgEventhandlers.hpp index becf395052..0d3301d6e0 100644 --- a/addons/frag/CfgEventhandlers.hpp +++ b/addons/frag/CfgEventhandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreStart_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preStart)); diff --git a/addons/frag/XEH_PREP.hpp b/addons/frag/XEH_PREP.hpp index 2fed1630f2..a9a9d43c5b 100644 --- a/addons/frag/XEH_PREP.hpp +++ b/addons/frag/XEH_PREP.hpp @@ -22,7 +22,6 @@ PREP(addPfhRound); PREP(removePfhRound); // THIS SHOULD ABE USED SPARINGLY // Explosive Reflection -GVAR(replacedBisArtyWrapper) = true; PREP(findReflections); PREP(doExplosions); PREP(doReflections); diff --git a/addons/frag/XEH_postInit.sqf b/addons/frag/XEH_postInit.sqf index feb4be05b6..17c0c14035 100644 --- a/addons/frag/XEH_postInit.sqf +++ b/addons/frag/XEH_postInit.sqf @@ -1,16 +1,15 @@ #include "script_component.hpp" -if(GVAR(EnableDebugTrace) && !isMultiplayer) then { +if (GVAR(EnableDebugTrace) && {!isMultiplayer}) then { GVAR(traceFrags) = true; GVAR(autoTrace) = true; }; -if(isServer) then { - [QGVAR(frag_eh), { _this call FUNC(frago); }] call CBA_fnc_addEventHandler; +if (isServer) then { + [QGVAR(frag_eh), {_this call FUNC(frago);}] call CBA_fnc_addEventHandler; }; ["ace_settingsInitialized", { - //If not enabled, exit if (!GVAR(enabled)) exitWith {}; // Register fire event handler @@ -20,9 +19,8 @@ if(isServer) then { ["ace_firedNonPlayerVehicle", DFUNC(fired)] call CBA_fnc_addEventHandler; [FUNC(masterPFH), 0, []] call CBA_fnc_addPerFrameHandler; - }] call CBA_fnc_addEventHandler; -//Cache for ammo type configs -GVAR(cacheRoundsTypesToTrack) = createLocation ["ACE_HashLocation", [-10000,-10000,-10000], 0, 0]; +// Cache for ammo type configs +GVAR(cacheRoundsTypesToTrack) = createLocation ["ACE_HashLocation", [-10000, -10000, -10000], 0, 0]; GVAR(cacheRoundsTypesToTrack) setText QGVAR(cacheRoundsTypesToTrack); diff --git a/addons/frag/XEH_preInit.sqf b/addons/frag/XEH_preInit.sqf index 9c03491a4e..b07f1df773 100644 --- a/addons/frag/XEH_preInit.sqf +++ b/addons/frag/XEH_preInit.sqf @@ -4,10 +4,11 @@ ADDON = false; #include "XEH_PREP.hpp" +GVAR(replacedBisArtyWrapper) = true; GVAR(blackList) = []; GVAR(traceFrags) = false; -GVAR(TOTALFRAGS) = 0; +GVAR(totalFrags) = 0; GVAR(spallHPData) = []; GVAR(spallIsTrackingCount) = 0; diff --git a/addons/frag/config.cpp b/addons/frag/config.cpp index 7ac109d29f..f3b409dbd0 100644 --- a/addons/frag/config.cpp +++ b/addons/frag/config.cpp @@ -1,4 +1,5 @@ #include "script_component.hpp" + class CfgPatches { class ADDON { name = COMPONENT_NAME; diff --git a/addons/frag/functions/fnc_addBlackList.sqf b/addons/frag/functions/fnc_addBlackList.sqf index 1a7d7cb253..9950cab2b0 100644 --- a/addons/frag/functions/fnc_addBlackList.sqf +++ b/addons/frag/functions/fnc_addBlackList.sqf @@ -1,3 +1,5 @@ #include "script_component.hpp" + params ["_round"]; -GVAR(blackList) set [(count GVAR(blackList)), _round]; + +GVAR(blackList) pushBack _round; diff --git a/addons/frag/functions/fnc_addPfhRound.sqf b/addons/frag/functions/fnc_addPfhRound.sqf index f0047bb24d..a211752e98 100644 --- a/addons/frag/functions/fnc_addPfhRound.sqf +++ b/addons/frag/functions/fnc_addPfhRound.sqf @@ -1,73 +1,67 @@ //#define DEBUG_MODE_FULL #include "script_component.hpp" -private ["_enabled", "_doSpall", "_spallTrack", "_spallTrackID"]; -PARAMS_3(_gun,_type,_round); -DEFAULT_PARAM(3,_doFragTrack,false); +params ["_gun", "_type", "_round", ["_doFragTrack", false]]; if (!GVAR(enabled)) exitWith {}; //_enabled = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(enabled)); -//if(_enabled < 1) exitWith {}; +//if (_enabled < 1) exitWith {}; -if(_round in GVAR(blackList)) exitWith { - GVAR(blackList) = GVAR(blackList) - [_round]; +if (_round in GVAR(blackList)) exitWith { + REM(GVAR(blackList),_round); }; // Exit on max track -if( (count GVAR(objects)) > GVAR(MaxTrack)) exitWith { }; +if ((count GVAR(objects)) > GVAR(MaxTrack)) exitWith {}; -if(_gun == ACE_player) then { +if ( + _gun == ACE_player || + {(gunner _gun) == ACE_player} || + {local _gun && {!(isPlayer (gunner _gun))} && {!(isPlayer _gun)}} +) then { _doFragTrack = true; -} else { - if((gunner _gun) == ACE_player) then { - _doFragTrack = true; - } else { - if(local _gun && {!(isPlayer (gunner _gun))} && {!(isPlayer _gun)}) then { - _doFragTrack = true; - }; - }; }; -_doSpall = false; -if(GVAR(SpallEnabled)) then { - if(GVAR(spallIsTrackingCount) <= 0) then { +private _doSpall = false; +if (GVAR(SpallEnabled)) then { + if (GVAR(spallIsTrackingCount) <= 0) then { GVAR(spallHPData) = []; }; - if(GVAR(spallIsTrackingCount) > 5) then { + if (GVAR(spallIsTrackingCount) > 5) then { // ACE_player sideChat "LIMT!"; } else { _doSpall = true; - GVAR(spallIsTrackingCount) = GVAR(spallIsTrackingCount) + 1; + INC(GVAR(spallIsTrackingCount)); }; }; -// ACE_player sideChat format["c: %1", GVAR(spallIsTrackingCount)]; +// ACE_player sideChat format ["c: %1", GVAR(spallIsTrackingCount)]; -if(GVAR(autoTrace)) then { - [ACE_player, _round, [1,0,0,1]] call FUNC(addTrack); +if (GVAR(autoTrace)) then { + [ACE_player, _round, [1, 0, 0, 1]] call FUNC(addTrack); }; // We only do the single track object check here. // We should do an {!(_round in GVAR(objects))} // But we leave that out here for optimization. So this cannot be a framework function // Otherwise, it should only be added once and from the FiredEH -if(_doFragTrack && {alive _round}) then { - _spallTrack = []; - _spallTrackID = []; +if (_doFragTrack && {alive _round}) then { + private _spallTrack = []; + private _spallTrackID = []; - private ["_args"]; - _args = [_round, (getPosASL _round), (velocity _round), _type, diag_frameno, _gun, _doSpall, _spallTrack, _spallTrackID, - (getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip))), - (getNumber (configFile >> "CfgAmmo" >> _type >> "explosive")), - (getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange")), - (getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force))), - (getNumber(configFile >> "CfgAmmo" >> _type >> "indirecthit")*(sqrt((getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"))))) + private _args = [ + _round, getPosASL _round, velocity _round, _type, diag_frameno, _gun, _doSpall, _spallTrack, _spallTrackID, + getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip)), + getNumber (configFile >> "CfgAmmo" >> _type >> "explosive"), + getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"), + getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force)), + getNumber (configFile >> "CfgAmmo" >> _type >> "indirecthit") * (sqrt (getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"))) ]; TRACE_1("Initializing track", _round); GVAR(objects) pushBack _round; GVAR(arguments) pushBack _args; - if(_doSpall) then { + if (_doSpall) then { [_round, 1, _spallTrack, _spallTrackID] call FUNC(spallTrack); }; // ACE_player sideChat "WTF2"; diff --git a/addons/frag/functions/fnc_addTrack.sqf b/addons/frag/functions/fnc_addTrack.sqf index 4270e15996..a93106d518 100644 --- a/addons/frag/functions/fnc_addTrack.sqf +++ b/addons/frag/functions/fnc_addTrack.sqf @@ -5,16 +5,12 @@ if (GVAR(autoTrace)) then { }; // setAccTime 0.05; -private _index = count GVAR(traces); -params ["_origin", "_obj"]; -private _color = [1,0,0,1]; -if((count _this) > 2) then { - _color = _this select 2; -}; +params ["_origin", "_obj", ["_color", [1, 0, 0, 1]]]; + private _positions = []; private _objSpd = vectorMagnitude (velocity _obj); -_positions set[(count _positions), [(getPos _obj), _objSpd]]; +_positions pushBack [getPos _obj, _objSpd]; private _data = [_origin, typeOf _origin, typeOf _obj, _objSpd, _positions, _color]; -GVAR(traces) set[_index, _data]; +private _index = GVAR(traces) pushBack _data; [DFUNC(trackTrace), 0, [_obj, _index, CBA_missionTime]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/frag/functions/fnc_dev_debugAmmo.sqf b/addons/frag/functions/fnc_dev_debugAmmo.sqf index 297113f5af..14b190c8c3 100644 --- a/addons/frag/functions/fnc_dev_debugAmmo.sqf +++ b/addons/frag/functions/fnc_dev_debugAmmo.sqf @@ -1,7 +1,11 @@ #define DEBUG_MODE_FULL #include "script_component.hpp" -params [["_debugMissing", true, [false]], ["_debugForce", false, [false]], ["_debugNonFrag", false, [false]]]; +params [ + ["_debugMissing", true, [false]], + ["_debugForce", false, [false]], + ["_debugNonFrag", false, [false]] +]; diag_log text format ["~~~~~~~~~~~~~Start [%1]~~~~~~~~~~~~~", _this]; @@ -10,7 +14,7 @@ private _processedCfgAmmos = []; { private _ammo = toLower getText (_x >> "ammo"); - if ((_ammo != "") && {!(_ammo in _processedCfgAmmos)}) then { + if (_ammo != "" && {!(_ammo in _processedCfgAmmos)}) then { _processedCfgAmmos pushBack _ammo; //Ignore mines/bombs @@ -23,37 +27,37 @@ private _processedCfgAmmos = []; private _explosive = getNumber (_ammoConfig >> "explosive"); private _indirectRange = getNumber (_ammoConfig >> "indirectHitRange"); private _force = getNumber (_ammoConfig >> QGVAR(force)); - private _fragPower = getNumber(_ammoConfig >> "indirecthit")*(sqrt((getNumber (_ammoConfig >> "indirectHitRange")))); + private _fragPower = getNumber (_ammoConfig >> "indirecthit") * (sqrt ((getNumber (_ammoConfig >> "indirectHitRange")))); private _shouldAdd = (_skip == 0) && {(_force == 1) || {_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}}}; if (_shouldAdd) then { if (_debugForce && {((getNumber(_ammoConfig >> "hit")) < 5) || {_fragPower < 10}}) then { - diag_log text format ["Ammo [%1] from Mag [%2] - Weak but will still frag!",_ammo,configName _x]; - diag_log text format [" - _force=%1,_fragPower=%2",_force,_fragPower]; + diag_log text format ["Ammo [%1] from Mag [%2] - Weak but will still frag!", _ammo, configName _x]; + diag_log text format [" - _force=%1,_fragPower=%2", _force, _fragPower]; }; - - _warn = false; + + private _warn = false; _fragTypes = getArray (_ammoConfig >> QGVAR(CLASSES)); - if(_fragTypes isEqualTo []) then {_warn = true;}; + if (_fragTypes isEqualTo []) then {_warn = true;}; _c = getNumber(_ammoConfig >> QGVAR(CHARGE)); - if(_c == 0) then {_warn = true;}; + if (_c == 0) then {_warn = true;}; _m = getNumber(_ammoConfig >> QGVAR(METAL)); - if(_m == 0) then {_warn = true;}; + if (_m == 0) then {_warn = true;}; _k = getNumber(_ammoConfig >> QGVAR(GURNEY_K)); - if(_k == 0) then {_warn = true;}; + if (_k == 0) then {_warn = true;}; _gC = getNumber(_ammoConfig >> QGVAR(GURNEY_C)); - if(_gC == 0) then { _warn = true;}; + if (_gC == 0) then {_warn = true;}; - if(_debugMissing && _warn) then { - diag_log text format ["Ammo [%1] from Mag [%2] MISSING frag configs:",_ammo,configName _x]; - diag_log text format [" - _c=%1,_m=%2,_k=%3,_gC=%4,_fragTypes=%5",_c,_m,_k,_gC,_fragTypes]; + if (_debugMissing && {_warn}) then { + diag_log text format ["Ammo [%1] from Mag [%2] MISSING frag configs:", _ammo, configName _x]; + diag_log text format [" - _c=%1,_m=%2,_k=%3,_gC=%4,_fragTypes=%5", _c, _m, _k, _gC, _fragTypes]; }; } else { if (_debugNonFrag && {isArray (_ammoConfig >> QGVAR(CLASSES))}) then { - diag_log text format ["Ammo [%1] from Mag [%2] has frag configs but will NOT frag:",_ammo,configName _x]; - diag_log text format ["- skip=%1,explosive=%2,indirectHitRange=%3,force=%4,fragPower=%5",_skip,_explosive,_indirectRange,_force,_fragPower]; + diag_log text format ["Ammo [%1] from Mag [%2] has frag configs but will NOT frag:", _ammo, configName _x]; + diag_log text format ["- skip=%1,explosive=%2,indirectHitRange=%3,force=%4,fragPower=%5", _skip, _explosive, _indirectRange, _force, _fragPower]; }; }; }; diff --git a/addons/frag/functions/fnc_doExplosions.sqf b/addons/frag/functions/fnc_doExplosions.sqf index 03ad4d1dec..85074bdb13 100644 --- a/addons/frag/functions/fnc_doExplosions.sqf +++ b/addons/frag/functions/fnc_doExplosions.sqf @@ -1,20 +1,22 @@ //fnc_doExplosions.sqf #include "script_component.hpp" -params ["_args"]; +params ["_args", "_pfhID"]; _args params ["_explosions", "_index"]; -for "_i" from _index to ((_index+2) min (count _explosions)) do { +for "_i" from _index to ((_index + 2) min (count _explosions)) do { private _exp = _explosions select _i; _exp params ["_refExp", "_bpos", "_hit", "_distance", "_indirectHitRange", "_depth"]; _refExp createVehicle (ASLtoATL _bpos); - // if(_hit >= 150 && _distance > _indirectHitRange) then { + // if (_hit >= 150 && _distance > _indirectHitRange) then { // [_bpos, _refExp, _depth] call FUNC(doReflections); // }; }; -_index = _index + 2; -if(_index >= (count _explosions)) then { - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + +ADD(_index,2); + +if (_index >= count _explosions) then { + [_pfhID] call CBA_fnc_removePerFrameHandler; } else { - _params set[1, _index]; + _args set [1, _index]; }; diff --git a/addons/frag/functions/fnc_doReflections.sqf b/addons/frag/functions/fnc_doReflections.sqf index de5bac1b62..b4bec189f7 100644 --- a/addons/frag/functions/fnc_doReflections.sqf +++ b/addons/frag/functions/fnc_doReflections.sqf @@ -1,14 +1,10 @@ //fnc_doReflections.sqf #include "script_component.hpp" -params ["_pos", "_ammo"]; +params ["_pos", "_ammo", ["_depth", 1]]; -private _depth = 1; -if(count _this > 2) then { - _depth = _this select 2; -}; -// TEST_ICONS pushBack [_pos, format["EXP!", _hit, _range, _hitFactor]]; -if(_depth <= 2) then { +// TEST_ICONS pushBack [_pos, format ["EXP!", _hit, _range, _hitFactor]]; +if (_depth <= 2) then { private _indirectHitRange = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange"); private _indirectHit = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirectHit"); private _testParams = [_pos, [_indirectHitRange, _indirectHit], [], [], -4, _depth, 0]; diff --git a/addons/frag/functions/fnc_doSpall.sqf b/addons/frag/functions/fnc_doSpall.sqf index 2eb118004b..5b9bf757c4 100644 --- a/addons/frag/functions/fnc_doSpall.sqf +++ b/addons/frag/functions/fnc_doSpall.sqf @@ -2,145 +2,126 @@ #include "script_component.hpp" // ACE_player sideChat "WAAAAAAAAAAAAAAAAAAAAA"; -params ["_hitData"]; +params ["_hitData", "_hitPartDataIndex"]; private _initialData = GVAR(spallHPData) select (_hitData select 0); -private _hpData = (_hitData select 1) select (_this select 1); +_initialData params ["_hpId", "_object", "_roundType", "_round", "_curPos", "_velocity"]; -_hpData params ["_object"]; -_object removeEventHandler ["hitPart", _initialData select 0]; -private _foundObjects = _initialData select 7; -private _index = _foundObjects find _object; -if(_index != -1) then { - _foundObjects set[_index, nil]; -}; +private _hpData = (_hitData select 1) select _hitPartDataIndex; +(_hpData select 0) removeEventHandler ["hitPart", _hpId]; -_initialData params ["", "_object", "_roundType", "_round"]; +private _caliber = getNumber (configFile >> "CfgAmmo" >> _roundType >> "caliber"); +private _explosive = getNumber (configFile >> "CfgAmmo" >> _roundType >> "explosive"); +private _idh = getNumber (configFile >> "CfgAmmo" >> _roundType >> "indirectHitRange"); -private _caliber = getNumber(configFile >> "CfgAmmo" >> _roundType >> "caliber"); -private _explosive = getNumber(configFile >> "CfgAmmo" >> _roundType >> "explosive"); -private _idh = getNumber(configFile >> "CfgAmmo" >> _roundType >> "indirectHitRange"); +if !(_caliber >= 2.5 || {(_explosive > 0 && {_idh >= 1})}) exitWith {}; +// ACE_player sideChat format ["BBBB"]; +private _exit = false; +private _vm = 1; -private _alive = true; -if(!alive _round && (_initialData select 6) isEqualTo 1) then { - _alive = false; -}; +private _oldVelocity = vectorMagnitude _velocity; +private _curVelocity = vectorMagnitude (velocity _round); -if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { - // ACE_player sideChat format["BBBB"]; - private _exit = false; - private _vm = 1; - private _velocity = _initialData select 5; - - private _oldVelocity = vectorMagnitude _velocity; - private _curVelocity = vectorMagnitude (velocity _round); - - if(alive _round) then { - private _diff = _velocity vectorDiff (velocity _round); - private _polar = _diff call CBA_fnc_vect2polar; - // ACE_player sideChat format["polar: %1", _polar]; - if((abs(_polar select 1) > 45 || abs(_polar select 2) > 45)) then { - if(_caliber < 2.5) then { - // ACE_player sideChat format["exit!"]; - _exit = true; - } else { - _vm = 1-(_curVelocity/_oldVelocity); - }; - }; - }; - if(!_exit) then { - private _unitDir = vectorNormalized _velocity; - private _pos = _hpData select 3; - private _spallPos = nil; - for "_i" from 0 to 100 do { - private _pos1 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * _i)); - private _pos2 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * (_i + 1))); - // _blah = [_object, "FIRE"] intersect [_object worldToModel (ASLtoATL _pos1), _object worldToModel (ASLtoATL _pos2)]; - // diag_log text format["b: %1", _blah]; - - // _data = [nil, nil, nil, 1, [[ASLtoATL _pos1, 1], [ASLtoATL _pos2, 1]]]; - // NOU_TRACES set[(count NOU_TRACES), _data]; - - if(!lineIntersects [_pos1, _pos2]) exitWith { - // ACE_player sideChat format["FOUND!"]; - _spallPos = _pos2; - }; - }; - if(!isNil "_spallPos") then { - private _spallPolar = _velocity call CBA_fnc_vect2polar; - - if(_explosive > 0) then { - // ACE_player sideChat format["EXPLOSIVE!"]; - private _warn = false; - private _c = getNumber(configFile >> "CfgAmmo" >> _roundType >> QGVAR(CHARGE)); - if(_c == 0) then { _c = 1; _warn = true;}; - private _m = getNumber(configFile >> "CfgAmmo" >> _roundType >> QGVAR(METAL)); - if(_m == 0) then { _m = 2; _warn = true;}; - private _k = getNumber(configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_K)); - if(_k == 0) then { _k = 1/2; _warn = true;}; - private _gC = getNumber(configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_C)); - if(_gC == 0) then { _gC = 2440; _warn = true;}; - - if(_warn) then { - WARNING_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_roundType); //TODO: turn this off when we get closer to release - }; - - private _fragPower = (((_m/_c)+_k)^-(1/2))*_gC; - _spallPolar set[0, _fragPower*0.66]; - }; - - private _fragTypes = [ - QGVAR(spall_small), QGVAR(spall_small), QGVAR(spall_small), - QGVAR(spall_small),QGVAR(spall_medium),QGVAR(spall_medium),QGVAR(spall_medium), - QGVAR(spall_medium), QGVAR(spall_large), QGVAR(spall_large), QGVAR(spall_huge), - QGVAR(spall_huge) - - ]; - - // diag_log text format["SPALL POWER: %1", _spallPolar select 0]; - private _spread = 15+(random 25); - private _spallCount = 5+(random 10); - for "_i" from 1 to _spallCount do { - private _elev = ((_spallPolar select 2)-_spread)+(random (_spread*2)); - private _dir = ((_spallPolar select 1)-_spread)+(random (_spread*2)); - if(abs _elev > 90) then { - _dir = _dir + 180; - }; - _dir = _dir % 360; - private _vel = (_spallPolar select 0)*0.33*_vm; - _vel = (_vel-(_vel*0.25))+(random (_vel*0.5)); - - private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; - private _fragType = round (random ((count _fragTypes)-1)); - private _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; - _fragment setPosASL _spallPos; - _fragment setVelocity _spallFragVect; - - if(GVAR(traceFrags)) then { - [ACE_player, _fragment, [1,0.5,0,1]] call FUNC(addTrack); - }; - }; - _spread = 5+(random 5); - _spallCount = 3+(random 5); - for "_i" from 1 to _spallCount do { - private _elev = ((_spallPolar select 2)-_spread)+(random (_spread*2)); - private _dir = ((_spallPolar select 1)-_spread)+(random (_spread*2)); - if(abs _elev > 90) then { - _dir = _dir + 180; - }; - _dir = _dir % 360; - private _vel = (_spallPolar select 0)*0.55*_vm; - _vel = (_vel-(_vel*0.25))+(random (_vel*0.5)); - - private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; - private _fragType = round (random ((count _fragTypes)-1)); - private _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; - _fragment setPosASL _spallPos; - _fragment setVelocity _spallFragVect; - - if(GVAR(traceFrags)) then { - [ACE_player, _fragment, [1,0,0,1]] call FUNC(addTrack); - }; - }; +if (alive _round) then { + private _diff = _velocity vectorDiff (velocity _round); + private _polar = _diff call CBA_fnc_vect2polar; + // ACE_player sideChat format ["polar: %1", _polar]; + if (abs (_polar select 1) > 45 || {abs (_polar select 2) > 45}) then { + if (_caliber < 2.5) then { + // ACE_player sideChat format ["exit!"]; + _exit = true; + } else { + SUB(_vm,_curVelocity / _oldVelocity); }; }; }; +if (_exit) exitWith {}; +private _unitDir = vectorNormalized _velocity; +private _pos = _hpData select 3; +private _spallPos = []; +for "_i" from 0 to 100 do { + private _pos1 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * _i)); + private _pos2 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * (_i + 1))); + // _data = [nil, nil, nil, 1, [[ASLtoATL _pos1, 1], [ASLtoATL _pos2, 1]]]; + // NOU_TRACES pushBack _data; + + if (!lineIntersects [_pos1, _pos2]) exitWith { + // ACE_player sideChat format ["FOUND!"]; + _spallPos = _pos2; + }; +}; +if (_spallPos isEqualTo []) exitWith {}; +private _spallPolar = _velocity call CBA_fnc_vect2polar; + +if (_explosive > 0) then { + // ACE_player sideChat format ["EXPLOSIVE!"]; + private _warn = false; + private _c = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(CHARGE)); + if (_c == 0) then {_c = 1; _warn = true;}; + private _m = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(METAL)); + if (_m == 0) then {_m = 2; _warn = true;}; + private _k = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_K)); + if (_k == 0) then {_k = 1 / 2; _warn = true;}; + private _gC = getNumber (configFile >> "CfgAmmo" >> _roundType >> QGVAR(GURNEY_C)); + if (_gC == 0) then {_gC = 2440; _warn = true;}; + + if (_warn) then { + WARNING_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_roundType); //TODO: turn this off when we get closer to release + }; + + private _fragPower = (((_m / _c) + _k) ^ - (1 / 2)) * _gC; + _spallPolar set [0, _fragPower * 0.66]; +}; + +private _fragTypes = [ + QGVAR(spall_small), QGVAR(spall_small), QGVAR(spall_small), + QGVAR(spall_small),QGVAR(spall_medium),QGVAR(spall_medium),QGVAR(spall_medium), + QGVAR(spall_medium), QGVAR(spall_large), QGVAR(spall_large), QGVAR(spall_huge), + QGVAR(spall_huge) + +]; + +// diag_log text format ["SPALL POWER: %1", _spallPolar select 0]; +private _spread = 15 + (random 25); +private _spallCount = 5 + (random 10); +for "_i" from 1 to _spallCount do { + private _elev = ((_spallPolar select 2) - _spread) + (random (_spread * 2)); + private _dir = ((_spallPolar select 1) - _spread) + (random (_spread * 2)); + if (abs _elev > 90) then { + ADD(_dir,180); + }; + _dir = _dir % 360; + private _vel = (_spallPolar select 0) * 0.33 * _vm; + _vel = (_vel - (_vel * 0.25)) + (random (_vel * 0.5)); + + private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; + private _fragType = round (random ((count _fragTypes) - 1)); + private _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; + _fragment setPosASL _spallPos; + _fragment setVelocity _spallFragVect; + + if (GVAR(traceFrags)) then { + [ACE_player, _fragment, [1, 0.5, 0, 1]] call FUNC(addTrack); + }; +}; +_spread = 5 + (random 5); +_spallCount = 3 + (random 5); +for "_i" from 1 to _spallCount do { + private _elev = ((_spallPolar select 2) - _spread) + (random (_spread * 2)); + private _dir = ((_spallPolar select 1) - _spread) + (random (_spread * 2)); + if (abs _elev > 90) then { + ADD(_dir,180); + }; + _dir = _dir % 360; + private _vel = (_spallPolar select 0) * 0.55 * _vm; + _vel = (_vel - (_vel * 0.25)) + (random (_vel * 0.5)); + + private _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; + private _fragType = round (random ((count _fragTypes) - 1)); + private _fragment = (_fragTypes select _fragType) createVehicleLocal [0, 0, 10000]; + _fragment setPosASL _spallPos; + _fragment setVelocity _spallFragVect; + + if (GVAR(traceFrags)) then { + [ACE_player, _fragment, [1, 0, 0, 1]] call FUNC(addTrack); + }; +}; diff --git a/addons/frag/functions/fnc_drawTraces.sqf b/addons/frag/functions/fnc_drawTraces.sqf index 790d53491f..6dd710f61c 100644 --- a/addons/frag/functions/fnc_drawTraces.sqf +++ b/addons/frag/functions/fnc_drawTraces.sqf @@ -1,31 +1,23 @@ #include "script_component.hpp" -private ["_color", "_index", "_lastPos", "_lastSpd", "_max", "_positions", "_startSpeed"]; - { - _positions = _x select 4; - _color = _x select 5; - _index = 0; - _max = count _positions; - _startSpeed = 0.01 max ((_positions select 0) select 1); - _lastSpd = []; - _lastPos = []; + private _positions = _x select 4; + private _color = _x select 5; + private _index = 0; + private _max = count _positions; + private _lastSpd = []; + private _lastPos = []; while {_index < _max} do { _data1 = _positions select _index; - _data2 = nil; - if(_index + ACE_TRACE_DRAW_INC >= _max) then { - _data2 = _positions select (_max - 1); - } else { - _data2 = _positions select (_index + ACE_TRACE_DRAW_INC); - }; + _data2 = _positions select ([_index + ACE_TRACE_DRAW_INC, _max - 1] select (_index + ACE_TRACE_DRAW_INC >= _max)); _pos1 = _data1 select 0; _pos2 = _data2 select 0; - _index = _index + ACE_TRACE_DRAW_INC; + ADD(_index,ACE_TRACE_DRAW_INC); drawLine3D [_pos1, _pos2, _color]; _lastPos = _pos2; _lastSpd = _data1 select 1; }; - // drawIcon3D ["", [1,0,0,1], _lastPos, 0, 0, 0, format["%1m/s", _lastSpd], 1, 0.05, "RobotoCondensed"]; + // drawIcon3D ["", [1,0,0,1], _lastPos, 0, 0, 0, format ["%1m/s", _lastSpd], 1, 0.05, "RobotoCondensed"]; } forEach GVAR(traces); diff --git a/addons/frag/functions/fnc_findReflections.sqf b/addons/frag/functions/fnc_findReflections.sqf index 3020cd9c12..f8c9685bda 100644 --- a/addons/frag/functions/fnc_findReflections.sqf +++ b/addons/frag/functions/fnc_findReflections.sqf @@ -1,61 +1,58 @@ //fnc_findReflections.sqf #include "script_component.hpp" -private ["_lastPos", "_test", "_vec", "_testPos", "_buckets", "_excludes", "_bucketIndex", "_bucketPos", "_bucketList", "_c", "_index", "_blist", "_avgX", "_avgY", "_avgZ", "_bpos", "_distance", "_hitFactor", "_hit", "_range", "_refExp", "_i", "_x", "_res", "_forEachIndex", "_explosions", "_can", "_dirvec", "_zAng"]; - BEGIN_COUNTER(fnc_findReflections); -params ["_args"]; +params ["_args", "_pfhID"]; _args params ["_pos", "_explosiveInfo", "_los", "_nlos", "_zIndex", "_depth", "_rand"]; private _split = 15; -private _radi = (360/_split*_depth); +private _radi = 360 / _split * _depth; -// player sideChat format["p: %1", _explosiveInfo]; +// player sideChat format ["p: %1", _explosiveInfo]; _explosiveInfo params ["_indirectHitRange", "_indirectHit"]; -private _distanceCount = (floor _indirectHitRange*4) min 100; +private _distanceCount = (floor _indirectHitRange * 4) min 100; -if(_zIndex < 5) then { - _lastPos = _pos; - _zAng = _zIndex*20+2; - if(_zAng > 80) then { +if (_zIndex < 5) then { + private _lastPos = _pos; + private _zAng = _zIndex * 20 + 2; + if (_zAng > 80) then { _radi = 1; _zAng = 90; }; for "_i" from 0 to _radi do { - _test = true; - _vec = [1, ((_i*_split)+_rand) mod 360, _zAng] call CBA_fnc_polar2vect; + private _test = true; + private _vec = [1, ((_i * _split) + _rand) % 360, _zAng] call CBA_fnc_polar2vect; for "_x" from 1 to _distanceCount do { - _testPos = _pos vectorAdd (_vec vectorMultiply _x); + private _testPos = _pos vectorAdd (_vec vectorMultiply _x); // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _testPos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; - _res = lineIntersectsWith [_pos, _testPos]; - if(count _res > 0) exitWith { + private _res = lineIntersectsWith [_pos, _testPos]; + if (count _res > 0) exitWith { _test = false; _nlos pushBack _lastPos; // { - // _x addEventHandler ["HandleDamage", { diag_log text format["this: %1", _this]; }]; + // _x addEventHandler ["HandleDamage", { diag_log text format ["this: %1", _this]; }]; // } forEach _res; // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _testPos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; // TEST_PAIRS pushBack [_pos, _lastPos, [1,0,0,1]]; }; - // if(terrainIntersectASL [_pos, _testPos]) exitWith {}; + // if (terrainIntersectASL [_pos, _testPos]) exitWith {}; _lastPos = _testPos; }; }; - _args set[4, _zIndex+1]; + _args set [4, _zIndex + 1]; } else { - _depth = _depth + 1; - _buckets = []; - _excludes = []; - _bucketIndex = 0; - _bucketPos = nil; - _bucketList = nil; - _c = 0; - while { count(_nlos) != count(_excludes) && _c < (count _nlos) } do { + INC(_depth); + private _buckets = []; + private _excludes = []; + private _bucketPos = nil; + private _bucketList = nil; + private _c = 0; + while {count _nlos != count _excludes && {_c < (count _nlos)}} do { scopeName "mainSearch"; { - if(!(_forEachIndex in _excludes)) then { - _index = _buckets pushBack [_x, [_x]]; + if (!(_forEachIndex in _excludes)) then { + private _index = _buckets pushBack [_x, [_x]]; _excludes pushBack _forEachIndex; _bucketPos = _x; _bucketList = (_buckets select _index) select 1; @@ -63,59 +60,58 @@ if(_zIndex < 5) then { }; } forEach _nlos; { - if(!(_forEachIndex in _excludes)) then { + if (!(_forEachIndex in _excludes)) then { _testPos = _x; - if(_testPos vectorDistanceSqr _bucketPos <= 30) then { + if (_testPos vectorDistanceSqr _bucketPos <= 30) then { _bucketList pushBack _x; _excludes pushBack _forEachIndex; }; }; } forEach _nlos; - _c = _c + 1; + INC(_c); }; - // player sideChat format["c: %1", count _buckets]; - _explosions = []; + // player sideChat format ["c: %1", count _buckets]; + private _explosions = []; { - _blist = _x select 1; - _avgX = 0; - _avgY = 0; - _avgZ = 0; + private _blist = _x select 1; + private _avgX = 0; + private _avgY = 0; + private _avgZ = 0; { - _avgX = _avgX + (_x select 0); - _avgY = _avgY + (_x select 1); - _avgZ = _avgZ + (_x select 2); + ADD(_avgX,_x select 0); + ADD(_avgY,_x select 1); + ADD(_avgZ,_x select 2); } forEach _blist; _c = count _blist; - _bpos = [_avgX/_c, _avgY/_c, _avgZ/_c]; + private _bpos = [_avgX / _c, _avgY / _c, _avgZ / _c]; - _distance = _pos vectorDistance _bpos; - _hitFactor = 1-(((_distance/(_indirectHitRange*4)) min 1) max 0); - // _hitFactor = 1/(_distance^2); - _hit = _indirectHit*_hitFactor; - _hit = (floor (_hit/4)) min 500; - _hit = _hit - (_hit%10); - _range = (floor (_indirectHitRange-(_distance/4))) min 100; - _range = _range - (_range%2); + private _distance = _pos vectorDistance _bpos; + private _hitFactor = 1 - (((_distance / (_indirectHitRange * 4)) min 1) max 0); + // _hitFactor = 1 / (_distance ^ 2); + private _hit = _indirectHit * _hitFactor; + _hit = (floor (_hit / 4)) min 500; + SUB(_hit,_hit % 10); + private _range = (floor (_indirectHitRange - (_distance / 4))) min 100; + SUB(_range,_range % 2); - if(_hit >= 10 && _range > 0) then { - // TEST_ICONS pushBack [_bpos, format["h: %1, r: %2, hf: %3 d: %4 ihr: %5", _hit, _range, _hitFactor, _distance, _indirectHitRange*4]]; + if (_hit >= 10 && {_range > 0}) then { + // TEST_ICONS pushBack [_bpos, format ["h: %1, r: %2, hf: %3 d: %4 ihr: %5", _hit, _range, _hitFactor, _distance, _indirectHitRange*4]]; // TEST_PAIRS pushBack [_pos, _bpos, [1,0,0,1]]; - _refExp = format["ace_explosion_reflection_%1_%2", _range, _hit]; + private _refExp = format ["ace_explosion_reflection_%1_%2", _range, _hit]; // _refExp createVehicle (ASLtoATL _bpos); // drop ["\a3\data_f\Cl_basic","","Billboard",1,15,ASLtoATL _bpos,[0,0,0],1,1.275,1.0,0.0,[1],[[1,0,0,1]],[0],0.0,2.0,"","",""]; - _explosions pushBack [_refExp, _bpos, _hit, _distance, _indirectHitRange/4, _depth]; - + _explosions pushBack [_refExp, _bpos, _hit, _distance, _indirectHitRange / 4, _depth]; }; - if(count _explosions > (_radi*2)/_depth) exitWith {}; + if (count _explosions > (_radi * 2) / _depth) exitWith {}; } forEach _buckets; // _can = "Land_Bricks_V4_F" createVehicle (ASLtoATL _pos); // _dirvec = _pos vectorFromTo ((ATLtoASL (player modelToWorldVisual (player selectionPosition "Spine3")))); // _dirvec = _dirvec vectorMultiply 100; // _can setVelocity _dirvec; [DFUNC(doExplosions), 0, [_explosions, 0]] call CBA_fnc_addPerFrameHandler; - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_pfhID] call CBA_fnc_removePerFrameHandler; }; END_COUNTER(fnc_findReflections); diff --git a/addons/frag/functions/fnc_fired.sqf b/addons/frag/functions/fnc_fired.sqf index dbe1ab6347..6b12e09d76 100644 --- a/addons/frag/functions/fnc_fired.sqf +++ b/addons/frag/functions/fnc_fired.sqf @@ -42,7 +42,7 @@ if (isNil "_shouldAdd") then { private _explosive = getNumber (configFile >> "CfgAmmo" >> _ammo >> "explosive"); private _indirectRange = getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange"); private _force = getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(force)); - private _fragPower = getNumber(configFile >> "CfgAmmo" >> _ammo >> "indirecthit")*(sqrt((getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange")))); + private _fragPower = getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirecthit") * (sqrt (getNumber (configFile >> "CfgAmmo" >> _ammo >> "indirectHitRange"))); _shouldAdd = (_skip == 0) && {(_force == 1) || {_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}}}; TRACE_6("SettingCache[willFrag?]",_skip,_explosive,_indirectRange,_force,_fragPower,_shouldAdd); diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf index 8e6c6ca7e9..389ab73842 100644 --- a/addons/frag/functions/fnc_frago.sqf +++ b/addons/frag/functions/fnc_frago.sqf @@ -6,44 +6,36 @@ #define MAX_FRAG_COUNT 50 -if(!isServer) exitWith { }; +if (!isServer) exitWith {}; BEGIN_COUNTER(frago); // _startTime = diag_tickTime; -private ["_fuseDist", "_indirectHitRange", "_fragRange", "_c", "_m", "_k", "_gC", "_fragPower", "_fragPowerRandom", "_manObjects", "_objects", "_crew", "_fragCount", "_fragArcs", "_doRandom", "_boundingBox", "_targetPos", "_distance", "_add", "_bbX", "_bbY", "_bbZ", "_cubic", "_targetVel", "_baseVec", "_dir", "_currentCount", "_count", "_vecVar", "_vec", "_fp", "_vel", "_fragType", "_fragObj", "_randomCount", "_sectorSize", "_sectorOffset", "_i", "_randomDir", "_endTime", "_target"]; - -params ["_round", "_lastPos", "_lastVel", "_shellType"]; -private _gun = nil; -if((count _this) > 5) then { - _gun = _this select 5; -}; +params ["_round", "_lastPos", "_lastVel", "_shellType", "_firedFrame", "_gun"]; private _fragTypes = [ QGVAR(tiny), QGVAR(tiny), QGVAR(tiny), QGVAR(tiny_HD), QGVAR(tiny_HD), QGVAR(tiny_HD), - QGVAR(small),QGVAR(small),QGVAR(small),QGVAR(small), - QGVAR(small_HD),QGVAR(small_HD),QGVAR(small_HD),QGVAR(small_HD), + QGVAR(small), QGVAR(small), QGVAR(small), QGVAR(small), + QGVAR(small_HD), QGVAR(small_HD), QGVAR(small_HD), QGVAR(small_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD), QGVAR(medium_HD) ]; private _warn = false; -if(isArray (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CLASSES))) then { +if (isArray (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CLASSES))) then { _fragTypes = getArray (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CLASSES)); } else { _warn = true; }; -private _atlPos = ASLtoATL _lastPos; - private _isArmed = true; -if(!isNil "_gun") then { - _fuseDist = getNumber(configFile >> "CfgAmmo" >> _shellType >> "fuseDistance"); +if (!isNil "_gun") then { + private _fuseDist = getNumber(configFile >> "CfgAmmo" >> _shellType >> "fuseDistance"); _isArmed = ((getPosASL _gun) distance _lastPos > _fuseDist); }; -_indirectHitRange = getNumber(configFile >> "CfgAmmo" >> _shellType >> "indirecthitrange"); -_fragRange = 20 * _indirectHitRange * 4; +private _indirectHitRange = getNumber(configFile >> "CfgAmmo" >> _shellType >> "indirecthitrange"); +private _fragRange = 20 * _indirectHitRange * 4; // _c = 185; // grams of comp-b // _m = 210; // grams of fragmentating metal // _k = 3/5; // spherical K factor @@ -54,26 +46,27 @@ _fragRange = 20 * _indirectHitRange * 4; // _k = 1/2; // spherical K factor // _gC = 2320; // Gurney constant of tritonal in /ms +private _c = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(CHARGE)); +if (_c == 0) then {_c = 1; _warn = true;}; +private _m = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(METAL)); +if (_m == 0) then {_m = 2; _warn = true;}; +private _k = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_K)); +if (_k == 0) then {_k = 0.5; _warn = true;}; +private _gC = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_C)); +if (_gC == 0) then {_gC = 2440; _warn = true;}; -_c = getNumber(configFile >> "CfgAmmo" >> _shellType >> QGVAR(CHARGE)); -if(_c == 0) then { _c = 1; _warn = true;}; -_m = getNumber(configFile >> "CfgAmmo" >> _shellType >> QGVAR(METAL)); -if(_m == 0) then { _m = 2; _warn = true;}; -_k = getNumber(configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_K)); -if(_k == 0) then { _k = 1/2; _warn = true;}; -_gC = getNumber(configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_C)); -if(_gC == 0) then { _gC = 2440; _warn = true;}; - -if(_warn) then { +if (_warn) then { WARNING_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_shellType); //TODO: turn this off when we get closer to release }; -_fragPower = (((_m/_c)+_k)^-(1/2))*_gC; +private _fragPower = (((_m / _c) + _k) ^ - (1 / 2)) * _gC; _fragPower = _fragPower * 0.8; // Gunery equation is for a non-fragmenting metal, imperical value of 80% represents fragmentation -_fragPowerRandom = _fragPower * 0.5; -if((_atlPos select 2) < 0.5) then { - _lastPos set[2, (_lastPos select 2)+0.5]; +private _atlPos = ASLtoATL _lastPos; + +private _fragPowerRandom = _fragPower * 0.5; +if ((_atlPos select 2) < 0.5) then { + _lastPos set [2, (_lastPos select 2) + 0.5]; }; // _manObjects = _atlPos nearEntities ["CaManBase", _fragRange]; @@ -81,134 +74,130 @@ if((_atlPos select 2) < 0.5) then { // setAccTime 0.01; //_objects = nearestObjects [_atlPos, ["AllVehicles"], _fragRange]; // Not sure if tracking "ReammoBox" is required, if so revert this change for _objects -_objects = _atlPos nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], _fragRange]; +private _objects = _atlPos nearEntities [["Car", "Motorcycle", "Tank", "StaticWeapon", "CAManBase", "Air", "Ship"], _fragRange]; // _objects = _manObjects; -// Target also people inside vehicles or manning weapons -_crew = []; +// Add unique crews in faster way { { - _crew set [count _crew,_x] + _objects pushBackUnique _x; } forEach (crew _x); } forEach _objects; -_objects = _objects - _crew; -_objects = _objects + _crew; +private _fragCount = 0; -_fragCount = 0; - -_fragArcs = []; -_fragArcs set[360, 0]; +private _fragArcs = []; +_fragArcs set [360, 0]; #ifdef DEBUG_MODE_FULL - ACE_player sideChat format["_fragRange: %1", _fragRange]; - ACE_player sideChat format["_objects: %1", _objects]; + ACE_player sideChat format ["_fragRange: %1", _fragRange]; + ACE_player sideChat format ["_objects: %1", _objects]; #endif -_doRandom = true; -if(_isArmed && (count _objects) > 0) then { + +private _doRandom = true; +if (_isArmed && {!(_objects isEqualTo [])}) then { if (GVAR(ReflectionsEnabled)) then { [_lastPos, _shellType] call FUNC(doReflections); }; { - //if(random(1) > 0.5) then { - _target = _x; - if(alive _target) then { - _boundingBox = boundingBox _target; - _targetPos = (getPosASL _target); - _distance = _targetPos distance _lastPos; - _add = (((_boundingBox select 1) select 2)/2)+((((_distance-(_fragpower/8)) max 0)/_fragPower)*10); - _bbX = (abs((_boundingBox select 0) select 0))+((_boundingBox select 1) select 0); - _bbY = (abs((_boundingBox select 0) select 1))+((_boundingBox select 1) select 1); - _bbZ = (abs((_boundingBox select 0) select 2))+((_boundingBox select 1) select 2); - _cubic = _bbX * _bbY * _bbZ; - if(_cubic > 1) then { + //if (random(1) > 0.5) then { + private _target = _x; + if (alive _target) then { + private _boundingBox = boundingBox _target; + private _targetPos = getPosASL _target; + private _distance = _targetPos distance _lastPos; + private _add = (((_boundingBox select 1) select 2) / 2) + ((((_distance - (_fragpower / 8)) max 0) / _fragPower) * 10); + private _bbX = (abs ((_boundingBox select 0) select 0)) + ((_boundingBox select 1) select 0); + private _bbY = (abs ((_boundingBox select 0) select 1)) + ((_boundingBox select 1) select 1); + private _bbZ = (abs ((_boundingBox select 0) select 2)) + ((_boundingBox select 1) select 2); + private _cubic = _bbX * _bbY * _bbZ; + if (_cubic > 1) then { _doRandom = true; - _targetVel = (velocity _target); + private _targetVel = velocity _target; + _targetPos = _targetPos vectorAdd [ + (_targetVel select 0) * (_distance / _fragPower), + (_targetVel select 1) * (_distance / _fragPower), + _add + ]; - _targetPos set[0, (_targetPos select 0)+((_targetVel select 0)*(_distance/_fragPower))]; - _targetPos set[1, (_targetPos select 1)+((_targetVel select 1)*(_distance/_fragPower))]; - _targetPos set[2, (_targetPos select 2)+_add]; + private _baseVec = _lastPos vectorFromTo _targetPos; - _baseVec = _lastPos vectorFromTo _targetPos; - - _dir = floor(_baseVec call CBA_fnc_vectDir); - _currentCount = _fragArcs select _dir; - if(isNil "_currentCount") then { - _currentCount = 0; - }; - if(_currentCount < 20) then { - _count = ceil(random(sqrt(_m/1000))); - _vecVar = FRAG_VEC_VAR; - if(!(_target isKindOf "Man")) then { - _vecVar = ((sqrt _cubic)/2000)+FRAG_VEC_VAR; - if((count (crew _target)) == 0 && _count > 0) then { - _count = 0 max (_count/2); + private _dir = floor (_baseVec call CBA_fnc_vectDir); + private _currentCount = _fragArcs select _dir; + ISNILS(_currentCount,0); + if (_currentCount < 20) then { + private _count = ceil (random (sqrt (_m / 1000))); + private _vecVar = FRAG_VEC_VAR; + if (!(_target isKindOf "Man")) then { + _vecVar = ((sqrt _cubic) / 2000) + FRAG_VEC_VAR; + if ((crew _target) isEqualTo [] && {_count > 0}) then { + _count = 0 max (_count / 2); }; }; for "_i" from 1 to _count do { - _vec = +_baseVec; + private _vec = _baseVec vectorDiff [ + (_vecVar / 2) + (random _vecVar), + (_vecVar / 2) + (random _vecVar), + (_vecVar / 2) + (random _vecVar) + ]; - _vec set[0, (_vec select 0)-(_vecVar/2)+(random _vecVar)]; - _vec set[1, (_vec select 1)-(_vecVar/2)+(random _vecVar)]; - _vec set[2, (_vec select 2)-(_vecVar/2)+(random _vecVar)]; + private _fp = _fragPower - (random (_fragPowerRandom)); + private _vel = _vec vectorMultiply _fp; - _fp = (_fragPower-(random (_fragPowerRandom))); - _vel = _vec vectorMultiply _fp; - - _fragType = round (random ((count _fragTypes)-1)); - _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; - // diag_log text format["fp: %1 %2", _fp, typeOf _fragObj]; + private _fragType = round (random ((count _fragTypes) - 1)); + private _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; + // diag_log text format ["fp: %1 %2", _fp, typeOf _fragObj]; _fragObj setPosASL _lastPos; _fragObj setVectorDir _vec; _fragObj setVelocity _vel; - if(GVAR(traceFrags)) then { - GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; + if (GVAR(traceFrags)) then { + INC(GVAR(totalFrags)); [ACE_player, _fragObj, [1,0,0,1]] call FUNC(addTrack); }; - _fragCount = _fragCount + 1; - _currentCount = _currentCount + 1; + INC(_fragCount); + INC(_currentCount); }; - _fragArcs set[_dir, _currentCount]; + _fragArcs set [_dir, _currentCount]; }; }; }; //}; - if(_fragCount > MAX_FRAG_COUNT) exitWith {}; + if (_fragCount > MAX_FRAG_COUNT) exitWith {}; } forEach _objects; - if(_fragCount > MAX_FRAG_COUNT) exitWith {}; - _randomCount = ((ceil((MAX_FRAG_COUNT - _fragCount)*0.1)) max 0)+20; - _sectorSize = 360 / (_randomCount max 1); + if (_fragCount > MAX_FRAG_COUNT) exitWith {}; + private _randomCount = ((ceil ((MAX_FRAG_COUNT - _fragCount) * 0.1)) max 0) + 20; + private _sectorSize = 360 / (_randomCount max 1); // _doRandom = false; - if(_doRandom) then { + if (_doRandom) then { for "_i" from 1 to _randomCount do { // Distribute evenly - _sectorOffset = 360 * (_i - 1) / (_randomCount max 1); - _randomDir = random(_sectorSize); - _vec = [cos(_sectorOffset + _randomDir), sin(_sectorOffset + _randomDir), sin(30 - (random 45))]; + private _sectorOffset = 360 * (_i - 1) / (_randomCount max 1); + private _randomDir = random (_sectorSize); + _vec = [cos (_sectorOffset + _randomDir), sin (_sectorOffset + _randomDir), sin (30 - (random 45))]; - _fp = (_fragPower-(random (_fragPowerRandom))); + _fp = (_fragPower - (random (_fragPowerRandom))); _vel = _vec vectorMultiply _fp; - _fragType = round (random ((count _fragTypes)-1)); - _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; + _fragType = round (random ((count _fragTypes) - 1)); + _fragObj = (_fragTypes select _fragType) createVehicleLocal [0, 0, 10000]; _fragObj setPosASL _lastPos; _fragObj setVectorDir _vec; _fragObj setVelocity _vel; - if(GVAR(traceFrags)) then { - GVAR(TOTALFRAGS) = GVAR(TOTALFRAGS) + 1; + if (GVAR(traceFrags)) then { + INC(GVAR(totalFrags)); [ACE_player, _fragObj, [1,0.5,0,1]] call FUNC(addTrack); }; - _fragCount = _fragCount + 1; + INC(_fragCount); }; }; }; // #ifdef DEBUG_MODE_FULL - // ACE_player sideChat format["total frags: %1", GVAR(TOTALFRAGS)]; + // ACE_player sideChat format["total frags: %1", GVAR(totalFrags)]; // ACE_player sideChat format["tracks: %1", (count GVAR(trackedObjects))]; // #endif // _endTime = diag_tickTime; diff --git a/addons/frag/functions/fnc_masterPFH.sqf b/addons/frag/functions/fnc_masterPFH.sqf index 722590a391..d543c35bf7 100644 --- a/addons/frag/functions/fnc_masterPFH.sqf +++ b/addons/frag/functions/fnc_masterPFH.sqf @@ -15,36 +15,35 @@ if (!GVAR(enabled)) exitWith {}; -private ["_gcIndex", "_iter"]; -_gcIndex = []; +private _gcIndex = []; -_iter = 0; -while { (count GVAR(objects)) > 0 && { _iter < (GVAR(MaxTrackPerFrame) min (count GVAR(objects))) } } do { - private ["_object", "_args"]; - if(GVAR(lastIterationIndex) >= (count GVAR(objects))) then { +private _iter = 0; +private _objectCount = count GVAR(objects); +while {_objectCount > 0 && {_iter < (GVAR(MaxTrackPerFrame) min _objectCount)}} do { + + if (GVAR(lastIterationIndex) >= _objectCount) then { GVAR(lastIterationIndex) = 0; }; - _object = GVAR(objects) select GVAR(lastIterationIndex); + private _object = GVAR(objects) select GVAR(lastIterationIndex); - if(!isNil "_object") then { - _args = GVAR(arguments) select GVAR(lastIterationIndex); + if (!isNil "_object") then { + private _args = GVAR(arguments) select GVAR(lastIterationIndex); - if(!(_args call FUNC(pfhRound))) then { - _gcIndex pushBack GVAR(lastIterationIndex); // Add it to the GC if it returns false + if (!(_args call FUNC(pfhRound))) then { + _gcIndex pushBack GVAR(lastIterationIndex); // Add it to the GC if it returns false }; }; - _iter = _iter + 1; - GVAR(lastIterationIndex) = GVAR(lastIterationIndex) + 1; + INC(_iter); + INC(GVAR(lastIterationIndex)); }; -// clean up dead object references -private ["_deletionCount", "_deleteIndex"]; -_deletionCount = 0; +// Clean up dead object references +private _deletionCount = 0; { TRACE_1("GC Projectile", _x); - _deleteIndex = _x - _deletionCount; + private _deleteIndex = _x - _deletionCount; GVAR(objects) deleteAt _deleteIndex; GVAR(arguments) deleteAt _deleteIndex; - _deletionCount = _deletionCount + 1; + INC(_deletionCount); } forEach _gcIndex; diff --git a/addons/frag/functions/fnc_pfhRound.sqf b/addons/frag/functions/fnc_pfhRound.sqf index cbbd75b633..1338e8fef9 100644 --- a/addons/frag/functions/fnc_pfhRound.sqf +++ b/addons/frag/functions/fnc_pfhRound.sqf @@ -1,26 +1,26 @@ #include "script_component.hpp" -params ["_round", "_lastPos", "_lastVel", "_type", "_firedFrame", "", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; +params ["_round", "_lastPos", "_lastVel", "_type", "_firedFrame", "_gun", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; -if(_round in GVAR(blackList)) exitWith { +if (_round in GVAR(blackList)) exitWith { false }; if (!alive _round) exitWith { - if((diag_frameno - _firedFrame) > 1) then { //skip if deleted within a single frame - if(_skip == 0) then { - if((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1} ) then { + if ((diag_frameno - _firedFrame) > 1) then { //skip if deleted within a single frame + if (_skip == 0) then { + if ((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1}) then { // shotbullet, shotShell don't seem to explode when touching water, so don't create frags if (((_lastPos select 2) < 0) && {(toLower getText (configFile >> "CfgAmmo" >> _type >> "simulation")) in ["shotbullet", "shotshell"]}) exitWith {}; [QGVAR(frag_eh), _this] call CBA_fnc_serverEvent; }; }; }; - if(_doSpall) then { - GVAR(spallIsTrackingCount) = GVAR(spallIsTrackingCount) - 1; - // diag_log text format["F: %1", _foundObjectHPIds]; + if (_doSpall) then { + DEC(GVAR(spallIsTrackingCount)); + // diag_log text format ["F: %1", _foundObjectHPIds]; { - if(!isNil "_x") then { + if (!isNil "_x") then { _x removeEventHandler ["hitPart", _foundObjectHPIds select _forEachIndex]; }; } forEach _spallTrack; @@ -28,12 +28,12 @@ if (!alive _round) exitWith { false }; -_this set[1, (getPosASL _round)]; -_this set[2, (velocity _round)]; +_this set [1, getPosASL _round]; +_this set [2, velocity _round]; -if(_doSpall) then { +if (_doSpall) then { private ["_scale"]; - _scale = ( (count GVAR(objects)) / GVAR(MaxTrackPerFrame) ) max 0.1; + _scale = ((count GVAR(objects)) / GVAR(MaxTrackPerFrame)) max 0.1; [_round, _scale, _spallTrack, _foundObjectHPIds] call FUNC(spallTrack); }; diff --git a/addons/frag/functions/fnc_removePfhRound.sqf b/addons/frag/functions/fnc_removePfhRound.sqf index d186da1e17..b9df275643 100644 --- a/addons/frag/functions/fnc_removePfhRound.sqf +++ b/addons/frag/functions/fnc_removePfhRound.sqf @@ -4,8 +4,8 @@ PARAMS_1(_round); -if(_round in GVAR(blackList)) then { - GVAR(blackList) = GVAR(blackList) - [_round]; +if (_round in GVAR(blackList)) then { + REM(GVAR(blackList),_round); }; -GVAR(objects) = GVAR(objects) - [_round]; +REM(GVAR(objects),_round); diff --git a/addons/frag/functions/fnc_removeTrack.sqf b/addons/frag/functions/fnc_removeTrack.sqf index 914a90602c..8c0f7e3736 100644 --- a/addons/frag/functions/fnc_removeTrack.sqf +++ b/addons/frag/functions/fnc_removeTrack.sqf @@ -1,12 +1,11 @@ #include "script_component.hpp" -private ["_ret"]; -_ret = true; -if(IS_ARRAY((_this select 0))) then { +private _ret = true; +if (IS_ARRAY(_this select 0)) then { _ret = false; } else { - if((_this select 0) in GVAR(trackedObjects)) then { - GVAR(trackedObjects) = GVAR(trackedObjects) - [(_this select 0)]; + if ((_this select 0) in GVAR(trackedObjects)) then { + REM(GVAR(trackedObjects),_this select 0); } else { _ret = false; }; diff --git a/addons/frag/functions/fnc_spallHP.sqf b/addons/frag/functions/fnc_spallHP.sqf index 5bdde6eee9..085e037e70 100644 --- a/addons/frag/functions/fnc_spallHP.sqf +++ b/addons/frag/functions/fnc_spallHP.sqf @@ -1,29 +1,27 @@ #include "script_component.hpp" -private ["_initialData", "_hpData", "_round", "_hpRound", "_hpDirect"]; -//player sideChat format["f: %1 c: %2", (_this select 0), (count GVAR(spallHPData))]; +//player sideChat format ["f: %1 c: %2", (_this select 0), (count GVAR(spallHPData))]; -if ((_this select 0) <= (count GVAR(spallHPData))) then { - _initialData = GVAR(spallHPData) select (_this select 0); - if (!isNil "_initialData") then { - _hpRound = ((_this select 1) select 0) select 2; - _round = _initialData select 3; - _hpDirect = ((_this select 1) select 0) select 10; - if (_hpDirect && {_round == _hpRound}) then { - { - _hpData = _x; - _round = _initialData select 3; - // diag_log text format["HPDUMP-------------------------------------"]; - // { - // _hp = _x; - // diag_log text format["%1 --", _forEachIndex]; - // { - // diag_log text format["%1: %2", _forEachIndex, _x]; - // } forEach _hp; - // } forEach (_this select 1); - [DFUNC(doSpall), [_this, _forEachIndex]] call CBA_fnc_execNextFrame; - // player sideChat "WEEE"; - } forEach (_this select 1); - }; - }; +params ["_index", "_hitPartData"]; + +private _initialData = GVAR(spallHPData) param [_index, []]; +if (_initialData isEqualTo []) exitWith {}; + +private _hpRound = (_hitPartData select 0) select 2; +private _round = _initialData select 3; +private _hpDirect = (_hitPartData select 0) select 10; + +if (_hpDirect && {_round == _hpRound}) then { + { + // diag_log text format ["HPDUMP-------------------------------------"]; + // { + // _hp = _x; + // diag_log text format ["%1 --", _forEachIndex]; + // { + // diag_log text format ["%1: %2", _forEachIndex, _x]; + // } forEach _hp; + // } forEach (_this select 1); + [DFUNC(doSpall), [_this, _forEachIndex]] call CBA_fnc_execNextFrame; + // player sideChat "WEEE"; + } forEach _hitPartData; }; diff --git a/addons/frag/functions/fnc_spallTrack.sqf b/addons/frag/functions/fnc_spallTrack.sqf index 91c7dee511..aedcf56cf8 100644 --- a/addons/frag/functions/fnc_spallTrack.sqf +++ b/addons/frag/functions/fnc_spallTrack.sqf @@ -3,7 +3,7 @@ params ["_round", "_multiplier", "_foundObjects", "_foundObjectHPIds"]; -private _delta = (1/diag_fps) * _multiplier; +private _delta = (1 / diag_fps) * _multiplier; private _curPos = getPosASL _round; private _velocity = velocity _round; @@ -12,17 +12,15 @@ private _forwardPos = _curPos vectorAdd _velocityStep; private _intersectsWith = lineIntersectsWith [_curPos, _forwardPos]; -if (count _intersectsWith > 0) then { - // player sideChat format["inter: %1", _intersectsWith]; - { - if(!(_x in _foundObjects)) then { - // diag_log text format["Adding HP: %1", _x]; - private _index = count GVAR(spallHPData); - private _hpId = _x addEventHandler ["hitPart", compile format["[%1, _this] call " + QFUNC(spallHP), _index]]; - _foundObjects set[(count _foundObjects), _x]; - _foundObjectHPIds set[(count _foundObjectHPIds), _hpId]; - private _data = [_hpId, _x, typeOf _round, _round, _curPos, _velocity, 0, _foundObjects, _foundObjectHPIds]; - GVAR(spallHPData) set[_index, _data]; - }; - } forEach _intersectsWith; -}; +if (_intersectsWith isEqualTo []) exitWith {}; + +// player sideChat format ["inter: %1", _intersectsWith]; +{ + // diag_log text format ["Adding HP: %1", _x]; + private _index = count GVAR(spallHPData); + private _hpId = _x addEventHandler ["hitPart", compile format ["[%1, _this] call " + QFUNC(spallHP), _index]]; + _foundObjects pushBack _x; + _foundObjectHPIds pushBack _hpId; + private _data = [_hpId, _x, typeOf _round, _round, _curPos, _velocity, 0, _foundObjects, _foundObjectHPIds]; + GVAR(spallHPData) pushBack _data; +} forEach (_intersectsWith select {!(_x in _foundObjects)}); diff --git a/addons/frag/functions/fnc_startTracing.sqf b/addons/frag/functions/fnc_startTracing.sqf index ca9aa8c84e..d860d6635e 100644 --- a/addons/frag/functions/fnc_startTracing.sqf +++ b/addons/frag/functions/fnc_startTracing.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -if(!GVAR(tracesStarted)) then { - GVAR(tracesStarted) = true; - GVAR(traceID) = [FUNC(drawTraces), 0, []] call CBA_fnc_addPerFrameHandler; -}; + +if (GVAR(tracesStarted)) exitWith {}; +GVAR(tracesStarted) = true; +GVAR(traceID) = [FUNC(drawTraces)] call CBA_fnc_addPerFrameHandler; diff --git a/addons/frag/functions/fnc_stopTracing.sqf b/addons/frag/functions/fnc_stopTracing.sqf index b58352c897..e06a9a2b46 100644 --- a/addons/frag/functions/fnc_stopTracing.sqf +++ b/addons/frag/functions/fnc_stopTracing.sqf @@ -1,5 +1,5 @@ #include "script_component.hpp" -if(GVAR(tracesStarted)) then { - GVAR(tracesStarted) = false; - [GVAR(traceID)] call CBA_fnc_removePerFrameHandler; -}; + +if (!GVAR(tracesStarted)) exitWith {}; +GVAR(tracesStarted) = false; +[GVAR(traceID)] call CBA_fnc_removePerFrameHandler; diff --git a/addons/frag/functions/fnc_trackTrace.sqf b/addons/frag/functions/fnc_trackTrace.sqf index d57eaa8c5c..07867ba1ff 100644 --- a/addons/frag/functions/fnc_trackTrace.sqf +++ b/addons/frag/functions/fnc_trackTrace.sqf @@ -1,12 +1,12 @@ #include "script_component.hpp" -params ["_args"]; +params ["_args", "_pfhID"]; _args params ["_tracerObj", "_index"]; -if (alive _tracerObj && (count GVAR(traces)) > 0) then { +if (alive _tracerObj && {!(GVAR(traces) isEqualTo [])}) then { private _data = GVAR(traces) select _index; private _positions = _data select 4; - _positions pushBack [(getPos _tracerObj), vectorMagnitude (velocity _tracerObj)]; + _positions pushBack [getPos _tracerObj, vectorMagnitude (velocity _tracerObj)]; } else { - [(_this select 1)] call CBA_fnc_removePerFrameHandler; + [_pfhID] call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/frag/functions/script_component.hpp b/addons/frag/functions/script_component.hpp index 8312313751..0903b3ba1e 100644 --- a/addons/frag/functions/script_component.hpp +++ b/addons/frag/functions/script_component.hpp @@ -1 +1 @@ -#include "\z\ace\addons\frag\script_component.hpp" \ No newline at end of file +#include "\z\ace\addons\frag\script_component.hpp" diff --git a/addons/frag/script_component.hpp b/addons/frag/script_component.hpp index ed94fac8f0..59868e36cf 100644 --- a/addons/frag/script_component.hpp +++ b/addons/frag/script_component.hpp @@ -17,4 +17,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ACE_TRACE_DRAW_INC 1 +#define ACE_TRACE_DRAW_INC 1 diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index 3a4fff2711..1202c18ed7 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -167,4 +167,4 @@ (SP のみ) ミッションとエディタの再起動が必要です。有効化すると、シングルプレイでのみ破片と剥離の弾頭が見えるようになります。 - \ No newline at end of file + From fd1888be361e8131ade8530610643dabdab1d39b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Thu, 27 Oct 2016 20:34:25 +0300 Subject: [PATCH 059/826] Add 'uniforms' Component (#4435) --- AUTHORS.txt | 1 + optionals/nouniformrestrictions/$PBOPREFIX$ | 1 + .../CfgEventHandlers.hpp | 11 + .../nouniformrestrictions/CfgVehicles.hpp | 1658 +++++++++++++++++ optionals/nouniformrestrictions/README.md | 12 + optionals/nouniformrestrictions/XEH_PREP.hpp | 1 + .../nouniformrestrictions/XEH_preInit.sqf | 7 + .../nouniformrestrictions/XEH_preStart.sqf | 3 + optionals/nouniformrestrictions/config.cpp | 18 + .../functions/fnc_exportConfig.sqf | 52 + .../functions/script_component.hpp | 1 + .../script_component.hpp | 18 + 12 files changed, 1783 insertions(+) create mode 100644 optionals/nouniformrestrictions/$PBOPREFIX$ create mode 100644 optionals/nouniformrestrictions/CfgEventHandlers.hpp create mode 100644 optionals/nouniformrestrictions/CfgVehicles.hpp create mode 100644 optionals/nouniformrestrictions/README.md create mode 100644 optionals/nouniformrestrictions/XEH_PREP.hpp create mode 100644 optionals/nouniformrestrictions/XEH_preInit.sqf create mode 100644 optionals/nouniformrestrictions/XEH_preStart.sqf create mode 100644 optionals/nouniformrestrictions/config.cpp create mode 100644 optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf create mode 100644 optionals/nouniformrestrictions/functions/script_component.hpp create mode 100644 optionals/nouniformrestrictions/script_component.hpp diff --git a/AUTHORS.txt b/AUTHORS.txt index f9e55823b1..7033cfda28 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -29,6 +29,7 @@ Walter Pearce # CONTRIBUTORS [BIG]Bull 11RDP-LoupVert +654wak654 ACCtomeek adam3adam Adanteh diff --git a/optionals/nouniformrestrictions/$PBOPREFIX$ b/optionals/nouniformrestrictions/$PBOPREFIX$ new file mode 100644 index 0000000000..cd4e626c17 --- /dev/null +++ b/optionals/nouniformrestrictions/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\nouniformrestrictions diff --git a/optionals/nouniformrestrictions/CfgEventHandlers.hpp b/optionals/nouniformrestrictions/CfgEventHandlers.hpp new file mode 100644 index 0000000000..93e3311cf2 --- /dev/null +++ b/optionals/nouniformrestrictions/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreStart_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preStart)); + }; +}; + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/optionals/nouniformrestrictions/CfgVehicles.hpp b/optionals/nouniformrestrictions/CfgVehicles.hpp new file mode 100644 index 0000000000..b4a2a0465a --- /dev/null +++ b/optionals/nouniformrestrictions/CfgVehicles.hpp @@ -0,0 +1,1658 @@ +class CfgVehicles { + class Civilian; + class CAManBase; + + class Civilian_F: Civilian { + modelSides[] = {6}; + }; + class C_man_1: Civilian_F { + modelSides[] = {6}; + }; + class SoldierWB: CAManBase { + modelSides[] = {6}; + }; + class SoldierEB: CAManBase { + modelSides[] = {6}; + }; + class SoldierGB: CAManBase { + modelSides[] = {6}; + }; + class VirtualMan_F: Civilian_F { + modelSides[] = {6}; + }; + class HeadlessClient_F: VirtualMan_F { + modelSides[] = {6}; + }; + class B_Soldier_base_F: SoldierWB { + modelSides[] = {6}; + }; + class B_Soldier_02_f: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Soldier_03_f: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Soldier_04_f: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Soldier_05_f: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Soldier_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_RangeMaster_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Soldier_lite_F: B_Soldier_03_f { + modelSides[] = {6}; + }; + class B_Soldier_GL_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_soldier_AR_F: B_Soldier_02_f { + modelSides[] = {6}; + }; + class B_Soldier_SL_F: B_Soldier_03_f { + modelSides[] = {6}; + }; + class B_Soldier_TL_F: B_Soldier_03_f { + modelSides[] = {6}; + }; + class B_soldier_M_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_soldier_LAT_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_medic_F: B_Soldier_02_f { + modelSides[] = {6}; + }; + class B_soldier_repair_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_soldier_exp_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Helipilot_F: B_Soldier_04_f { + modelSides[] = {6}; + }; + class B_Soldier_A_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_soldier_AT_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_soldier_AA_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_engineer_F: B_Soldier_03_f { + modelSides[] = {6}; + }; + class B_crew_F: B_Soldier_03_f { + modelSides[] = {6}; + }; + class B_officer_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Competitor_F: B_RangeMaster_F { + modelSides[] = {6}; + }; + class B_Pilot_F: B_Soldier_05_f { + modelSides[] = {6}; + }; + class B_helicrew_F: B_Helipilot_F { + modelSides[] = {6}; + }; + class B_soldier_PG_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_soldier_UAV_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Soldier_unarmed_F: B_Soldier_F { + modelSides[] = {6}; + }; + class B_Soldier_diver_base_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_diver_F: B_Soldier_diver_base_F { + modelSides[] = {6}; + }; + class B_diver_TL_F: B_Soldier_diver_base_F { + modelSides[] = {6}; + }; + class B_diver_exp_F: B_Soldier_diver_base_F { + modelSides[] = {6}; + }; + class B_Soldier_recon_base: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_recon_F: B_Soldier_recon_base { + modelSides[] = {6}; + }; + class B_recon_LAT_F: B_Soldier_recon_base { + modelSides[] = {6}; + }; + class B_recon_exp_F: B_Soldier_recon_base { + modelSides[] = {6}; + }; + class B_recon_medic_F: B_Soldier_recon_base { + modelSides[] = {6}; + }; + class B_recon_TL_F: B_Soldier_recon_base { + modelSides[] = {6}; + }; + class B_recon_M_F: B_Soldier_recon_base { + modelSides[] = {6}; + }; + class B_recon_JTAC_F: B_Soldier_recon_base { + modelSides[] = {6}; + }; + class B_Soldier_sniper_base_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_spotter_F: B_Soldier_sniper_base_F { + modelSides[] = {6}; + }; + class B_sniper_F: B_Soldier_sniper_base_F { + modelSides[] = {6}; + }; + class B_Story_SF_Captain_F: B_Soldier_02_f { + modelSides[] = {6}; + }; + class B_Story_Protagonist_F: B_Soldier_02_f { + modelSides[] = {6}; + }; + class B_Story_Engineer_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Story_Colonel_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Story_Pilot_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Story_Tank_Commander_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class b_soldier_survival_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_CTRG_soldier_GL_LAT_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_CTRG_soldier_engineer_exp_F: B_Soldier_02_f { + modelSides[] = {6}; + }; + class B_CTRG_soldier_M_medic_F: B_Soldier_03_f { + modelSides[] = {6}; + }; + class B_CTRG_soldier_AR_A_F: B_Soldier_03_f { + modelSides[] = {6}; + }; + class B_Soldier_support_base_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_soldier_AAR_F: B_Soldier_support_base_F { + modelSides[] = {6}; + }; + class B_soldier_AAT_F: B_Soldier_support_base_F { + modelSides[] = {6}; + }; + class B_soldier_AAA_F: B_soldier_AAT_F { + modelSides[] = {6}; + }; + class B_support_MG_F: B_Soldier_support_base_F { + modelSides[] = {6}; + }; + class B_support_GMG_F: B_Soldier_support_base_F { + modelSides[] = {6}; + }; + class B_support_Mort_F: B_Soldier_support_base_F { + modelSides[] = {6}; + }; + class B_support_AMG_F: B_Soldier_support_base_F { + modelSides[] = {6}; + }; + class B_support_AMort_F: B_Soldier_support_base_F { + modelSides[] = {6}; + }; + class C_man_1_1_F: C_man_1 { + modelSides[] = {6}; + }; + class C_man_1_2_F: C_man_1_1_F { + modelSides[] = {6}; + }; + class C_man_1_3_F: C_man_1_1_F { + modelSides[] = {6}; + }; + class C_man_polo_1_F: C_man_1 { + modelSides[] = {6}; + }; + class C_man_polo_1_F_afro: C_man_polo_1_F { + modelSides[] = {6}; + }; + class C_man_polo_1_F_euro: C_man_polo_1_F { + modelSides[] = {6}; + }; + class C_man_polo_1_F_asia: C_man_polo_1_F { + modelSides[] = {6}; + }; + class C_man_polo_2_F: C_man_polo_1_F { + modelSides[] = {6}; + }; + class C_man_polo_2_F_afro: C_man_polo_2_F { + modelSides[] = {6}; + }; + class C_man_polo_2_F_euro: C_man_polo_2_F { + modelSides[] = {6}; + }; + class C_man_polo_2_F_asia: C_man_polo_2_F { + modelSides[] = {6}; + }; + class C_man_polo_3_F: C_man_polo_1_F { + modelSides[] = {6}; + }; + class C_man_polo_3_F_afro: C_man_polo_3_F { + modelSides[] = {6}; + }; + class C_man_polo_3_F_euro: C_man_polo_3_F { + modelSides[] = {6}; + }; + class C_man_polo_3_F_asia: C_man_polo_3_F { + modelSides[] = {6}; + }; + class C_man_polo_4_F: C_man_polo_1_F { + modelSides[] = {6}; + }; + class C_man_polo_4_F_afro: C_man_polo_4_F { + modelSides[] = {6}; + }; + class C_man_polo_4_F_euro: C_man_polo_4_F { + modelSides[] = {6}; + }; + class C_man_polo_4_F_asia: C_man_polo_4_F { + modelSides[] = {6}; + }; + class C_man_polo_5_F: C_man_polo_1_F { + modelSides[] = {6}; + }; + class C_man_polo_5_F_afro: C_man_polo_5_F { + modelSides[] = {6}; + }; + class C_man_polo_5_F_euro: C_man_polo_5_F { + modelSides[] = {6}; + }; + class C_man_polo_5_F_asia: C_man_polo_5_F { + modelSides[] = {6}; + }; + class C_man_polo_6_F: C_man_polo_1_F { + modelSides[] = {6}; + }; + class C_man_polo_6_F_afro: C_man_polo_6_F { + modelSides[] = {6}; + }; + class C_man_polo_6_F_euro: C_man_polo_6_F { + modelSides[] = {6}; + }; + class C_man_polo_6_F_asia: C_man_polo_6_F { + modelSides[] = {6}; + }; + class C_man_p_fugitive_F: C_man_1 { + modelSides[] = {6}; + }; + class C_man_p_fugitive_F_afro: C_man_p_fugitive_F { + modelSides[] = {6}; + }; + class C_man_p_fugitive_F_euro: C_man_p_fugitive_F { + modelSides[] = {6}; + }; + class C_man_p_fugitive_F_asia: C_man_p_fugitive_F { + modelSides[] = {6}; + }; + class C_man_p_beggar_F: C_man_p_fugitive_F { + modelSides[] = {6}; + }; + class C_man_p_beggar_F_afro: C_man_p_beggar_F { + modelSides[] = {6}; + }; + class C_man_p_beggar_F_euro: C_man_p_beggar_F { + modelSides[] = {6}; + }; + class C_man_p_beggar_F_asia: C_man_p_beggar_F { + modelSides[] = {6}; + }; + class C_man_w_worker_F: C_man_1 { + modelSides[] = {6}; + }; + class C_scientist_F: C_man_w_worker_F { + modelSides[] = {6}; + }; + class C_man_hunter_1_F: C_man_1 { + modelSides[] = {6}; + }; + class C_man_p_shorts_1_F: C_man_1 { + modelSides[] = {6}; + }; + class C_man_p_shorts_1_F_afro: C_man_p_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_p_shorts_1_F_euro: C_man_p_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_p_shorts_1_F_asia: C_man_p_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_shorts_1_F: C_man_p_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_shorts_1_F_afro: C_man_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_shorts_1_F_euro: C_man_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_shorts_1_F_asia: C_man_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_shorts_2_F: C_man_p_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_shorts_2_F_afro: C_man_shorts_2_F { + modelSides[] = {6}; + }; + class C_man_shorts_2_F_euro: C_man_shorts_2_F { + modelSides[] = {6}; + }; + class C_man_shorts_2_F_asia: C_man_shorts_2_F { + modelSides[] = {6}; + }; + class C_man_shorts_3_F: C_man_p_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_shorts_3_F_afro: C_man_shorts_3_F { + modelSides[] = {6}; + }; + class C_man_shorts_3_F_euro: C_man_shorts_3_F { + modelSides[] = {6}; + }; + class C_man_shorts_3_F_asia: C_man_shorts_3_F { + modelSides[] = {6}; + }; + class C_man_shorts_4_F: C_man_p_shorts_1_F { + modelSides[] = {6}; + }; + class C_man_shorts_4_F_afro: C_man_shorts_4_F { + modelSides[] = {6}; + }; + class C_man_shorts_4_F_euro: C_man_shorts_4_F { + modelSides[] = {6}; + }; + class C_man_shorts_4_F_asia: C_man_shorts_4_F { + modelSides[] = {6}; + }; + class C_man_pilot_F: C_man_1 { + modelSides[] = {6}; + }; + class C_journalist_F: C_man_1 { + modelSides[] = {6}; + }; + class C_Orestes: C_man_1 { + modelSides[] = {6}; + }; + class C_Nikos: C_Orestes { + modelSides[] = {6}; + }; + class C_Nikos_aged: C_Nikos { + modelSides[] = {6}; + }; + class I_G_Soldier_base_F: SoldierGB { + modelSides[] = {6}; + }; + class I_G_Soldier_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_Soldier_lite_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_Soldier_SL_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_Soldier_TL_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_Soldier_AR_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_medic_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_engineer_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_Soldier_exp_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_Soldier_GL_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_Soldier_M_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_Soldier_LAT_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_Soldier_A_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_G_officer_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class B_G_Soldier_F: I_G_Soldier_F { + modelSides[] = {6}; + }; + class O_G_Soldier_F: I_G_Soldier_F { + modelSides[] = {6}; + }; + class B_G_Soldier_lite_F: I_G_Soldier_lite_F { + modelSides[] = {6}; + }; + class O_G_Soldier_lite_F: I_G_Soldier_lite_F { + modelSides[] = {6}; + }; + class B_G_Soldier_SL_F: I_G_Soldier_SL_F { + modelSides[] = {6}; + }; + class O_G_Soldier_SL_F: I_G_Soldier_SL_F { + modelSides[] = {6}; + }; + class B_G_Soldier_TL_F: I_G_Soldier_TL_F { + modelSides[] = {6}; + }; + class O_G_Soldier_TL_F: I_G_Soldier_TL_F { + modelSides[] = {6}; + }; + class B_G_Soldier_AR_F: I_G_Soldier_AR_F { + modelSides[] = {6}; + }; + class O_G_Soldier_AR_F: I_G_Soldier_AR_F { + modelSides[] = {6}; + }; + class B_G_medic_F: I_G_medic_F { + modelSides[] = {6}; + }; + class O_G_medic_F: I_G_medic_F { + modelSides[] = {6}; + }; + class B_G_engineer_F: I_G_engineer_F { + modelSides[] = {6}; + }; + class O_G_engineer_F: I_G_engineer_F { + modelSides[] = {6}; + }; + class B_G_Soldier_exp_F: I_G_Soldier_exp_F { + modelSides[] = {6}; + }; + class O_G_Soldier_exp_F: I_G_Soldier_exp_F { + modelSides[] = {6}; + }; + class B_G_Soldier_GL_F: I_G_Soldier_GL_F { + modelSides[] = {6}; + }; + class O_G_Soldier_GL_F: I_G_Soldier_GL_F { + modelSides[] = {6}; + }; + class B_G_Soldier_M_F: I_G_Soldier_M_F { + modelSides[] = {6}; + }; + class O_G_Soldier_M_F: I_G_Soldier_M_F { + modelSides[] = {6}; + }; + class B_G_Soldier_LAT_F: I_G_Soldier_LAT_F { + modelSides[] = {6}; + }; + class O_G_Soldier_LAT_F: I_G_Soldier_LAT_F { + modelSides[] = {6}; + }; + class B_G_Soldier_A_F: I_G_Soldier_A_F { + modelSides[] = {6}; + }; + class O_G_Soldier_A_F: I_G_Soldier_A_F { + modelSides[] = {6}; + }; + class B_G_officer_F: I_G_officer_F { + modelSides[] = {6}; + }; + class O_G_officer_F: I_G_officer_F { + modelSides[] = {6}; + }; + class I_G_Soldier_unarmed_F: I_G_Soldier_F { + modelSides[] = {6}; + }; + class B_G_Soldier_unarmed_F: B_G_Soldier_F { + modelSides[] = {6}; + }; + class O_G_Soldier_unarmed_F: O_G_Soldier_F { + modelSides[] = {6}; + }; + class I_G_Survivor_F: I_G_Soldier_F { + modelSides[] = {6}; + }; + class B_G_Survivor_F: B_G_Soldier_F { + modelSides[] = {6}; + }; + class O_G_Survivor_F: O_G_Soldier_F { + modelSides[] = {6}; + }; + class I_G_Story_Protagonist_F: B_G_Soldier_F { + modelSides[] = {6}; + }; + class I_G_Story_SF_Captain_F: B_G_Soldier_F { + modelSides[] = {6}; + }; + class I_G_resistanceLeader_F: I_G_Story_Protagonist_F { + modelSides[] = {6}; + }; + class I_G_resistanceCommander_F: I_G_Story_Protagonist_F { + modelSides[] = {6}; + }; + class I_Soldier_base_F: SoldierGB { + modelSides[] = {6}; + }; + class I_Soldier_02_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_03_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_04_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_soldier_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_lite_F: I_Soldier_02_F { + modelSides[] = {6}; + }; + class I_Soldier_A_F: I_Soldier_02_F { + modelSides[] = {6}; + }; + class I_Soldier_GL_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_AR_F: I_Soldier_02_F { + modelSides[] = {6}; + }; + class I_Soldier_SL_F: I_Soldier_02_F { + modelSides[] = {6}; + }; + class I_Soldier_TL_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_M_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_LAT_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_AT_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_AA_F: I_Soldier_02_F { + modelSides[] = {6}; + }; + class I_medic_F: I_Soldier_02_F { + modelSides[] = {6}; + }; + class I_Soldier_repair_F: I_Soldier_02_F { + modelSides[] = {6}; + }; + class I_Soldier_exp_F: I_Soldier_02_F { + modelSides[] = {6}; + }; + class I_engineer_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_crew_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_helipilot_F: I_Soldier_03_F { + modelSides[] = {6}; + }; + class I_pilot_F: I_Soldier_04_F { + modelSides[] = {6}; + }; + class I_helicrew_F: I_helipilot_F { + modelSides[] = {6}; + }; + class I_officer_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Story_Colonel_F: I_officer_F { + modelSides[] = {6}; + }; + class I_soldier_UAV_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_unarmed_F: I_soldier_F { + modelSides[] = {6}; + }; + class I_Soldier_diver_base_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_diver_F: I_Soldier_diver_base_F { + modelSides[] = {6}; + }; + class I_diver_exp_F: I_Soldier_diver_base_F { + modelSides[] = {6}; + }; + class I_diver_TL_F: I_Soldier_diver_base_F { + modelSides[] = {6}; + }; + class I_Soldier_sniper_base_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Spotter_F: I_Soldier_sniper_base_F { + modelSides[] = {6}; + }; + class I_Sniper_F: I_Soldier_sniper_base_F { + modelSides[] = {6}; + }; + class I_Soldier_support_base_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_AAR_F: I_Soldier_support_base_F { + modelSides[] = {6}; + }; + class I_Soldier_AAT_F: I_Soldier_support_base_F { + modelSides[] = {6}; + }; + class I_Soldier_AAA_F: I_Soldier_AAT_F { + modelSides[] = {6}; + }; + class I_support_MG_F: I_Soldier_support_base_F { + modelSides[] = {6}; + }; + class I_support_GMG_F: I_Soldier_support_base_F { + modelSides[] = {6}; + }; + class I_support_Mort_F: I_Soldier_support_base_F { + modelSides[] = {6}; + }; + class I_support_AMG_F: I_Soldier_support_base_F { + modelSides[] = {6}; + }; + class I_support_AMort_F: I_Soldier_support_base_F { + modelSides[] = {6}; + }; + class O_Soldier_base_F: SoldierEB { + modelSides[] = {6}; + }; + class O_Soldier_02_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_officer_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_lite_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_GL_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_AR_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_SL_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_TL_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_soldier_M_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_LAT_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_medic_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_soldier_repair_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_soldier_exp_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_helipilot_F: O_Soldier_02_F { + modelSides[] = {6}; + }; + class O_Soldier_A_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_AT_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_AA_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_engineer_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_crew_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Pilot_F: O_helipilot_F { + modelSides[] = {6}; + }; + class O_helicrew_F: O_helipilot_F { + modelSides[] = {6}; + }; + class O_soldier_PG_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Story_Colonel_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Story_CEO_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_soldier_UAV_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_unarmed_F: O_Soldier_F { + modelSides[] = {6}; + }; + class O_Soldier_diver_base_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_diver_F: O_Soldier_diver_base_F { + modelSides[] = {6}; + }; + class O_diver_TL_F: O_Soldier_diver_base_F { + modelSides[] = {6}; + }; + class O_diver_exp_F: O_Soldier_diver_base_F { + modelSides[] = {6}; + }; + class O_Soldier_sniper_base_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_spotter_F: O_Soldier_sniper_base_F { + modelSides[] = {6}; + }; + class O_sniper_F: O_Soldier_sniper_base_F { + modelSides[] = {6}; + }; + class O_Soldier_recon_base: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_recon_F: O_Soldier_recon_base { + modelSides[] = {6}; + }; + class O_recon_M_F: O_Soldier_recon_base { + modelSides[] = {6}; + }; + class O_recon_LAT_F: O_Soldier_recon_base { + modelSides[] = {6}; + }; + class O_recon_medic_F: O_Soldier_recon_base { + modelSides[] = {6}; + }; + class O_recon_exp_F: O_Soldier_recon_base { + modelSides[] = {6}; + }; + class O_recon_JTAC_F: O_Soldier_recon_base { + modelSides[] = {6}; + }; + class O_recon_TL_F: O_Soldier_recon_base { + modelSides[] = {6}; + }; + class O_Soldier_support_base_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_AAR_F: O_Soldier_support_base_F { + modelSides[] = {6}; + }; + class O_Soldier_AAT_F: O_Soldier_support_base_F { + modelSides[] = {6}; + }; + class O_Soldier_AAA_F: O_Soldier_AAT_F { + modelSides[] = {6}; + }; + class O_support_MG_F: O_Soldier_support_base_F { + modelSides[] = {6}; + }; + class O_support_GMG_F: O_Soldier_support_base_F { + modelSides[] = {6}; + }; + class O_support_Mort_F: O_Soldier_support_base_F { + modelSides[] = {6}; + }; + class O_support_AMG_F: O_Soldier_support_base_F { + modelSides[] = {6}; + }; + class O_support_AMort_F: O_Soldier_support_base_F { + modelSides[] = {6}; + }; + class O_Soldier_Urban_base: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_soldierU_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_AR_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_AAR_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_LAT_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_AT_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_AAT_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_AA_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_AAA_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_TL_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_SoldierU_SL_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_medic_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_repair_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_exp_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_engineer_U_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_M_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_soldierU_A_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_SoldierU_GL_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class C_Driver_1_F: C_man_1 { + modelSides[] = {6}; + }; + class C_Driver_2_F: C_Driver_1_F { + modelSides[] = {6}; + }; + class C_Driver_3_F: C_Driver_1_F { + modelSides[] = {6}; + }; + class C_Driver_4_F: C_Driver_1_F { + modelSides[] = {6}; + }; + class C_Driver_1_random_base_F: C_Driver_1_F { + modelSides[] = {6}; + }; + class C_Driver_1_black_F: C_Driver_1_random_base_F { + modelSides[] = {6}; + }; + class C_Driver_1_blue_F: C_Driver_1_random_base_F { + modelSides[] = {6}; + }; + class C_Driver_1_green_F: C_Driver_1_random_base_F { + modelSides[] = {6}; + }; + class C_Driver_1_red_F: C_Driver_1_random_base_F { + modelSides[] = {6}; + }; + class C_Driver_1_white_F: C_Driver_1_random_base_F { + modelSides[] = {6}; + }; + class C_Driver_1_yellow_F: C_Driver_1_random_base_F { + modelSides[] = {6}; + }; + class C_Driver_1_orange_F: C_Driver_1_random_base_F { + modelSides[] = {6}; + }; + class C_Marshal_F: B_RangeMaster_F { + modelSides[] = {6}; + }; + class B_Soldier_VR_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Soldier_VR_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Soldier_VR_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class C_Soldier_VR_F: C_man_1 { + modelSides[] = {6}; + }; + class B_Protagonist_VR_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Protagonist_VR_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class I_Protagonist_VR_F: I_Soldier_base_F { + modelSides[] = {6}; + }; + class B_ghillie_base_F: B_Soldier_sniper_base_F { + modelSides[] = {6}; + }; + class B_ghillie_lsh_F: B_ghillie_base_F { + modelSides[] = {6}; + }; + class B_ghillie_sard_F: B_ghillie_base_F { + modelSides[] = {6}; + }; + class B_ghillie_ard_F: B_ghillie_base_F { + modelSides[] = {6}; + }; + class O_ghillie_base_F: O_Soldier_sniper_base_F { + modelSides[] = {6}; + }; + class O_ghillie_lsh_F: O_ghillie_base_F { + modelSides[] = {6}; + }; + class O_ghillie_sard_F: O_ghillie_base_F { + modelSides[] = {6}; + }; + class O_ghillie_ard_F: O_ghillie_base_F { + modelSides[] = {6}; + }; + class I_ghillie_base_F: I_Soldier_sniper_base_F { + modelSides[] = {6}; + }; + class I_ghillie_lsh_F: I_ghillie_base_F { + modelSides[] = {6}; + }; + class I_ghillie_sard_F: I_ghillie_base_F { + modelSides[] = {6}; + }; + class I_ghillie_ard_F: I_ghillie_base_F { + modelSides[] = {6}; + }; + class B_Sharpshooter_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_Recon_Sharpshooter_F: B_Soldier_recon_base { + modelSides[] = {6}; + }; + class B_CTRG_Sharphooter_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_HeavyGunner_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Sharpshooter_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Urban_Sharpshooter_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class O_Pathfinder_F: O_Soldier_recon_base { + modelSides[] = {6}; + }; + class O_HeavyGunner_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_Urban_HeavyGunner_F: O_Soldier_Urban_base { + modelSides[] = {6}; + }; + class I_G_Sharpshooter_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class B_G_Sharpshooter_F: I_G_Sharpshooter_F { + modelSides[] = {6}; + }; + class O_G_Sharpshooter_F: I_G_Sharpshooter_F { + modelSides[] = {6}; + }; + class B_UAV_AI: B_Helipilot_F { + modelSides[] = {6}; + }; + class O_UAV_AI: O_helipilot_F { + modelSides[] = {6}; + }; + class I_UAV_AI: O_UAV_AI { + modelSides[] = {6}; + }; + class Underwear_F: B_Soldier_F { + modelSides[] = {6}; + }; + class VirtualCurator_F: VirtualMan_F { + modelSides[] = {6}; + }; + class B_VirtualCurator_F: VirtualCurator_F { + modelSides[] = {6}; + }; + class O_VirtualCurator_F: VirtualCurator_F { + modelSides[] = {6}; + }; + class I_VirtualCurator_F: VirtualCurator_F { + modelSides[] = {6}; + }; + class C_VirtualCurator_F: VirtualCurator_F { + modelSides[] = {6}; + }; + class VirtualSpectator_F: VirtualMan_F { + modelSides[] = {6}; + }; + class I_C_Soldier_base_F: I_G_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Para_1_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Para_2_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Para_3_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Para_4_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Para_5_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Para_6_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Para_7_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Para_8_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Bandit_1_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Bandit_2_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Bandit_3_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Bandit_4_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Bandit_5_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Bandit_6_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Bandit_7_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Bandit_8_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Soldier_Camo_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Pilot_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class I_C_Helipilot_F: I_C_Soldier_base_F { + modelSides[] = {6}; + }; + class B_T_Soldier_A_F: B_Soldier_A_F { + modelSides[] = {6}; + }; + class B_T_Soldier_AAR_F: B_soldier_AAR_F { + modelSides[] = {6}; + }; + class B_T_Support_AMG_F: B_support_AMG_F { + modelSides[] = {6}; + }; + class B_T_Support_AMort_F: B_support_AMort_F { + modelSides[] = {6}; + }; + class B_T_Soldier_AAA_F: B_soldier_AAA_F { + modelSides[] = {6}; + }; + class B_T_Soldier_AAT_F: B_soldier_AAT_F { + modelSides[] = {6}; + }; + class B_T_Soldier_AR_F: B_soldier_AR_F { + modelSides[] = {6}; + }; + class B_T_Medic_F: B_medic_F { + modelSides[] = {6}; + }; + class B_T_Crew_F: B_crew_F { + modelSides[] = {6}; + }; + class B_T_Engineer_F: B_engineer_F { + modelSides[] = {6}; + }; + class B_T_Soldier_Exp_F: B_soldier_exp_F { + modelSides[] = {6}; + }; + class B_T_Soldier_GL_F: B_Soldier_GL_F { + modelSides[] = {6}; + }; + class B_T_Support_GMG_F: B_support_GMG_F { + modelSides[] = {6}; + }; + class B_T_Support_MG_F: B_support_MG_F { + modelSides[] = {6}; + }; + class B_T_Support_Mort_F: B_support_Mort_F { + modelSides[] = {6}; + }; + class B_T_Helicrew_F: B_helicrew_F { + modelSides[] = {6}; + }; + class B_T_Helipilot_F: B_Helipilot_F { + modelSides[] = {6}; + }; + class B_T_soldier_M_F: B_soldier_M_F { + modelSides[] = {6}; + }; + class B_T_Soldier_AA_F: B_soldier_AA_F { + modelSides[] = {6}; + }; + class B_T_Soldier_AT_F: B_soldier_AT_F { + modelSides[] = {6}; + }; + class B_T_Officer_F: B_officer_F { + modelSides[] = {6}; + }; + class B_T_Soldier_PG_F: B_soldier_PG_F { + modelSides[] = {6}; + }; + class B_T_Pilot_F: B_Pilot_F { + modelSides[] = {6}; + }; + class B_T_Soldier_Repair_F: B_soldier_repair_F { + modelSides[] = {6}; + }; + class B_T_Soldier_F: B_Soldier_F { + modelSides[] = {6}; + }; + class B_T_Soldier_LAT_F: B_soldier_LAT_F { + modelSides[] = {6}; + }; + class B_T_Soldier_SL_F: B_Soldier_SL_F { + modelSides[] = {6}; + }; + class B_T_Soldier_TL_F: B_Soldier_TL_F { + modelSides[] = {6}; + }; + class B_T_Soldier_UAV_F: B_soldier_UAV_F { + modelSides[] = {6}; + }; + class B_T_Diver_F: B_diver_F { + modelSides[] = {6}; + }; + class B_T_Diver_Exp_F: B_diver_exp_F { + modelSides[] = {6}; + }; + class B_T_Diver_TL_F: B_diver_TL_F { + modelSides[] = {6}; + }; + class B_T_Recon_Exp_F: B_recon_exp_F { + modelSides[] = {6}; + }; + class B_T_Recon_JTAC_F: B_recon_JTAC_F { + modelSides[] = {6}; + }; + class B_T_Recon_M_F: B_recon_M_F { + modelSides[] = {6}; + }; + class B_T_Recon_Medic_F: B_recon_medic_F { + modelSides[] = {6}; + }; + class B_T_Recon_F: B_recon_F { + modelSides[] = {6}; + }; + class B_T_Recon_LAT_F: B_recon_LAT_F { + modelSides[] = {6}; + }; + class B_T_Recon_TL_F: B_recon_TL_F { + modelSides[] = {6}; + }; + class B_T_Sniper_F: B_sniper_F { + modelSides[] = {6}; + }; + class B_T_Spotter_F: B_spotter_F { + modelSides[] = {6}; + }; + class B_T_ghillie_tna_F: B_ghillie_base_F { + modelSides[] = {6}; + }; + class O_T_Soldier_A_F: O_Soldier_A_F { + modelSides[] = {6}; + }; + class O_T_Soldier_AAR_F: O_Soldier_AAR_F { + modelSides[] = {6}; + }; + class O_T_Support_AMG_F: O_support_AMG_F { + modelSides[] = {6}; + }; + class O_T_Support_AMort_F: O_support_AMort_F { + modelSides[] = {6}; + }; + class O_T_Soldier_AAA_F: O_Soldier_AAA_F { + modelSides[] = {6}; + }; + class O_T_Soldier_AAT_F: O_Soldier_AAT_F { + modelSides[] = {6}; + }; + class O_T_Soldier_AR_F: O_Soldier_AR_F { + modelSides[] = {6}; + }; + class O_T_Medic_F: O_medic_F { + modelSides[] = {6}; + }; + class O_T_Crew_F: O_crew_F { + modelSides[] = {6}; + }; + class O_T_Engineer_F: O_engineer_F { + modelSides[] = {6}; + }; + class O_T_Soldier_Exp_F: O_soldier_exp_F { + modelSides[] = {6}; + }; + class O_T_Soldier_GL_F: O_Soldier_GL_F { + modelSides[] = {6}; + }; + class O_T_Support_GMG_F: O_support_GMG_F { + modelSides[] = {6}; + }; + class O_T_Support_MG_F: O_support_MG_F { + modelSides[] = {6}; + }; + class O_T_Support_Mort_F: O_support_Mort_F { + modelSides[] = {6}; + }; + class O_T_Helicrew_F: O_helicrew_F { + modelSides[] = {6}; + }; + class O_T_Helipilot_F: O_helipilot_F { + modelSides[] = {6}; + }; + class O_T_Soldier_M_F: O_soldier_M_F { + modelSides[] = {6}; + }; + class O_T_Soldier_AA_F: O_Soldier_AA_F { + modelSides[] = {6}; + }; + class O_T_Soldier_AT_F: O_Soldier_AT_F { + modelSides[] = {6}; + }; + class O_T_Officer_F: O_officer_F { + modelSides[] = {6}; + }; + class O_T_Soldier_PG_F: O_soldier_PG_F { + modelSides[] = {6}; + }; + class O_T_Pilot_F: O_Pilot_F { + modelSides[] = {6}; + }; + class O_T_Soldier_Repair_F: O_soldier_repair_F { + modelSides[] = {6}; + }; + class O_T_Soldier_F: O_Soldier_F { + modelSides[] = {6}; + }; + class O_T_Soldier_LAT_F: O_Soldier_LAT_F { + modelSides[] = {6}; + }; + class O_T_Soldier_SL_F: O_Soldier_SL_F { + modelSides[] = {6}; + }; + class O_T_Soldier_TL_F: O_Soldier_TL_F { + modelSides[] = {6}; + }; + class O_T_Soldier_UAV_F: O_soldier_UAV_F { + modelSides[] = {6}; + }; + class O_T_Diver_F: O_diver_F { + modelSides[] = {6}; + }; + class O_T_Diver_Exp_F: O_diver_exp_F { + modelSides[] = {6}; + }; + class O_T_Diver_TL_F: O_diver_TL_F { + modelSides[] = {6}; + }; + class O_T_Recon_Exp_F: O_recon_exp_F { + modelSides[] = {6}; + }; + class O_T_Recon_JTAC_F: O_recon_JTAC_F { + modelSides[] = {6}; + }; + class O_T_Recon_M_F: O_recon_M_F { + modelSides[] = {6}; + }; + class O_T_Recon_Medic_F: O_recon_medic_F { + modelSides[] = {6}; + }; + class O_T_Recon_F: O_recon_F { + modelSides[] = {6}; + }; + class O_T_Recon_LAT_F: O_recon_LAT_F { + modelSides[] = {6}; + }; + class O_T_Recon_TL_F: O_recon_TL_F { + modelSides[] = {6}; + }; + class O_T_Sniper_F: O_sniper_F { + modelSides[] = {6}; + }; + class O_T_Spotter_F: O_spotter_F { + modelSides[] = {6}; + }; + class O_T_ghillie_tna_F: O_ghillie_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_Viper_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_Viper_hex_F: O_V_Soldier_Viper_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_base_F: B_Soldier_base_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_F: B_CTRG_Soldier_base_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_2_F: B_CTRG_Soldier_base_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_3_F: B_CTRG_Soldier_base_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_TL_tna_F: B_CTRG_Soldier_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_Exp_tna_F: B_CTRG_Soldier_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_Medic_tna_F: B_CTRG_Soldier_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_M_tna_F: B_CTRG_Soldier_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_tna_F: B_CTRG_Soldier_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_LAT_tna_F: B_CTRG_Soldier_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_AR_tna_F: B_CTRG_Soldier_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_JTAC_tna_F: B_CTRG_Soldier_F { + modelSides[] = {6}; + }; + class B_CTRG_Miller_F: B_CTRG_Soldier_3_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_urb_1_F: B_CTRG_Soldier_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_urb_2_F: B_CTRG_Soldier_2_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_urb_3_F: B_CTRG_Soldier_3_F { + modelSides[] = {6}; + }; + class O_V_Soldier_base_F: O_Soldier_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_hex_F: O_V_Soldier_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_TL_hex_F: O_V_Soldier_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_Exp_hex_F: O_V_Soldier_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_Medic_hex_F: O_V_Soldier_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_M_hex_F: O_V_Soldier_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_LAT_hex_F: O_V_Soldier_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_JTAC_hex_F: O_V_Soldier_base_F { + modelSides[] = {6}; + }; + class O_V_Soldier_ghex_F: O_V_Soldier_hex_F { + modelSides[] = {6}; + }; + class O_V_Soldier_TL_ghex_F: O_V_Soldier_TL_hex_F { + modelSides[] = {6}; + }; + class O_V_Soldier_Exp_ghex_F: O_V_Soldier_Exp_hex_F { + modelSides[] = {6}; + }; + class O_V_Soldier_Medic_ghex_F: O_V_Soldier_Medic_hex_F { + modelSides[] = {6}; + }; + class O_V_Soldier_M_ghex_F: O_V_Soldier_M_hex_F { + modelSides[] = {6}; + }; + class O_V_Soldier_LAT_ghex_F: O_V_Soldier_LAT_hex_F { + modelSides[] = {6}; + }; + class O_V_Soldier_JTAC_ghex_F: O_V_Soldier_JTAC_hex_F { + modelSides[] = {6}; + }; + class B_GEN_Soldier_base_F: B_Soldier_F { + modelSides[] = {6}; + }; + class B_GEN_Soldier_F: B_GEN_Soldier_base_F { + modelSides[] = {6}; + }; + class B_GEN_Commander_F: B_GEN_Soldier_base_F { + modelSides[] = {6}; + }; + class C_man_sport_1_F: C_man_1 { + modelSides[] = {6}; + }; + class C_man_sport_1_F_afro: C_man_sport_1_F { + modelSides[] = {6}; + }; + class C_man_sport_1_F_euro: C_man_sport_1_F { + modelSides[] = {6}; + }; + class C_man_sport_1_F_asia: C_man_sport_1_F { + modelSides[] = {6}; + }; + class C_man_sport_1_F_tanoan: C_man_sport_1_F { + modelSides[] = {6}; + }; + class C_man_sport_2_F: C_man_1 { + modelSides[] = {6}; + }; + class C_man_sport_2_F_afro: C_man_sport_2_F { + modelSides[] = {6}; + }; + class C_man_sport_2_F_euro: C_man_sport_2_F { + modelSides[] = {6}; + }; + class C_man_sport_2_F_asia: C_man_sport_2_F { + modelSides[] = {6}; + }; + class C_man_sport_2_F_tanoan: C_man_sport_2_F { + modelSides[] = {6}; + }; + class C_man_sport_3_F: C_man_1 { + modelSides[] = {6}; + }; + class C_man_sport_3_F_afro: C_man_sport_3_F { + modelSides[] = {6}; + }; + class C_man_sport_3_F_euro: C_man_sport_3_F { + modelSides[] = {6}; + }; + class C_man_sport_3_F_asia: C_man_sport_3_F { + modelSides[] = {6}; + }; + class C_man_sport_3_F_tanoan: C_man_sport_3_F { + modelSides[] = {6}; + }; + class C_Man_casual_1_F: C_man_1 { + modelSides[] = {6}; + }; + class C_Man_casual_1_F_afro: C_Man_casual_1_F { + modelSides[] = {6}; + }; + class C_Man_casual_1_F_euro: C_Man_casual_1_F { + modelSides[] = {6}; + }; + class C_Man_casual_1_F_asia: C_Man_casual_1_F { + modelSides[] = {6}; + }; + class C_Man_casual_1_F_tanoan: C_Man_casual_1_F { + modelSides[] = {6}; + }; + class C_Man_casual_2_F: C_Man_casual_1_F { + modelSides[] = {6}; + }; + class C_Man_casual_2_F_afro: C_Man_casual_2_F { + modelSides[] = {6}; + }; + class C_Man_casual_2_F_euro: C_Man_casual_2_F { + modelSides[] = {6}; + }; + class C_Man_casual_2_F_asia: C_Man_casual_2_F { + modelSides[] = {6}; + }; + class C_Man_casual_2_F_tanoan: C_Man_casual_2_F { + modelSides[] = {6}; + }; + class C_Man_casual_3_F: C_Man_casual_1_F { + modelSides[] = {6}; + }; + class C_Man_casual_3_F_afro: C_Man_casual_3_F { + modelSides[] = {6}; + }; + class C_Man_casual_3_F_euro: C_Man_casual_3_F { + modelSides[] = {6}; + }; + class C_Man_casual_3_F_asia: C_Man_casual_3_F { + modelSides[] = {6}; + }; + class C_Man_casual_3_F_tanoan: C_Man_casual_3_F { + modelSides[] = {6}; + }; + class C_Man_casual_4_F: C_Man_casual_1_F { + modelSides[] = {6}; + }; + class C_Man_casual_4_F_afro: C_Man_casual_4_F { + modelSides[] = {6}; + }; + class C_Man_casual_4_F_euro: C_Man_casual_4_F { + modelSides[] = {6}; + }; + class C_Man_casual_4_F_asia: C_Man_casual_4_F { + modelSides[] = {6}; + }; + class C_Man_casual_4_F_tanoan: C_Man_casual_4_F { + modelSides[] = {6}; + }; + class C_Man_casual_5_F: C_Man_casual_4_F { + modelSides[] = {6}; + }; + class C_Man_casual_5_F_afro: C_Man_casual_5_F { + modelSides[] = {6}; + }; + class C_Man_casual_5_F_euro: C_Man_casual_5_F { + modelSides[] = {6}; + }; + class C_Man_casual_5_F_asia: C_Man_casual_5_F { + modelSides[] = {6}; + }; + class C_Man_casual_5_F_tanoan: C_Man_casual_5_F { + modelSides[] = {6}; + }; + class C_Man_casual_6_F: C_Man_casual_4_F { + modelSides[] = {6}; + }; + class C_Man_casual_6_F_afro: C_Man_casual_6_F { + modelSides[] = {6}; + }; + class C_Man_casual_6_F_euro: C_Man_casual_6_F { + modelSides[] = {6}; + }; + class C_Man_casual_6_F_asia: C_Man_casual_6_F { + modelSides[] = {6}; + }; + class C_Man_casual_6_F_tanoan: C_Man_casual_6_F { + modelSides[] = {6}; + }; + class B_Survivor_F: B_Soldier_F { + modelSides[] = {6}; + }; + class O_Survivor_F: O_Soldier_F { + modelSides[] = {6}; + }; + class I_Survivor_F: I_soldier_F { + modelSides[] = {6}; + }; + class B_Soldier_universal_F: B_Soldier_F { + modelSides[] = {6}; + }; + class B_G_Soldier_universal_F: B_G_Soldier_F { + modelSides[] = {6}; + }; + class O_Soldier_universal_F: O_Soldier_F { + modelSides[] = {6}; + }; + class O_G_Soldier_universal_F: O_G_Soldier_F { + modelSides[] = {6}; + }; + class I_Soldier_universal_F: I_soldier_F { + modelSides[] = {6}; + }; + class I_G_Soldier_universal_F: I_G_Soldier_F { + modelSides[] = {6}; + }; + class B_T_Soldier_universal_F: B_T_Soldier_F { + modelSides[] = {6}; + }; + class O_T_Soldier_universal_F: O_T_Soldier_F { + modelSides[] = {6}; + }; + class I_C_Soldier_universal_F: I_C_Soldier_Para_1_F { + modelSides[] = {6}; + }; + class C_Man_French_universal_F: C_Man_casual_1_F { + modelSides[] = {6}; + }; + class B_CTRG_Soldier_universal_F: B_CTRG_Soldier_tna_F { + modelSides[] = {6}; + }; + class B_GEN_Soldier_universal_F: B_GEN_Soldier_F { + modelSides[] = {6}; + }; +}; diff --git a/optionals/nouniformrestrictions/README.md b/optionals/nouniformrestrictions/README.md new file mode 100644 index 0000000000..cb7dfe4c5b --- /dev/null +++ b/optionals/nouniformrestrictions/README.md @@ -0,0 +1,12 @@ +ace_nouniformrestrictions +======= + +Removes side restrictions from all vanilla uniforms. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [654wak654](https://github.com/654wak654) +- [Jonpas](https://github.com/jonpas) diff --git a/optionals/nouniformrestrictions/XEH_PREP.hpp b/optionals/nouniformrestrictions/XEH_PREP.hpp new file mode 100644 index 0000000000..5cf4c3d8e0 --- /dev/null +++ b/optionals/nouniformrestrictions/XEH_PREP.hpp @@ -0,0 +1 @@ +PREP(exportConfig); diff --git a/optionals/nouniformrestrictions/XEH_preInit.sqf b/optionals/nouniformrestrictions/XEH_preInit.sqf new file mode 100644 index 0000000000..a7feade1c3 --- /dev/null +++ b/optionals/nouniformrestrictions/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +#include "XEH_PREP.hpp" + +ADDON = true; diff --git a/optionals/nouniformrestrictions/XEH_preStart.sqf b/optionals/nouniformrestrictions/XEH_preStart.sqf new file mode 100644 index 0000000000..022888575e --- /dev/null +++ b/optionals/nouniformrestrictions/XEH_preStart.sqf @@ -0,0 +1,3 @@ +#include "script_component.hpp" + +#include "XEH_PREP.hpp" diff --git a/optionals/nouniformrestrictions/config.cpp b/optionals/nouniformrestrictions/config.cpp new file mode 100644 index 0000000000..2b658fdb85 --- /dev/null +++ b/optionals/nouniformrestrictions/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + name = COMPONENT_NAME; + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author = ECSTRING(common,ACETeam); + authors[] = {"654wak654", "jonpas"}; + url = ECSTRING(main,URL); + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" diff --git a/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf b/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf new file mode 100644 index 0000000000..60ac98cf98 --- /dev/null +++ b/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf @@ -0,0 +1,52 @@ +/* + * Author: BaerMitUmlaut, 654wak654 + * Generates the CfgVehicles.hpp to unlock all uniforms. + * + * Arguments: + * None + * + * Return Value: + * CfgVehicles.hpp content + * + * Example: + * [] call ace_nouniformrestrictions_fnc_exportConfig + * + * Public: [Yes] + */ +#include "script_component.hpp" + +private _modifyClasses = []; +private _baseClasses = []; +{ + private _modifyClass = { + if (!isNull (_x >> "modelSides")) exitWith {_x}; + } forEach (configHierarchy _x); + private _baseClass = inheritsFrom _modifyClass; + _modifyClasses pushBackUnique [_modifyClass, _baseClass]; + if !(_baseClass in (_modifyClasses apply {_x select 0})) then { + _baseClasses pushBackUnique _baseClass; + }; + false +} count ( + ("!isNull (_x >> 'modelSides') &&" + + "{!(getArray (_x >> 'modelSides') isEqualTo [6])} &&" + + "{!(getArray (_x >> 'modelSides') isEqualTo [0,1,2,3])}") + configClasses (configFile >> "CfgVehicles") +); + +private _nl = toString [13, 10]; +private _output = "class CfgVehicles {" + _nl; +{ + ADD(_output,format [ARR_3(" class %1;%2",configName _x,_nl)]); + false +} count _baseClasses; +ADD(_output,_nl); +{ + _x params ["_class", "_parent"]; + ADD(_output,format [ARR_4(" class %1: %2 {%3 modelSides[] = {6};%3 };%3",configName _class,configName _parent,_nl)]); + false +} count _modifyClasses; +ADD(_output,"};"); + +copyToClipboard _output; +_output; diff --git a/optionals/nouniformrestrictions/functions/script_component.hpp b/optionals/nouniformrestrictions/functions/script_component.hpp new file mode 100644 index 0000000000..6a559480df --- /dev/null +++ b/optionals/nouniformrestrictions/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\nouniformrestrictions\script_component.hpp" diff --git a/optionals/nouniformrestrictions/script_component.hpp b/optionals/nouniformrestrictions/script_component.hpp new file mode 100644 index 0000000000..521551c4cd --- /dev/null +++ b/optionals/nouniformrestrictions/script_component.hpp @@ -0,0 +1,18 @@ +#define COMPONENT nouniformrestrictions +#define COMPONENT_BEAUTIFIED No Uniform Restrictions +#include "\z\ace\addons\main\script_mod.hpp" + +// #define DEBUG_MODE_FULL +// #define DISABLE_COMPILE_CACHE +// #define CBA_DEBUG_SYNCHRONOUS +// #define ENABLE_PERFORMANCE_COUNTERS + +#ifdef DEBUG_ENABLED_UNIFORMS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_UNIFORMS + #define DEBUG_SETTINGS DEBUG_SETTINGS_UNIFORMS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" From d44770a27e92d34b9898486b41ff2885d3768d1c Mon Sep 17 00:00:00 2001 From: ace3mod Date: Thu, 27 Oct 2016 19:35:23 +0200 Subject: [PATCH 060/826] [Docs] Update component dependencies Automatically committed through Travis CI. [ci skip] --- docs/_includes/dependencies_list.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/_includes/dependencies_list.md b/docs/_includes/dependencies_list.md index 09de6ba5a3..4a3a43fab5 100644 --- a/docs/_includes/dependencies_list.md +++ b/docs/_includes/dependencies_list.md @@ -470,6 +470,10 @@ `ace_common` {% endif %} +{% if include.component == "nouniformrestrictions" %} +`ace_common` +{% endif %} + {% if include.component == "particles" %} `ace_common` {% endif %} From aeb0614e7eeaaee34239d8041c327105a55bf064 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 27 Oct 2016 12:54:58 -0500 Subject: [PATCH 061/826] Cleanup map gesture sync / color mapping (#4486) * Cleanup map gesture sync / color mapping - Adds ace_common_fnc_setPlayerOwner which syncs player's owner var - Redo publicVarClient with CBA's ownerEvent - Remove old ace_settings - Make color module run globaly - Ad public ace_map_gestures_fnc_addGroupColorMapping * fix return --- addons/common/XEH_PREP.hpp | 1 + .../common/functions/fnc_setPlayerOwner.sqf | 54 +++++++++++++++++++ addons/map_gestures/ACE_Settings.hpp | 14 ----- addons/map_gestures/CfgEventHandlers.hpp | 1 - addons/map_gestures/CfgVehicles.hpp | 2 +- addons/map_gestures/XEH_PREP.hpp | 2 +- addons/map_gestures/XEH_postInit.sqf | 11 ++++ addons/map_gestures/XEH_preInit.sqf | 2 + addons/map_gestures/XEH_serverPostInit.sqf | 3 -- .../functions/fnc_addGroupColorMapping.sqf | 30 +++++++++++ .../functions/fnc_assignClientIDOnServer.sqf | 24 --------- .../functions/fnc_drawMapGestures.sqf | 42 +++++++-------- .../functions/fnc_getProximityPlayers.sqf | 5 +- .../functions/fnc_moduleGroupSettings.sqf | 21 ++------ .../map_gestures/functions/fnc_transmit.sqf | 21 ++++---- .../functions/fnc_transmitterInit.sqf | 10 +--- addons/map_gestures/stringtable.xml | 47 +--------------- 17 files changed, 141 insertions(+), 149 deletions(-) create mode 100644 addons/common/functions/fnc_setPlayerOwner.sqf delete mode 100644 addons/map_gestures/XEH_serverPostInit.sqf create mode 100644 addons/map_gestures/functions/fnc_addGroupColorMapping.sqf delete mode 100644 addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp index 44e6010b4e..3f6f264699 100644 --- a/addons/common/XEH_PREP.hpp +++ b/addons/common/XEH_PREP.hpp @@ -141,6 +141,7 @@ PREP(setHearingCapability); PREP(setName); PREP(setParameter); PREP(setPitchBankYaw); +PREP(setPlayerOwner); PREP(setProne); PREP(setSetting); PREP(setSettingFromConfig); diff --git a/addons/common/functions/fnc_setPlayerOwner.sqf b/addons/common/functions/fnc_setPlayerOwner.sqf new file mode 100644 index 0000000000..5b21db0190 --- /dev/null +++ b/addons/common/functions/fnc_setPlayerOwner.sqf @@ -0,0 +1,54 @@ +/* + * Author: PabstMirror + * Sets the player's owner id as a variable on his player ojbect. + * Should be called on all machines (including server) + * Note: Needs to wait for CBA_clientID to be recieved from server. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_common_fnc_setPlayerOwner + * + * Public: No + */ + +// #define DEBUG_MODE_FULL +#include "script_component.hpp" + +if (missionNameSpace getVariable [QGVAR(setPlayerOwnerRunning), false]) exitWith {}; +GVAR(setPlayerOwnerRunning) = true; + +if (isServer) then { + addMissionEventHandler ["HandleDisconnect", { + params ["_dcPlayer"]; + TRACE_1("HandleDisconnect eh",_dcPlayer); + if (!isNil {_dcPlayer getVariable QGVAR(playerOwner)}) then { + _dcPlayer setVariable [QGVAR(playerOwner), nil, true]; + }; + }]; +}; + +if (hasInterface) then { + [{ + (!isNil "CBA_clientID") && {CBA_clientID > -1} + }, { + TRACE_1("CBA_clientID ready",CBA_clientID); + + ["unit", { + params ["_newUnit", "_oldUnit"]; + TRACE_2("unit changed",_newUnit,_oldUnit); + if ((_oldUnit getVariable [QGVAR(playerOwner), -1]) == CBA_clientID) then { + _oldUnit setVariable [QGVAR(playerOwner), nil, true]; + }; + if (alive _newUnit) then { + _newUnit setVariable [QGVAR(playerOwner), CBA_clientID, true]; + }; + }, true] call CBA_fnc_addPlayerEventHandler; + + }, []] call CBA_fnc_waitUntilAndExecute; +}; + diff --git a/addons/map_gestures/ACE_Settings.hpp b/addons/map_gestures/ACE_Settings.hpp index 3730c08c58..bb01592230 100644 --- a/addons/map_gestures/ACE_Settings.hpp +++ b/addons/map_gestures/ACE_Settings.hpp @@ -44,18 +44,4 @@ class ACE_Settings { typeName = "COLOR"; value[] = {1, 0.88, 0, 0.7}; }; - class GVAR(groupColorConfigurations) { - displayName = CSTRING(groupColorConfigurations_displayName); - description = CSTRING(groupColorConfigurations_description); - category = CSTRING(mapGestures_category); - typeName = "ARRAY"; - value[] = {}; - }; - class GVAR(groupColorConfigurationMapping) { - displayName = CSTRING(groupColorConfigurationMapping_displayName); - description = CSTRING(groupColorConfigurationMapping_description); - category = CSTRING(mapGestures_category); - typeName = "ARRAY"; - value[] = {{}, {}}; - }; }; diff --git a/addons/map_gestures/CfgEventHandlers.hpp b/addons/map_gestures/CfgEventHandlers.hpp index b0848d0248..becf395052 100644 --- a/addons/map_gestures/CfgEventHandlers.hpp +++ b/addons/map_gestures/CfgEventHandlers.hpp @@ -14,6 +14,5 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_postInit)); - serverInit = QUOTE(call COMPILE_FILE(XEH_serverPostInit)); }; }; diff --git a/addons/map_gestures/CfgVehicles.hpp b/addons/map_gestures/CfgVehicles.hpp index 5593d66181..0745c70a16 100644 --- a/addons/map_gestures/CfgVehicles.hpp +++ b/addons/map_gestures/CfgVehicles.hpp @@ -47,7 +47,7 @@ class CfgVehicles { category = "ACE"; displayName = CSTRING(moduleGroupSettings_displayName); function = QFUNC(moduleGroupSettings); - isGlobal = 0; + isGlobal = 2; author = ECSTRING(common,ACETeam); icon = QPATHTOF(ui\icon_module_map_gestures_ca.paa); class Arguments { diff --git a/addons/map_gestures/XEH_PREP.hpp b/addons/map_gestures/XEH_PREP.hpp index eba9f5bfe8..8d457bd7e0 100644 --- a/addons/map_gestures/XEH_PREP.hpp +++ b/addons/map_gestures/XEH_PREP.hpp @@ -1,5 +1,5 @@ -PREP(assignClientIDOnServer); +PREP(addGroupColorMapping); PREP(drawMapGestures); PREP(endTransmit); PREP(getProximityPlayers); diff --git a/addons/map_gestures/XEH_postInit.sqf b/addons/map_gestures/XEH_postInit.sqf index 3d93337aa6..cc3daf6a06 100644 --- a/addons/map_gestures/XEH_postInit.sqf +++ b/addons/map_gestures/XEH_postInit.sqf @@ -8,6 +8,17 @@ if (!hasInterface) exitWith {}; ["ace_settingsInitialized", { if (!GVAR(enabled)) exitWith {}; + + // This will set QEGVAR(common,playerOwner) var on player objects + [] call EFUNC(common,setPlayerOwner); + + GVAR(pointPosition) = [0,0,0]; + + [QGVAR(syncPos), { + params ["_unit", "_pointPos"]; + _unit setVariable [QGVAR(pointPosition), _pointPos]; + }] call CBA_fnc_addEventHandler; + [{ if (isNull (findDisplay 12)) exitWith {}; diff --git a/addons/map_gestures/XEH_preInit.sqf b/addons/map_gestures/XEH_preInit.sqf index a7feade1c3..198d66e02d 100644 --- a/addons/map_gestures/XEH_preInit.sqf +++ b/addons/map_gestures/XEH_preInit.sqf @@ -4,4 +4,6 @@ ADDON = false; #include "XEH_PREP.hpp" +GVAR(GroupColorCfgMappingNew) = call CBA_fnc_createNamespace; + ADDON = true; diff --git a/addons/map_gestures/XEH_serverPostInit.sqf b/addons/map_gestures/XEH_serverPostInit.sqf deleted file mode 100644 index 1b70e24149..0000000000 --- a/addons/map_gestures/XEH_serverPostInit.sqf +++ /dev/null @@ -1,3 +0,0 @@ -#include "script_component.hpp" - -[QGVAR(noOwnerID), FUNC(assignClientIDOnServer)] call CBA_fnc_addEventHandler; diff --git a/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf b/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf new file mode 100644 index 0000000000..949aa60da1 --- /dev/null +++ b/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf @@ -0,0 +1,30 @@ +/* + * Author: Dslyecxi, MikeMatrix, PabstMirror + * Adds a group id color mapping. + * + * Arguments: + * 0: Group ID or group + * 1: Leader color array (4 numbers including alpha) + * 2: Unit (non-leader) color array (4 numbers including alpha) + * + * Return Value: + * None + * + * Example: + * ["Alpha 1-1", [1,0,0,1], [0,1,0,1]] call ace_map_gestures_fnc_addGroupColorMapping + * + * Public: Yes + */ +#include "script_component.hpp" + +if (!params [["_group", "", [grpNull, ""]], ["_leadColor", [1,1,1,1], [[]], 4], ["_unitColor", [1,1,1,1], [[]], 4]]) exitWith { + ERROR_1("Bad Params: %1",_this); +}; +TRACE_3("params",_group,_leadColor,_unitColor); + +if (_group isEqualType grpNull) then {_group = groupID _group}; + +if (!([_leadColor] call FUNC(isValidColorArray))) exitWith {ERROR("leadColor is not a valid color array.")}; +if (!([_unitColor] call FUNC(isValidColorArray))) exitWith {ERROR("color is not a valid color array.")}; + +GVAR(GroupColorCfgMappingNew) setVariable [_group, [_leadColor, _unitColor]]; diff --git a/addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf b/addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf deleted file mode 100644 index 92b1e95ab5..0000000000 --- a/addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Author: Dslyecxi, MikeMatrix - * Assign readable client ID to unit on the server. - * - * Arguments: - * 0: Unit name - * - * Return Value: - * None - * - * Example: - * ["MikeMatrix"] call ace_map_gestures_fnc_assignClientIDOnServer - * - * Public: No - */ -#include "script_component.hpp" - -params ["_unitName"]; - -{ - if (name _x == _unitName) exitWith { - _x setVariable [QGVAR(owner_id), owner _x, true]; - }; -} count playableUnits; diff --git a/addons/map_gestures/functions/fnc_drawMapGestures.sqf b/addons/map_gestures/functions/fnc_drawMapGestures.sqf index 728126531e..237d0537f5 100644 --- a/addons/map_gestures/functions/fnc_drawMapGestures.sqf +++ b/addons/map_gestures/functions/fnc_drawMapGestures.sqf @@ -15,6 +15,8 @@ */ #include "script_component.hpp" +BEGIN_COUNTER(draw); + #define ICON_RENDER_SIZE 55 #define ICON_TEXT_ALIGN "left" #define ICON_ANGLE 0 @@ -26,36 +28,34 @@ if (!GVAR(enabled) || !visibleMap) exitWith {}; -private ["_color", "_drawPosVariableName", "_group", "_grpName", "_pos", "_unitUID"]; - params ["_mapHandle"]; // Iterate over all nearby players and render their pointer if player is transmitting. { - // Data variable name for unit - _unitUID = getPlayerUID _x; - _drawPosVariableName = if (!isNil "_unitUID" && _unitUID != "") then {format [QGVAR(%1_DrawPos), _unitUID]} else {nil}; - if (!isNil "_drawPosVariableName") then { - if (isNil {missionNamespace getVariable _drawPosVariableName}) then {missionNamespace setVariable [_drawPosVariableName, [1, 1, 1]];}; - _pos = missionNamespace getVariable _drawPosVariableName; + // Only render if the unit is alive and transmitting + if (alive _x && {_x getVariable [QGVAR(Transmit), false]}) then { - // Only render if the unit is alive and transmitting - if (alive _x && {_x getVariable QGVAR(Transmit)}) then { - _group = group _x; - _grpName = groupID _group; + private _pos = _x getVariable [QGVAR(pointPosition), [0,0,0]]; - // If color settings for the group exist, then use those, otherwise fall back to the default colors - _color = if ([GVAR(GroupColorConfigurationMapping), _grpName] call CBA_fnc_hashHasKey) then { - (GVAR(GroupColorConfigurations) select ([GVAR(GroupColorConfigurationMapping), _grpName] call CBA_fnc_hashGet)) select (_x != leader _group) - } else { - if (_x == leader _group) then {GVAR(defaultLeadColor)} else {GVAR(defaultColor)}; - }; + private _group = group _x; + private _grpName = groupID _group; - // Render icon and player name - _mapHandle drawIcon ["\a3\ui_f\data\gui\cfg\Hints\icon_text\group_1_ca.paa", _color, _pos, ICON_RENDER_SIZE, ICON_RENDER_SIZE, ICON_ANGLE, "", ICON_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; - _mapHandle drawIcon ["#(argb,8,8,3)color(0,0,0,0)", GVAR(nameTextColor), _pos, TEXT_ICON_RENDER_SIZE, TEXT_ICON_RENDER_SIZE, ICON_ANGLE, name _x, TEXT_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; + // If color settings for the group exist, then use those, otherwise fall back to the default colors + private _colorMap = GVAR(GroupColorCfgMappingNew) getVariable _grpName; + private _color = if (isNil "_colorMap") then { + [GVAR(defaultLeadColor), GVAR(defaultColor)] select (_x != leader _group); + } else { + _colorMap select (_x != leader _group); }; + + TRACE_2("",_colorMap,_color); + + // Render icon and player name + _mapHandle drawIcon ["\a3\ui_f\data\gui\cfg\Hints\icon_text\group_1_ca.paa", _color, _pos, ICON_RENDER_SIZE, ICON_RENDER_SIZE, ICON_ANGLE, "", ICON_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; + _mapHandle drawIcon ["#(argb,8,8,3)color(0,0,0,0)", GVAR(nameTextColor), _pos, TEXT_ICON_RENDER_SIZE, TEXT_ICON_RENDER_SIZE, ICON_ANGLE, name _x, TEXT_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; }; nil } count ([ACE_player, GVAR(maxRange)] call FUNC(getProximityPlayers)); + +END_COUNTER(draw); diff --git a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf index e4ec44837b..ea058f0f7e 100644 --- a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf +++ b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf @@ -10,7 +10,7 @@ * All units in proximity * * Example: - * ["example value"] call ace_module_fnc_functionName + * [player, 7] call ace_map_gestures_fnc_getProximityPlayers * * Public: No */ @@ -21,4 +21,5 @@ params ["_unit", "_range"]; private _proximityPlayers = (getPos _unit) nearEntities [["CAMAnBase"], _range]; _proximityPlayers deleteAt (_proximityPlayers find _unit); _proximityPlayers append (crew vehicle _unit); -_proximityPlayers + +_proximityPlayers select {[_x, false] call EFUNC(common,isPlayer);} diff --git a/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf b/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf index 52ae6d0a49..8f44cf5732 100644 --- a/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf +++ b/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf @@ -17,29 +17,18 @@ */ #include "script_component.hpp" -private ["_color", "_configurationGroupMappings", "_configurationIndex", "_configurations", "_leadColor"]; - params ["_logic", "_units", "_activated"]; +TRACE_3("params",_logic,_units,_activated); -if (!_activated || !isServer) exitWith {}; +if (!_activated) exitWith {}; // Transcode string setting into usable array. Example: "1,1,1,1" -> [1, 1, 1, 1] -_leadColor = call compile ("[" + (_logic getVariable ["leadColor", ""]) + "]"); +private _leadColor = call compile ("[" + (_logic getVariable ["leadColor", ""]) + "]"); if (!([_leadColor] call FUNC(isValidColorArray))) exitWith {ERROR("leadColor is not a valid color array.")}; -_color = call compile ("[" + (_logic getVariable ["color", ""]) + "]"); +private _color = call compile ("[" + (_logic getVariable ["color", ""]) + "]"); if (!([_color] call FUNC(isValidColorArray))) exitWith {ERROR("color is not a valid color array.")}; -// If we already have color configurations from another source, use those, otherwise use default. -_configurations = if (isNil QGVAR(GroupColorConfigurations)) then { [] } else { +GVAR(GroupColorConfigurations) }; -_configurationGroupMappings = if(isNil QGVAR(GroupColorConfigurationMapping)) then { [] call CBA_fnc_hashCreate } else { +GVAR(GroupColorConfigurationMapping) }; - -// Save custom color configuration and keep the index of the entry. -_configurationIndex = _configurations pushBack [_leadColor, _color]; - // Add all synchronized groups and reference custom configuration for them { - [_configurationGroupMappings, groupID group _x, _configurationIndex] call CBA_fnc_hashSet; + [group _x, _leadColor, _color] call FUNC(addGroupColorMapping); } forEach _units; - -[QGVAR(GroupColorConfigurations), _configurations, false, true] call EFUNC(common,setSetting); -[QGVAR(GroupColorConfigurationMapping), _configurationGroupMappings, false, true] call EFUNC(common,setSetting); diff --git a/addons/map_gestures/functions/fnc_transmit.sqf b/addons/map_gestures/functions/fnc_transmit.sqf index aacff9e679..166b1cb375 100644 --- a/addons/map_gestures/functions/fnc_transmit.sqf +++ b/addons/map_gestures/functions/fnc_transmit.sqf @@ -16,7 +16,7 @@ */ #include "script_component.hpp" -private ["_ownerID", "_unitUID", "_drawPosVariableName", "_playerOwnerID"]; +BEGIN_COUNTER(transmit); params ["", "_pfhId"]; @@ -29,17 +29,14 @@ if (!GVAR(EnableTransmit) || !visibleMap) exitWith { }; { - _ownerID = _x getVariable QGVAR(owner_id); - if (isNil "_ownerID") then { - [QGVAR(noOwnerID), [name _x]] call CBA_fnc_serverEvent; - } else { - _playerOwnerID = ACE_player getVariable QGVAR(owner_id); - if (!isNil "_playerOwnerID" && _ownerID != _playerOwnerID) then { - _unitUID = getPlayerUID ACE_Player; - _drawPosVariableName = if (!isNil "_unitUID" && _unitUID != "") then {format [QGVAR(%1_DrawPos), _unitUID]} else {nil}; - if (!isNil "_drawPosVariableName") then { - _ownerID publicVariableClient _drawPosVariableName; - }; + private _owner = _x getVariable [QEGVAR(common,playerOwner), -1]; + if (_owner > -1) then { + private _remotePos = _x getVariable [QGVAR(remotePos), [0,0,0]]; + if ((_remotePos distance2d GVAR(pointPosition)) > 1) then { // Only transmit when actually moving + [QGVAR(syncPos), [ACE_Player, GVAR(pointPosition)], _owner] call CBA_fnc_ownerEvent; + _x setVariable [QGVAR(remotePos), GVAR(pointPosition)]; }; }; } count ([ACE_player, GVAR(maxRange)] call FUNC(getProximityPlayers)); + +END_COUNTER(transmit); diff --git a/addons/map_gestures/functions/fnc_transmitterInit.sqf b/addons/map_gestures/functions/fnc_transmitterInit.sqf index d115fb22c5..a75ebb6e34 100644 --- a/addons/map_gestures/functions/fnc_transmitterInit.sqf +++ b/addons/map_gestures/functions/fnc_transmitterInit.sqf @@ -15,11 +15,9 @@ */ #include "script_component.hpp" -private ["_mapCtrl", "_unitUID", "_drawPosVariableName"]; - disableSerialization; -_mapCtrl = findDisplay 12 displayCtrl 51; +private _mapCtrl = findDisplay 12 displayCtrl 51; // MouseMoving EH. if (!isNil QGVAR(MouseMoveHandlerID)) then { @@ -36,11 +34,7 @@ GVAR(MouseMoveHandlerID) = _mapCtrl ctrlAddEventHandler ["MouseMoving", { ACE_player setVariable [QGVAR(Transmit), true, true]; }; - _unitUID = getPlayerUID ACE_player; - _drawPosVariableName = if (!isNil "_unitUID" && _unitUID != "") then {format [QGVAR(%1_DrawPos), _unitUID]} else {nil}; - if (!isNil "_drawPosVariableName") then { - missionNamespace setVariable [_drawPosVariableName, _control ctrlMapScreenToWorld [_posX, _posY]]; - }; + GVAR(pointPosition) = _control ctrlMapScreenToWorld [_posX, _posY]; }]; // MouseDown EH diff --git a/addons/map_gestures/stringtable.xml b/addons/map_gestures/stringtable.xml index 3cc1f6b33a..0264dfdc5b 100644 --- a/addons/map_gestures/stringtable.xml +++ b/addons/map_gestures/stringtable.xml @@ -177,51 +177,6 @@ Temps entre les actualisations de données データの更新間隔 - - Group color configurations - Configurações de cores de grupo - Konf. koloru grup - Конфигурация цвета групп - Konfigurace barvy pro skupinu - Configurazioni colori dei gruppi - Konfiguration der Gruppenfarbe - Configuración de color de grupo - Configuration des couleurs de groupe - グループで使う色の設定 - - - Group color configuration containing arrays of color pairs ([leadColor, color]). - Configuração de cores de grupo contendo arrays com pares de cores ([leadColor, color]). - Konfiguracja kolorów grup zawierająca tablice par kolorów ([kolorLidera, kolor]). - Конфигурация цвета групп содержит массив цветовых пар ([лид. цвет, цвет]). - Configurazioni colori gruppi contenenti array di coppie di colori ([leadColor, color]). - Konfiguration der Gruppenfarbe mit zugeordneten Farbpaaren der Aufstellung ([leadColor, color]). - Configuración de color de grupo conteniendo una lista de pares de colores ([colorLider, colo]). - Configuration des couleurs de groupe contenant des tableaux de paires de couleurs ([couleurDeCommandement, couleur]). - アライに格納された組によりグループの色を設定します。([leadColor, color]) - - - Hash of Group ID mapped to the Group color configuration index. - Hashes de ID de grupos mapeados para o índice de configuração de cor de grupos. - Hasz ID grup zmapowanych w indeksie konfiguracji koloru grup. - Хеш ID групп, соответствующих индексам конфигурации цвета групп. - Hash degli ID Gruppi mappati nell'indice configurazioni colori gruppi. - Hashwert der Gruppen-ID, die dem Konfigurations-Index der Gruppenfarbe zugeordnet werden. - ID de Grupo mapeado al índice de la configuración de color de grupo. - Hash de l'identifiant du groupe mappé à l'index de la configuration de la couleur du groupe. - グループ ID のハッシュはグループの色を設定するインデックスへマッピングされます。 - - - GroupID Color configuration mapping - Mapeamento de configuração para cores de GroupID - Mapowanie kolorów poprzez GroupID - Соответствие ID групп конфигурации цвета групп - Mappatura configurazioni colori GroupID - Gruppen-ID-Farbe Konfigurationszuordnung - Mapeado de ID de Grupo - Configuration du mappage de l'identifiant de la couleur du groupe. - GroupID の色への設定をマッピング - Enables the Map Gestures. Ativa os gestos no mapa @@ -270,4 +225,4 @@ マップ ジェスチャ - \ No newline at end of file + From 8c700cfd17c50eea7694d9e095ebd3fa568581e3 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 27 Oct 2016 12:54:58 -0500 Subject: [PATCH 062/826] Cleanup map gesture sync / color mapping (#4486) * Cleanup map gesture sync / color mapping - Adds ace_common_fnc_setPlayerOwner which syncs player's owner var - Redo publicVarClient with CBA's ownerEvent - Remove old ace_settings - Make color module run globaly - Ad public ace_map_gestures_fnc_addGroupColorMapping * fix return --- addons/common/XEH_PREP.hpp | 1 + .../common/functions/fnc_setPlayerOwner.sqf | 54 +++++++++++++++++++ addons/map_gestures/ACE_Settings.hpp | 14 ----- addons/map_gestures/CfgEventHandlers.hpp | 1 - addons/map_gestures/CfgVehicles.hpp | 2 +- addons/map_gestures/XEH_PREP.hpp | 2 +- addons/map_gestures/XEH_postInit.sqf | 11 ++++ addons/map_gestures/XEH_preInit.sqf | 2 + addons/map_gestures/XEH_serverPostInit.sqf | 3 -- .../functions/fnc_addGroupColorMapping.sqf | 30 +++++++++++ .../functions/fnc_assignClientIDOnServer.sqf | 24 --------- .../functions/fnc_drawMapGestures.sqf | 42 +++++++-------- .../functions/fnc_getProximityPlayers.sqf | 5 +- .../functions/fnc_moduleGroupSettings.sqf | 21 ++------ .../map_gestures/functions/fnc_transmit.sqf | 21 ++++---- .../functions/fnc_transmitterInit.sqf | 10 +--- addons/map_gestures/stringtable.xml | 47 +--------------- 17 files changed, 141 insertions(+), 149 deletions(-) create mode 100644 addons/common/functions/fnc_setPlayerOwner.sqf delete mode 100644 addons/map_gestures/XEH_serverPostInit.sqf create mode 100644 addons/map_gestures/functions/fnc_addGroupColorMapping.sqf delete mode 100644 addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf diff --git a/addons/common/XEH_PREP.hpp b/addons/common/XEH_PREP.hpp index 44e6010b4e..3f6f264699 100644 --- a/addons/common/XEH_PREP.hpp +++ b/addons/common/XEH_PREP.hpp @@ -141,6 +141,7 @@ PREP(setHearingCapability); PREP(setName); PREP(setParameter); PREP(setPitchBankYaw); +PREP(setPlayerOwner); PREP(setProne); PREP(setSetting); PREP(setSettingFromConfig); diff --git a/addons/common/functions/fnc_setPlayerOwner.sqf b/addons/common/functions/fnc_setPlayerOwner.sqf new file mode 100644 index 0000000000..5b21db0190 --- /dev/null +++ b/addons/common/functions/fnc_setPlayerOwner.sqf @@ -0,0 +1,54 @@ +/* + * Author: PabstMirror + * Sets the player's owner id as a variable on his player ojbect. + * Should be called on all machines (including server) + * Note: Needs to wait for CBA_clientID to be recieved from server. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_common_fnc_setPlayerOwner + * + * Public: No + */ + +// #define DEBUG_MODE_FULL +#include "script_component.hpp" + +if (missionNameSpace getVariable [QGVAR(setPlayerOwnerRunning), false]) exitWith {}; +GVAR(setPlayerOwnerRunning) = true; + +if (isServer) then { + addMissionEventHandler ["HandleDisconnect", { + params ["_dcPlayer"]; + TRACE_1("HandleDisconnect eh",_dcPlayer); + if (!isNil {_dcPlayer getVariable QGVAR(playerOwner)}) then { + _dcPlayer setVariable [QGVAR(playerOwner), nil, true]; + }; + }]; +}; + +if (hasInterface) then { + [{ + (!isNil "CBA_clientID") && {CBA_clientID > -1} + }, { + TRACE_1("CBA_clientID ready",CBA_clientID); + + ["unit", { + params ["_newUnit", "_oldUnit"]; + TRACE_2("unit changed",_newUnit,_oldUnit); + if ((_oldUnit getVariable [QGVAR(playerOwner), -1]) == CBA_clientID) then { + _oldUnit setVariable [QGVAR(playerOwner), nil, true]; + }; + if (alive _newUnit) then { + _newUnit setVariable [QGVAR(playerOwner), CBA_clientID, true]; + }; + }, true] call CBA_fnc_addPlayerEventHandler; + + }, []] call CBA_fnc_waitUntilAndExecute; +}; + diff --git a/addons/map_gestures/ACE_Settings.hpp b/addons/map_gestures/ACE_Settings.hpp index 3730c08c58..bb01592230 100644 --- a/addons/map_gestures/ACE_Settings.hpp +++ b/addons/map_gestures/ACE_Settings.hpp @@ -44,18 +44,4 @@ class ACE_Settings { typeName = "COLOR"; value[] = {1, 0.88, 0, 0.7}; }; - class GVAR(groupColorConfigurations) { - displayName = CSTRING(groupColorConfigurations_displayName); - description = CSTRING(groupColorConfigurations_description); - category = CSTRING(mapGestures_category); - typeName = "ARRAY"; - value[] = {}; - }; - class GVAR(groupColorConfigurationMapping) { - displayName = CSTRING(groupColorConfigurationMapping_displayName); - description = CSTRING(groupColorConfigurationMapping_description); - category = CSTRING(mapGestures_category); - typeName = "ARRAY"; - value[] = {{}, {}}; - }; }; diff --git a/addons/map_gestures/CfgEventHandlers.hpp b/addons/map_gestures/CfgEventHandlers.hpp index b0848d0248..becf395052 100644 --- a/addons/map_gestures/CfgEventHandlers.hpp +++ b/addons/map_gestures/CfgEventHandlers.hpp @@ -14,6 +14,5 @@ class Extended_PreInit_EventHandlers { class Extended_PostInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_postInit)); - serverInit = QUOTE(call COMPILE_FILE(XEH_serverPostInit)); }; }; diff --git a/addons/map_gestures/CfgVehicles.hpp b/addons/map_gestures/CfgVehicles.hpp index 5593d66181..0745c70a16 100644 --- a/addons/map_gestures/CfgVehicles.hpp +++ b/addons/map_gestures/CfgVehicles.hpp @@ -47,7 +47,7 @@ class CfgVehicles { category = "ACE"; displayName = CSTRING(moduleGroupSettings_displayName); function = QFUNC(moduleGroupSettings); - isGlobal = 0; + isGlobal = 2; author = ECSTRING(common,ACETeam); icon = QPATHTOF(ui\icon_module_map_gestures_ca.paa); class Arguments { diff --git a/addons/map_gestures/XEH_PREP.hpp b/addons/map_gestures/XEH_PREP.hpp index eba9f5bfe8..8d457bd7e0 100644 --- a/addons/map_gestures/XEH_PREP.hpp +++ b/addons/map_gestures/XEH_PREP.hpp @@ -1,5 +1,5 @@ -PREP(assignClientIDOnServer); +PREP(addGroupColorMapping); PREP(drawMapGestures); PREP(endTransmit); PREP(getProximityPlayers); diff --git a/addons/map_gestures/XEH_postInit.sqf b/addons/map_gestures/XEH_postInit.sqf index 3d93337aa6..cc3daf6a06 100644 --- a/addons/map_gestures/XEH_postInit.sqf +++ b/addons/map_gestures/XEH_postInit.sqf @@ -8,6 +8,17 @@ if (!hasInterface) exitWith {}; ["ace_settingsInitialized", { if (!GVAR(enabled)) exitWith {}; + + // This will set QEGVAR(common,playerOwner) var on player objects + [] call EFUNC(common,setPlayerOwner); + + GVAR(pointPosition) = [0,0,0]; + + [QGVAR(syncPos), { + params ["_unit", "_pointPos"]; + _unit setVariable [QGVAR(pointPosition), _pointPos]; + }] call CBA_fnc_addEventHandler; + [{ if (isNull (findDisplay 12)) exitWith {}; diff --git a/addons/map_gestures/XEH_preInit.sqf b/addons/map_gestures/XEH_preInit.sqf index a7feade1c3..198d66e02d 100644 --- a/addons/map_gestures/XEH_preInit.sqf +++ b/addons/map_gestures/XEH_preInit.sqf @@ -4,4 +4,6 @@ ADDON = false; #include "XEH_PREP.hpp" +GVAR(GroupColorCfgMappingNew) = call CBA_fnc_createNamespace; + ADDON = true; diff --git a/addons/map_gestures/XEH_serverPostInit.sqf b/addons/map_gestures/XEH_serverPostInit.sqf deleted file mode 100644 index 1b70e24149..0000000000 --- a/addons/map_gestures/XEH_serverPostInit.sqf +++ /dev/null @@ -1,3 +0,0 @@ -#include "script_component.hpp" - -[QGVAR(noOwnerID), FUNC(assignClientIDOnServer)] call CBA_fnc_addEventHandler; diff --git a/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf b/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf new file mode 100644 index 0000000000..949aa60da1 --- /dev/null +++ b/addons/map_gestures/functions/fnc_addGroupColorMapping.sqf @@ -0,0 +1,30 @@ +/* + * Author: Dslyecxi, MikeMatrix, PabstMirror + * Adds a group id color mapping. + * + * Arguments: + * 0: Group ID or group + * 1: Leader color array (4 numbers including alpha) + * 2: Unit (non-leader) color array (4 numbers including alpha) + * + * Return Value: + * None + * + * Example: + * ["Alpha 1-1", [1,0,0,1], [0,1,0,1]] call ace_map_gestures_fnc_addGroupColorMapping + * + * Public: Yes + */ +#include "script_component.hpp" + +if (!params [["_group", "", [grpNull, ""]], ["_leadColor", [1,1,1,1], [[]], 4], ["_unitColor", [1,1,1,1], [[]], 4]]) exitWith { + ERROR_1("Bad Params: %1",_this); +}; +TRACE_3("params",_group,_leadColor,_unitColor); + +if (_group isEqualType grpNull) then {_group = groupID _group}; + +if (!([_leadColor] call FUNC(isValidColorArray))) exitWith {ERROR("leadColor is not a valid color array.")}; +if (!([_unitColor] call FUNC(isValidColorArray))) exitWith {ERROR("color is not a valid color array.")}; + +GVAR(GroupColorCfgMappingNew) setVariable [_group, [_leadColor, _unitColor]]; diff --git a/addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf b/addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf deleted file mode 100644 index 92b1e95ab5..0000000000 --- a/addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Author: Dslyecxi, MikeMatrix - * Assign readable client ID to unit on the server. - * - * Arguments: - * 0: Unit name - * - * Return Value: - * None - * - * Example: - * ["MikeMatrix"] call ace_map_gestures_fnc_assignClientIDOnServer - * - * Public: No - */ -#include "script_component.hpp" - -params ["_unitName"]; - -{ - if (name _x == _unitName) exitWith { - _x setVariable [QGVAR(owner_id), owner _x, true]; - }; -} count playableUnits; diff --git a/addons/map_gestures/functions/fnc_drawMapGestures.sqf b/addons/map_gestures/functions/fnc_drawMapGestures.sqf index 728126531e..237d0537f5 100644 --- a/addons/map_gestures/functions/fnc_drawMapGestures.sqf +++ b/addons/map_gestures/functions/fnc_drawMapGestures.sqf @@ -15,6 +15,8 @@ */ #include "script_component.hpp" +BEGIN_COUNTER(draw); + #define ICON_RENDER_SIZE 55 #define ICON_TEXT_ALIGN "left" #define ICON_ANGLE 0 @@ -26,36 +28,34 @@ if (!GVAR(enabled) || !visibleMap) exitWith {}; -private ["_color", "_drawPosVariableName", "_group", "_grpName", "_pos", "_unitUID"]; - params ["_mapHandle"]; // Iterate over all nearby players and render their pointer if player is transmitting. { - // Data variable name for unit - _unitUID = getPlayerUID _x; - _drawPosVariableName = if (!isNil "_unitUID" && _unitUID != "") then {format [QGVAR(%1_DrawPos), _unitUID]} else {nil}; - if (!isNil "_drawPosVariableName") then { - if (isNil {missionNamespace getVariable _drawPosVariableName}) then {missionNamespace setVariable [_drawPosVariableName, [1, 1, 1]];}; - _pos = missionNamespace getVariable _drawPosVariableName; + // Only render if the unit is alive and transmitting + if (alive _x && {_x getVariable [QGVAR(Transmit), false]}) then { - // Only render if the unit is alive and transmitting - if (alive _x && {_x getVariable QGVAR(Transmit)}) then { - _group = group _x; - _grpName = groupID _group; + private _pos = _x getVariable [QGVAR(pointPosition), [0,0,0]]; - // If color settings for the group exist, then use those, otherwise fall back to the default colors - _color = if ([GVAR(GroupColorConfigurationMapping), _grpName] call CBA_fnc_hashHasKey) then { - (GVAR(GroupColorConfigurations) select ([GVAR(GroupColorConfigurationMapping), _grpName] call CBA_fnc_hashGet)) select (_x != leader _group) - } else { - if (_x == leader _group) then {GVAR(defaultLeadColor)} else {GVAR(defaultColor)}; - }; + private _group = group _x; + private _grpName = groupID _group; - // Render icon and player name - _mapHandle drawIcon ["\a3\ui_f\data\gui\cfg\Hints\icon_text\group_1_ca.paa", _color, _pos, ICON_RENDER_SIZE, ICON_RENDER_SIZE, ICON_ANGLE, "", ICON_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; - _mapHandle drawIcon ["#(argb,8,8,3)color(0,0,0,0)", GVAR(nameTextColor), _pos, TEXT_ICON_RENDER_SIZE, TEXT_ICON_RENDER_SIZE, ICON_ANGLE, name _x, TEXT_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; + // If color settings for the group exist, then use those, otherwise fall back to the default colors + private _colorMap = GVAR(GroupColorCfgMappingNew) getVariable _grpName; + private _color = if (isNil "_colorMap") then { + [GVAR(defaultLeadColor), GVAR(defaultColor)] select (_x != leader _group); + } else { + _colorMap select (_x != leader _group); }; + + TRACE_2("",_colorMap,_color); + + // Render icon and player name + _mapHandle drawIcon ["\a3\ui_f\data\gui\cfg\Hints\icon_text\group_1_ca.paa", _color, _pos, ICON_RENDER_SIZE, ICON_RENDER_SIZE, ICON_ANGLE, "", ICON_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; + _mapHandle drawIcon ["#(argb,8,8,3)color(0,0,0,0)", GVAR(nameTextColor), _pos, TEXT_ICON_RENDER_SIZE, TEXT_ICON_RENDER_SIZE, ICON_ANGLE, name _x, TEXT_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN]; }; nil } count ([ACE_player, GVAR(maxRange)] call FUNC(getProximityPlayers)); + +END_COUNTER(draw); diff --git a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf index e4ec44837b..ea058f0f7e 100644 --- a/addons/map_gestures/functions/fnc_getProximityPlayers.sqf +++ b/addons/map_gestures/functions/fnc_getProximityPlayers.sqf @@ -10,7 +10,7 @@ * All units in proximity * * Example: - * ["example value"] call ace_module_fnc_functionName + * [player, 7] call ace_map_gestures_fnc_getProximityPlayers * * Public: No */ @@ -21,4 +21,5 @@ params ["_unit", "_range"]; private _proximityPlayers = (getPos _unit) nearEntities [["CAMAnBase"], _range]; _proximityPlayers deleteAt (_proximityPlayers find _unit); _proximityPlayers append (crew vehicle _unit); -_proximityPlayers + +_proximityPlayers select {[_x, false] call EFUNC(common,isPlayer);} diff --git a/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf b/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf index 52ae6d0a49..8f44cf5732 100644 --- a/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf +++ b/addons/map_gestures/functions/fnc_moduleGroupSettings.sqf @@ -17,29 +17,18 @@ */ #include "script_component.hpp" -private ["_color", "_configurationGroupMappings", "_configurationIndex", "_configurations", "_leadColor"]; - params ["_logic", "_units", "_activated"]; +TRACE_3("params",_logic,_units,_activated); -if (!_activated || !isServer) exitWith {}; +if (!_activated) exitWith {}; // Transcode string setting into usable array. Example: "1,1,1,1" -> [1, 1, 1, 1] -_leadColor = call compile ("[" + (_logic getVariable ["leadColor", ""]) + "]"); +private _leadColor = call compile ("[" + (_logic getVariable ["leadColor", ""]) + "]"); if (!([_leadColor] call FUNC(isValidColorArray))) exitWith {ERROR("leadColor is not a valid color array.")}; -_color = call compile ("[" + (_logic getVariable ["color", ""]) + "]"); +private _color = call compile ("[" + (_logic getVariable ["color", ""]) + "]"); if (!([_color] call FUNC(isValidColorArray))) exitWith {ERROR("color is not a valid color array.")}; -// If we already have color configurations from another source, use those, otherwise use default. -_configurations = if (isNil QGVAR(GroupColorConfigurations)) then { [] } else { +GVAR(GroupColorConfigurations) }; -_configurationGroupMappings = if(isNil QGVAR(GroupColorConfigurationMapping)) then { [] call CBA_fnc_hashCreate } else { +GVAR(GroupColorConfigurationMapping) }; - -// Save custom color configuration and keep the index of the entry. -_configurationIndex = _configurations pushBack [_leadColor, _color]; - // Add all synchronized groups and reference custom configuration for them { - [_configurationGroupMappings, groupID group _x, _configurationIndex] call CBA_fnc_hashSet; + [group _x, _leadColor, _color] call FUNC(addGroupColorMapping); } forEach _units; - -[QGVAR(GroupColorConfigurations), _configurations, false, true] call EFUNC(common,setSetting); -[QGVAR(GroupColorConfigurationMapping), _configurationGroupMappings, false, true] call EFUNC(common,setSetting); diff --git a/addons/map_gestures/functions/fnc_transmit.sqf b/addons/map_gestures/functions/fnc_transmit.sqf index aacff9e679..166b1cb375 100644 --- a/addons/map_gestures/functions/fnc_transmit.sqf +++ b/addons/map_gestures/functions/fnc_transmit.sqf @@ -16,7 +16,7 @@ */ #include "script_component.hpp" -private ["_ownerID", "_unitUID", "_drawPosVariableName", "_playerOwnerID"]; +BEGIN_COUNTER(transmit); params ["", "_pfhId"]; @@ -29,17 +29,14 @@ if (!GVAR(EnableTransmit) || !visibleMap) exitWith { }; { - _ownerID = _x getVariable QGVAR(owner_id); - if (isNil "_ownerID") then { - [QGVAR(noOwnerID), [name _x]] call CBA_fnc_serverEvent; - } else { - _playerOwnerID = ACE_player getVariable QGVAR(owner_id); - if (!isNil "_playerOwnerID" && _ownerID != _playerOwnerID) then { - _unitUID = getPlayerUID ACE_Player; - _drawPosVariableName = if (!isNil "_unitUID" && _unitUID != "") then {format [QGVAR(%1_DrawPos), _unitUID]} else {nil}; - if (!isNil "_drawPosVariableName") then { - _ownerID publicVariableClient _drawPosVariableName; - }; + private _owner = _x getVariable [QEGVAR(common,playerOwner), -1]; + if (_owner > -1) then { + private _remotePos = _x getVariable [QGVAR(remotePos), [0,0,0]]; + if ((_remotePos distance2d GVAR(pointPosition)) > 1) then { // Only transmit when actually moving + [QGVAR(syncPos), [ACE_Player, GVAR(pointPosition)], _owner] call CBA_fnc_ownerEvent; + _x setVariable [QGVAR(remotePos), GVAR(pointPosition)]; }; }; } count ([ACE_player, GVAR(maxRange)] call FUNC(getProximityPlayers)); + +END_COUNTER(transmit); diff --git a/addons/map_gestures/functions/fnc_transmitterInit.sqf b/addons/map_gestures/functions/fnc_transmitterInit.sqf index d115fb22c5..a75ebb6e34 100644 --- a/addons/map_gestures/functions/fnc_transmitterInit.sqf +++ b/addons/map_gestures/functions/fnc_transmitterInit.sqf @@ -15,11 +15,9 @@ */ #include "script_component.hpp" -private ["_mapCtrl", "_unitUID", "_drawPosVariableName"]; - disableSerialization; -_mapCtrl = findDisplay 12 displayCtrl 51; +private _mapCtrl = findDisplay 12 displayCtrl 51; // MouseMoving EH. if (!isNil QGVAR(MouseMoveHandlerID)) then { @@ -36,11 +34,7 @@ GVAR(MouseMoveHandlerID) = _mapCtrl ctrlAddEventHandler ["MouseMoving", { ACE_player setVariable [QGVAR(Transmit), true, true]; }; - _unitUID = getPlayerUID ACE_player; - _drawPosVariableName = if (!isNil "_unitUID" && _unitUID != "") then {format [QGVAR(%1_DrawPos), _unitUID]} else {nil}; - if (!isNil "_drawPosVariableName") then { - missionNamespace setVariable [_drawPosVariableName, _control ctrlMapScreenToWorld [_posX, _posY]]; - }; + GVAR(pointPosition) = _control ctrlMapScreenToWorld [_posX, _posY]; }]; // MouseDown EH diff --git a/addons/map_gestures/stringtable.xml b/addons/map_gestures/stringtable.xml index 3cc1f6b33a..0264dfdc5b 100644 --- a/addons/map_gestures/stringtable.xml +++ b/addons/map_gestures/stringtable.xml @@ -177,51 +177,6 @@ Temps entre les actualisations de données データの更新間隔 - - Group color configurations - Configurações de cores de grupo - Konf. koloru grup - Конфигурация цвета групп - Konfigurace barvy pro skupinu - Configurazioni colori dei gruppi - Konfiguration der Gruppenfarbe - Configuración de color de grupo - Configuration des couleurs de groupe - グループで使う色の設定 - - - Group color configuration containing arrays of color pairs ([leadColor, color]). - Configuração de cores de grupo contendo arrays com pares de cores ([leadColor, color]). - Konfiguracja kolorów grup zawierająca tablice par kolorów ([kolorLidera, kolor]). - Конфигурация цвета групп содержит массив цветовых пар ([лид. цвет, цвет]). - Configurazioni colori gruppi contenenti array di coppie di colori ([leadColor, color]). - Konfiguration der Gruppenfarbe mit zugeordneten Farbpaaren der Aufstellung ([leadColor, color]). - Configuración de color de grupo conteniendo una lista de pares de colores ([colorLider, colo]). - Configuration des couleurs de groupe contenant des tableaux de paires de couleurs ([couleurDeCommandement, couleur]). - アライに格納された組によりグループの色を設定します。([leadColor, color]) - - - Hash of Group ID mapped to the Group color configuration index. - Hashes de ID de grupos mapeados para o índice de configuração de cor de grupos. - Hasz ID grup zmapowanych w indeksie konfiguracji koloru grup. - Хеш ID групп, соответствующих индексам конфигурации цвета групп. - Hash degli ID Gruppi mappati nell'indice configurazioni colori gruppi. - Hashwert der Gruppen-ID, die dem Konfigurations-Index der Gruppenfarbe zugeordnet werden. - ID de Grupo mapeado al índice de la configuración de color de grupo. - Hash de l'identifiant du groupe mappé à l'index de la configuration de la couleur du groupe. - グループ ID のハッシュはグループの色を設定するインデックスへマッピングされます。 - - - GroupID Color configuration mapping - Mapeamento de configuração para cores de GroupID - Mapowanie kolorów poprzez GroupID - Соответствие ID групп конфигурации цвета групп - Mappatura configurazioni colori GroupID - Gruppen-ID-Farbe Konfigurationszuordnung - Mapeado de ID de Grupo - Configuration du mappage de l'identifiant de la couleur du groupe. - GroupID の色への設定をマッピング - Enables the Map Gestures. Ativa os gestos no mapa @@ -270,4 +225,4 @@ マップ ジェスチャ - \ No newline at end of file + From 945adf8fef750b3ae4d4ec6ac8dafc0472e2c4db Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Thu, 27 Oct 2016 22:19:55 +0200 Subject: [PATCH 063/826] Fix makeJerryCan locality issues (#4600) --- addons/refuel/functions/fnc_makeJerryCan.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/refuel/functions/fnc_makeJerryCan.sqf b/addons/refuel/functions/fnc_makeJerryCan.sqf index c826948fa2..36c64a3055 100644 --- a/addons/refuel/functions/fnc_makeJerryCan.sqf +++ b/addons/refuel/functions/fnc_makeJerryCan.sqf @@ -23,8 +23,8 @@ if (isNull _target || {_target getVariable [QGVAR(jerryCan), false]}) exitWith {}; [_target, _fuelAmount] call FUNC(setFuel); -_target setVariable [QGVAR(jerryCan), true, true]; -_target setVariable [QGVAR(source), _target, true]; +_target setVariable [QGVAR(jerryCan), true]; +_target setVariable [QGVAR(source), _target]; // Main Action private _action = [QGVAR(Refuel), From 60d98df5fca774f04d1d5059b28e6cdd18ff9b0b Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Thu, 27 Oct 2016 22:19:55 +0200 Subject: [PATCH 064/826] Fix makeJerryCan locality issues (#4600) --- addons/refuel/functions/fnc_makeJerryCan.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/refuel/functions/fnc_makeJerryCan.sqf b/addons/refuel/functions/fnc_makeJerryCan.sqf index c826948fa2..36c64a3055 100644 --- a/addons/refuel/functions/fnc_makeJerryCan.sqf +++ b/addons/refuel/functions/fnc_makeJerryCan.sqf @@ -23,8 +23,8 @@ if (isNull _target || {_target getVariable [QGVAR(jerryCan), false]}) exitWith {}; [_target, _fuelAmount] call FUNC(setFuel); -_target setVariable [QGVAR(jerryCan), true, true]; -_target setVariable [QGVAR(source), _target, true]; +_target setVariable [QGVAR(jerryCan), true]; +_target setVariable [QGVAR(source), _target]; // Main Action private _action = [QGVAR(Refuel), From 2df4a28145c4c3db513591d38dc058c4fd96557a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 28 Oct 2016 12:16:23 -0500 Subject: [PATCH 065/826] Remove repair locization warning (#4607) --- addons/repair/functions/fnc_getHitPointString.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/repair/functions/fnc_getHitPointString.sqf b/addons/repair/functions/fnc_getHitPointString.sqf index 0119fd17e1..6214b00df7 100644 --- a/addons/repair/functions/fnc_getHitPointString.sqf +++ b/addons/repair/functions/fnc_getHitPointString.sqf @@ -84,7 +84,7 @@ for "_i" from 0 to (count _hitPoint) do { // Don't display part name if no string is found in stringtable if (_text == LSTRING(Hit)) then { - if (_hitPoint != "") then { WARNING_1("Hitpoint [%1] - could not be localized", _hitPoint); }; + if (_hitPoint != "") then { LOG_1("Hitpoint [%1] - could not be localized", _hitPoint); }; _text = _textDefault; }; From 7a95d660857bf341ec59a57b01b5e820ed35ba48 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 28 Oct 2016 12:16:23 -0500 Subject: [PATCH 066/826] Remove repair locization warning (#4607) --- addons/repair/functions/fnc_getHitPointString.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/repair/functions/fnc_getHitPointString.sqf b/addons/repair/functions/fnc_getHitPointString.sqf index 0119fd17e1..6214b00df7 100644 --- a/addons/repair/functions/fnc_getHitPointString.sqf +++ b/addons/repair/functions/fnc_getHitPointString.sqf @@ -84,7 +84,7 @@ for "_i" from 0 to (count _hitPoint) do { // Don't display part name if no string is found in stringtable if (_text == LSTRING(Hit)) then { - if (_hitPoint != "") then { WARNING_1("Hitpoint [%1] - could not be localized", _hitPoint); }; + if (_hitPoint != "") then { LOG_1("Hitpoint [%1] - could not be localized", _hitPoint); }; _text = _textDefault; }; From 416ab316101b75f158bea34a1a0c32c1bd8efa0a Mon Sep 17 00:00:00 2001 From: commy2 Date: Fri, 28 Oct 2016 22:10:40 +0200 Subject: [PATCH 067/826] cookoff ammo selections default values (#4604) * cookoff ammo selections default values * Add missing subTurret cache for Wheeled APCs --- addons/cookoff/CfgVehicles.hpp | 12 ++++-------- addons/cookoff/XEH_postInit.sqf | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/addons/cookoff/CfgVehicles.hpp b/addons/cookoff/CfgVehicles.hpp index 26453ef286..1155b9ba52 100644 --- a/addons/cookoff/CfgVehicles.hpp +++ b/addons/cookoff/CfgVehicles.hpp @@ -28,20 +28,16 @@ class CfgVehicles { class Tank; class Tank_F: Tank { - GVAR(ammoLocation) = "HitTurret"; + GVAR(ammoLocation) = "HitHull"; GVAR(cookoffSelections)[] = {"poklop_gunner","poklop_commander"}; }; - - class MBT_01_base_F: Tank_F { - GVAR(ammoLocation) = "HitHull"; - }; - class APC_Tracked_01_base_F: Tank_F { - GVAR(ammoLocation) = "HitHull"; + class MBT_02_base_F: Tank_F { + GVAR(ammoLocation) = "HitTurret"; }; class Car_F; class Wheeled_APC_F: Car_F { - GVAR(ammoLocation) = "HitTurret"; + GVAR(ammoLocation) = "HitHull"; GVAR(cookoffSelections)[] = {"poklop_gunner","poklop_commander"}; // big explosions for wheeled APCs (same as for tanks) diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf index 1e17e20893..fe98faa2be 100644 --- a/addons/cookoff/XEH_postInit.sqf +++ b/addons/cookoff/XEH_postInit.sqf @@ -36,6 +36,22 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; ["Wheeled_APC_F", "init", { params ["_vehicle"]; + private _typeOf = typeOf _vehicle; + + if (isNil {GVAR(cacheTankDuplicates) getVariable _typeOf}) then { + private _hitpoints = (getAllHitPointsDamage _vehicle param [0, []]) apply {toLower _x}; + private _duplicateHitpoints = []; + + { + if ((_x != "") && {_x in (_hitpoints select [0,_forEachIndex])}) then { + _duplicateHitpoints pushBack _forEachIndex; + }; + } forEach _hitpoints; + + TRACE_2("dupes",_typeOf,_duplicateHitpoints); + GVAR(cacheTankDuplicates) setVariable [_typeOf, _duplicateHitpoints]; + }; + _vehicle addEventHandler ["HandleDamage", { if ((_this select 0) getVariable [QGVAR(enable), GVAR(enable)]) then { ["tank", _this] call FUNC(handleDamage); From eb38290aafc754c90ae83660b2c8ed976fddacc8 Mon Sep 17 00:00:00 2001 From: commy2 Date: Fri, 28 Oct 2016 22:10:40 +0200 Subject: [PATCH 068/826] cookoff ammo selections default values (#4604) * cookoff ammo selections default values * Add missing subTurret cache for Wheeled APCs --- addons/cookoff/CfgVehicles.hpp | 12 ++++-------- addons/cookoff/XEH_postInit.sqf | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/addons/cookoff/CfgVehicles.hpp b/addons/cookoff/CfgVehicles.hpp index 26453ef286..1155b9ba52 100644 --- a/addons/cookoff/CfgVehicles.hpp +++ b/addons/cookoff/CfgVehicles.hpp @@ -28,20 +28,16 @@ class CfgVehicles { class Tank; class Tank_F: Tank { - GVAR(ammoLocation) = "HitTurret"; + GVAR(ammoLocation) = "HitHull"; GVAR(cookoffSelections)[] = {"poklop_gunner","poklop_commander"}; }; - - class MBT_01_base_F: Tank_F { - GVAR(ammoLocation) = "HitHull"; - }; - class APC_Tracked_01_base_F: Tank_F { - GVAR(ammoLocation) = "HitHull"; + class MBT_02_base_F: Tank_F { + GVAR(ammoLocation) = "HitTurret"; }; class Car_F; class Wheeled_APC_F: Car_F { - GVAR(ammoLocation) = "HitTurret"; + GVAR(ammoLocation) = "HitHull"; GVAR(cookoffSelections)[] = {"poklop_gunner","poklop_commander"}; // big explosions for wheeled APCs (same as for tanks) diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf index 1e17e20893..fe98faa2be 100644 --- a/addons/cookoff/XEH_postInit.sqf +++ b/addons/cookoff/XEH_postInit.sqf @@ -36,6 +36,22 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; ["Wheeled_APC_F", "init", { params ["_vehicle"]; + private _typeOf = typeOf _vehicle; + + if (isNil {GVAR(cacheTankDuplicates) getVariable _typeOf}) then { + private _hitpoints = (getAllHitPointsDamage _vehicle param [0, []]) apply {toLower _x}; + private _duplicateHitpoints = []; + + { + if ((_x != "") && {_x in (_hitpoints select [0,_forEachIndex])}) then { + _duplicateHitpoints pushBack _forEachIndex; + }; + } forEach _hitpoints; + + TRACE_2("dupes",_typeOf,_duplicateHitpoints); + GVAR(cacheTankDuplicates) setVariable [_typeOf, _duplicateHitpoints]; + }; + _vehicle addEventHandler ["HandleDamage", { if ((_this select 0) getVariable [QGVAR(enable), GVAR(enable)]) then { ["tank", _this] call FUNC(handleDamage); From 70439aaa9da55617d45f07cbada37fdb32db6bbb Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 28 Oct 2016 15:12:37 -0500 Subject: [PATCH 069/826] Fix bleeding hit logic for enabledFor = 1 (#4585) * Fix bleeding hit logic for enabledFor = 1 * Handle RC * fix --- addons/medical_blood/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_blood/XEH_postInit.sqf b/addons/medical_blood/XEH_postInit.sqf index 8d563da1dc..ceff7f074c 100644 --- a/addons/medical_blood/XEH_postInit.sqf +++ b/addons/medical_blood/XEH_postInit.sqf @@ -39,7 +39,7 @@ if (isServer) then { ["CAManBase", "hit", { params ["_unit"]; - if (GVAR(enabledFor) == 1 && {!isPlayer _unit || {_unit == ACE_player}}) exitWith {}; + if (GVAR(enabledFor) == 1 && {!isPlayer _unit && {_unit != ACE_player}}) exitWith {}; _this call FUNC(hit); }] call CBA_fnc_addClassEventHandler; From e1900d81bc526ac8cd3c8257a2b298cb507f82c0 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 28 Oct 2016 15:12:37 -0500 Subject: [PATCH 070/826] Fix bleeding hit logic for enabledFor = 1 (#4585) * Fix bleeding hit logic for enabledFor = 1 * Handle RC * fix --- addons/medical_blood/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_blood/XEH_postInit.sqf b/addons/medical_blood/XEH_postInit.sqf index 8d563da1dc..ceff7f074c 100644 --- a/addons/medical_blood/XEH_postInit.sqf +++ b/addons/medical_blood/XEH_postInit.sqf @@ -39,7 +39,7 @@ if (isServer) then { ["CAManBase", "hit", { params ["_unit"]; - if (GVAR(enabledFor) == 1 && {!isPlayer _unit || {_unit == ACE_player}}) exitWith {}; + if (GVAR(enabledFor) == 1 && {!isPlayer _unit && {_unit != ACE_player}}) exitWith {}; _this call FUNC(hit); }] call CBA_fnc_addClassEventHandler; From 7b2d736ba35fb2c6808311ba61065076da4c9401 Mon Sep 17 00:00:00 2001 From: ulteq Date: Fri, 28 Oct 2016 22:25:47 +0200 Subject: [PATCH 071/826] Fix Kestrel4500 wind speed calculation * Cosine was applied twice (on some screens) --- addons/kestrel4500/functions/fnc_generateOutputData.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/kestrel4500/functions/fnc_generateOutputData.sqf b/addons/kestrel4500/functions/fnc_generateOutputData.sqf index c3bce5efa2..ccc2ab57e3 100644 --- a/addons/kestrel4500/functions/fnc_generateOutputData.sqf +++ b/addons/kestrel4500/functions/fnc_generateOutputData.sqf @@ -107,7 +107,7 @@ if (GVAR(referenceHeadingMenu) == 0) then { }; case 2: { // Wind SPD if (!GVAR(MinAvgMax)) then { - _textCenterBig = Str(round(abs(_windSpeed) * 10) / 10); + _textCenterBig = Str(round(_windSpeed * 10) / 10); } else { _textCenterLine1Left = "Max"; _textCenterLine2Left = "Avg"; @@ -134,7 +134,7 @@ if (GVAR(referenceHeadingMenu) == 0) then { if (!GVAR(MinAvgMax)) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _textCenterBig = Str(round(abs(sin(GVAR(RefHeading) - _playerDir) * _windSpeed) * 10) / 10); - _textInfoLine1 = format["%1 m/s @ %2", round((abs(cos(_playerDir - _windDir)) * _windSpeed) * 10) / 10, round(_playerDir)]; + _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_playerDir)]; } else { _textCenterBig = Str(round(abs(sin(GVAR(RefHeading)) * _windSpeed) * 10) / 10); _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_windDir)]; @@ -166,7 +166,7 @@ if (GVAR(referenceHeadingMenu) == 0) then { if (!GVAR(MinAvgMax)) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _textCenterBig = Str(round(cos(GVAR(RefHeading) - _playerDir) * _windSpeed * 10) / 10); - _textInfoLine1 = format["%1 m/s @ %2", round((abs(cos(_playerDir - _windDir)) * _windSpeed) * 10) / 10, round(_playerDir)]; + _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_playerDir)]; } else { _textCenterBig = Str(round(cos(GVAR(RefHeading)) * _windSpeed * 10) / 10); _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_windDir)]; From 6a7998d47d1b8c7b6fdd0c2686b69b00eced690b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 29 Oct 2016 01:28:24 -0500 Subject: [PATCH 072/826] WebDoc Version to 3.8.1 (#4611) Close #4610 --- docs/_config.yml | 4 ++-- docs/_config_dev.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index 8babdb2525..1fa01b3ad4 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -11,8 +11,8 @@ ace: version: major: 3 minor: 8 - patch: 0 - build: 10 + patch: 1 + build: 11 acex: githubUrl: https://github.com/acemod/ACEX diff --git a/docs/_config_dev.yml b/docs/_config_dev.yml index 6eba5ae628..1367ab9a32 100644 --- a/docs/_config_dev.yml +++ b/docs/_config_dev.yml @@ -11,8 +11,8 @@ ace: version: major: 3 minor: 8 - patch: 0 - build: 10 + patch: 1 + build: 11 acex: githubUrl: https://github.com/acemod/ACEX From 0e364b0d48122b85312bb9bd139ead025194b0f6 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 29 Oct 2016 13:49:24 +0200 Subject: [PATCH 073/826] Adds realistic names for the QBZ-95 camo variants Green Hex and Hex variants of: * QBZ-95-1 * QBZ-95-1 GL * QBZ-95-1 LSW --- addons/realisticnames/CfgWeapons.hpp | 19 +++++++ addons/realisticnames/stringtable.xml | 78 +++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index 2654dc0df7..3bc97b14ab 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -586,14 +586,33 @@ class CfgWeapons { class arifle_CTAR_blk_F: arifle_CTAR_base_F { displayName = CSTRING(arifle_CTAR_blk); }; + class arifle_CTAR_ghex_F: arifle_CTAR_base_F { + displayName = CSTRING(arifle_CTAR_ghex); + }; + class arifle_CTAR_hex_F: arifle_CTAR_base_F { + displayName = CSTRING(arifle_CTAR_hex); + }; class arifle_CTAR_GL_base_F; class arifle_CTAR_GL_blk_F: arifle_CTAR_GL_base_F { displayName = CSTRING(arifle_CTAR_GL_blk); }; + class arifle_CTAR_GL_ghex_F: arifle_CTAR_GL_base_F { + displayName = CSTRING(arifle_CTAR_GL_ghex); + }; + class arifle_CTAR_GL_hex_F: arifle_CTAR_GL_base_F { + displayName = CSTRING(arifle_CTAR_GL_hex); + }; + class arifle_CTARS_base_F; class arifle_CTARS_blk_F: arifle_CTARS_base_F { displayName = CSTRING(arifle_CTARS_blk); }; + class arifle_CTARS_ghex_F: arifle_CTARS_base_F { + displayName = CSTRING(arifle_CTARS_ghex); + }; + class arifle_CTARS_hex_F: arifle_CTARS_base_F { + displayName = CSTRING(arifle_CTARS_hex); + }; // QBU-88 class DMR_07_base_F; diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 7517e7b937..9821346a5a 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -2223,6 +2223,32 @@ QBZ-95-1 (Preto) QBZ-95-1 (黒) + + QBZ-95-1 (Green Hex) + QBZ-95-1 (Hex Grün) + QBZ-95-1 (Hex Verde) + QBZ-95-1 (zielony hex) + QBZ-95-1 (Zelený Hex) + QBZ-95-1 (Hex Verte) + QBZ-95-1 (Зелёный Hex) + QBZ-95-1 (Verde Hex) + QBZ-95-1 (Zöld Hex) + QBZ-95-1 (Hex Verde) + QBZ-95-1 (緑蜂巣) + + + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (蜂巣) + QBZ-95-1 GL (Black) QBZ-95-1 GL (Černá) @@ -2236,6 +2262,32 @@ QBZ-95-1 GL (Preto) QBZ-95-1 GL (黒) + + QBZ-95-1 GL (Green Hex) + QBZ-95-1 GL (Hex Grün) + QBZ-95-1 GL (Hex Verde) + QBZ-95-1 GL (zielony hex) + QBZ-95-1 GL (Zelený Hex) + QBZ-95-1 GL (Hex Verte) + QBZ-95-1 GL (Зелёный Hex) + QBZ-95-1 GL (Verde Hex) + QBZ-95-1 GL (Zöld Hex) + QBZ-95-1 GL (Hex Verde) + QBZ-95-1 GL (緑蜂巣) + + + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (蜂巣) + QBZ-95-1 LSW (Black) QBZ-95-1 LSW (Černá) @@ -2249,6 +2301,32 @@ QBZ-95-1 LSW (Preto) QBZ-95-1 LSW (黒) + + QBZ-95-1 LSW (Green Hex) + QBZ-95-1 LSW (Hex Grün) + QBZ-95-1 LSW (Hex Verde) + QBZ-95-1 LSW (zielony hex) + QBZ-95-1 LSW (Zelený Hex) + QBZ-95-1 LSW (Hex Verte) + QBZ-95-1 LSW (Зелёный Hex) + QBZ-95-1 LSW (Verde Hex) + QBZ-95-1 LSW (Zöld Hex) + QBZ-95-1 LSW (Hex Verde) + QBZ-95-1 LSW (緑蜂巣) + + + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (蜂巣) + QBU-88 (Black) QBU-88 (Černá) From 14af5577c6d5da8cfe16a4f77278670ab903e7c0 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 30 Oct 2016 00:28:25 +0200 Subject: [PATCH 074/826] Updates the ballistics module to support Apex * Made the new ammo types ready for advanced ballistics * Made the new weapons ready for advanced ballistics * Recalculated all initSpeed coefficients * Updated the airFrictionAnalysis report --- addons/ballistics/CfgAmmo.hpp | 56 ++++++++++--- addons/ballistics/CfgMagazines.hpp | 30 ++++++- addons/ballistics/CfgWeapons.hpp | 123 ++++++++++++++++++++++------- extras/airFrictionAnalysis.txt | 44 +++++++---- 4 files changed, 195 insertions(+), 58 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 0819f8aa4b..652cc8ece7 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -79,8 +79,8 @@ class CfgAmmo { class ACE_B_556x45_Ball_Tracer_Dim: B_556x45_Ball_Tracer_Red { nvgOnly = 1; }; - class ACE_545x39_Ball_7N6M : B_556x45_Ball { - airFriction=-0.00114744; + class B_545x39_Ball_F : BulletBase { + airFriction=-0.00116278; caliber=0.6; deflecting=18; hit=7; @@ -93,12 +93,14 @@ class CfgAmmo { ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; - ACE_muzzleVelocities[]={780, 880, 920}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; + ACE_muzzleVelocities[]={735, 883, 892}; + ACE_barrelLengths[]={206.5, 414.02, 508.0}; }; + class ACE_545x39_Ball_7N6M : B_545x39_Ball_F { + } class B_556x45_Ball_Tracer_Green; class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Green { - airFriction=-0.00114744; + airFriction=-0.00116278; caliber=0.6; deflecting=18; hit=7; @@ -113,12 +115,26 @@ class CfgAmmo { ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; - ACE_muzzleVelocities[]={785, 883, 925}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; + ACE_muzzleVelocities[]={740, 886, 897}; + ACE_barrelLengths[]={206.5, 414.02, 508.0}; }; class B_56x15_dual: BulletBase { tracerScale = 0.5; }; + class B_580x42_Ball_F: BulletBase { + airFriction=-0.00117956; + typicalSpeed=930; + ACE_caliber=5.9944; + ACE_bulletLength=24.2; + ACE_bulletMass=4.15; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.156}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={790, 930, 970}; + ACE_barrelLengths[]={369.0, 463.0, 600.0}; + }; class B_65x39_Caseless : BulletBase { airFriction=-0.00075308; typicalSpeed=800; @@ -439,7 +455,7 @@ class CfgAmmo { ACE_muzzleVelocities[]={620, 655, 675}; ACE_barrelLengths[]={228.6, 406.4, 508.0}; }; - class ACE_762x39_Ball : B_762x51_Ball { + class B_762x39_Ball_F : BulletBase { airFriction=-0.00151621; hit=12; caliber=1.5; @@ -455,6 +471,8 @@ class CfgAmmo { ACE_muzzleVelocities[]={650, 716, 750}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; + class ACE_762x39_Ball : B_762x39_Ball_F { + }; class ACE_762x39_Ball_57N231P : B_762x54_Tracer_Green { airFriction=-0.00151621; hit=12; @@ -474,7 +492,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; class B_9x21_Ball : BulletBase { - airFriction=-0.00226847; + airFriction=-0.00208292; typicalSpeed=390; tracerScale = 0.5; hit=6; @@ -486,8 +504,8 @@ class CfgAmmo { ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=1; - ACE_muzzleVelocities[]={440, 460, 480}; - ACE_barrelLengths[]={101.6, 127.0, 228.6}; + ACE_muzzleVelocities[]={380, 390, 420, 435}; + ACE_barrelLengths[]={93.5, 101.6, 127.0, 228.6}; }; class B_9x21_Ball_Tracer_Green: B_9x21_Ball { tracerScale = 0.5; @@ -508,7 +526,7 @@ class CfgAmmo { ACE_barrelLengths[]={96.52, 127.0, 228.6}; }; class ACE_9x19_Ball : B_9x21_Ball { - airFriction=-0.0018577; + airFriction=-0.0019835; typicalSpeed=370; hit=6; ACE_caliber=9.017; @@ -771,6 +789,20 @@ class CfgAmmo { ACE_muzzleVelocities[]={230, 250, 285}; ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; + class B_50BW_Ball_F : BulletBase { + airFriction=-0.00202645; + typicalSpeed=550; + ACE_caliber=12.7; + ACE_bulletLength=24.13; + ACE_bulletMass=21.7076; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.21}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={510, 550, 596}; + ACE_barrelLengths[]={304.8, 406.4, 609.6}; + }; class B_19mm_HE: BulletBase { tracerScale = 1; }; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 931a6c2309..4c79e7ef51 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -2,6 +2,12 @@ class CfgMagazines { class CA_Magazine; + class 30Rnd_580x42_Mag_F: CA_Magazine { + initSpeed = 930; + }; + class 100Rnd_580x42_Mag_F: 30Rnd_580x42_Mag_F { + initSpeed = 930; + }; class 30Rnd_65x39_caseless_mag: CA_Magazine { initSpeed = 760; }; @@ -47,6 +53,10 @@ class CfgMagazines { descriptionShort = CSTRING(30Rnd_65x39_caseless_green_mag_Tracer_DimDescription); }; + class 30Rnd_545x39_Mag_F: CA_Magazine { + initSpeed = 735; + }; + class 30Rnd_556x45_Stanag: CA_Magazine { }; class ACE_30Rnd_556x45_Stanag_M995_AP_mag: 30Rnd_556x45_Stanag { @@ -84,6 +94,14 @@ class CfgMagazines { picture = "\A3\weapons_f\data\ui\m_20stanag_red_ca.paa"; }; + class 200Rnd_556x45_Box_F: CA_Magazine { + initSpeed = 872; + }; + + class 30Rnd_762x39_Mag_F: CA_Magazine { + initSpeed = 715; + }; + class 20Rnd_762x51_Mag: CA_Magazine { initSpeed = 833; }; @@ -276,7 +294,7 @@ class CfgMagazines { class 30Rnd_9x21_Mag: CA_Magazine { - initSpeed = 450; + initSpeed = 390; }; class ACE_30Rnd_9x19_mag: 30Rnd_9x21_Mag { author = ECSTRING(common,ACETeam); @@ -287,6 +305,10 @@ class CfgMagazines { initSpeed = 370; }; + class 10Rnd_50BW_Mag_F: CA_Magazine { + initSpeed = 552; + }; + class 11Rnd_45ACP_Mag: CA_Magazine { initSpeed = 250; }; @@ -307,8 +329,12 @@ class CfgMagazines { initSpeed = 250; }; + class 10Rnd_9x21_Mag: 30Rnd_9x21_Mag { + initSpeed = 390; + }; + class 16Rnd_9x21_Mag: 30Rnd_9x21_Mag { - initSpeed = 450; + initSpeed = 390; }; class ACE_16Rnd_9x19_mag: 16Rnd_9x21_Mag { author = ECSTRING(common,ACETeam); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 2446aeb3b3..51f815f938 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -27,6 +27,12 @@ class CfgWeapons { }; }; + class DMR_07_base_F: Rifle_Long_Base_F { + initSpeed = -0.982908; + ACE_barrelTwist = 228.6; + ACE_barrelLength = 640.0; + }; + class DMR_06_base_F: Rifle_Long_Base_F { class Single: Mode_SemiAuto { dispersion = 0.00029; // radians. Equal to 1.00 MOA. @@ -112,7 +118,7 @@ class CfgWeapons { "ACE_30Rnd_65x47_Scenar_mag", "ACE_30Rnd_65_Creedmor_mag" }; - initSpeed = -1.018; + initSpeed = -1.01842; ACE_barrelTwist=228.6; ACE_barrelLength=457.2; class Single: Single { @@ -142,6 +148,14 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; + initSpeed = -0.859238; + ACE_barrelTwist=177.8; + ACE_barrelLength=264.0; + }; + class arifle_SPAR_02_base_F: Rifle_Base_F { + initSpeed = -0.934282; + ACE_barrelTwist=177.8; + ACE_barrelLength=368.0; }; class arifle_SPAR_03_base_F: Rifle_Base_F { magazines[] = { @@ -154,6 +168,9 @@ class CfgWeapons { "ACE_20Rnd_762x51_M993_AP_Mag", "ACE_20Rnd_762x51_Mag_SD" }; + initSpeed = -0.984394; + ACE_barrelTwist=279.4; + ACE_barrelLength=508.0; }; /* Other */ @@ -163,21 +180,26 @@ class CfgWeapons { "200Rnd_65x39_cased_Box_Tracer", "ACE_200Rnd_65x39_cased_Box_Tracer_Dim" }; - initSpeed = -0.9763; + initSpeed = -0.976974; ACE_barrelTwist=177.8; ACE_barrelLength=317.5; }; class LMG_Zafir_F: Rifle_Long_Base_F { - initSpeed = -1.0; + initSpeed = -1.00333; ACE_barrelTwist=304.8; ACE_barrelLength=459.74; }; + class LMG_03_base_F: Rifle_Long_Base_F { + initSpeed = -1.02002; + ACE_barrelTwist=177.8; + ACE_barrelLength=414.02; + }; class Tavor_base_F: Rifle_Base_F {}; class mk20_base_F: Rifle_Base_F {}; /* SMGs */ class SDAR_base_F: Rifle_Base_F { - initSpeed = -0.989; + initSpeed = -1.211; class Single: Mode_SemiAuto { dispersion = 0.0008727; // radians. Equal to 3 MOA. }; @@ -190,9 +212,6 @@ class CfgWeapons { dispersion = 0.0008727; // radians. Equal to 3 MOA. }; }; - class pdw2000_base_F: Rifle_Short_Base_F {}; - class SMG_01_Base: Rifle_Short_Base_F {}; - class SMG_02_base_F: Rifle_Base_F {}; /* Pistols */ @@ -200,13 +219,13 @@ class CfgWeapons { class Pistol_Base_F: Pistol {}; class hgun_P07_F: Pistol_Base_F { - initSpeed = -0.9778; + initSpeed = -1.0; ACE_barrelTwist=254.0; ACE_barrelLength=101.6; }; class hgun_Rook40_F: Pistol_Base_F { - initSpeed = -1.0; + initSpeed = -1.03077; ACE_barrelTwist=254.0; ACE_barrelLength=111.76; }; @@ -228,18 +247,57 @@ class CfgWeapons { ACE_barrelTwist=406.4; ACE_barrelLength=76.2; }; - class hgun_PDW2000_F: pdw2000_base_F { - initSpeed = -1.157; + + class hgun_Pistol_01_F: Pistol_Base_F { + initSpeed = -0.974359; + ACE_barrelTwist=254.0; + ACE_barrelLength=93.5; + }; + + class pdw2000_base_F: Rifle_Short_Base_F { + initSpeed = -1.09615; ACE_barrelTwist=228.6; ACE_barrelLength=177.8; }; + + /* Rifles */ + class arifle_AKS_base_F: Rifle_Base_F { + initSpeed = -1.00419; + ACE_barrelTwist=160.02; + ACE_barrelLength=210.82; + }; + class arifle_AKM_base_F: Rifle_Base_F { + initSpeed = -1.0014; + ACE_barrelTwist = 199.898; + ACE_barrelLength = 414.02; + }; + class arifle_AK12_base_F: Rifle_Base_F { + initSpeed = -1.0014; + ACE_barrelTwist = 199.898; + ACE_barrelLength = 414.02; + }; + class arifle_CTAR_base_F: Rifle_Base_F { + initSpeed = -1.0; + ACE_barrelTwist = 244.0; + ACE_barrelLength = 463.0; + }; + class arifle_CTARS_base_F: Rifle_Base_F { + initSpeed = -1.04301; + ACE_barrelTwist = 244.0; + ACE_barrelLength = 600.0; + }; + class arifle_ARX_base_F: Rifle_Base_F { + initSpeed = -1.02052; + ACE_barrelTwist = 228.6; + ACE_barrelLength = 463.0; + }; class arifle_Katiba_F: arifle_katiba_Base_F { magazines[] = { "30Rnd_65x39_caseless_green", "30Rnd_65x39_caseless_green_mag_Tracer", "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" }; - initSpeed = -1.08; + initSpeed = -1.08355; ACE_barrelTwist=203.2; ACE_barrelLength=728.98; }; @@ -249,7 +307,7 @@ class CfgWeapons { "30Rnd_65x39_caseless_green_mag_Tracer", "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" }; - initSpeed = -1.07; + initSpeed = -1.07105; ACE_barrelTwist=203.2; ACE_barrelLength=680.72; }; @@ -259,7 +317,7 @@ class CfgWeapons { "30Rnd_65x39_caseless_green_mag_Tracer", "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" }; - initSpeed = -1.08; + initSpeed = -1.08355; ACE_barrelTwist=203.2; ACE_barrelLength=728.98; }; @@ -269,7 +327,7 @@ class CfgWeapons { "30Rnd_65x39_caseless_mag_Tracer", "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim" }; - initSpeed = -0.99; + initSpeed = -0.990132; ACE_barrelTwist=228.6; ACE_barrelLength=368.3; }; @@ -295,7 +353,7 @@ class CfgWeapons { "30Rnd_65x39_caseless_mag_Tracer", "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim" }; - initSpeed = -0.965; + initSpeed = -0.963816; ACE_barrelTwist=203.2; ACE_barrelLength=266.7; }; @@ -323,11 +381,16 @@ class CfgWeapons { ACE_barrelTwist=285.75; ACE_barrelLength=457.2; }; - class SMG_02_F: SMG_02_base_F { - initSpeed = -1.054; + class SMG_02_base_F: Rifle_Base_F { + initSpeed = -1.10288; ACE_barrelTwist=254.0; ACE_barrelLength=195.58; }; + class SMG_05_base_F: Rifle_Short_Base_F { + initSpeed = -1.04058; + ACE_barrelTwist=254.0; + ACE_barrelLength=115.0; + }; class arifle_TRG20_F: Tavor_base_F { magazines[] = { "30Rnd_556x45_Stanag", @@ -358,7 +421,7 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.989; + initSpeed = -0.988043; ACE_barrelTwist=177.8; ACE_barrelLength=459.74; }; @@ -375,7 +438,7 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.989; + initSpeed = -0.988043; ACE_barrelTwist=177.8; ACE_barrelLength=459.74; }; @@ -398,7 +461,7 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.98; + initSpeed = -0.980978; ACE_barrelTwist=177.8; ACE_barrelLength=441.96; }; @@ -415,7 +478,7 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.956; + initSpeed = -0.962648; ACE_barrelTwist=177.8; ACE_barrelLength=406.4; }; @@ -432,12 +495,12 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.956; + initSpeed = -0.962648; ACE_barrelTwist=177.8; ACE_barrelLength=406.4; }; - class SMG_01_F: SMG_01_Base { - initSpeed = -1.016; + class SMG_01_Base: Rifle_Short_Base_F { + initSpeed = -1.0175; ACE_barrelTwist=406.4; ACE_barrelLength=139.7; }; @@ -461,7 +524,7 @@ class CfgWeapons { "ACE_20Rnd_762x51_M993_AP_Mag", "ACE_20Rnd_762x51_Mag_SD" }; - initSpeed = -0.9724; + initSpeed = -0.972389; ACE_barrelTwist=304.8; ACE_barrelLength=457.2; }; @@ -498,7 +561,7 @@ class CfgWeapons { "ACE_20Rnd_762x67_Mk248_Mod_1_Mag", "ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag" }; - initSpeed = -0.962; + initSpeed = -0.961749; ACE_barrelTwist=254.0; ACE_barrelLength=508.0; }; @@ -513,7 +576,7 @@ class CfgWeapons { "ACE_20Rnd_762x51_M993_AP_Mag", "ACE_20Rnd_762x51_Mag_SD" }; - initSpeed = -0.9843; + initSpeed = -0.984394; ACE_barrelTwist=254.0; ACE_barrelLength=508.0; }; @@ -538,12 +601,12 @@ class CfgWeapons { "ACE_20Rnd_762x51_M993_AP_Mag", "ACE_20Rnd_762x51_Mag_SD" }; - initSpeed = -0.9916; + initSpeed = -0.992197; ACE_barrelTwist=304.8; ACE_barrelLength=558.8; }; class MMG_01_hex_F: MMG_01_base_F { - initSpeed = -1.0; + initSpeed = -0.997073; ACE_barrelTwist=359.918; ACE_barrelLength=549.91; }; diff --git a/extras/airFrictionAnalysis.txt b/extras/airFrictionAnalysis.txt index 722077578b..0f825e55d5 100644 --- a/extras/airFrictionAnalysis.txt +++ b/extras/airFrictionAnalysis.txt @@ -31,13 +31,21 @@ Max. drop difference (cm): 1.25 Max. tof difference (ms): 7.0 Optimal airFriction: 0.00123272 ########################################## -Ammo Class: ACE_545x39_Ball_7N6M +Ammo Class: B_545x39_Ball_F MaxRanges (m): [400, 500] -MuzzleVelocities (m/s): [780, 880, 920] -Max. velocity difference (m/s): 19.71 -Max. drop difference (cm): 2.04 +MuzzleVelocities (m/s): [735, 892] +Max. velocity difference (m/s): 23.07 +Max. drop difference (cm): 3.76 +Max. tof difference (ms): 12.0 +Optimal airFriction: 0.00116278 +########################################## +Ammo Class: B_580x42_Ball_F +MaxRanges (m): [500, 500] +MuzzleVelocities (m/s): [930, 970] +Max. velocity difference (m/s): 24.7 +Max. drop difference (cm): 1.51 Max. tof difference (ms): 8.0 -Optimal airFriction: 0.00114744 +Optimal airFriction: 0.00117956 ########################################## Ammo Class: B_65x39_Caseless MaxRanges (m): [400, 800, 800] @@ -247,6 +255,14 @@ Max. drop difference (cm): 14.52 Max. tof difference (ms): 29.0 Optimal airFriction: 0.00069611 ########################################## +Ammo Class: B_50BW_Ball_F +MaxRanges (m): [300, 400] +MuzzleVelocities (m/s): [510, 596] +Max. velocity difference (m/s): 29.6 +Max. drop difference (cm): 2.19 +Max. tof difference (ms): 18.0 +Optimal airFriction: 0.00202645 +########################################## Ammo Class: B_127x99_Ball MaxRanges (m): [1300, 1300] MuzzleVelocities (m/s): [895, 905] @@ -280,12 +296,12 @@ Max. tof difference (ms): 9.0 Optimal airFriction: 0.00049899 ########################################## Ammo Class: B_9x21_Ball -MaxRanges (m): [200, 300, 300] -MuzzleVelocities (m/s): [440, 460, 480] -Max. velocity difference (m/s): 37.94 -Max. drop difference (cm): 5.27 +MaxRanges (m): [200, 300] +MuzzleVelocities (m/s): [380, 420] +Max. velocity difference (m/s): 34.77 +Max. drop difference (cm): 4.7 Max. tof difference (ms): 31.0 -Optimal airFriction: 0.00226847 +Optimal airFriction: 0.00208292 ########################################## Ammo Class: ACE_9x18_Ball_57N181S MaxRanges (m): [100, 200, 200] @@ -298,10 +314,10 @@ Optimal airFriction: 0.00190333 Ammo Class: ACE_9x19_Ball MaxRanges (m): [100, 200, 200] MuzzleVelocities (m/s): [340, 370, 400] -Max. velocity difference (m/s): 17.59 -Max. drop difference (cm): 6.56 -Max. tof difference (ms): 10.0 -Optimal airFriction: 0.0018577 +Max. velocity difference (m/s): 23.95 +Max. drop difference (cm): 3.75 +Max. tof difference (ms): 17.0 +Optimal airFriction: 0.0019835 ########################################## Ammo Class: ACE_10x25_Ball MaxRanges (m): [200, 300, 300] From c3f967e365defd1aeb7e5e5adf1407ae6f0f6062 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 30 Oct 2016 12:05:17 +0100 Subject: [PATCH 075/826] Updates the ATragMX gun list --- addons/atragmx/XEH_postInit.sqf | 11 ++++++++--- addons/atragmx/script_component.hpp | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 4a68aac749..992f9e657a 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -10,9 +10,10 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], - ["12.7x99mm API" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.99, 12.9, 38.10, 0.670, 1, "ASM" ], ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], + + [".50 Beowulf" , 563, 100, 0.0657485, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" ], [".408 Chey Tac" , 910, 100, 0.0569400, -0.00038944, 3.81, 0, 2, 10, 120, 0, 0, 26.57, 10.4, 33.02, 0.970, 1, "ASM" ], @@ -38,11 +39,15 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ["6.5x39mm" , 800, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"], ["6.5x47mm Lapua" , 800, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"], ["6.5mm Creedmor" , 840, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.317, 7, "ICAO"], - + + ["5.8x42mm DBP87" , 930, 100, 0.0572574, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.156, 7, "ICAO" ], + ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ], ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ], ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ], - ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" ]]; + ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" ], + + ["5.45x39mm 7N6M" , 735, 100, 0.0787205, -0.00116278, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.168, 7, "ICAO"]]; [] call FUNC(clear_user_data); profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 0eae4ee5a0..3b09c0ad2f 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -16,4 +16,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.7 +#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.8 From e84cdef8172c0d941b904b1ce23977c849723e12 Mon Sep 17 00:00:00 2001 From: Rebel Date: Sun, 30 Oct 2016 14:33:28 +0200 Subject: [PATCH 076/826] Blocks AI getting back into the vehicle on cookoff (#4587) * no message * Header. * Typo. * Less code. * New getPos syntax. * leaveVehicle seems to work. * Removed the second waypoint. * Clear previous waypoints. * Run away waypoint before others. * Use arr select code * Revert select. Use doMove. --- addons/cookoff/functions/fnc_cookOff.sqf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/cookoff/functions/fnc_cookOff.sqf b/addons/cookoff/functions/fnc_cookOff.sqf index 890bbff557..7ae36670ac 100644 --- a/addons/cookoff/functions/fnc_cookOff.sqf +++ b/addons/cookoff/functions/fnc_cookOff.sqf @@ -9,7 +9,7 @@ * None * * Example: - * (vehicle player) call ace_cookoff_fnc_cookOff + * [(vehicle player)] call ace_cookoff_fnc_cookOff * * Public: No */ @@ -113,9 +113,12 @@ if (local _vehicle) then { [_vehicle, _fnc_FlameEffect, 12] call _fnc_FlameEffect; // recursive function + private _randomPosition = _vehicle getPos [100, random 360]; + { if (local _x && {!(_x call EFUNC(common,isPlayer))}) then { - _x action ["Eject", _vehicle]; + _x leaveVehicle _vehicle; + _x doMove _randomPosition; }; } forEach crew _vehicle; From 18e5fa28490658211207fb4fb74900d7a7f4918e Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Oct 2016 14:46:31 +0100 Subject: [PATCH 077/826] remove scrollbars from javelin scope (#4618) --- addons/javelin/RscInGameUI.hpp | 66 ++++++---------------------------- 1 file changed, 11 insertions(+), 55 deletions(-) diff --git a/addons/javelin/RscInGameUI.hpp b/addons/javelin/RscInGameUI.hpp index 80e1201682..e6136a52d3 100644 --- a/addons/javelin/RscInGameUI.hpp +++ b/addons/javelin/RscInGameUI.hpp @@ -1,14 +1,11 @@ + class RscOpticsValue; -class RscControlsGroup; +class RscControlsGroupNoScrollbars; class RscPicture; class RscMapControl; -class VScrollbar; -class HScrollbar; class RscLine; - // Taken from AGM for optics management. - class RscInGameUI { class ACE_RscOptics_javelin { idd = 300; @@ -16,24 +13,13 @@ class RscInGameUI { onLoad = QUOTE(_this call FUNC(onOpticLoad)); onUnload = QUOTE(_this call FUNC(onOpticUnload)); - class GVAR(elements_group): RscControlsGroup - { + class GVAR(elements_group): RscControlsGroupNoScrollbars { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW"; h = "SafezoneH"; idc = 170; - class VScrollbar { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; + class Controls { class CA_Distance: RscOpticsValue { idc = 151; @@ -63,23 +49,13 @@ class RscInGameUI { x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\wfov_co.paa"; }; - class GVAR(WFOV_mode_group): RscControlsGroup { + class GVAR(WFOV_mode_group): RscControlsGroupNoScrollbars { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW"; h = "SafezoneH"; idc = 163; - class VScrollbar { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; + class Controls { class StadiaL: RscLine { x = "0.4899*SafezoneW - SafezoneX"; @@ -131,23 +107,13 @@ class RscInGameUI { x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\nfov_co.paa"; }; - class GVAR(NFOV_mode_group): RscControlsGroup { + class GVAR(NFOV_mode_group): RscControlsGroupNoScrollbars { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW-SafezoneX"; h = "SafezoneH-SafezoneY"; idc = 162; - class VScrollbar { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; + class Controls { class StadiaL: RscLine { x = "0.4788*SafezoneW - SafezoneX"; @@ -251,7 +217,7 @@ class RscInGameUI { }; }; }; - class ACE_Targeting : RscControlsGroup { + class ACE_Targeting: RscControlsGroupNoScrollbars { idc = 6999; x = "SafezoneX"; @@ -261,24 +227,14 @@ class RscInGameUI { enabled = 0; class Controls { - class ACE_TargetingConstrains: RscControlsGroup { + class ACE_TargetingConstrains: RscControlsGroupNoScrollbars { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW-SafezoneX"; h = "SafezoneH-SafezoneY"; enabled = 0; - class VScrollbar { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; + class Controls { class Top: RscPicture { idc = 699101; From 357d5c119b7875dfb0cd528bce245790b272471e Mon Sep 17 00:00:00 2001 From: commy2 Date: Sun, 30 Oct 2016 14:46:31 +0100 Subject: [PATCH 078/826] remove scrollbars from javelin scope (#4618) --- addons/javelin/RscInGameUI.hpp | 66 ++++++---------------------------- 1 file changed, 11 insertions(+), 55 deletions(-) diff --git a/addons/javelin/RscInGameUI.hpp b/addons/javelin/RscInGameUI.hpp index 80e1201682..e6136a52d3 100644 --- a/addons/javelin/RscInGameUI.hpp +++ b/addons/javelin/RscInGameUI.hpp @@ -1,14 +1,11 @@ + class RscOpticsValue; -class RscControlsGroup; +class RscControlsGroupNoScrollbars; class RscPicture; class RscMapControl; -class VScrollbar; -class HScrollbar; class RscLine; - // Taken from AGM for optics management. - class RscInGameUI { class ACE_RscOptics_javelin { idd = 300; @@ -16,24 +13,13 @@ class RscInGameUI { onLoad = QUOTE(_this call FUNC(onOpticLoad)); onUnload = QUOTE(_this call FUNC(onOpticUnload)); - class GVAR(elements_group): RscControlsGroup - { + class GVAR(elements_group): RscControlsGroupNoScrollbars { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW"; h = "SafezoneH"; idc = 170; - class VScrollbar { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; + class Controls { class CA_Distance: RscOpticsValue { idc = 151; @@ -63,23 +49,13 @@ class RscInGameUI { x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\wfov_co.paa"; }; - class GVAR(WFOV_mode_group): RscControlsGroup { + class GVAR(WFOV_mode_group): RscControlsGroupNoScrollbars { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW"; h = "SafezoneH"; idc = 163; - class VScrollbar { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; + class Controls { class StadiaL: RscLine { x = "0.4899*SafezoneW - SafezoneX"; @@ -131,23 +107,13 @@ class RscInGameUI { x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\nfov_co.paa"; }; - class GVAR(NFOV_mode_group): RscControlsGroup { + class GVAR(NFOV_mode_group): RscControlsGroupNoScrollbars { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW-SafezoneX"; h = "SafezoneH-SafezoneY"; idc = 162; - class VScrollbar { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; + class Controls { class StadiaL: RscLine { x = "0.4788*SafezoneW - SafezoneX"; @@ -251,7 +217,7 @@ class RscInGameUI { }; }; }; - class ACE_Targeting : RscControlsGroup { + class ACE_Targeting: RscControlsGroupNoScrollbars { idc = 6999; x = "SafezoneX"; @@ -261,24 +227,14 @@ class RscInGameUI { enabled = 0; class Controls { - class ACE_TargetingConstrains: RscControlsGroup { + class ACE_TargetingConstrains: RscControlsGroupNoScrollbars { x = "SafezoneX"; y = "SafezoneY"; w = "SafezoneW-SafezoneX"; h = "SafezoneH-SafezoneY"; enabled = 0; - class VScrollbar { - autoScrollSpeed = -1; - autoScrollDelay = 5; - autoScrollRewind = 0; - color[] = {1,1,1,0}; - width = 0.001; - }; - class HScrollbar { - color[] = {1,1,1,0}; - height = 0.001; - }; + class Controls { class Top: RscPicture { idc = 699101; From 9ac12aaee8f3fb0df2393b13d056315f32f02ccf Mon Sep 17 00:00:00 2001 From: Rebel Date: Sun, 30 Oct 2016 14:33:28 +0200 Subject: [PATCH 079/826] Blocks AI getting back into the vehicle on cookoff (#4587) * no message * Header. * Typo. * Less code. * New getPos syntax. * leaveVehicle seems to work. * Removed the second waypoint. * Clear previous waypoints. * Run away waypoint before others. * Use arr select code * Revert select. Use doMove. --- addons/cookoff/functions/fnc_cookOff.sqf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/cookoff/functions/fnc_cookOff.sqf b/addons/cookoff/functions/fnc_cookOff.sqf index 890bbff557..7ae36670ac 100644 --- a/addons/cookoff/functions/fnc_cookOff.sqf +++ b/addons/cookoff/functions/fnc_cookOff.sqf @@ -9,7 +9,7 @@ * None * * Example: - * (vehicle player) call ace_cookoff_fnc_cookOff + * [(vehicle player)] call ace_cookoff_fnc_cookOff * * Public: No */ @@ -113,9 +113,12 @@ if (local _vehicle) then { [_vehicle, _fnc_FlameEffect, 12] call _fnc_FlameEffect; // recursive function + private _randomPosition = _vehicle getPos [100, random 360]; + { if (local _x && {!(_x call EFUNC(common,isPlayer))}) then { - _x action ["Eject", _vehicle]; + _x leaveVehicle _vehicle; + _x doMove _randomPosition; }; } forEach crew _vehicle; From 2222834c43a5a5f51f11ad72234a154cb01fe47c Mon Sep 17 00:00:00 2001 From: jonpas Date: Sun, 30 Oct 2016 18:54:54 +0100 Subject: [PATCH 080/826] Allow checking dogtags inside vehicles and when sitting (#4619) * Allow checking dogtag inside and when sitting * Remove redundant format --- addons/dogtags/CfgVehicles.hpp | 1 + addons/dogtags/functions/fnc_addDogtagActions.sqf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/dogtags/CfgVehicles.hpp b/addons/dogtags/CfgVehicles.hpp index f2e0fc6ad7..f583164b1f 100644 --- a/addons/dogtags/CfgVehicles.hpp +++ b/addons/dogtags/CfgVehicles.hpp @@ -34,6 +34,7 @@ class CfgVehicles { displayName = CSTRING(checkItem); condition = "true"; statement = ""; + exceptions[] = {"isNotInside", "isNotSitting"}; insertChildren = QUOTE(_this call DFUNC(addDogtagActions)); }; }; diff --git a/addons/dogtags/functions/fnc_addDogtagActions.sqf b/addons/dogtags/functions/fnc_addDogtagActions.sqf index 7cd7529bcc..988f909775 100644 --- a/addons/dogtags/functions/fnc_addDogtagActions.sqf +++ b/addons/dogtags/functions/fnc_addDogtagActions.sqf @@ -32,7 +32,7 @@ private _unitDogtagIDs = []; //Create action children for all dogtags private _actions = []; { - private _displayName = format ["%1", getText (configFile >> "CfgWeapons" >> _x >> "displayName")]; + private _displayName = getText (configFile >> "CfgWeapons" >> _x >> "displayName"); private _picture = getText (configFile >> "CfgWeapons" >> _x >> "picture"); private _action = [_x, _displayName, _picture, {_this call FUNC(checkDogtagItem)}, {true}, {}, _x] call EFUNC(interact_menu,createAction); From 657c790ee323b38edb938842acf68fea75ad1d83 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sun, 30 Oct 2016 18:54:54 +0100 Subject: [PATCH 081/826] Allow checking dogtags inside vehicles and when sitting (#4619) * Allow checking dogtag inside and when sitting * Remove redundant format --- addons/dogtags/CfgVehicles.hpp | 1 + addons/dogtags/functions/fnc_addDogtagActions.sqf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/dogtags/CfgVehicles.hpp b/addons/dogtags/CfgVehicles.hpp index f2e0fc6ad7..f583164b1f 100644 --- a/addons/dogtags/CfgVehicles.hpp +++ b/addons/dogtags/CfgVehicles.hpp @@ -34,6 +34,7 @@ class CfgVehicles { displayName = CSTRING(checkItem); condition = "true"; statement = ""; + exceptions[] = {"isNotInside", "isNotSitting"}; insertChildren = QUOTE(_this call DFUNC(addDogtagActions)); }; }; diff --git a/addons/dogtags/functions/fnc_addDogtagActions.sqf b/addons/dogtags/functions/fnc_addDogtagActions.sqf index 7cd7529bcc..988f909775 100644 --- a/addons/dogtags/functions/fnc_addDogtagActions.sqf +++ b/addons/dogtags/functions/fnc_addDogtagActions.sqf @@ -32,7 +32,7 @@ private _unitDogtagIDs = []; //Create action children for all dogtags private _actions = []; { - private _displayName = format ["%1", getText (configFile >> "CfgWeapons" >> _x >> "displayName")]; + private _displayName = getText (configFile >> "CfgWeapons" >> _x >> "displayName"); private _picture = getText (configFile >> "CfgWeapons" >> _x >> "picture"); private _action = [_x, _displayName, _picture, {_this call FUNC(checkDogtagItem)}, {true}, {}, _x] call EFUNC(interact_menu,createAction); From 9f56ba50c1c1c711a5d6b5826cacfa75fc91a732 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 30 Oct 2016 18:43:43 -0500 Subject: [PATCH 082/826] Add semi-colon --- addons/ballistics/CfgAmmo.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 652cc8ece7..065dcdf17d 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -97,7 +97,7 @@ class CfgAmmo { ACE_barrelLengths[]={206.5, 414.02, 508.0}; }; class ACE_545x39_Ball_7N6M : B_545x39_Ball_F { - } + }; class B_556x45_Ball_Tracer_Green; class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Green { airFriction=-0.00116278; From ace24d02829ab8eeb9b49e2dfe9f50933ec3d357 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 30 Oct 2016 18:46:55 -0500 Subject: [PATCH 083/826] Fix ubc --- addons/ballistics/CfgMagazines.hpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 4c79e7ef51..efde366d8c 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -329,11 +329,10 @@ class CfgMagazines { initSpeed = 250; }; - class 10Rnd_9x21_Mag: 30Rnd_9x21_Mag { + class 16Rnd_9x21_Mag: 30Rnd_9x21_Mag { initSpeed = 390; }; - - class 16Rnd_9x21_Mag: 30Rnd_9x21_Mag { + class 10Rnd_9x21_Mag: 16Rnd_9x21_Mag { initSpeed = 390; }; class ACE_16Rnd_9x19_mag: 16Rnd_9x21_Mag { From 510622dfc9eb9d6cb51ab7bb0a6648cf08801b14 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 29 Oct 2016 13:49:24 +0200 Subject: [PATCH 084/826] Adds realistic names for the QBZ-95 camo variants Green Hex and Hex variants of: * QBZ-95-1 * QBZ-95-1 GL * QBZ-95-1 LSW --- addons/realisticnames/CfgWeapons.hpp | 19 +++++++ addons/realisticnames/stringtable.xml | 78 +++++++++++++++++++++++++++ 2 files changed, 97 insertions(+) diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index 2654dc0df7..3bc97b14ab 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -586,14 +586,33 @@ class CfgWeapons { class arifle_CTAR_blk_F: arifle_CTAR_base_F { displayName = CSTRING(arifle_CTAR_blk); }; + class arifle_CTAR_ghex_F: arifle_CTAR_base_F { + displayName = CSTRING(arifle_CTAR_ghex); + }; + class arifle_CTAR_hex_F: arifle_CTAR_base_F { + displayName = CSTRING(arifle_CTAR_hex); + }; class arifle_CTAR_GL_base_F; class arifle_CTAR_GL_blk_F: arifle_CTAR_GL_base_F { displayName = CSTRING(arifle_CTAR_GL_blk); }; + class arifle_CTAR_GL_ghex_F: arifle_CTAR_GL_base_F { + displayName = CSTRING(arifle_CTAR_GL_ghex); + }; + class arifle_CTAR_GL_hex_F: arifle_CTAR_GL_base_F { + displayName = CSTRING(arifle_CTAR_GL_hex); + }; + class arifle_CTARS_base_F; class arifle_CTARS_blk_F: arifle_CTARS_base_F { displayName = CSTRING(arifle_CTARS_blk); }; + class arifle_CTARS_ghex_F: arifle_CTARS_base_F { + displayName = CSTRING(arifle_CTARS_ghex); + }; + class arifle_CTARS_hex_F: arifle_CTARS_base_F { + displayName = CSTRING(arifle_CTARS_hex); + }; // QBU-88 class DMR_07_base_F; diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 7517e7b937..9821346a5a 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -2223,6 +2223,32 @@ QBZ-95-1 (Preto) QBZ-95-1 (黒) + + QBZ-95-1 (Green Hex) + QBZ-95-1 (Hex Grün) + QBZ-95-1 (Hex Verde) + QBZ-95-1 (zielony hex) + QBZ-95-1 (Zelený Hex) + QBZ-95-1 (Hex Verte) + QBZ-95-1 (Зелёный Hex) + QBZ-95-1 (Verde Hex) + QBZ-95-1 (Zöld Hex) + QBZ-95-1 (Hex Verde) + QBZ-95-1 (緑蜂巣) + + + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (Hex) + QBZ-95-1 (蜂巣) + QBZ-95-1 GL (Black) QBZ-95-1 GL (Černá) @@ -2236,6 +2262,32 @@ QBZ-95-1 GL (Preto) QBZ-95-1 GL (黒) + + QBZ-95-1 GL (Green Hex) + QBZ-95-1 GL (Hex Grün) + QBZ-95-1 GL (Hex Verde) + QBZ-95-1 GL (zielony hex) + QBZ-95-1 GL (Zelený Hex) + QBZ-95-1 GL (Hex Verte) + QBZ-95-1 GL (Зелёный Hex) + QBZ-95-1 GL (Verde Hex) + QBZ-95-1 GL (Zöld Hex) + QBZ-95-1 GL (Hex Verde) + QBZ-95-1 GL (緑蜂巣) + + + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (Hex) + QBZ-95-1 GL (蜂巣) + QBZ-95-1 LSW (Black) QBZ-95-1 LSW (Černá) @@ -2249,6 +2301,32 @@ QBZ-95-1 LSW (Preto) QBZ-95-1 LSW (黒) + + QBZ-95-1 LSW (Green Hex) + QBZ-95-1 LSW (Hex Grün) + QBZ-95-1 LSW (Hex Verde) + QBZ-95-1 LSW (zielony hex) + QBZ-95-1 LSW (Zelený Hex) + QBZ-95-1 LSW (Hex Verte) + QBZ-95-1 LSW (Зелёный Hex) + QBZ-95-1 LSW (Verde Hex) + QBZ-95-1 LSW (Zöld Hex) + QBZ-95-1 LSW (Hex Verde) + QBZ-95-1 LSW (緑蜂巣) + + + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (Hex) + QBZ-95-1 LSW (蜂巣) + QBU-88 (Black) QBU-88 (Černá) From e60df02758e9dd997fb591ba8dfcbe2876c3b6ea Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 31 Oct 2016 15:11:45 -0500 Subject: [PATCH 087/826] Update CBA macros in tools (#4620) --- .../cba/addons/main/script_macros_common.hpp | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/tools/cba/addons/main/script_macros_common.hpp b/tools/cba/addons/main/script_macros_common.hpp index 6ec4906fff..a847909490 100644 --- a/tools/cba/addons/main/script_macros_common.hpp +++ b/tools/cba/addons/main/script_macros_common.hpp @@ -142,7 +142,7 @@ Author: #define LOG_SYS(LEVEL,MESSAGE) LOG_SYS_FORMAT(LEVEL,MESSAGE) call CBA_fnc_log #endif -#define LOG_SYS_FILELINENUMBERS(LEVEL,MESSAGE) LOG_SYS(LEVEL,format [ARR_4('%1 File: %2 Line: %3',MESSAGE,__FILE__,__LINE__ + 1)]) +#define LOG_SYS_FILELINENUMBERS(LEVEL,MESSAGE) LOG_SYS(LEVEL,format [ARR_4('%1 %2:%3',MESSAGE,__FILE__,__LINE__ + 1)]) /* ------------------------------------------- Macro: LOG() @@ -270,7 +270,7 @@ Example: Author: Spooner ------------------------------------------- */ -#define ERROR(MESSAGE) ['PREFIX', 'COMPONENT', MESSAGE, nil, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR(MESSAGE) LOG_SYS_FILELINENUMBERS('ERROR',MESSAGE) #define ERROR_1(MESSAGE,ARG1) ERROR(FORMAT_1(MESSAGE,ARG1)) #define ERROR_2(MESSAGE,ARG1,ARG2) ERROR(FORMAT_2(MESSAGE,ARG1,ARG2)) #define ERROR_3(MESSAGE,ARG1,ARG2,ARG3) ERROR(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) @@ -280,6 +280,33 @@ Author: #define ERROR_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) #define ERROR_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) +/* ------------------------------------------- +Macro: ERROR_MSG() + Record a critical error in the RPT log and display on screen error message. + + Newlines (\n) in the MESSAGE will be put on separate lines. + +Parameters: + MESSAGE - Message to record + +Example: + (begin example) + ERROR_MSG("value of frog not found in config ...yada...yada..."); + (end) + +Author: + commy2 +------------------------------------------- */ +#define ERROR_MSG(MESSAGE) ['PREFIX', 'COMPONENT', nil, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_MSG_1(MESSAGE,ARG1) ERROR_MSG(FORMAT_1(MESSAGE,ARG1)) +#define ERROR_MSG_2(MESSAGE,ARG1,ARG2) ERROR_MSG(FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_MSG_3(MESSAGE,ARG1,ARG2,ARG3) ERROR_MSG(FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_MSG_4(MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_MSG(FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_MSG_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_MSG(FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_MSG_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_MSG(FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_MSG_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_MSG(FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_MSG_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_MSG(FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) + /* ------------------------------------------- Macro: ERROR_WITH_TITLE() Record a critical error in the RPT log. @@ -287,8 +314,6 @@ Macro: ERROR_WITH_TITLE() The title can be specified (in the heading is always just "ERROR") Newlines (\n) in the MESSAGE will be put on separate lines. - TODO: Popup an error dialog & throw an exception. - Parameters: TITLE - Title of error message MESSAGE - Body of error message @@ -302,6 +327,14 @@ Author: Spooner ------------------------------------------- */ #define ERROR_WITH_TITLE(TITLE,MESSAGE) ['PREFIX', 'COMPONENT', TITLE, MESSAGE, __FILE__, __LINE__ + 1] call CBA_fnc_error +#define ERROR_WITH_TITLE_1(TITLE,MESSAGE,ARG1) ERROR_WITH_TITLE(TITLE,FORMAT_1(MESSAGE,ARG1)) +#define ERROR_WITH_TITLE_2(TITLE,MESSAGE,ARG1,ARG2) ERROR_WITH_TITLE(TITLE,FORMAT_2(MESSAGE,ARG1,ARG2)) +#define ERROR_WITH_TITLE_3(TITLE,MESSAGE,ARG1,ARG2,ARG3) ERROR_WITH_TITLE(TITLE,FORMAT_3(MESSAGE,ARG1,ARG2,ARG3)) +#define ERROR_WITH_TITLE_4(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4) ERROR_WITH_TITLE(TITLE,FORMAT_4(MESSAGE,ARG1,ARG2,ARG3,ARG4)) +#define ERROR_WITH_TITLE_5(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5) ERROR_WITH_TITLE(TITLE,FORMAT_5(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5)) +#define ERROR_WITH_TITLE_6(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6) ERROR_WITH_TITLE(TITLE,FORMAT_6(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6)) +#define ERROR_WITH_TITLE_7(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7) ERROR_WITH_TITLE(TITLE,FORMAT_7(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7)) +#define ERROR_WITH_TITLE_8(TITLE,MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8) ERROR_WITH_TITLE(TITLE,FORMAT_8(MESSAGE,ARG1,ARG2,ARG3,ARG4,ARG5,ARG6,ARG7,ARG8)) /* ------------------------------------------- Macro: MESSAGE_WITH_TITLE() From 9e37dc1192c9e4a54953cd126126f98debe4ed2f Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 1 Nov 2016 13:50:00 +0100 Subject: [PATCH 088/826] Fix make.py wiki lists --- .../wiki/development/setting-up-the-development-environment.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/wiki/development/setting-up-the-development-environment.md b/docs/wiki/development/setting-up-the-development-environment.md index c0333ac590..f2cdfc01ab 100644 --- a/docs/wiki/development/setting-up-the-development-environment.md +++ b/docs/wiki/development/setting-up-the-development-environment.md @@ -72,14 +72,17 @@ To start the game using this build, you can use the following modline: ## 4.3 Creating a Release Build To create a complete build of ACE3 that you can use without the source files you will need to: + - Ensure `.hpp` is **NOT** in pboProject's "Exclude From Pbo" list When the requirements are met: + - Execute `make.py version increment_build force check_external release` in the `tools` folder, replacing `` with the part of version you want to increment (options described below) This will populate the `release` folder with binarized PBOs, compiled extensions, copied extras, bisigns and a bikey. Additionally, an archive file will also be created in the folder. The folder and archive handle like those of any other mod. Different `make.py` command line options include: + - `version` - update version number in all files and leave them in working directory (leaving this out will still update the version in all files present in the `release` folder, but they will be reverted to not disturb the working directory) - `increment_build` - increments _build_ version number - `increment_patch` - increments _patch_ version number (ignored with `increment_minor` or `increment_major`) From 7d3d3ad47d3f749acab626316103151e245793a5 Mon Sep 17 00:00:00 2001 From: bux578 Date: Wed, 2 Nov 2016 11:46:50 +0100 Subject: [PATCH 089/826] add first draft of acerep --- docs/_posts/2016-11-03-ace3-version381.md | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 docs/_posts/2016-11-03-ace3-version381.md diff --git a/docs/_posts/2016-11-03-ace3-version381.md b/docs/_posts/2016-11-03-ace3-version381.md new file mode 100644 index 0000000000..781c99eece --- /dev/null +++ b/docs/_posts/2016-11-03-ace3-version381.md @@ -0,0 +1,46 @@ +--- +title: ACEREP #00007 +description: Status report on ACE3 version 3.8.1 +parent: posts +image: /img/news/160912_grenade.jpg +author: bux +layout: post +--- + +Just about two month ago we've released 3.7.0. A version that had most of the bugs fixed even before the official release. For the first time we were supplying users interested in helping us with pre release versions of the mod - so called release candidates. Quite a lot of communities tested the several release candidates and provided us with very valuable feedback. Especially on bugs and quirks that are near impossible to test alone. + + + +A big shoutout to those who helped testing! Thank you. + +We've used this approach for 3.8.0 aswell and hope that again most of the bugs have been fixed already and that you can enjoy ACE3 without annoying interruptions. + +We will keep this approach for the future and invite you to join to test the release candidates. All information will be posted in our public chat to which you're invited too. You can access it here: [http://slackin.ace3mod.com](http://slackin.ace3mod.com){:target="_blank"} + +So, why didn't we release any minor releases for 3.7.0 (e.g. 3.7.1)? In short: We didn't feel that it was necessary. During and directingly after the release we already had added new, awesome features so that we had to do a major release. + +Two new features have made it into 3.8.0 which are blood splatters and ammo box cook off. +Wounded units now will leave more visible trails of blood on the ground which could make for interesting missions like escaping as a wounded soldier who is being tracked down by enemy combatants. +When ammo boxes are destroyed the contained ammunition now will cook off in a multitude of small explosions and the boxes won't just sink into the ground. + +With 3.8.0 the map tools will allow you to draw straight lines again. A feature that sadly is missing in vanilla Arma 3. + +## The Future things + +### Medical rewrite + +If you're following ACE3 development on github closely you might already have spotted it: The medical system gets a huge rewrite. That's true, we're completely redoing the medical system. Until now the medical system has been a merge of the AGM and CSE medical systems. The AGM one kind of became what you know as the "basic system" and CSE's respectively the "advanced system". Being two separate systems it was always hard for us to improve one or the other without reworking the other one too. Not an ideal situation. Another issue we will address with this rewrite is the amount of influence a medical condition has on gameplay. An issue we've often heard from different communities aswell. There's an interesting discussion going on github with a lot of different ideas and feature requests. Worth a read. // link to that discussion + +With the state machine system that has been introduced in CBA we're able to rewrite the medical system in a better and easier way. +Now it's possible to define all medical conditions as different states and show feedback (visual, audio and textual) during the transitions between states (e.g. "no pain" -> "in pain") or react to sudden changes. All with performance and modularity in mind. + +We're really looking forward to the result and how you will like it. + +## The End Things + +The full changelog for ACE3 v3.8.1 can be found here: [https://github.com/acemod/ACE3/releases/v3.8.1](https://github.com/acemod/ACE3/releases/v3.8.1){:target="_blank"} + +We are still in need for translations for some languages within the ACE3 project. Please have a look at [this github issue to track the progress and what languages lack translations](https://github.com/acemod/ACE3/issues/367){:target="_blank"}. Any and all help with this is very appreciated. + +Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} and to [like our facebook page](https://www.facebook.com/ACE3Mod/){:target="_blank"}. + From 4ef3d9f0632bb891f46eac93d8b2bc15506e46fd Mon Sep 17 00:00:00 2001 From: bux578 Date: Wed, 2 Nov 2016 11:49:16 +0100 Subject: [PATCH 090/826] improve dockerfile --- docs/Dockerfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/Dockerfile b/docs/Dockerfile index aecfb1aa33..033cd89d67 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -2,7 +2,10 @@ # docker build -t ace3mod/jekyll . # # Run: -# docker run -p 4000:4000 -it ace3mod/jekyll +# docker run -it -p 4000:4000 -v $(pwd):/usr/src/app ace3mod/jekyll +# +# Run with --incremental flag: +# docker run -it -p 4000:4000 -v $(pwd):/usr/src/app ace3mod/jekyll --incremental FROM starefossen/github-pages:latest MAINTAINER bux @@ -11,4 +14,4 @@ COPY . /usr/src/app VOLUME "/usr/src/app" -CMD ["jekyll", "serve", "--future", "--incremental", "--config", "_config_dev.yml", "-H", "0.0.0.0", "-P", "4000"] +ENTRYPOINT ["jekyll", "serve", "--future", "--config", "_config_dev.yml", "-H", "0.0.0.0", "-P", "4000"] From 6a60770470625117b47a7ee0b3a8a8bc39c983b9 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 2 Nov 2016 13:54:22 +0100 Subject: [PATCH 091/826] Minor corrections in the ballistics module * Corrected AKS-U barrel length * Corrected .338 250gr BC * Corrected .338 API526 BC and muzzle velocity * Slightly reduced 5.8x42mm muzzle velocity --- addons/ballistics/CfgAmmo.hpp | 12 ++++++------ addons/ballistics/CfgWeapons.hpp | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 065dcdf17d..5884e63577 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -132,7 +132,7 @@ class CfgAmmo { ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; - ACE_muzzleVelocities[]={790, 930, 970}; + ACE_muzzleVelocities[]={790, 930, 950}; ACE_barrelLengths[]={369.0, 463.0, 600.0}; }; class B_65x39_Caseless : BulletBase { @@ -667,7 +667,7 @@ class CfgAmmo { ACE_bulletLength=43.18; ACE_bulletMass=19.44; ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.381}; + ACE_ballisticCoefficients[]={0.368}; ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; @@ -683,12 +683,12 @@ class CfgAmmo { ACE_bulletLength=38.989; ACE_bulletMass=16.3941242; ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.560}; + ACE_ballisticCoefficients[]={0.290}; ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={880, 915, 925}; - ACE_barrelLengths[]={508.0, 660.4, 711.2}; + ACE_dragModel=7; + ACE_muzzleVelocities[]={880, 895, 900}; + ACE_barrelLengths[]={508.0, 685,8, 711.2}; }; class B_127x33_Ball: BulletBase { tracerScale = 1.3; //1.2; diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 51f815f938..b1791d7fe7 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -262,9 +262,9 @@ class CfgWeapons { /* Rifles */ class arifle_AKS_base_F: Rifle_Base_F { - initSpeed = -1.00419; + initSpeed = -1.0; ACE_barrelTwist=160.02; - ACE_barrelLength=210.82; + ACE_barrelLength=206.5; }; class arifle_AKM_base_F: Rifle_Base_F { initSpeed = -1.0014; From 71fe9bde7d703b6b71fbfc29d2d76aac82f00850 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 2 Nov 2016 14:27:26 +0100 Subject: [PATCH 092/826] Fixed a typo --- addons/ballistics/CfgAmmo.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 5884e63577..5fc2168b84 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -688,7 +688,7 @@ class CfgAmmo { ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; ACE_muzzleVelocities[]={880, 895, 900}; - ACE_barrelLengths[]={508.0, 685,8, 711.2}; + ACE_barrelLengths[]={508.0, 685.8, 711.2}; }; class B_127x33_Ball: BulletBase { tracerScale = 1.3; //1.2; From aef7010d67f9d9f5b2d2522107313b7edcc8a948 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 2 Nov 2016 18:05:19 +0100 Subject: [PATCH 093/826] Fixes the ATragMX 'Done' button issue (#4617) --- .../functions/fnc_update_zero_range.sqf | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index 299c321d33..3d56dc81eb 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -15,6 +15,8 @@ */ #include "script_component.hpp" +[] call FUNC(parse_input); + private ["_scopeBaseAngle"]; _scopeBaseAngle = (GVAR(workingMemory) select 3); @@ -28,10 +30,7 @@ _dragModel = GVAR(workingMemory) select 16; _atmosphereModel = GVAR(workingMemory) select 17; private ["_zeroRange"]; -_zeroRange = Round(parseNumber(ctrlText 120060)); -if (GVAR(currentUnit) == 1) then { - _zeroRange = _zeroRange / 1.0936133; -}; +_zeroRange = GVAR(workingMemory) select 2; if (_zeroRange < 10) exitWith { GVAR(workingMemory) set [2, _zeroRange]; GVAR(workingMemory) set [3, 0]; @@ -42,9 +41,17 @@ _altitude = GVAR(altitude); _temperature = GVAR(temperature); _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); +if (!GVAR(atmosphereModeTBH)) then { + _barometricPressure = 1013.25 * (1 - (0.0065 * _altitude) / (273.15 + _temperature + 0.0065 * _altitude)) ^ 5.255754495; + _relativeHumidity = 50; +}; -private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0, 0] call FUNC(calculate_solution); +{ + private _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0, 0] call FUNC(calculate_solution); + private _offset = (_result select 0) / 60; + _scopeBaseAngle = _scopeBaseAngle + _offset; + if (_offset < 0.01) exitWith {}; +} forEach [1, 2, 3]; GVAR(workingMemory) set [2, _zeroRange]; -GVAR(workingMemory) set [3, _scopeBaseAngle + (_result select 0) / 60]; +GVAR(workingMemory) set [3, _scopeBaseAngle]; From 14c9cffb6a95380eeaad7d1616c5634dcaf7423b Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 2 Nov 2016 18:44:39 +0100 Subject: [PATCH 094/826] Prevent switching to weapon while carrying fuel nozzle - fix #4601 --- addons/refuel/XEH_PREP.hpp | 1 + addons/refuel/XEH_postInit.sqf | 1 + .../fnc_handlePlayerWeaponChanged.sqf | 29 +++++++++++++++++++ .../functions/fnc_maxDistanceDropNozzle.sqf | 4 +++ 4 files changed, 35 insertions(+) create mode 100644 addons/refuel/functions/fnc_handlePlayerWeaponChanged.sqf diff --git a/addons/refuel/XEH_PREP.hpp b/addons/refuel/XEH_PREP.hpp index 806d861a69..282b008fca 100644 --- a/addons/refuel/XEH_PREP.hpp +++ b/addons/refuel/XEH_PREP.hpp @@ -14,6 +14,7 @@ PREP(dropNozzle); PREP(getFuel); PREP(handleDisconnect); PREP(handleKilled); +PREP(handlePlayerWeaponChanged); PREP(handleUnconscious); PREP(makeJerryCan); PREP(maxDistanceDropNozzle); diff --git a/addons/refuel/XEH_postInit.sqf b/addons/refuel/XEH_postInit.sqf index 89a1f3dc45..f0fb928187 100644 --- a/addons/refuel/XEH_postInit.sqf +++ b/addons/refuel/XEH_postInit.sqf @@ -1,6 +1,7 @@ #include "script_component.hpp" ["ace_unconscious", {_this call FUNC(handleUnconscious)}] call CBA_fnc_addEventHandler; +["weapon", FUNC(handlePlayerWeaponChanged)] call CBA_fnc_addPlayerEventHandler; if (isServer) then { addMissionEventHandler ["HandleDisconnect", {_this call FUNC(handleDisconnect)}]; diff --git a/addons/refuel/functions/fnc_handlePlayerWeaponChanged.sqf b/addons/refuel/functions/fnc_handlePlayerWeaponChanged.sqf new file mode 100644 index 0000000000..57897aef89 --- /dev/null +++ b/addons/refuel/functions/fnc_handlePlayerWeaponChanged.sqf @@ -0,0 +1,29 @@ +/* + * Author: Jonpas + * Drops nozzle or jerry can when selecting a weapon. + * + * Arguments: + * 0: Unit + * 1: Weapon (unused) + * + * Return Value: + * None + * + * Example: + * [_unit, "gun"] call ace_refuel_fnc_handlePlayerWeaponChanged; + * + * Public: No +*/ +#include "script_component.hpp" + +params ["_unit"]; + +// Drop nozzle/jerry can when selecting a non-primary weapon +if (_unit getVariable [QGVAR(isRefueling), false]) then { + private _nozzle = _unit getVariable [QGVAR(nozzle), objNull]; + if !(isNull _nozzle) then { + [_unit, _nozzle] call FUNC(dropNozzle); + _unit setVariable [QGVAR(selectedWeaponOnRefuel), nil]; + [_unit, "forceWalk", "ACE_refuel", false] call EFUNC(common,statusEffect_set); + }; +}; diff --git a/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf index 90231a30f2..687af9e072 100644 --- a/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf +++ b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf @@ -33,6 +33,10 @@ if (_nozzle getVariable [QGVAR(jerryCan), false]) exitWith {}; ["_nozzle", (_args select 0) getVariable [QGVAR(nozzle), objNull], [objNull]] ]; + if (_unit getVariable [QGVAR(isRefueling), false]) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + }; + if (isNull _source || {_unit distance (_source modelToWorld _endPosOffset) > (REFUEL_HOSE_LENGTH - 2)} || {!alive _source}) exitWith { if !(isNull _nozzle) then { [_unit, _nozzle] call FUNC(dropNozzle); From 0bfc476888d4f91e4a5cfd210859ef8edfb28f49 Mon Sep 17 00:00:00 2001 From: bux578 Date: Thu, 3 Nov 2016 10:54:20 +0100 Subject: [PATCH 095/826] add second draft of acerep7 --- docs/_posts/2016-11-03-ace3-version381.md | 17 ++++++++++++++++- docs/img/news/161003_blood.jpg | Bin 0 -> 307625 bytes 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 docs/img/news/161003_blood.jpg diff --git a/docs/_posts/2016-11-03-ace3-version381.md b/docs/_posts/2016-11-03-ace3-version381.md index 781c99eece..38439ff876 100644 --- a/docs/_posts/2016-11-03-ace3-version381.md +++ b/docs/_posts/2016-11-03-ace3-version381.md @@ -2,7 +2,7 @@ title: ACEREP #00007 description: Status report on ACE3 version 3.8.1 parent: posts -image: /img/news/160912_grenade.jpg +image: /img/news/161003_blood.jpg author: bux layout: post --- @@ -23,6 +23,12 @@ Two new features have made it into 3.8.0 which are blood splatters and ammo box Wounded units now will leave more visible trails of blood on the ground which could make for interesting missions like escaping as a wounded soldier who is being tracked down by enemy combatants. When ammo boxes are destroyed the contained ammunition now will cook off in a multitude of small explosions and the boxes won't just sink into the ground. +
+
+ A wounded insurgent in front of a damaged truck. +
+
+ With 3.8.0 the map tools will allow you to draw straight lines again. A feature that sadly is missing in vanilla Arma 3. ## The Future things @@ -36,6 +42,15 @@ Now it's possible to define all medical conditions as different states and show We're really looking forward to the result and how you will like it. +### Night Vision Googles Improvements + +If you've [watched dslyecxi's recent youtube videos](https://www.youtube.com/user/Dslyecxi){:target="_blank"} or if you're [following us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} you might already have seen that dslyecxi has put together a mod vastly improving night vision googles and the resulting very limiting view. Check out his video with the explanation why vanilla Arma 3 NVGs are a bad representation of real life NVGs and what he has done to improve that. + + + + +dslyecxi has donated his mod to ACE3 and we're looking into integrating it for a future release. + ## The End Things The full changelog for ACE3 v3.8.1 can be found here: [https://github.com/acemod/ACE3/releases/v3.8.1](https://github.com/acemod/ACE3/releases/v3.8.1){:target="_blank"} diff --git a/docs/img/news/161003_blood.jpg b/docs/img/news/161003_blood.jpg new file mode 100644 index 0000000000000000000000000000000000000000..80af0fdd04838d9b9d64eec468d14a6973d10193 GIT binary patch literal 307625 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%0A%pHkoO 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�AJE{cZJl>(J0v zMZIKU4ldOt+=gGM9YF)WwOz0msT)fdp>q=YiS)?bSOywi=cQ28nJwc>keQ{)BrfmD ziqAXSRW|akQ*rU7=?+T17z=|UIk6QPEt0LYvi>kZCi;A8jf|&n+KCbwl6dEt$%+;H zl~JIKu_Tghprur;~EYav+d->^v9^O(p%uPtbS%(}|D9oUDDaNhR5*0>BQ00o&tM zb}scQS-4B777?K*rl20;ucIoqN%63vm;`1cKvau;hyGMp6-@Hbu|ToudkF~qU9Yc7 zm1PzY3@eMdy|n=U09w4P^jNKLO#LHKrX67_Jh}<)9nJROsUYb!S2ilut}A>j^D_d zX%W;leZ`J-^#|YnG}0^^{{X$f!uyBEy#~gD3HeM}Q0;Mk)myM&RsP_C&6@hveTPWW zY{=y5FMhrhRfE(DObi^+X%%(&Rn^F?z^60V+*Uy>BU|{2E~$b_-zDu)#d+|U+;kVJ zEumOgk!a;JvBt?zkTf;R*`^rkrsJ2!b+p6H-l$sa9-@r=oH-nNY%kGjo7JvN8<2~T z52jgW*?J z*n>-14dcOu6u7WZHnING@v5w(xhxN`pvBE#i~)YPwT)2ILdqM-?HqF-uBtcoDlByH zwJP4xVxnSsc}$)W_amQ7A2AF;1L6&C)wi-T?AHd*`gQ_poZVt9I_G48;AA5J5c{WA~U~TEL-^#uR zwuZU4slKef^9w49>A8hWosppY9)MgX#v^Tvh*L?c9Zs0U=5EVCKl># za0Tu^#+C?;iYe4;8rs{TsjV>+QHzf)jF;5&;RwUXM-f03nK5++yS>aF~KSLl32 zRGb{zx2?c7U7QlO4hDeVQSd$MOq8d)c>q#Vd#`=wEUCh^}Mp)Q8t$(_*+hL}fQ?Fnv zW~C>S{I153#vv@Gz*eb)#H%*OxcGCbZYo7lYe?vl65>#;<3=znu z>OstLkVzNiujU;ETf#Z%%Ot{pV&essZvOy=_S(Ak9nDd4)UqzlJKD;2j;wm0vZ>(N zP40yFvY1d9)P(r;KNCe4t=}gkvgSzrJ9RziJ2q_B#6vfRU^Q&A&I)Kta|)@RdTeF0F!KY zEZ%1Nn%dZQ6qiE>@yPj1S8ewH0H+fHx3AR3nP5i4r^ruG;|BGQ(%A)Ws83}T4wR>EO(XOeBKZtQ-cd+9|?5N{OZ4>f}kZkMHK90KHWcxmOxYeo%@ zy-&)SVG?A^zQX7$A^5NCu*L1Q9ITn&o_#*8S+&4j$QS6hyNH#{*L5L+})d zmB6xjTHc@}U!Xm~?M-e8RSbcfDQzT2&~dKqyNLNxRSwX83tw=%9Em^GnT_3tfb1w) zlc;LB#LI^)My_#3^-o@%`;%4m3`j-h$bd})ZVToo$NE*t z6+AH5aB;G+RF?GF?pzWtap6eNQ;$B${-p&YV*zbw{-vy z3T0ti$eRJ7W-h=*k_DBQL8nhIN@g^SPEI3wSlI}YN=}9K174<j$T#BaZ2C4_={x3;A8p;ZKEeT6*Bg^rw@o8wRmOA*>ZZ^GU* zmQ6V#x1m_~hqK_%3!93OyD#_>@D-VO0$IlzAew4@kTyo6ppqp+` z&0s3YoQ9>7C0E~Cdk0H zgUxGNtl1GI6m2*xc)UIr8#k>!`3%QNqtqe)0IJpkvs-H))X%yi$>MQChD3NDbNWme z%^QybEJuw|uC21Y_3aE%$3(v8fMv`?8IZ2n<6D6wYp6%KAd0_%_3MNLTHJ|;9x&Ww zuFV!PDnwEN=Gem4`5L)WP#@ahwnv5~;vthMgEVeR0LUB*YvX@~D#2t)R_Ah85#A`D z*KDR%n`l8IBI*=a4X4J!uC041VqVU#0}eVkBMQvQ*-}DY2T#kmAdgB*3vai2qTG^Y z3(f%J^D*;rH$}#0J%rf+vd1_eNQ}d`#;xxn#0)WV*BdHr%0%pTOyRvq1&HfR ztkX47bx?Emo=CIIL3Y3|zsb@;*19xG)s|Ok$nzLQF3C|uV31kWcCxVOdg)o)^d7qX zM>0t`fs`N3H{W755Jj(RQbd|l6bxw}Xkt}vRnXjRJ&(xKqN^hkU>tM+9g(T{lC6HX z15riTj2|R8EgOAc`P%+pvfZepQsiAMatF9JBVRW_J5{y8Q$`vY?RdwWjT^0n^&{s} zWrbD^_)OUnSz>TZDtyAgIJa;=!jkoqR4MuKW)2f6 zD-NooP2$YJeipH@6xMP@gL11RidA-mK2_9}_#5g)TU(@x-8%-&$SxFMx|P4w$nK{OZ1;97FD`cOjBNR;x5t(9av66A-G`zLc+P3aHS=GNau3>E5iZ+be1c z$1N5tOjW=YVy9tbtmN_0X96+wBdHY@fIAePUk4|Q%|Kj~Cg_b-*_SnO!y>20FWx>lT08kj{x&vd>d}~s)o}Wh&4avr@DzVXeuAjis?FNRj zdd74Jg3bp~^pW625xoiUG4nBHRRRj}o z>A2Z9DAmMd>c8D%+;RHA{j*jRnlk)qZQ%FP&4A`9&VvT9Y-bsqvMDu72GSdEEC zKAH0?Ui(4UvHR*kQyIg`rG}s}&>eQ4x3w$`HO5BE7C~lhEn{%s^QxUPBOuBvjKoXj zQKXDIs}B%GQEge17R?ir%lXT%(nZymp}%l@U&4`A1=m+r4=yVm!q@)f`n2&K?^;p4 beaH>*%8jGUq}_Z$A3pU}>T`UJ9gqLn5d#|^ literal 0 HcmV?d00001 From d1d27963923574b1b316799450a96b612e4f56a1 Mon Sep 17 00:00:00 2001 From: bux578 Date: Thu, 3 Nov 2016 11:12:18 +0100 Subject: [PATCH 096/826] fix typos, improve medical rewrite cba text --- docs/_posts/2016-11-03-ace3-version381.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/_posts/2016-11-03-ace3-version381.md b/docs/_posts/2016-11-03-ace3-version381.md index 38439ff876..9ce43188c0 100644 --- a/docs/_posts/2016-11-03-ace3-version381.md +++ b/docs/_posts/2016-11-03-ace3-version381.md @@ -13,14 +13,14 @@ Just about two month ago we've released 3.7.0. A version that had most of the bu A big shoutout to those who helped testing! Thank you. -We've used this approach for 3.8.0 aswell and hope that again most of the bugs have been fixed already and that you can enjoy ACE3 without annoying interruptions. +We've used this approach for 3.8.0 as well and hope that again most of the bugs have been fixed already and that you can enjoy ACE3 without annoying interruptions. We will keep this approach for the future and invite you to join to test the release candidates. All information will be posted in our public chat to which you're invited too. You can access it here: [http://slackin.ace3mod.com](http://slackin.ace3mod.com){:target="_blank"} -So, why didn't we release any minor releases for 3.7.0 (e.g. 3.7.1)? In short: We didn't feel that it was necessary. During and directingly after the release we already had added new, awesome features so that we had to do a major release. +So, why didn't we release any minor releases for 3.7.0 (e.g. 3.7.1)? In short: We didn't feel that it was necessary. During and directly after the release we had already added new and awesome features so that we had to do a major release. -Two new features have made it into 3.8.0 which are blood splatters and ammo box cook off. -Wounded units now will leave more visible trails of blood on the ground which could make for interesting missions like escaping as a wounded soldier who is being tracked down by enemy combatants. +Two new features have made it into 3.8.0 which are "blood splatters" and "ammo box cook off". +Wounded units will now leave more visible trails of blood on the ground which could make for interesting missions like escaping as a wounded soldier who is being tracked down by enemy combatants. When ammo boxes are destroyed the contained ammunition now will cook off in a multitude of small explosions and the boxes won't just sink into the ground.
@@ -35,10 +35,9 @@ With 3.8.0 the map tools will allow you to draw straight lines again. A feature ### Medical rewrite -If you're following ACE3 development on github closely you might already have spotted it: The medical system gets a huge rewrite. That's true, we're completely redoing the medical system. Until now the medical system has been a merge of the AGM and CSE medical systems. The AGM one kind of became what you know as the "basic system" and CSE's respectively the "advanced system". Being two separate systems it was always hard for us to improve one or the other without reworking the other one too. Not an ideal situation. Another issue we will address with this rewrite is the amount of influence a medical condition has on gameplay. An issue we've often heard from different communities aswell. There's an interesting discussion going on github with a lot of different ideas and feature requests. Worth a read. // link to that discussion +If you're following ACE3 development on github closely you might already have spotted it: The medical system gets a huge rewrite. That's true, we're completely redoing the medical system. Until now the medical system has been a merge of the AGM and CSE medical systems. The AGM one kind of became what you know as the "basic system" and CSE's respectively the "advanced system". Being two separate systems it was always hard for us to improve one or the other without reworking the other one too. Not an ideal situation. Another issue we will address with this rewrite is the amount of influence a medical condition has on gameplay. An issue we've often heard from different communities as well. There's an [interesting discussion going on github with a lot of different ideas and feature requests](https://github.com/acemod/ACE3/issues/3134{:target="_blank"}). Worth a read. -With the state machine system that has been introduced in CBA we're able to rewrite the medical system in a better and easier way. -Now it's possible to define all medical conditions as different states and show feedback (visual, audio and textual) during the transitions between states (e.g. "no pain" -> "in pain") or react to sudden changes. All with performance and modularity in mind. +With the state machine system that has been introduced in CBA we are now able to strictly define various health states of players such as unconsciousness or cardiac arrest and what can happen in those states. This allows us to massively declutter the code which will not only reduce the possibility of bugs, but also enable us to add more features and gameplay elements to the medical system - with no performance loss at all. We're really looking forward to the result and how you will like it. From 0746264905accb7477f930548ae541af9bb2920b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 3 Nov 2016 18:01:58 -0500 Subject: [PATCH 097/826] MedicalAI - Fix treatment animion with no weapon (#4633) --- addons/medical_ai/functions/fnc_playTreatmentAnim.sqf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf index 93a784922d..f013486cc1 100644 --- a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf +++ b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf @@ -32,7 +32,12 @@ if (stance _unit == "PRONE") then { }; private _anim = getText (_animConfig >> _configProperty); -private _wpn = ["non", "rfl", "pst"] select (1 + ([primaryWeapon _unit, handgunWeapon _unit] find (currentWeapon _unit))); +private _wpn = switch (true) do { + case ((currentWeapon _unit) == ""): {"non"}; + case ((currentWeapon _unit) == (primaryWeapon _unit)): {"rfl"}; + case ((currentWeapon _unit) == (handgunWeapon _unit)): {"pst"}; + default {"non"}; +}; _anim = [_anim, "[wpn]", _wpn] call CBA_fnc_replace; [_unit, _anim] call EFUNC(common,doAnimation); From f23d96d4559ce6911f4ff1f1e8afe8f818fddd2f Mon Sep 17 00:00:00 2001 From: bux578 Date: Fri, 4 Nov 2016 09:24:21 +0100 Subject: [PATCH 098/826] fix typos, wording --- docs/_posts/2016-11-03-ace3-version381.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/_posts/2016-11-03-ace3-version381.md b/docs/_posts/2016-11-03-ace3-version381.md index 9ce43188c0..9e52325f53 100644 --- a/docs/_posts/2016-11-03-ace3-version381.md +++ b/docs/_posts/2016-11-03-ace3-version381.md @@ -7,7 +7,7 @@ author: bux layout: post --- -Just about two month ago we've released 3.7.0. A version that had most of the bugs fixed even before the official release. For the first time we were supplying users interested in helping us with pre release versions of the mod - so called release candidates. Quite a lot of communities tested the several release candidates and provided us with very valuable feedback. Especially on bugs and quirks that are near impossible to test alone. +Just about two month ago we've released 3.7.0. A version that had most of the bugs fixed even before the official release. For the first time we were actively supplying users interested in helping us with pre release versions of the mod - so called release candidates. Quite a lot of communities tested the several release candidates and provided us with very valuable feedback. Especially on bugs and quirks that are near impossible to test alone. @@ -35,7 +35,7 @@ With 3.8.0 the map tools will allow you to draw straight lines again. A feature ### Medical rewrite -If you're following ACE3 development on github closely you might already have spotted it: The medical system gets a huge rewrite. That's true, we're completely redoing the medical system. Until now the medical system has been a merge of the AGM and CSE medical systems. The AGM one kind of became what you know as the "basic system" and CSE's respectively the "advanced system". Being two separate systems it was always hard for us to improve one or the other without reworking the other one too. Not an ideal situation. Another issue we will address with this rewrite is the amount of influence a medical condition has on gameplay. An issue we've often heard from different communities as well. There's an [interesting discussion going on github with a lot of different ideas and feature requests](https://github.com/acemod/ACE3/issues/3134{:target="_blank"}). Worth a read. +If you're following ACE3 development on GitHub closely you might already have spotted it: The medical system gets a huge rewrite. That's true, we're completely redoing the medical system. Until now the medical system has been a merge of the AGM and CSE medical systems. The AGM one kind of became what you know as the "basic system" and CSE's respectively the "advanced system". Being two separate systems it was always hard for us to improve one or the other without reworking the other one too. Not an ideal situation. Another issue we will address with this rewrite is the amount of influence a medical condition has on gameplay. An issue we've often heard from different communities as well. There's an [interesting discussion going on GitHub with a lot of different ideas and feature requests](https://github.com/acemod/ACE3/issues/3134{:target="_blank"}). Worth a read. With the state machine system that has been introduced in CBA we are now able to strictly define various health states of players such as unconsciousness or cardiac arrest and what can happen in those states. This allows us to massively declutter the code which will not only reduce the possibility of bugs, but also enable us to add more features and gameplay elements to the medical system - with no performance loss at all. @@ -43,7 +43,7 @@ We're really looking forward to the result and how you will like it. ### Night Vision Googles Improvements -If you've [watched dslyecxi's recent youtube videos](https://www.youtube.com/user/Dslyecxi){:target="_blank"} or if you're [following us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} you might already have seen that dslyecxi has put together a mod vastly improving night vision googles and the resulting very limiting view. Check out his video with the explanation why vanilla Arma 3 NVGs are a bad representation of real life NVGs and what he has done to improve that. +If you've [watched dslyecxi's recent YouTube videos](https://www.youtube.com/user/Dslyecxi){:target="_blank"} or if you're [following us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} you might already have seen that dslyecxi has put together a mod vastly improving night vision googles and the resulting very limiting view. Check out his video with the explanation why vanilla Arma 3 NVGs are a bad representation of real life NVGs and what he has done to improve that. @@ -54,7 +54,7 @@ dslyecxi has donated his mod to ACE3 and we're looking into integrating it for a The full changelog for ACE3 v3.8.1 can be found here: [https://github.com/acemod/ACE3/releases/v3.8.1](https://github.com/acemod/ACE3/releases/v3.8.1){:target="_blank"} -We are still in need for translations for some languages within the ACE3 project. Please have a look at [this github issue to track the progress and what languages lack translations](https://github.com/acemod/ACE3/issues/367){:target="_blank"}. Any and all help with this is very appreciated. +We are still in need for translations for some languages within the ACE3 project. Please have a look at [this GitHub issue to track the progress and what languages lack translations](https://github.com/acemod/ACE3/issues/367){:target="_blank"}. Any and all help with this is very appreciated. Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} and to [like our facebook page](https://www.facebook.com/ACE3Mod/){:target="_blank"}. From f9f6afb8bbfcf5849ba9e7513fac7e224b0f8373 Mon Sep 17 00:00:00 2001 From: bux578 Date: Fri, 4 Nov 2016 20:16:35 +0100 Subject: [PATCH 099/826] increase date --- ...-version381.md => 2016-11-04-ace3-version381.md} | 4 ++-- .../img/news/{161003_blood.jpg => 161104_blood.jpg} | Bin 2 files changed, 2 insertions(+), 2 deletions(-) rename docs/_posts/{2016-11-03-ace3-version381.md => 2016-11-04-ace3-version381.md} (98%) rename docs/img/news/{161003_blood.jpg => 161104_blood.jpg} (100%) diff --git a/docs/_posts/2016-11-03-ace3-version381.md b/docs/_posts/2016-11-04-ace3-version381.md similarity index 98% rename from docs/_posts/2016-11-03-ace3-version381.md rename to docs/_posts/2016-11-04-ace3-version381.md index 9e52325f53..29bc850e97 100644 --- a/docs/_posts/2016-11-03-ace3-version381.md +++ b/docs/_posts/2016-11-04-ace3-version381.md @@ -2,7 +2,7 @@ title: ACEREP #00007 description: Status report on ACE3 version 3.8.1 parent: posts -image: /img/news/161003_blood.jpg +image: /img/news/161104_blood.jpg author: bux layout: post --- @@ -25,7 +25,7 @@ When ammo boxes are destroyed the contained ammunition now will cook off in a mu
- A wounded insurgent in front of a damaged truck. + A wounded insurgent in front of a damaged truck.
diff --git a/docs/img/news/161003_blood.jpg b/docs/img/news/161104_blood.jpg similarity index 100% rename from docs/img/news/161003_blood.jpg rename to docs/img/news/161104_blood.jpg From 7efe752f3c87f5f02e5857f26e36c55afabf057d Mon Sep 17 00:00:00 2001 From: System98 Date: Sat, 5 Nov 2016 13:42:55 +0100 Subject: [PATCH 100/826] Update german translation - Add missing german translations --- addons/advanced_throwing/stringtable.xml | 22 +++++++++++- addons/chemlights/stringtable.xml | 41 +++++++++++++++++++++- addons/cookoff/stringtable.xml | 10 ++++-- addons/dogtags/stringtable.xml | 6 ++++ addons/explosives/stringtable.xml | 4 ++- addons/goggles/stringtable.xml | 5 ++- addons/laser/stringtable.xml | 3 +- addons/maptools/stringtable.xml | 6 +++- addons/medical_blood/stringtable.xml | 5 ++- addons/minedetector/stringtable.xml | 10 +++++- addons/overheating/stringtable.xml | 12 +++++-- addons/tagging/stringtable.xml | 9 ++++- addons/trenches/stringtable.xml | 3 ++ addons/ui/stringtable.xml | 44 +++++++++++++++++++++++- addons/zeus/stringtable.xml | 33 +++++++++++++++++- 15 files changed, 197 insertions(+), 16 deletions(-) diff --git a/addons/advanced_throwing/stringtable.xml b/addons/advanced_throwing/stringtable.xml index dfd346a9e1..4e11662e90 100644 --- a/addons/advanced_throwing/stringtable.xml +++ b/addons/advanced_throwing/stringtable.xml @@ -6,60 +6,70 @@ Улучшенный бросок гранат アドバンスド投てき Zaawansowane rzucanie + Erweitertes Werfen Allows changing advanced throwing behaviour. Позволяет настраивать поведение улучшенного броска гранат. アドバンスド投てきの挙動変更を許可します。 Zezwala na zmianę zachowania zaawansowanego trybu rzucania. + Erlaubt es, das Verhalten beim erweiterten Werfen zu ändern. Enable Advanced Throwing Включить улучшенный бросок アドバンスド投てきを有効化 Aktywuj zaawansowane rzucanie + Aktiviert erweitertes Werfen Enables advanced throwing system. Включает систему улучшенного броска. アドバンスド投てきシステムを有効化 Aktywuje system zaawansowanego rzucania. + Aktiviert das erweiterte Wurfsystem. Show Throw Arc Показать траекторию броска 軌道を表示 Pokaż trasę lotu + Zeige Wurfbogen Enables visualization of the throw arc (where throwable will fly). Включает визуализацию траектории броска (как полетит граната). 投てき物の予測軌道の表示を有効化します。 Wyświetla wizualizację trasy przelotu granatu. + Aktiviert die Visualisierung des Wurfbogens (wohin das Objekt geworfen werden wird). Show Throwing Mouse Controls Показывать управление мышью 投てきのマウス操作を表示 Pokaż podpowiedzi sterowania myszą + Zeige Maussteuerung beim Werfen Enables visual cues for mouse controls when throwable is prepared. Включает отображение подсказок по управлению мышью, когда граната подготовлена. 投てき物を投げるとき、マウス操作の説明表示を有効化します。 Wyświetla podpowiedzi sterowania myszą kiedy obiekt miotany jest w ręku. + Aktiviert visuelle Hinweise zur Maussteuerung, wenn ein Objekt zum Werfen vorbereitet wird. Enable Throwables Pick Up Включить подбор гранат 投てき物の拾い上げを有効化 Zezwól na podnoszenie obiektów miotanych + Aktiviere Aufheben von Wurfobjekten Enables ability to pick up throwables from the ground. Включает возможность подбирать гранаты с земли. 地面に落ちている投てき物の拾い上げ動作を有効化します。 Umożliwia podnoszenie obiektów miotanych z ziemi. + Aktiviert die Möglichkeit, geworfene Objekte wieder vom Boden aufzuheben. Enable Attached Throwables Pick Up @@ -72,60 +82,70 @@ Включает возможность подбирать гранаты, прикрепленные к объектам. オブジェクトに取り付けられていた投てき物を拾い上げられるようにします。 Umożliwia podnoszenie obiektów miotanych przyczepionych do innych obiektów. + Aktiviert die Möglichkeit, befestigte Wurfobjekte erneut aufzunehmen. Prepare/Change Throwable Подготовить/заменить гранату 機能の起動/変更 Przygotuj/zmień ob. miotany + Wurfobjekt vorbereiten/wechseln Throwable Drop Mode (Hold) Режим броска гранаты (удерживать) 投てきモード (押しっぱ) Tryb upuszczania ob. miotanego (przytrzymaj) + Wurfobjekt Fallmodus (halten) Throwable Drop Mode (Toggle) Режим броска гранаты (переключить) 投てきモード (トグル) Tryb upuszczania ob. miotanego (przełącz) + Wurfobjekt Fallmodus (umschalten) Primed Подготовлена 起動した Odbezpieczony + Scharf gemacht Throw Бросить 投げる Rzuć + Werfen (Scroll) Change Mode (Скролл) Изменить режим (スクロール) モード変更 (Kółko m.) zmień tryb + (Scrollen) Modus wechseln (Scroll) Extend (Скролл) Увеличить (スクロール) 遠くに (Kółko m.) przedłuż + (Scrollen) Erweitern (Click) Cook (Клик) Подготовить (クリック) 起爆 (Kliknięcie) Odbezpiecz + (Klicken) Abkochen Pick Up Подобрать 拾い上げる Podnieś + Aufheben - + \ No newline at end of file diff --git a/addons/chemlights/stringtable.xml b/addons/chemlights/stringtable.xml index 72ac033d3e..b11c60f04d 100644 --- a/addons/chemlights/stringtable.xml +++ b/addons/chemlights/stringtable.xml @@ -5,16 +5,19 @@ Chemlights ケミライト Świetliki + Knicklichter Prepare %1 %1 をつかう Przygotuj %1 + %1 vorbereiten %1<br/>Prepared %1&lt;br/&gt; をつかった %1<br/>Przygotowany + %1<br/>vorbereitet No inventory space @@ -33,180 +36,216 @@ [ACE] Chemlights [ACE] ケミライト [ACE] Świetliki + [ACE] Knicklichter Chemlight (Orange) ケミライト (オレンジ) Świetlik (pomarańczowy) + Knicklicht (orange) Orange Light オレンジ色 Pomarańczowe światło + Oranges Knicklicht Type: Light - Orange<br />Rounds: 1<br />Used in: Hand 種類: 照明 - オレンジ&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - pomarańczowe<br/>Pociski: 1<br/>Używany w: ręce + Typ: Licht - orange<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (White) ケミライト (白) Świetlik (biały) + Knicklicht (weiß) White Light 白色 Białe światło + Weißes Knicklicht Type: Light - White<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 白&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - białe<br/>Pociski: 1<br/>Używany w: ręce + Typ: Licht - weiß<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (Hi Red) ケミライト (高輝度 赤) Świetlik (jaskrawy czerwony) + Knicklicht (Hi rot) Red Hi Light 高輝度の赤色 Jaskrawe czerwone światło + Rotes Hi Licht Type: Light - Red Hi (5 minute)<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 高輝度 赤 (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - jaskrawe czerwone (5 minut)<br/>Pociski: 1<br/>Używany w: ręce + Typ: Licht - rot Hi (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (Hi Yellow) ケミライト (高輝度 黄) Świetlik (jaskrawy żółty) + Knicklicht (Hi gelb) Yellow Hi Light 高輝度の黄色 Jaskrawe żółte światło + Gelbes Hi Licht Type: Light - Yellow Hi (5 minute)<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 高輝度 黄 (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - jaskrawe żółte (5 minut)<br/>Pociski: 1<br/>Używany w: ręce + Typ: Licht - gelb Hi (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (Hi Orange) ケミライト (高輝度 オレンジ) Świetlik (jaskrawy pomarańczowy) + Knicklicht (Hi orange) Orange Hi Light 高輝度のオレンジ Jaskrawe pomarańczowe światło + Oranges Hi Licht Type: Light - Orange Hi (5 minute)<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 高輝度 オレンジ (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - jaskrawe pomarańczowe (5 minut)<br/>Pociski: 1<br/>Używany w: ręce + Typ: Licht - orange Hi (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (Hi White) ケミライト (高輝度 白) Świetlik (jaskrawy biały) + Knicklicht (Hi weiß) White Hi Light 高輝度の白色 Jaskrawe białe światło + Weißes Hi Licht Type: Light - White Hi (5 minute)<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 高輝度 白 (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - jaskrawe białe (5 minut)<br/>Pociski: 1<br/>Używany w: ręce + Typ: Licht - weiß Hi (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (IR) ケミライト (IR) Świetlik (podczerwony) + Knicklicht (IR) IR Light 赤外線光 Światło podczerwone + IR Licht Type: Light - Infrared<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 赤外線&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - podczerwone<br/>Pociski: 1<br/>Używany w: ręce + Typ: Licht - infrarot<br />Anzahl: 1<br />Benutzt in: Hand Chemlight Shield (Empty) ケミライト シールド (空) Osłona na świetlik (pusta) + Knicklicht-Abschirmung (leer) Shield for chemlights. Combine with chemlight to prepare reading light. ケミライトを入れられます。シールドとケミライトを組み合わせることで、照明にもなりえます。 Osłona na świetliki. Połącz ją ze świetlikiem by stworzyć lampkę do czytania. + Abschirmung für Knicklichter. Mit Knicklicht kombinieren, um Leselicht zu erhalten. Chemlight Shield (Green) ケミライト シールド (緑) Osłona na świetlik (zielona) + Knicklicht-Abschirmung (grün) Green reading light. 緑色の照明。 Zielona lampka. + Grünes Leselicht. Chemlight Shield (Red) ケミライト シールド (赤) Osłona na świetlik (czerwona) + Knicklicht-Abschirmung (rot) Red reading light. 赤色の照明。 Czerwona lampka. + Rotes Leselicht. Chemlight Shield (Blue) ケミライト シールド (青) Osłona na świetlik (niebieska) + Knicklicht-Abschirmung (blau) Blue reading light. 青色の照明。 Niebieska lampka. + Blaues Leselicht. Chemlight Shield (Yellow) ケミライト シールド (黄) Osłona na świetlik (żółta) + Knicklicht-Abschirmung (gelb) Yellow reading light. 黄色の照明。 Żółta lampka. + Gelbes Leselicht. Chemlight Shield (Orange) ケミライト シールド (オレンジ) Osłona na świetlik (pomarańczowa) + Knicklicht-Abschirmung (orange) Orange reading light. オレンジの照明。 Pomarańczowa lampka. + Oranges Leselicht. Chemlight Shield (White) ケミライト シールド (白) Osłona na świetlik (biała) + Knicklicht-Abschirmung (weiß) White reading light. 白の照明。 + Weißes Leselicht. - + \ No newline at end of file diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index 8b08b1e3ff..9774265f08 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -11,7 +11,7 @@ Enables cook off and related vehicle destruction effects. - Ermöglicht Cook-off und zugehörige Fahrzeug-Zerstörungseffekte. + Ermöglicht Selbstzündung und zugehörige Fahrzeug-Zerstörungseffekte. Povolí explozi munice a její následné ničivé efekty. Включает воспламенение и сопутствующие эффекты повреждения техники. 誘爆を有効化し、車両が誘爆によって破壊されていきます。 @@ -34,18 +34,22 @@ Enable ammo box cook off 弾薬箱に誘爆を有効化 + Cook-off für Munitionskisten ermöglichen Enables cooking off of ammo boxes. 弾薬箱が誘爆するようになります。 + Ermöglicht Selbstzündung von Munitionskisten. Enable Ammunition cook off 弾薬の誘爆を有効化 + Cook-off für Munition ermöglichen Enables Ammunition cook off. Fires ammunition projectiles while vehicle is on fire and has ammunition. 弾薬が誘爆します。車両が燃えると、搭載している弾薬が激しく燃え上がりす。 + Ermöglicht Selbstzündung von Munition. Feuert Projektile der Munition ab, solange das Fahrzeug brennt und Munition besitzt. - + \ No newline at end of file diff --git a/addons/dogtags/stringtable.xml b/addons/dogtags/stringtable.xml index 7f57e75026..5131afde9a 100644 --- a/addons/dogtags/stringtable.xml +++ b/addons/dogtags/stringtable.xml @@ -7,6 +7,7 @@ Жетон Identifikační známka ドッグ タグ + Hundemarke Check Dog Tag @@ -14,6 +15,7 @@ Проверить жетон Zkontrolovat známku ドッグ タグを見る + Hundemarke prüfen Check @@ -21,6 +23,7 @@ Проверить Zkontroluj 見る + Prüfen Take @@ -28,6 +31,7 @@ Взять Vezmi 取る + Nehmen Dogtag taken from %1... @@ -35,6 +39,7 @@ Жетон снят с %1... Sebral jsem známku od %1... %1からドッグ タグを取っている・・・ + Hundemarke von %1 genommen... Somebody else has already taken the dogtag... @@ -42,6 +47,7 @@ Кто-то уже забрал жетон... Někdo jiný už vzal identifikační známku... すでに誰かがドッグ タグを取っているようだ・・・ + Jemand anderes hat bereits die Hundemarke genommen... \ No newline at end of file diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index ecc97a4d7e..51a3051614 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -820,12 +820,14 @@ Сигнальная растяжка 仕掛け型照明地雷 Flara na linkę + Stolperdraht-Leuchtrakete Type: Tripwire flare - Ignites a non-lethal flare when triggered.<br />Rounds: 1<br />Used on: Ground Тип: Сигнальная растяжка - При срабатывании выпускает несмертельную сгнальную вспышку.<br />Зарядов: 1<br />Используется на: Земле 種類: 仕掛け型照明地雷 - 発動したとき、非致死性の照明を発炎します。<br />装填数: 1<br />次で使用: 地表 Typ: Flara na linkę - Wystrzeliwuje nieszkodliwą flarę przy nadepnięciu linki.<br/>Pociski: 1<br/>Używane na: ziemia + Typ: Stolperdraht-Leuchtrakete - Schießt bei Auslösung eine nicht-tödliche Leuchtrakete ab.<br />Ladungen: 1<br />Benutzt auf: Boden - + \ No newline at end of file diff --git a/addons/goggles/stringtable.xml b/addons/goggles/stringtable.xml index fa31607242..eec413b69c 100644 --- a/addons/goggles/stringtable.xml +++ b/addons/goggles/stringtable.xml @@ -32,18 +32,21 @@ Эффект очков ゴーグルによる効果 Efekty gogli + Brilleneffekt Tint Тонировка 色彩のみ Winieta + Tönung Tint + Effects Тонировка + эффекты 色彩 + 効果 Winieta + Efekty + Tönung + Effekte - + \ No newline at end of file diff --git a/addons/laser/stringtable.xml b/addons/laser/stringtable.xml index 5fd9f21ae7..00d40257f4 100644 --- a/addons/laser/stringtable.xml +++ b/addons/laser/stringtable.xml @@ -4,6 +4,7 @@ Laser Dispersion Simulation Count レーザーの分散シミュレート数 + Laserstreuung-Simulationszähler Laser Code @@ -45,4 +46,4 @@ レーザ - コードの数値を減らす - + \ No newline at end of file diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index 18b3a91aaf..e35ed536b0 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -150,6 +150,7 @@ Клавиша поворота инструментов карты マップ ツールの回転キー Klawisz obrotu narzędzi nawigacyjnych + Taste zum drehen des Kartenwerkzeugs Modifier key to allow rotating map tools @@ -157,14 +158,17 @@ Клавиша-модификатор, позволяющая поворачивать инструменты карты マップ ツールを回転させるキーを編集できます。 Modyfikator pozwalający na obracanie narzędzi nawigacyjnych + Steuerungstaste, um Drehung des Kartenwerkzeugs zu ermöglichen. Draw straight lines with maptools マップ ツールを使って直線を書く + Zeichne gerade Linien mit dem Kartenwerkzeug Draw on the edge of maptools to draw straight lines. Note: Must hover at midpoint to delete. マップ ツールの端から直線を書きます。メモ:線の中央ホバーすると削除します。 + Zeichne gerade Linien am Rand des Kartenwerkzeugs. Hinweis: zum Löschen über den Mittelpunkt der Linie fahren - + \ No newline at end of file diff --git a/addons/medical_blood/stringtable.xml b/addons/medical_blood/stringtable.xml index 6eb21c3aca..d32227d780 100644 --- a/addons/medical_blood/stringtable.xml +++ b/addons/medical_blood/stringtable.xml @@ -4,14 +4,17 @@ Only Players プレイヤーのみ + Nur Spieler Enable Blood Drops 血の滴下を有効化 + Aktiviere Blutspritzer Enable or disable Blood Drops created on bleeding and taking damage ダメージを受けたり、出血していると血が滴る様子の有効か無効化 + Aktiviere oder deaktiviere Blutspritzer, die durch Blutungen oder bei Schadensnahme entstehen. - + \ No newline at end of file diff --git a/addons/minedetector/stringtable.xml b/addons/minedetector/stringtable.xml index ff67757cb3..ed879dfd6b 100644 --- a/addons/minedetector/stringtable.xml +++ b/addons/minedetector/stringtable.xml @@ -8,6 +8,7 @@ Detektor kovů 地雷探知機 Wykrywacz metali + Metalldetektor Metal detector @@ -16,6 +17,7 @@ Detektor kovů 地雷探知機 Wykrywacz metali + Metalldetektor Activate @@ -24,6 +26,7 @@ Aktivovat 起動 Aktywuj + Aktivieren Deactivate @@ -32,6 +35,7 @@ Deaktivovat 停止 Deaktywuj + Deaktivieren Connect Headphones @@ -39,6 +43,7 @@ Připojit sluchátka ヘッドホンへつなぐ Podłącz słuchawki + Kopfhörer verbinden Disconnect Headphones @@ -46,6 +51,7 @@ Odpojit sluchátka ヘッドホンからはずす Odłącz słuchawki + Kopfhörer trennen Headphones Connected @@ -53,6 +59,7 @@ Sluchátka připojena ヘッドホンへ接続された Słuchawki podpięte + Kopfhörer verbunden Headphones Disconnected @@ -60,6 +67,7 @@ Sluchátka odpojena ヘッドホンから外された Słuchawki odpięte + Kopfhörer getrennt - + \ No newline at end of file diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index cd5559282b..d5a229ac6a 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -310,6 +310,7 @@ Zkontrolovat teplotu náhradní hlavně 予備銃身の温度を測る Sprawdź temperaturę zapasowych luf + Temperatur der Wechselläufe prüfen Checking spare barrels temperatures... @@ -319,6 +320,7 @@ Kontroluji teplotu náhradní hlavně... 予備銃身の温度を測っている・・・ Sprawdzanie temperatury zapasowych luf... + Prüfe Temperatur der Wechselläufe... Temperature @@ -341,6 +343,7 @@ Studená náhrandí hlaveň 予備銃身は冷たい Zimne zapasowe lufy + Kalte Wechselläufe Warm Spare Barrel/s @@ -350,6 +353,7 @@ Teplá náhrandí hlaveň 予備銃身は温かい Ciepłe zapasowe lufy + Warme Wechselläufe Hot Spare Barrel/s @@ -359,6 +363,7 @@ Horká náhrandí hlaveň 予備銃身は熱い Gorące zapasowe lufy + Heiße Wechselläufe Very Hot Spare Barrel/s @@ -368,6 +373,7 @@ Velmi horká náhrandí hlaveň 予備銃身はとても熱い Bardzo gorące zapasowe lufy + Sehr heiße Wechselläufe Extremely Hot Spare Barrel/s @@ -377,10 +383,11 @@ Extrémně horká náhrandí hlaveň 予備銃身は極めて熱い Ekstremalnie gorące zapasowe lufy + Extrem heiße Wechselläufe Overheating Enabled - Überhitzen Aktiviert + Überhitzung aktiviert Activada Sobrecalentamiento Superaquecimento ativado Surchauffe activée @@ -396,6 +403,7 @@ Главный включатель для модуля перегрева/заклинивания 過熱と弾詰まりモジュールを全て有効化します Główny włącznik modułu przegrzewania/zacinania się broni + Hauptschalter, um die Überhitzung-/Ladehemmung-Module zu aktivieren - + \ No newline at end of file diff --git a/addons/tagging/stringtable.xml b/addons/tagging/stringtable.xml index bbcaead48d..b813fb66a2 100644 --- a/addons/tagging/stringtable.xml +++ b/addons/tagging/stringtable.xml @@ -6,42 +6,49 @@ Маркировка タグ付け Tagowanie + Markierungssystem Configure how the tagging system will operate by default. Настройка работы системы спрей-маркеров по-умолчанию. 標準で開くタグ付けシステムの設定を行います。 Skonfiguruj zachowanie systemu tagowania. + Konfiguriert, wie das Markierungssystem standardmäßig funktioniert. Quick Tag Быстрый маркер クイック タグ Szybkie tagowanie + Schnelle Markierung Action performed on main tag interaction point. Действие, выполняемое при выборе главного пункта меню маркировки. インタラクション ポインにむけてタグ付けをします。 Akcja wykonywana na głównym punkcie interakcji tagu. + Aktion, die am Haupt-Interaktionspunkt ausgeführt werden soll. Last Used Повторить последний 最後の使用 Ostatnio użyte + Zuletzt benutzt Random X Случайный Х 無作為な X印 Losowy X + Zufällig X Random Случайный 無作為 Losowy + Zufällig Tag @@ -164,4 +171,4 @@ スプレー缶は壁にタグ付できます。 - + \ No newline at end of file diff --git a/addons/trenches/stringtable.xml b/addons/trenches/stringtable.xml index a56d56640b..1bb0928c2f 100644 --- a/addons/trenches/stringtable.xml +++ b/addons/trenches/stringtable.xml @@ -152,6 +152,7 @@ Продолжить копание окопа Pokračovat v kopání 塹壕を掘りつづける + Graben fortsetzen Remove Trench @@ -161,6 +162,7 @@ Убрать окоп Odstranit zákop 塹壕を消す + Schützengraben entfernen Removing Trench @@ -170,6 +172,7 @@ Убирание окопа Odstraňuji zákop 塹壕を消している + Entferne Schützengraben \ No newline at end of file diff --git a/addons/ui/stringtable.xml b/addons/ui/stringtable.xml index f039bfd7e7..7d324157f0 100644 --- a/addons/ui/stringtable.xml +++ b/addons/ui/stringtable.xml @@ -9,6 +9,7 @@ Интерфейс ユーザ インタフェイス Interfejs użytkownika + Benutzeroberfläche User Interface @@ -18,6 +19,7 @@ Пользовательский интерфейс ユーザ インタフェイス Interfejs użytkownika + Benutzeroberfläche This module allows toggling visible user interface parts. @@ -26,6 +28,7 @@ Этот модуль позволяет переключать видимость элементов пользовательского интерфейса. モジュールではユーザ インタフェイスの一部をトグル表示できます。 Moduł ten pozwala zmienić stan widoczności poszczególnych elementów UI. + Dieses Modul erlaubt es, Teile der Benutzeroberfläche (UI) an- oder auszuschalten. Allow Selective UI @@ -35,6 +38,7 @@ Включить настраиваемый интерфейс 選択できるユーザ インタフェイスを有効化します Zezwól na selektywne UI + Erlaube selektives UI Allow client to modify their UI. @@ -44,6 +48,7 @@ Позволить клиентам изменять их пользовательский интерфейс. クライアントがユーザ インタフェイスを編集できるようにします。 Zezwól klientowi na modyfikację UI. + Erlaube Clients, ihr UI zu modifizieren. Soldier/Vehicle/Weapon Information @@ -53,6 +58,7 @@ Информация о Солдате/Технике/Оружии 兵士/車両/武器の情報 Informacje o żołnierzu/pojeździe/broni + Soldat/Fahrzeug/Waffe Information Vehicle Radar @@ -62,6 +68,7 @@ Радар в технике 車両のレーダ Radar w pojeździe + Fahrzeugradar Vehicle Compass @@ -71,6 +78,7 @@ Компас в технике 車両のレーダ Kompas w pojeździe + Fahrzeugkompass Command Menu @@ -80,6 +88,7 @@ Командное меню 指揮メニュー Menu dowodzenia + Kommandomenü Group Bar @@ -89,6 +98,7 @@ Панель командира 指揮メニュー Pasek grupy + Gruppenleiste Weapon Name @@ -98,6 +108,7 @@ Название оружия 武器名 Nazwa broni + Waffenname Weapon Name Background @@ -107,6 +118,7 @@ Фон названия оружия 武器名の背景表示 Tło nazwy broni + Waffenname Hintergrund Firing Mode @@ -116,6 +128,7 @@ Режим стрельбы 射撃モード Tryb ognia + Feuermodus Ammo Type @@ -125,6 +138,7 @@ Тип боеприпасов 弾種 Typ amunicji + Munitionstyp Ammo Count @@ -134,6 +148,7 @@ Количество боеприпасов 弾薬数 Ilość amunicji + Munitionsanzahl Magazine Count @@ -143,6 +158,7 @@ Количество магазинов 弾倉装填数 Ilość magazynków + Magazinanzahl Throwable Type @@ -152,6 +168,7 @@ Тип гранаты 投げる種類 Typ granatu + Wurfobjekt-Typ Throwable Count @@ -161,6 +178,7 @@ Количество гранат 投げられる数 Ilość granatów + Wurfobjekt-Anzahl Zeroing @@ -170,6 +188,7 @@ Дальность стрельбы ゼロイン Wyzerowanie broni + Nullung Weapon Lower Info Background @@ -178,6 +197,7 @@ Фон ниформации об оружии снизу 武器名の背景表示 (下側) Tło dolnej części informacji o broni + Hintergrund der unteren Waffen-Info-Leiste Stance @@ -187,6 +207,7 @@ Стойка 姿勢 Postura + Haltung Stamina Bar @@ -196,6 +217,7 @@ Полоса выносливости 体力バー Pasek staminy + Ausdaueranzeige Gunner Weapon Name @@ -204,6 +226,7 @@ Название орудия наводчика 射手用の武器名 Nazwa broni strzelca + Richtschütze Waffenname Gunner Weapon Name Background @@ -212,6 +235,7 @@ Фон названия орудия наводчика 射手用の武器名の背景表示 Tło nazwy broni strzelca + Richtschütze Waffenname Hintergrund Gunner Firing Mode @@ -220,6 +244,7 @@ Режим стрельбы наводчика 射手用の発射モード Tryb ognia strzelca + Richtschütze Feuermodus Gunner Ammo Type @@ -228,6 +253,7 @@ Тип боеприпасов наводчика 射手用の弾種 Typ amunicji strzelca + Richtschütze Munitionstyp Gunner Ammo Count @@ -236,6 +262,7 @@ Количество боеприпасов наводчика 射手用の弾数 Ilość amunicji strzelca + Richtschütze Munitionsanzahl Gunner Magazine Count @@ -244,6 +271,7 @@ Количество магазинов наводчика 射手用の弾倉数 Ilość magazynków strzelca + Richtschütze Magazinanzahl Gunner Launchable Type @@ -252,6 +280,7 @@ Тип пусковой установки наводчика 射手用のランチャーの種類 Typ rakiet strzelca + Richtschütze Raketentyp Gunner Launchable Count @@ -260,6 +289,7 @@ Количество снарядов пусковой установки наводчика 射手用のランチャー弾薬数 Ilość rakiet strzelca + Richtschütze Raketenanzahl Gunner Zeroing @@ -268,6 +298,7 @@ Дальность стрельбы наводчика 射手用ゼロイン Wyzerowanie broni strzelca + Richtschütze Nullung Gunner Weapon Lower Info Background @@ -276,6 +307,7 @@ Фон ниформации об орудии наводчика снизу 射手用の武器名の背景表示 (下側) Tło dolnej części informacji o broni strzelca + Hintergrund der unteren Waffen-Info-Leiste (Richtschütze) Vehicle Name @@ -285,6 +317,7 @@ Название техники 車両名 Nazwa pojazdu + Fahrzeugname Vehicle Name Background @@ -294,6 +327,7 @@ Фон названия техники 車両名の背景 Tło nazwy pojazdu + Fahrzeugname Hintergrund Vehicle Fuel Bar @@ -303,6 +337,7 @@ Полоса топлива 車両の給油計 Pasek paliwa + Fahrzeug-Treibstoffleiste Vehicle Speed @@ -312,6 +347,7 @@ Скорость техники 車両の速度計 Prędkościomierz + Fahrzeuggeschwindigkeit Vehicle Altitude @@ -321,6 +357,7 @@ Высота полета 車両の高度計 Wysokościomierz radarowy + Fahrzeughöhe Vehicle Damage @@ -330,6 +367,7 @@ Повреждение техники 車両の損傷表示 Uszkodzenia pojazdu + Fahrzeugschaden Vehicle Info Background @@ -339,6 +377,7 @@ Фон информации о технике 車両状態の背景 Tło informacji o pojeździe + Fahrzeug Info Hintergrund Requires Soldier/Vehicle/Weapon Information. @@ -348,6 +387,7 @@ Требуется Информация о Солдате/Технике/Оружии. 兵士/車両/武器の情報を必要とします。 Wymaga informacji o żołnierzu/pojeździe/broni. + Benötigt Soldat/Fahrzeug/Waffe Information. Modifying User Interface is disabled. @@ -357,6 +397,7 @@ Изменение пользовательского интерфейса запрещено. 変更されたユーザ インタフェイスを無効化します。 Modyfikacja interfejsu użytkownika jest wyłączona. + Die Modifizierung des UI ist deaktiviert. Cannot modify a forced User Interface element. @@ -365,6 +406,7 @@ Невозможно изменить зафиксированный элемент пользовательского интерфейса. ユーザー インタフェイス要素は変更できません。 Nie można modyfikować wymuszonego elementu interfejsu użytkownika. + Gesperrte UI-Element können nicht modifiziert werden. - + \ No newline at end of file diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 6a6f75a450..8f111751d0 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -203,6 +203,7 @@ Bránit oblast 防衛範囲 Osłaniaj obszar + Verteidige Gebiet Global AI Skill @@ -211,6 +212,7 @@ Globální zkušenosti AI 総合的な AI スキル Globalne umiejętności AI + Globales KI-Können General Skill @@ -219,6 +221,7 @@ Primární zkušenosti 総合スキル Ogólne umiejętności + Allgemeines Können Changes: general, commanding, courage @@ -227,6 +230,7 @@ Upravuje: general, commanding, courage 変更:general, commanding, courage Zmienia: ogólne, dowodzenie, odwaga + Ändert: general, commanding, courage Accuracy @@ -235,6 +239,7 @@ Přesnost 精度 Precyzja + Genauigkeit Changes: aimingAccuracy @@ -243,6 +248,7 @@ Upravuje: aimingAccuracy 変更:aimingAccuracy Zmienia: precyzję celowania + Ändert: aimingAccuracy Weapon Handling @@ -251,6 +257,7 @@ Zacházení se zbraní 武器の扱い Obsługa broni + Waffenhandhabung Changes: aimingShake, aimingSpeed, reloadSpeed @@ -259,6 +266,7 @@ Upravuje: aimingShake, aimingSpeed, reloadSpeed 変更:aimingShake, aimingSpeed, reloadSpeed Zmienia: drżenie broni, szybkość celowania, szybkość przeładowania + Ändert: aimingShake, aimingSpeed, reloadSpeed Spotting @@ -267,6 +275,7 @@ Vnímavost 索敵 Rozpoznanie + Aufklärung Changes: spotDistance, spotTime @@ -275,6 +284,7 @@ Upravuje: spotDistance, spotTime 変更:spotDistance, spotTime Zmienia: zasięg rozpoznawania, czas rozpoznawania + Ändert: spotDistance, spotTime Seek Cover @@ -283,6 +293,7 @@ Vyhledávat krytí 遮蔽 Szukaj osłon + Deckungssuche Should AI seek cover @@ -291,6 +302,7 @@ AI se bude snažit vyhledávat krytí AI は遮蔽を取るようになります Czy AI powinno szukać osłon + Soll KI nach Deckung suchen Auto Combat @@ -299,6 +311,7 @@ Automatický režim boje 自動戦闘 Auto walka + Automatischer Kampfmodus Should AI automatically switch to combat mode @@ -307,6 +320,7 @@ AI se automaticky přepne do bojového režimu AI は自動的に戦闘状態へ切り替えます Czy AI powinno automatycznie przechodzić w tryb walki + Soll KI automatisch in Kampfmodus umschalten Group Side @@ -315,6 +329,7 @@ Strana skupiny グループ側 Strona grupy + Gruppenseite Patrol Area @@ -323,6 +338,7 @@ Oblast hlídkování 哨戒範囲 Patrol obszaru + Patrouillengebiet Toggle Surrender @@ -344,6 +360,7 @@ Teleportovat hráče プレイヤーを移動 Teleportuj graczy + Spieler teleportieren Player @@ -352,6 +369,7 @@ Hráč プレイヤー Gracz + Spieler Teleport selected player to module position @@ -360,6 +378,7 @@ Teleportuje vybraného hráče na pozici modulu 選択したプレイヤーをプレイヤーをモジュール位置へ移動します Teleportuje wybranego gracza na pozycję modułu + Teleportiert ausgewählten Spieler zur Position des Moduls Teleport Group @@ -368,6 +387,7 @@ Teleportovat skupinu グループを移動 Teleport grupy + Gruppe teleportieren Teleports all units in group @@ -376,6 +396,7 @@ Teleportuje všechny jednotky ve skupině グループ内の全ユニットを移動させます Teleportuje wszystkie jednostki w grupie + Teleportiert alle Einheiten der Gruppe Toggle Unconscious @@ -397,6 +418,7 @@ Prohledat oblast 捜索範囲 Przeszukaj teren + Durchsuche Gebiet Search Nearby Building @@ -405,6 +427,7 @@ Prohledat nejbližší budovu 近くの建物を創作します Przeszukaj najbliższy budynek + Durchsuche nahegelegenes Gebäude Assign Medic @@ -560,6 +583,7 @@ Jednotka musí patřit k příslušné straně ユニットを適切な陣営にします Jednostka musi należeć do odpowiedniej strony + Einheit muss einer passenden Seite angehören Nearest building is too far away @@ -568,6 +592,7 @@ Nejbližší budova je příliš daleko 近くに建物がありません。 Najbliższy budynek jest zbyt daleko + Nächstgelegenes Gebäude ist zu weit entfernt Place on a unit @@ -626,6 +651,7 @@ Náklad: カーゴ: Ładunek: + Ladung: Task Position @@ -634,6 +660,7 @@ Pozice úkolu タスクの位置 Pozycja zadania + Position der Aufgabe Select a position to perform the task at @@ -641,6 +668,7 @@ Выбрать местоположение для выполнения задания 次の選択位置をタスクとして実行 Wybierz pozycję na której wykonać zadanie + Wähle eine Position, an der die Aufgabe ausgeführt werden soll Task Radius @@ -648,6 +676,7 @@ Радиус задания タスク範囲 Obszar zadania + Radius der Aufgabe Radius to perform the task within @@ -655,6 +684,7 @@ Радиус выполнения задания 次の範囲をタスクとして実行 Obszar na którym zadanie powinno zostać wykonane + Radius, in dem die Aufgabe ausgeführt werden soll Invalid radius entered @@ -663,6 +693,7 @@ Vložen neplatný parametr 無効な半径が入力されました Wpisano nieprawidłowy promień + Ungültiger Radius eingegeben - + \ No newline at end of file From 5376a3045ba34a826cc8ce367cf561218b402e03 Mon Sep 17 00:00:00 2001 From: System98 Date: Sat, 5 Nov 2016 13:43:57 +0100 Subject: [PATCH 101/826] Fix typo - Fiy typo in german translation --- addons/advanced_throwing/stringtable.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/advanced_throwing/stringtable.xml b/addons/advanced_throwing/stringtable.xml index 4e11662e90..0cfec2ab61 100644 --- a/addons/advanced_throwing/stringtable.xml +++ b/addons/advanced_throwing/stringtable.xml @@ -76,6 +76,7 @@ Включить подбор прикрепленных гранат 拾い上げた投てき物の取り付けを有効化 Zezwól na podnoszenie przyczepionych obiektów miotanych + Aktiviere erneute Aufnahme befestigter Wurfobjekte Enables ability to pick up throwables from attached objects. From 38be06c28cd5c354f4a222496c9062da0e0fb06c Mon Sep 17 00:00:00 2001 From: System98 Date: Sat, 5 Nov 2016 13:50:26 +0100 Subject: [PATCH 102/826] Typo fix - fix another typo --- addons/advanced_throwing/stringtable.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_throwing/stringtable.xml b/addons/advanced_throwing/stringtable.xml index 0cfec2ab61..aa04cc633d 100644 --- a/addons/advanced_throwing/stringtable.xml +++ b/addons/advanced_throwing/stringtable.xml @@ -20,7 +20,7 @@ Включить улучшенный бросок アドバンスド投てきを有効化 Aktywuj zaawansowane rzucanie - Aktiviert erweitertes Werfen + Aktiviere erweitertes Werfen Enables advanced throwing system. From 7de56ad9b542cca5b0f4a2281c43c9b7b990390f Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 5 Nov 2016 14:20:48 +0000 Subject: [PATCH 103/826] Fix #4630 Not all explosives detonate on destruction, so their ammo config must be checked to see if they will. ACE_Explosives adds a property to define the associated ammo which *will* detonate on destruction, which is used if present. Otherwise a generic small explosion happens. --- .../functions/fnc_detonateAmmunition.sqf | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/addons/cookoff/functions/fnc_detonateAmmunition.sqf b/addons/cookoff/functions/fnc_detonateAmmunition.sqf index 211e359bb3..5a29bf4f8a 100644 --- a/addons/cookoff/functions/fnc_detonateAmmunition.sqf +++ b/addons/cookoff/functions/fnc_detonateAmmunition.sqf @@ -33,15 +33,16 @@ if (_amountOfMagazines > 0) exitWith { } else { _magazine set [1, _newMagCount]; // clear out the magazine }; - private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClassname >> "ammo"); - private _timeBetweenAmmoDetonation = (random 7) * (1 / random (_amountOfMagazines)) min MAX_TIME_BETWEEN_AMMO_DET; _timeBetweenAmmoDetonation = _timeBetweenAmmoDetonation max 0.1; + private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClassname >> "ammo"); + private _ammoCfg = (configFile >> "CfgAmmo" >> _ammo); + private _speedOfAmmo = getNumber (configFile >> "CfgMagazines" >> _magazineClassname >> "initSpeed"); - private _simulationTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "simulation"); - private _caliber = getNumber (configFile >> "CfgAmmo" >> _ammo >> "caliber"); - private _simType = getText (configFile >> "CfgAmmo" >> _ammo >> "simulation"); + private _simulationTime = getNumber (_ammoCfg >> "simulation"); + private _caliber = getNumber (_ammoCfg >> "caliber"); + private _simType = getText (_ammoCfg >> "simulation"); private _effect2pos = _vehicle selectionPosition "destructionEffect2"; @@ -91,7 +92,7 @@ if (_amountOfMagazines > 0) exitWith { }; [_vehicle, _ammo, _speed, random 1 < 0.5] call _spawnProjectile; }; - if (toLower _simType == "shotrocket" || {toLower _simType == "shotmissile"}) then { + if (toLower _simType in ["shotrocket", "shotmissile", "shotsubmunitions"]) then { if (random 1 < 0.1) then { private _sound = selectRandom [QUOTE(PATHTO_R(sounds\cannon_crack_close.wss)), QUOTE(PATHTO_R(sounds\cannon_crack_close_filtered.wss))]; playSound3D [_sound, objNull, false, (getPosASL _vehicle), 3, 1, 1600]; @@ -101,9 +102,25 @@ if (_amountOfMagazines > 0) exitWith { "ACE_ammoExplosionLarge" createvehicle (_vehicle modelToWorld _effect2pos); }; }; - if (toLower _simType in ["shotdirectionalbomb", "shotilluminating", "shotmine"]) then { + if (toLower _simType in ["shotdirectionalbomb", "shotmine"]) then { if (random 1 < 0.5) then { - [_vehicle, _ammo, 0, false] call _spawnProjectile; + // 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 { + "SmallSecondary" createvehicle (_vehicle modelToWorld _effect2pos); + }; + }; + }; + if (toLower _simType == "shotilluminating") then { + if (random 1 < 0.15) then { + [_vehicle, _ammo, _speed, random 1 < 0.3] call _spawnProjectile; }; }; From 5032619b9a0902bf90438e86f00dcecebd8f110a Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 5 Nov 2016 14:48:48 +0000 Subject: [PATCH 104/826] Add cook off 3den setting to ammo boxes --- addons/cookoff/CfgEden.hpp | 2 +- addons/cookoff/XEH_postInit.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/cookoff/CfgEden.hpp b/addons/cookoff/CfgEden.hpp index 1cc406463f..55e9b6d8b8 100644 --- a/addons/cookoff/CfgEden.hpp +++ b/addons/cookoff/CfgEden.hpp @@ -11,7 +11,7 @@ class Cfg3DEN { tooltip = CSTRING(enable_tooltip); expression = QUOTE(if !(_value) then {_this setVariable [ARR_3('%s',_value,true)];};); typeName = "BOOL"; - condition = "objectVehicle"; + condition = "objectVehicle + objectHasInventoryCargo"; defaultValue = "(true)"; // fix pbo project preprocessing bug }; }; diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf index fe98faa2be..4e65bf8886 100644 --- a/addons/cookoff/XEH_postInit.sqf +++ b/addons/cookoff/XEH_postInit.sqf @@ -71,7 +71,7 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; ["ReammoBox_F", "init", { (_this select 0) addEventHandler ["HandleDamage", { - if (GVAR(enableAmmobox)) then { + if ((_this select 0) getVariable [QGVAR(enable), GVAR(enableAmmobox)]) then { ["box", _this] call FUNC(handleDamage); }; }]; From 43c2e299c9e1d9b36749f8acb086466f3ce68c54 Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 5 Nov 2016 20:10:08 +0100 Subject: [PATCH 105/826] Fix make.py checkexternal argument documentation --- .../development/setting-up-the-development-environment.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/wiki/development/setting-up-the-development-environment.md b/docs/wiki/development/setting-up-the-development-environment.md index f2cdfc01ab..5efb993dbe 100644 --- a/docs/wiki/development/setting-up-the-development-environment.md +++ b/docs/wiki/development/setting-up-the-development-environment.md @@ -77,7 +77,7 @@ To create a complete build of ACE3 that you can use without the source files you When the requirements are met: -- Execute `make.py version increment_build force check_external release` in the `tools` folder, replacing `` with the part of version you want to increment (options described below) +- Execute `make.py version increment_build force checkexternal release` in the `tools` folder, replacing `` with the part of version you want to increment (options described below) This will populate the `release` folder with binarized PBOs, compiled extensions, copied extras, bisigns and a bikey. Additionally, an archive file will also be created in the folder. The folder and archive handle like those of any other mod. @@ -89,7 +89,7 @@ Different `make.py` command line options include: - `increment_minor` - increments _minor_ version number and resets _patch_ version number to `0` (ignored with `increment_major`) - `increment_major` - increments _major_ version number and resets _minor_ and _patch_ version numbers to `0` - `force` - force rebuild all PBOs, even those already present in the `release` directory (combined with `compile` it will also rebuild all extensions) -- `check_external` - check external references (incompatible only with ` ` and `force `) +- `checkexternal` - check external references (incompatible only with ` ` and `force `) - `release` - create release packages/archives - ` ` - build only specified component(s) (incompatible with `release`) - `force ` - force rebuild specified component(s) (incompatible with `release`) From b0bf50c506ab8ac1bf79fd01ed696ec53cc392aa Mon Sep 17 00:00:00 2001 From: System98 Date: Sun, 6 Nov 2016 10:10:36 +0100 Subject: [PATCH 106/826] Unify and improve some german translations - unify and improve some german translations - fix a few typos --- addons/advanced_throwing/stringtable.xml | 6 +++--- addons/chemlights/stringtable.xml | 26 ++++++++++++------------ addons/cookoff/stringtable.xml | 6 +++--- addons/dogtags/stringtable.xml | 4 ++-- addons/maptools/stringtable.xml | 2 +- addons/overheating/stringtable.xml | 6 +++--- addons/ui/stringtable.xml | 2 +- addons/zeus/stringtable.xml | 4 ++-- 8 files changed, 28 insertions(+), 28 deletions(-) diff --git a/addons/advanced_throwing/stringtable.xml b/addons/advanced_throwing/stringtable.xml index aa04cc633d..65fd7de04a 100644 --- a/addons/advanced_throwing/stringtable.xml +++ b/addons/advanced_throwing/stringtable.xml @@ -6,21 +6,21 @@ Улучшенный бросок гранат アドバンスド投てき Zaawansowane rzucanie - Erweitertes Werfen + Erweitertes Wurfsystem Allows changing advanced throwing behaviour. Позволяет настраивать поведение улучшенного броска гранат. アドバンスド投てきの挙動変更を許可します。 Zezwala na zmianę zachowania zaawansowanego trybu rzucania. - Erlaubt es, das Verhalten beim erweiterten Werfen zu ändern. + Erlaubt es, das Verhalten des erweiterten Wurfsystems zu ändern. Enable Advanced Throwing Включить улучшенный бросок アドバンスド投てきを有効化 Aktywuj zaawansowane rzucanie - Aktiviere erweitertes Werfen + Aktiviere erweitertes Wurfsystem Enables advanced throwing system. diff --git a/addons/chemlights/stringtable.xml b/addons/chemlights/stringtable.xml index b11c60f04d..4e609178ac 100644 --- a/addons/chemlights/stringtable.xml +++ b/addons/chemlights/stringtable.xml @@ -78,73 +78,73 @@ Chemlight (Hi Red) ケミライト (高輝度 赤) Świetlik (jaskrawy czerwony) - Knicklicht (Hi rot) + Knicklicht (rot, hell) Red Hi Light 高輝度の赤色 Jaskrawe czerwone światło - Rotes Hi Licht + Helles rotes Knicklicht Type: Light - Red Hi (5 minute)<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 高輝度 赤 (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - jaskrawe czerwone (5 minut)<br/>Pociski: 1<br/>Używany w: ręce - Typ: Licht - rot Hi (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand + Typ: Licht - rot, hell (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (Hi Yellow) ケミライト (高輝度 黄) Świetlik (jaskrawy żółty) - Knicklicht (Hi gelb) + Knicklicht (gelb, hell) Yellow Hi Light 高輝度の黄色 Jaskrawe żółte światło - Gelbes Hi Licht + Helles gelbes Knicklicht Type: Light - Yellow Hi (5 minute)<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 高輝度 黄 (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - jaskrawe żółte (5 minut)<br/>Pociski: 1<br/>Używany w: ręce - Typ: Licht - gelb Hi (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand + Typ: Licht - gelb, hell (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (Hi Orange) ケミライト (高輝度 オレンジ) Świetlik (jaskrawy pomarańczowy) - Knicklicht (Hi orange) + Knicklicht (orange, hell) Orange Hi Light 高輝度のオレンジ Jaskrawe pomarańczowe światło - Oranges Hi Licht + Helles oranges Knicklicht Type: Light - Orange Hi (5 minute)<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 高輝度 オレンジ (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - jaskrawe pomarańczowe (5 minut)<br/>Pociski: 1<br/>Używany w: ręce - Typ: Licht - orange Hi (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand + Typ: Licht - orange, hell (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (Hi White) ケミライト (高輝度 白) Świetlik (jaskrawy biały) - Knicklicht (Hi weiß) + Knicklicht (weiß, hell) White Hi Light 高輝度の白色 Jaskrawe białe światło - Weißes Hi Licht + Helles weißes Knicklicht Type: Light - White Hi (5 minute)<br />Rounds: 1<br />Used in: Hand 種類: 照明 - 高輝度 白 (5分間)&lt;br /&gt;装填数: 1&lt;br /&gt;次で使用: 携帯 Typ: Światło - jaskrawe białe (5 minut)<br/>Pociski: 1<br/>Używany w: ręce - Typ: Licht - weiß Hi (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand + Typ: Licht - weiß, hell (5 Minuten)<br />Anzahl: 1<br />Benutzt in: Hand Chemlight (IR) @@ -156,7 +156,7 @@ IR Light 赤外線光 Światło podczerwone - IR Licht + IR-Knicklicht Type: Light - Infrared<br />Rounds: 1<br />Used in: Hand diff --git a/addons/cookoff/stringtable.xml b/addons/cookoff/stringtable.xml index 9774265f08..2e221ce7fc 100644 --- a/addons/cookoff/stringtable.xml +++ b/addons/cookoff/stringtable.xml @@ -3,7 +3,7 @@ Enable cook off - Cook-off ermöglichen + Selbstzündung ermöglichen Povolit explozi munice Включить воспламенение 誘爆を有効化 @@ -34,7 +34,7 @@ Enable ammo box cook off 弾薬箱に誘爆を有効化 - Cook-off für Munitionskisten ermöglichen + Selbstzündung für Munitionskisten ermöglichen Enables cooking off of ammo boxes. @@ -44,7 +44,7 @@ Enable Ammunition cook off 弾薬の誘爆を有効化 - Cook-off für Munition ermöglichen + Selbstzündung für Munition ermöglichen Enables Ammunition cook off. Fires ammunition projectiles while vehicle is on fire and has ammunition. diff --git a/addons/dogtags/stringtable.xml b/addons/dogtags/stringtable.xml index 5131afde9a..0987dca59f 100644 --- a/addons/dogtags/stringtable.xml +++ b/addons/dogtags/stringtable.xml @@ -39,7 +39,7 @@ Жетон снят с %1... Sebral jsem známku od %1... %1からドッグ タグを取っている・・・ - Hundemarke von %1 genommen... + Hundemarke von %1 genommen ... Somebody else has already taken the dogtag... @@ -47,7 +47,7 @@ Кто-то уже забрал жетон... Někdo jiný už vzal identifikační známku... すでに誰かがドッグ タグを取っているようだ・・・ - Jemand anderes hat bereits die Hundemarke genommen... + Jemand anderes hat bereits die Hundemarke genommen ... \ No newline at end of file diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index e35ed536b0..fbb3ff49c7 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -150,7 +150,7 @@ Клавиша поворота инструментов карты マップ ツールの回転キー Klawisz obrotu narzędzi nawigacyjnych - Taste zum drehen des Kartenwerkzeugs + Taste zum Drehen des Kartenwerkzeugs Modifier key to allow rotating map tools diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index d5a229ac6a..5ef227bc42 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -239,7 +239,7 @@ Swapping barrel... - Lauf wird gewechselt... + Lauf wird gewechselt ... Cambiando el cañón... Wymienianie lufy... Měním hlaveň... @@ -291,7 +291,7 @@ Checking temperature... - Prüfe Temperatur... + Prüfe Temperatur ... Verificando temperatura... Sprawdzanie temperatury... Vérification de la température... @@ -320,7 +320,7 @@ Kontroluji teplotu náhradní hlavně... 予備銃身の温度を測っている・・・ Sprawdzanie temperatury zapasowych luf... - Prüfe Temperatur der Wechselläufe... + Prüfe Temperatur der Wechselläufe ... Temperature diff --git a/addons/ui/stringtable.xml b/addons/ui/stringtable.xml index 7d324157f0..a06a695e63 100644 --- a/addons/ui/stringtable.xml +++ b/addons/ui/stringtable.xml @@ -406,7 +406,7 @@ Невозможно изменить зафиксированный элемент пользовательского интерфейса. ユーザー インタフェイス要素は変更できません。 Nie można modyfikować wymuszonego elementu interfejsu użytkownika. - Gesperrte UI-Element können nicht modifiziert werden. + Gesperrte UI-Elemente können nicht modifiziert werden. \ No newline at end of file diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 8f111751d0..317f423b4e 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -212,7 +212,7 @@ Globální zkušenosti AI 総合的な AI スキル Globalne umiejętności AI - Globales KI-Können + Globale KI-Fähigkeit General Skill @@ -221,7 +221,7 @@ Primární zkušenosti 総合スキル Ogólne umiejętności - Allgemeines Können + Allgemeine Fähigkeit Changes: general, commanding, courage From 6272b95accb3274735d7da9637104e70ed4228c8 Mon Sep 17 00:00:00 2001 From: System98 Date: Sun, 6 Nov 2016 12:22:39 +0100 Subject: [PATCH 107/826] Update chemlight translations - Add missing commas to some chemlight-strings --- addons/chemlights/stringtable.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/chemlights/stringtable.xml b/addons/chemlights/stringtable.xml index 4e609178ac..c66bb425b9 100644 --- a/addons/chemlights/stringtable.xml +++ b/addons/chemlights/stringtable.xml @@ -84,7 +84,7 @@ Red Hi Light 高輝度の赤色 Jaskrawe czerwone światło - Helles rotes Knicklicht + Helles, rotes Knicklicht Type: Light - Red Hi (5 minute)<br />Rounds: 1<br />Used in: Hand @@ -102,7 +102,7 @@ Yellow Hi Light 高輝度の黄色 Jaskrawe żółte światło - Helles gelbes Knicklicht + Helles, gelbes Knicklicht Type: Light - Yellow Hi (5 minute)<br />Rounds: 1<br />Used in: Hand @@ -120,7 +120,7 @@ Orange Hi Light 高輝度のオレンジ Jaskrawe pomarańczowe światło - Helles oranges Knicklicht + Helles, oranges Knicklicht Type: Light - Orange Hi (5 minute)<br />Rounds: 1<br />Used in: Hand @@ -138,7 +138,7 @@ White Hi Light 高輝度の白色 Jaskrawe białe światło - Helles weißes Knicklicht + Helles, weißes Knicklicht Type: Light - White Hi (5 minute)<br />Rounds: 1<br />Used in: Hand From e39959767822880d8f89d6c0b694d151c12ce4b9 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sun, 6 Nov 2016 12:24:00 +0000 Subject: [PATCH 108/826] Clean some cook off code - Use unary `createVehicle` syntax - Removed some parenthesis - Simpify 3den property condition --- addons/cookoff/CfgEden.hpp | 2 +- addons/cookoff/functions/fnc_detonateAmmunition.sqf | 10 +++++----- addons/cookoff/functions/fnc_secondaryExplosions.sqf | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/cookoff/CfgEden.hpp b/addons/cookoff/CfgEden.hpp index 55e9b6d8b8..aa550a9228 100644 --- a/addons/cookoff/CfgEden.hpp +++ b/addons/cookoff/CfgEden.hpp @@ -11,7 +11,7 @@ class Cfg3DEN { tooltip = CSTRING(enable_tooltip); expression = QUOTE(if !(_value) then {_this setVariable [ARR_3('%s',_value,true)];};); typeName = "BOOL"; - condition = "objectVehicle + objectHasInventoryCargo"; + condition = "objectHasInventoryCargo"; defaultValue = "(true)"; // fix pbo project preprocessing bug }; }; diff --git a/addons/cookoff/functions/fnc_detonateAmmunition.sqf b/addons/cookoff/functions/fnc_detonateAmmunition.sqf index 5a29bf4f8a..d7d7114e7d 100644 --- a/addons/cookoff/functions/fnc_detonateAmmunition.sqf +++ b/addons/cookoff/functions/fnc_detonateAmmunition.sqf @@ -37,7 +37,7 @@ if (_amountOfMagazines > 0) exitWith { _timeBetweenAmmoDetonation = _timeBetweenAmmoDetonation max 0.1; private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClassname >> "ammo"); - private _ammoCfg = (configFile >> "CfgAmmo" >> _ammo); + private _ammoCfg = configFile >> "CfgAmmo" >> _ammo; private _speedOfAmmo = getNumber (configFile >> "CfgMagazines" >> _magazineClassname >> "initSpeed"); private _simulationTime = getNumber (_ammoCfg >> "simulation"); @@ -53,8 +53,8 @@ if (_amountOfMagazines > 0) exitWith { if (_spawnPos select 2 < 0) then { _spawnPos set [2, 0]; }; - private _projectile = _ammo createVehicle [0,0,0]; - _projectile setPos _spawnPos; + + 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; @@ -99,7 +99,7 @@ if (_amountOfMagazines > 0) exitWith { [_vehicle, _ammo, _speed, random 1 < 0.3] call _spawnProjectile; } else { - "ACE_ammoExplosionLarge" createvehicle (_vehicle modelToWorld _effect2pos); + createvehicle ["ACE_ammoExplosionLarge", (_vehicle modelToWorld _effect2pos), [], 0 , "CAN_COLLIDE"]; }; }; if (toLower _simType in ["shotdirectionalbomb", "shotmine"]) then { @@ -114,7 +114,7 @@ if (_amountOfMagazines > 0) exitWith { if (_ammo != "") then { [_vehicle, _ammo, 0, false] call _spawnProjectile; } else { - "SmallSecondary" createvehicle (_vehicle modelToWorld _effect2pos); + createvehicle ["SmallSecondary", (_vehicle modelToWorld _effect2pos), [], 0 , "CAN_COLLIDE"]; }; }; }; diff --git a/addons/cookoff/functions/fnc_secondaryExplosions.sqf b/addons/cookoff/functions/fnc_secondaryExplosions.sqf index 01a2fa3b3f..34a1d28ea8 100644 --- a/addons/cookoff/functions/fnc_secondaryExplosions.sqf +++ b/addons/cookoff/functions/fnc_secondaryExplosions.sqf @@ -44,7 +44,7 @@ private _fnc_secondaryExplosion = { private _position = _vehicle modelToWorld (_vehicle selectionPosition "destructionEffect2"); // these CfgAmmo objects are always global - "SmallSecondary" createVehicle _position; + createVehicle ["SmallSecondary", _position, [], 0, "CAN_COLLIDE"]; DEC(_amount); From a0d6e0322b3ce66accce438158774c46400d31bc Mon Sep 17 00:00:00 2001 From: bux578 Date: Sun, 6 Nov 2016 20:41:21 +0100 Subject: [PATCH 109/826] fix typo in acerep7 --- docs/_posts/2016-11-04-ace3-version381.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_posts/2016-11-04-ace3-version381.md b/docs/_posts/2016-11-04-ace3-version381.md index 29bc850e97..8b9a448db3 100644 --- a/docs/_posts/2016-11-04-ace3-version381.md +++ b/docs/_posts/2016-11-04-ace3-version381.md @@ -35,7 +35,7 @@ With 3.8.0 the map tools will allow you to draw straight lines again. A feature ### Medical rewrite -If you're following ACE3 development on GitHub closely you might already have spotted it: The medical system gets a huge rewrite. That's true, we're completely redoing the medical system. Until now the medical system has been a merge of the AGM and CSE medical systems. The AGM one kind of became what you know as the "basic system" and CSE's respectively the "advanced system". Being two separate systems it was always hard for us to improve one or the other without reworking the other one too. Not an ideal situation. Another issue we will address with this rewrite is the amount of influence a medical condition has on gameplay. An issue we've often heard from different communities as well. There's an [interesting discussion going on GitHub with a lot of different ideas and feature requests](https://github.com/acemod/ACE3/issues/3134{:target="_blank"}). Worth a read. +If you're following ACE3 development on GitHub closely you might already have spotted it: The medical system gets a huge rewrite. That's true, we're completely redoing the medical system. Until now the medical system has been a merge of the AGM and CSE medical systems. The AGM one kind of became what you know as the "basic system" and CSE's respectively the "advanced system". Being two separate systems it was always hard for us to improve one or the other without reworking the other one too. Not an ideal situation. Another issue we will address with this rewrite is the amount of influence a medical condition has on gameplay. An issue we've often heard from different communities as well. There's an [interesting discussion going on GitHub with a lot of different ideas and feature requests](https://github.com/acemod/ACE3/issues/3134){:target="_blank"}. Worth a read. With the state machine system that has been introduced in CBA we are now able to strictly define various health states of players such as unconsciousness or cardiac arrest and what can happen in those states. This allows us to massively declutter the code which will not only reduce the possibility of bugs, but also enable us to add more features and gameplay elements to the medical system - with no performance loss at all. From 3f4564605beeb8cfb6f3a253000fd65eee47a812 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 2 Nov 2016 13:56:59 +0100 Subject: [PATCH 110/826] ATragMX - Implemented missing features * Muzzle Velocity vs. Temperature Interpolation * C1 Ballistic Coefficient vs. Distance Interpolation * Coriolis and Spin drift output * Options menu * Truing Drop --------------------------------- * Overworked default gun profiles --------------------------------- * Fixed the Cancel buttons on the gun-, atmosphere- and target columns. * Fixed some muzzle velocity entries in the default gun list. * Fixed divide by zero error in the target range estimator --- addons/atragmx/RscTitles.hpp | 390 +++++++++++++++++- addons/atragmx/XEH_PREP.hpp | 26 ++ addons/atragmx/XEH_postInit.sqf | 60 +-- addons/atragmx/functions/fnc_add_new_gun.sqf | 2 +- .../fnc_calculate_distance_at_velocity.sqf | 41 ++ .../fnc_calculate_target_range_assist.sqf | 18 +- .../fnc_calculate_target_solution.sqf | 10 +- .../functions/fnc_calculate_truing_drop.sqf | 107 +++++ addons/atragmx/functions/fnc_change_gun.sqf | 11 + .../functions/fnc_change_target_slot.sqf | 5 +- ...nc_clear_c1_ballistic_coefficient_data.sqf | 21 + .../fnc_clear_muzzle_velocity_data.sqf | 21 + .../atragmx/functions/fnc_clear_user_data.sqf | 1 + .../atragmx/functions/fnc_create_dialog.sqf | 10 + .../functions/fnc_cycle_scope_unit.sqf | 4 +- .../fnc_evaluate_option_menu_input.sqf | 30 ++ addons/atragmx/functions/fnc_init.sqf | 16 + ...c_insert_c1_ballistic_coefficient_data.sqf | 55 +++ .../fnc_insert_muzzle_velocity_data.sqf | 41 ++ addons/atragmx/functions/fnc_parse_input.sqf | 47 ++- ...c_recalculate_c1_ballistic_coefficient.sqf | 57 +++ .../fnc_recalculate_muzzle_velocity.sqf | 57 +++ .../functions/fnc_restore_truing_drop.sqf | 33 ++ .../functions/fnc_restore_user_data.sqf | 1 + ...nc_shift_c1_ballistic_coefficient_data.sqf | 25 ++ .../fnc_shift_muzzle_velocity_data.sqf | 25 ++ ...fnc_show_c1_ballistic_coefficient_data.sqf | 25 ++ .../atragmx/functions/fnc_show_main_page.sqf | 12 + .../fnc_show_muzzle_velocity_data.sqf | 25 ++ .../functions/fnc_show_truing_drop.sqf | 43 ++ .../atragmx/functions/fnc_store_user_data.sqf | 1 + .../functions/fnc_toggle_atmo_env_data.sqf | 4 + ...c_toggle_c1_ballistic_coefficient_data.sqf | 33 ++ .../atragmx/functions/fnc_toggle_coriolis.sqf | 19 + .../functions/fnc_toggle_gun_ammo_data.sqf | 3 + .../fnc_toggle_muzzle_velocity_data.sqf | 33 ++ .../functions/fnc_toggle_option_menu.sqf | 51 +++ .../functions/fnc_toggle_target_data.sqf | 2 + .../functions/fnc_toggle_truing_drop.sqf | 39 ++ .../fnc_true_c1_ballistic_coefficient.sqf | 42 ++ .../functions/fnc_true_muzzle_velocity.sqf | 42 ++ ...c_update_c1_ballistic_coefficient_data.sqf | 25 ++ .../fnc_update_muzzle_velocity_data.sqf | 28 ++ .../atragmx/functions/fnc_update_result.sqf | 21 +- .../functions/fnc_update_truing_drop_data.sqf | 77 ++++ .../fnc_update_truing_drop_selection.sqf | 43 ++ addons/atragmx/script_component.hpp | 2 +- 47 files changed, 1614 insertions(+), 70 deletions(-) create mode 100644 addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf create mode 100644 addons/atragmx/functions/fnc_calculate_truing_drop.sqf create mode 100644 addons/atragmx/functions/fnc_clear_c1_ballistic_coefficient_data.sqf create mode 100644 addons/atragmx/functions/fnc_clear_muzzle_velocity_data.sqf create mode 100644 addons/atragmx/functions/fnc_evaluate_option_menu_input.sqf create mode 100644 addons/atragmx/functions/fnc_insert_c1_ballistic_coefficient_data.sqf create mode 100644 addons/atragmx/functions/fnc_insert_muzzle_velocity_data.sqf create mode 100644 addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf create mode 100644 addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf create mode 100644 addons/atragmx/functions/fnc_restore_truing_drop.sqf create mode 100644 addons/atragmx/functions/fnc_shift_c1_ballistic_coefficient_data.sqf create mode 100644 addons/atragmx/functions/fnc_shift_muzzle_velocity_data.sqf create mode 100644 addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf create mode 100644 addons/atragmx/functions/fnc_show_muzzle_velocity_data.sqf create mode 100644 addons/atragmx/functions/fnc_show_truing_drop.sqf create mode 100644 addons/atragmx/functions/fnc_toggle_c1_ballistic_coefficient_data.sqf create mode 100644 addons/atragmx/functions/fnc_toggle_coriolis.sqf create mode 100644 addons/atragmx/functions/fnc_toggle_muzzle_velocity_data.sqf create mode 100644 addons/atragmx/functions/fnc_toggle_option_menu.sqf create mode 100644 addons/atragmx/functions/fnc_toggle_truing_drop.sqf create mode 100644 addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf create mode 100644 addons/atragmx/functions/fnc_true_muzzle_velocity.sqf create mode 100644 addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf create mode 100644 addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf create mode 100644 addons/atragmx/functions/fnc_update_truing_drop_data.sqf create mode 100644 addons/atragmx/functions/fnc_update_truing_drop_selection.sqf diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 625cd68deb..eb2de958d6 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -2,6 +2,8 @@ #define ST_RIGHT 1 #define ST_CENTER 2 +#define ST_WITH_RECT 160 + class ATragMX_RscText { idc=-1; type=0; @@ -350,6 +352,7 @@ class ATragMX_Display { colorBackground[]={0.15,0.21,0.23,0.3}; colorFocused[]={0.15,0.21,0.23,0.2}; text="MV"; + action=QUOTE(0 call FUNC(toggle_muzzle_velocity_data)); }; class TEXT_MUZZLE_VELOCITY_OUTPUT: TEXT_BORE_HEIGHT_OUTPUT { idc=130; @@ -383,18 +386,18 @@ class ATragMX_Display { y=0.265*safezoneH+safezoneY+0.320; text=""; }; - class TEXT_BAROMETRIC_PRESSURE: TEXT_AIR_FRICTION { + class TEXT_BAROMETRIC_PRESSURE: TEXT_TEMPERATURE { idc=21; x=0.550*safezoneW+safezoneX+0.20; + y=0.265*safezoneH+safezoneY+0.355; text="BP"; }; class TEXT_BAROMETRIC_PRESSURE_OUTPUT: TEXT_TEMPERATURE_OUTPUT { idc=210; y=0.265*safezoneH+safezoneY+0.355; }; - class TEXT_RELATIVE_HUMIDITY: TEXT_AIR_FRICTION { + class TEXT_RELATIVE_HUMIDITY: TEXT_BAROMETRIC_PRESSURE { idc=22; - x=0.550*safezoneW+safezoneX+0.20; y=0.265*safezoneH+safezoneY+0.390; text="RH"; }; @@ -526,7 +529,7 @@ class ATragMX_Display { }; class TEXT_ELEVATION_OUTPUT_ABSOLUTE: ATragMX_RscText { idc=400; - style=160; + style=ST_WITH_RECT+ST_RIGHT; sizeEx=0.025; w=0.065; h=0.032; @@ -606,17 +609,39 @@ class ATragMX_Display { class TEXT_SCOPE_CLICK_NUMBER: TEXT_GUN_LIST { idc=2001; style=ST_CENTER; - w=0.03; + w=0.025; x=0.550*safezoneW+safezoneX+0.27; text="4"; action=QUOTE(call FUNC(toggle_solution_setup)); }; - class TEXT_CALCULATE: TEXT_SCOPE_UNIT { + class TEXT_OPTIONS: TEXT_GUN_LIST { idc=3000; style=ST_RIGHT; x=0.550*safezoneW+safezoneX+0.3; - text="Calc"; - action=QUOTE(call FUNC(calculate_target_solution)); + text="Options"; + action=QUOTE(false call FUNC(toggle_option_menu)); + }; + class TEXT_OPTIONS_BACKGROUND: ATragMX_RscButton { + idc=3001; + colorBackground[]={0.15,0.21,0.23,0.2}; + colorBackgroundActive[]={0.15,0.21,0.23,0.2}; + colorFocused[]={0.15,0.21,0.23,0.2}; + x=0.550*safezoneW+safezoneX+0.105; + y=0.265*safezoneH+safezoneY+0.17; + w=0.3; + h=0.535; + offsetPressedX=0.0; + offsetPressedY=0.0; + action=QUOTE(false call FUNC(toggle_option_menu)); + }; + class TEXT_OPTIONS_LIST_OUTPUT: ATragMX_RscListBox { + idc=3002; + w=0.17; + h=0.28; + x=0.550*safezoneW+safezoneX+0.225; + y=0.265*safezoneH+safezoneY+0.355; + sizeEx=0.025; + onMouseButtonClick=QUOTE(true call FUNC(toggle_option_menu)); }; class TEXT_RANGE_CARD_SCOPE_UNIT: TEXT_GUN_PROFILE { @@ -766,8 +791,9 @@ class ATragMX_Display { class TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE: TEXT_TARGET_RANGE_ASSIST_MEASUREMENT_METHOD { idc=7003; style=ST_RIGHT; - x=0.550*safezoneW+safezoneX+0.10; + x=0.550*safezoneW+safezoneX+0.092; y=0.265*safezoneH+safezoneY+0.4; + w=0.128; text="Target Size"; }; class TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE { @@ -874,22 +900,22 @@ class ATragMX_Display { class TEXT_TARGET_SPEED_ASSIST_TARGET_RANGE: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE { idc=8000; - x=0.550*safezoneW+safezoneX+0.13; + x=0.550*safezoneW+safezoneX+0.12; text="Target Range"; }; class TEXT_TARGET_SPEED_ASSIST_NUM_TICKS: TEXT_TARGET_RANGE_ASSIST_IMAGE_SIZE { idc=8001; - x=0.550*safezoneW+safezoneX+0.13; + x=0.550*safezoneW+safezoneX+0.12; text="Num Ticks"; }; class TEXT_TARGET_SPEED_ASSIST_TIME: TEXT_TARGET_RANGE_ASSIST_ANGLE { idc=8002; - x=0.550*safezoneW+safezoneX+0.13; + x=0.550*safezoneW+safezoneX+0.12; text="Time (secs)"; }; class TEXT_TARGET_SPEED_ASSIST_TARGET_ESTIMATED_SPEED: TEXT_TARGET_RANGE_ASSIST_ESTIMATED_RANGE { idc=8003; - x=0.550*safezoneW+safezoneX+0.13; + x=0.550*safezoneW+safezoneX+0.12; text="Est Speed"; }; class TEXT_TARGET_SPEED_ASSIST_TARGET_RANGE_INPUT: TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE_INPUT { @@ -1468,5 +1494,343 @@ class ATragMX_Display { y=0.265*safezoneH+safezoneY+0.55; action=QUOTE(0 call FUNC(toggle_solution_setup)); }; + + class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE: TEXT_BORE_HEIGHT { + idc=16000; + w=0.22; + y=0.265*safezoneH+safezoneY+0.25; + sizeEx=0.022; + text="Temperature"; + }; + class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE { + idc=16001; + x=0.550*safezoneW+safezoneX+0.215; + sizeEx=0.022; + text="Muzzle velocity"; + }; + class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1: ATragMX_RscEdit { + idc=160021; + w=0.082; + h=0.035; + x=0.550*safezoneW+safezoneX+0.128; + y=0.265*safezoneH+safezoneY+0.29; + text="0"; + }; + class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_2: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { + idc=160022; + y=0.265*safezoneH+safezoneY+0.325; + }; + class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_3: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { + idc=160023; + y=0.265*safezoneH+safezoneY+0.360; + }; + class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_4: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { + idc=160024; + y=0.265*safezoneH+safezoneY+0.395; + }; + class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_5: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { + idc=160025; + y=0.265*safezoneH+safezoneY+0.430; + }; + class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_6: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { + idc=160026; + y=0.265*safezoneH+safezoneY+0.465; + }; + class TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_7: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { + idc=160027; + y=0.265*safezoneH+safezoneY+0.500; + }; + class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_1: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_1 { + idc=160031; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_2: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_2 { + idc=160032; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_3: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_3 { + idc=160033; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_4: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_4 { + idc=160034; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_5: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_5 { + idc=160035; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_6: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_6 { + idc=160036; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_MUZZLE_VELOCITY_DATA_MUZZLE_VELOCITY_INPUT_7: TEXT_MUZZLE_VELOCITY_DATA_TEMPERATURE_INPUT_7 { + idc=160037; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_MUZZLE_VELOCITY_DATA_CLEAR: TEXT_TARGET_DATA_NEXT { + idc=16004; + style=ST_CENTER; + h=0.035; + y=0.265*safezoneH+safezoneY+0.3625; + text="Clear"; + action=QUOTE(call FUNC(clear_muzzle_velocity_data)); + }; + class TEXT_MUZZLE_VELOCITY_DATA_QUESTIONMARK: TEXT_MUZZLE_VELOCITY_DATA_CLEAR { + idc=16005; + y=0.265*safezoneH+safezoneY+0.430; + text="?"; + action=""; + }; + class TEXT_MUZZLE_VELOCITY_DATA_DONE: TEXT_TARGET_DATA_DONE { + idc=16006; + action=QUOTE(1 call FUNC(toggle_muzzle_velocity_data)); + }; + class TEXT_MUZZLE_VELOCITY_DATA_CANCEL: TEXT_TARGET_DATA_CANCEL { + idc=16007; + action=QUOTE(0 call FUNC(toggle_muzzle_velocity_data)); + }; + class TEXT_MUZZLE_VELOCITY_DATA_PREV: TEXT_TARGET_DATA_PREV { + idc=16008; + }; + class TEXT_MUZZLE_VELOCITY_DATA_NEXT: TEXT_TARGET_DATA_NEXT { + idc=16009; + }; + + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE: TEXT_BORE_HEIGHT { + idc=17000; + w=0.22; + x=0.550*safezoneW+safezoneX+0.15; + y=0.265*safezoneH+safezoneY+0.25; + sizeEx=0.022; + text="Meters"; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE { + idc=17001; + x=0.550*safezoneW+safezoneX+0.235; + sizeEx=0.022; + text="BC-Coef"; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1: ATragMX_RscEdit { + idc=170021; + w=0.082; + h=0.035; + x=0.550*safezoneW+safezoneX+0.128; + y=0.265*safezoneH+safezoneY+0.29; + text="0"; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_2: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { + idc=170022; + y=0.265*safezoneH+safezoneY+0.325; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_3: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { + idc=170023; + y=0.265*safezoneH+safezoneY+0.360; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_4: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { + idc=170024; + y=0.265*safezoneH+safezoneY+0.395; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_5: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { + idc=170025; + y=0.265*safezoneH+safezoneY+0.430; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_6: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { + idc=170026; + y=0.265*safezoneH+safezoneY+0.465; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_7: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { + idc=170027; + y=0.265*safezoneH+safezoneY+0.500; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_1: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_1 { + idc=170031; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_2: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_2 { + idc=170032; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_3: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_3 { + idc=170033; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_4: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_4 { + idc=170034; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_5: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_5 { + idc=170035; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_6: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_6 { + idc=170036; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_C1_BALLISTIC_COEFFICIENT_INPUT_7: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DISTANCE_INPUT_7 { + idc=170037; + x=0.550*safezoneW+safezoneX+0.225; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_QUESTIONMARK: TEXT_TARGET_DATA_NEXT { + idc=17004; + style=ST_CENTER; + w=0.04; + h=0.035; + y=0.265*safezoneH+safezoneY+0.35; + text="?"; + action=""; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_CLEAR: TEXT_C1_BALLISTIC_COEFFICIENT_DATA_QUESTIONMARK { + idc=17005; + w=0.07; + y=0.265*safezoneH+safezoneY+0.4175; + text="Clear"; + action=QUOTE(call FUNC(clear_c1_ballistic_coefficient_data)); + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_DONE: TEXT_TARGET_DATA_DONE { + idc=17006; + action=QUOTE(1 call FUNC(toggle_c1_ballistic_coefficient_data)); + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_CANCEL: TEXT_TARGET_DATA_CANCEL { + idc=17007; + action=QUOTE(0 call FUNC(toggle_c1_ballistic_coefficient_data)); + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_PREV: TEXT_TARGET_DATA_PREV { + idc=17008; + }; + class TEXT_C1_BALLISTIC_COEFFICIENT_DATA_NEXT: TEXT_TARGET_DATA_NEXT { + idc=17009; + }; + + class TEXT_TRUING_DROP_ZERO_RANGE: ATragMX_RscText { + idc=18000; + style=ST_LEFT; + x=0.550*safezoneW+safezoneX+0.115; + y=0.265*safezoneH+safezoneY+0.220; + w=0.135; + h=0.03; + sizeEx=0.025; + text="ZR=100meters"; + }; + class TEXT_TRUING_DROP_DROP_UNIT: TEXT_TRUING_DROP_ZERO_RANGE { + idc=18001; + style=ST_LEFT; + x=0.550*safezoneW+safezoneX+0.25; + text="Drop=mil"; + }; + class TEXT_TRUING_DROP_TARGET_RANGE: TEXT_TRUING_DROP_ZERO_RANGE { + idc=18002; + y=0.265*safezoneH+safezoneY+0.35; + sizeEx=0.027; + text="Target Range"; + }; + class TEXT_TRUING_DROP_DROP: TEXT_TRUING_DROP_TARGET_RANGE { + idc=18003; + w=0.07; + y=0.265*safezoneH+safezoneY+0.40; + text="Drop"; + }; + class TEXT_TRUING_DROP_MUZZLE_VELOCITY: TEXT_TRUING_DROP_DROP { + idc=18004; + y=0.265*safezoneH+safezoneY+0.50; + text="MV"; + }; + class TEXT_TRUING_DROP_C1_BALLISTIC_COEFFICIENT: TEXT_TRUING_DROP_DROP { + idc=18005; + y=0.265*safezoneH+safezoneY+0.55; + text="C1"; + }; + class TEXT_TRUING_DROP_DROP_OUTPUT: ATragMX_RscEdit { + idc=18006; + style=ST_WITH_RECT+ST_RIGHT; + colorBackground[]={0.15,0.21,0.23,0.3}; + colorDisabled[]={0,0,0,1}; + w=0.06; + y=0.265*safezoneH+safezoneY+0.40; + x=0.550*safezoneW+safezoneX+0.17; + text=""; + }; + class TEXT_TRUING_DROP_MUZZLE_VELOCITY_OUTPUT: TEXT_TRUING_DROP_DROP_OUTPUT { + idc=18007; + y=0.265*safezoneH+safezoneY+0.50; + text=""; + }; + class TEXT_TRUING_DROP_C1_BALLISTIC_COEFFICIENT_OUTPUT: TEXT_TRUING_DROP_DROP_OUTPUT { + idc=18008; + y=0.265*safezoneH+safezoneY+0.55; + text=""; + }; + class TEXT_TRUING_DROP_SUPER: TEXT_TARGET_A { + idc=18009; + w=0.06; + x=0.550*safezoneW+safezoneX+0.25; + y=0.265*safezoneH+safezoneY+0.30; + text="SUPER"; + action=QUOTE(GVAR(truingDropMode) = 0; call FUNC(update_truing_drop_selection)); + }; + class TEXT_TRUING_DROP_SUB: TEXT_TRUING_DROP_SUPER { + idc=18010; + x=0.550*safezoneW+safezoneX+0.32; + text="SUB"; + action=QUOTE(GVAR(truingDropMode) = 1; call FUNC(update_truing_drop_selection)); + }; + class TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT: ATragMX_RscEdit { + idc=18011; + style=ST_WITH_RECT+ST_RIGHT; + colorDisabled[]={0,0,0,0.6}; + w=0.06; + x=0.550*safezoneW+safezoneX+0.25; + y=0.265*safezoneH+safezoneY+0.35; + }; + class TEXT_TRUING_DROP_TARGET_RANGE_SUB_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT { + idc=18012; + x=0.550*safezoneW+safezoneX+0.32; + }; + class TEXT_TRUING_DROP_DROP_SUPER_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT { + idc=18013; + y=0.265*safezoneH+safezoneY+0.40; + }; + class TEXT_TRUING_DROP_DROP_SUB_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUB_INPUT { + idc=18014; + y=0.265*safezoneH+safezoneY+0.40; + }; + class TEXT_TRUING_DROP_CALC: TEXT_GUN_LIST { + idc=18015; + style=ST_CENTER; + w=0.11; + x=0.550*safezoneW+safezoneX+0.26; + y=0.265*safezoneH+safezoneY+0.45; + text="Calc"; + action=QUOTE(true call FUNC(calculate_truing_drop)); + }; + class TEXT_TRUING_DROP_MV_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUPER_INPUT { + idc=18016; + y=0.265*safezoneH+safezoneY+0.50; + }; + class TEXT_TRUING_DROP_C1_BALLISTIC_COEFFICIENT_INPUT: TEXT_TRUING_DROP_TARGET_RANGE_SUB_INPUT { + idc=18017; + y=0.265*safezoneH+safezoneY+0.55; + }; + class TEXT_TRUING_DROP_ACCEPT: TEXT_GUN_LIST { + idc=18018; + w=0.085; + h=0.04; + x=0.550*safezoneW+safezoneX+0.125; + y=0.265*safezoneH+safezoneY+0.60; + text="Accept"; + action=QUOTE(1 call FUNC(toggle_truing_drop)); + }; + class TEXT_TRUING_DROP_CANCEL: TEXT_TRUING_DROP_ACCEPT { + idc=18019; + x=0.550*safezoneW+safezoneX+0.210; + text="Cancel"; + action=QUOTE(0 call FUNC(toggle_truing_drop)); + }; + class TEXT_TRUING_DROP_RESTORE: TEXT_TRUING_DROP_CANCEL { + idc=18020; + x=0.550*safezoneW+safezoneX+0.29525; + text="Restore"; + action=QUOTE(true call FUNC(restore_truing_drop)); + }; }; }; diff --git a/addons/atragmx/XEH_PREP.hpp b/addons/atragmx/XEH_PREP.hpp index 20900711c3..29433f9313 100644 --- a/addons/atragmx/XEH_PREP.hpp +++ b/addons/atragmx/XEH_PREP.hpp @@ -1,13 +1,17 @@ PREP(add_new_gun); +PREP(calculate_distance_at_velocity); PREP(calculate_range_card); PREP(calculate_solution); PREP(calculate_target_range_assist); PREP(calculate_target_solution); PREP(calculate_target_speed_assist); +PREP(calculate_truing_drop); PREP(can_show); PREP(change_gun); PREP(change_target_slot); +PREP(clear_c1_ballistic_coefficient_data); +PREP(clear_muzzle_velocity_data); PREP(clear_user_data); PREP(create_dialog); PREP(cycle_gun_list); @@ -18,17 +22,27 @@ PREP(cycle_scope_unit); PREP(cycle_target_size_units); PREP(cycle_target_speed_direction); PREP(delete_gun); +PREP(evaluate_option_menu_input); PREP(init); +PREP(insert_c1_ballistic_coefficient_data); +PREP(insert_muzzle_velocity_data); PREP(parse_input); +PREP(recalculate_c1_ballistic_coefficient); +PREP(recalculate_muzzle_velocity); PREP(reset_relative_click_memory); PREP(restore_atmo_default); +PREP(restore_truing_drop); PREP(restore_user_data); PREP(save_gun); +PREP(shift_c1_ballistic_coefficient_data); +PREP(shift_muzzle_velocity_data); PREP(show_add_new_gun); PREP(show_atmo_env_data); +PREP(show_c1_ballistic_coefficient_data); PREP(show_gun_ammo_data); PREP(show_gun_list); PREP(show_main_page); +PREP(show_muzzle_velocity_data); PREP(show_range_card); PREP(show_range_card_setup); PREP(show_solution_setup); @@ -36,24 +50,34 @@ PREP(show_target_data); PREP(show_target_range_assist); PREP(show_target_speed_assist); PREP(show_target_speed_assist_timer); +PREP(show_truing_drop); PREP(sord); PREP(store_user_data); PREP(target_speed_assist_timer); PREP(toggle_atmo_env_data); +PREP(toggle_c1_ballistic_coefficient_data); +PREP(toggle_coriolis); PREP(toggle_gun_ammo_data); PREP(toggle_gun_list); +PREP(toggle_muzzle_velocity_data); +PREP(toggle_option_menu); PREP(toggle_range_card); PREP(toggle_range_card_setup); PREP(toggle_solution_setup); PREP(toggle_target_data); PREP(toggle_target_range_assist); PREP(toggle_target_speed_assist); +PREP(toggle_truing_drop); +PREP(true_c1_ballistic_coefficient); +PREP(true_muzzle_velocity); PREP(update_atmosphere); PREP(update_atmo_env_data); PREP(update_atmo_selection); +PREP(update_c1_ballistic_coefficient_data); PREP(update_gun); PREP(update_gun_ammo_data); PREP(update_inclination_angle); +PREP(update_muzzle_velocity_data); PREP(update_range_card); PREP(update_relative_click_memory); PREP(update_result); @@ -62,6 +86,8 @@ PREP(update_solution_setup); PREP(update_target); PREP(update_target_data); PREP(update_target_selection); +PREP(update_truing_drop_data); +PREP(update_truing_drop_selection); PREP(update_unit_selection); PREP(update_zero_range); PREP(on_close_dialog); diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 992f9e657a..3caecd2c83 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -5,49 +5,49 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ATRAGMX_PROFILE_NAMESPACE_VERSION && count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { - // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657485, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ], + // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657485, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], - ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], + ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" , [[-15,833],[0,840],[10,847],[15,852],[25,866],[30,875],[35,886]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" , [[-15,873],[0,880],[10,887],[15,892],[25,906],[30,915],[35,926]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], + ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" , [[-15,297],[0,298],[10,299],[15,299],[25,301],[30,302],[35,303]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - [".50 Beowulf" , 563, 100, 0.0657485, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" ], + [".50 Beowulf" , 563, 100, 0.0657485, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" , [[-15,560],[0,561],[10,562],[15,562],[25,564],[30,565],[35,566]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - [".408 Chey Tac" , 910, 100, 0.0569400, -0.00038944, 3.81, 0, 2, 10, 120, 0, 0, 26.57, 10.4, 33.02, 0.970, 1, "ASM" ], + [".408 Chey Tac" , 910, 100, 0.0569400, -0.00038944, 3.81, 0, 2, 10, 120, 0, 0, 26.57, 10.4, 33.02, 0.970, 1, "ASM" , [[-15,883],[0,890],[10,897],[15,902],[25,916],[30,925],[35,936]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["9.3×64mm" , 870, 100, 0.0619295, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" ], + ["9.3×64mm" , 870, 100, 0.0619295, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" , [[-15,843],[0,850],[10,857],[15,862],[25,876],[30,885],[35,896]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - [".338LM 250gr" , 880, 100, 0.0598469, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.322, 7, "ICAO"], - [".338LM 300gr" , 800, 100, 0.0677343, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.381, 7, "ICAO"], - [".338LM API526" , 895, 100, 0.0588865, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.560, 1, "ASM" ], + [".338LM 250gr" , 880, 100, 0.0598469, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.645, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + [".338LM 300gr" , 800, 100, 0.0677343, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.759, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + [".338LM API526" , 880, 100, 0.0588865, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.760, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - [".300WM Mk248 Mod0" , 900, 100, 0.0584442, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.268, 7, "ICAO"], - [".300WM Mk248 Mod1" , 867, 100, 0.0610738, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.310, 7, "ICAO"], - [".300WM Berger OTM" , 853, 100, 0.0622179, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.368, 7, "ICAO"], + [".300WM Mk248 Mod0" , 900, 100, 0.0584442, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.537, 1, "ICAO", [[-15,838],[0,845],[10,852],[15,857],[25,871],[30,880],[35,891]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + [".300WM Mk248 Mod1" , 867, 100, 0.0610738, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.619, 1, "ICAO", [[-15,820],[0,827],[10,834],[15,839],[25,853],[30,862],[35,873]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + [".300WM Berger OTM" , 853, 100, 0.0622179, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.715, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["7.62x54mmR" , 800, 100, 0.0691878, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO"], + ["7.62x54mmR" , 820, 100, 0.0691878, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO", [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["7.62x51mm M80" , 810, 100, 0.0679374, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 25.40, 0.200, 7, "ICAO"], - ["7.62x51mm M118LR" , 780, 100, 0.0710319, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"], - ["7.62x51mm Mk316" , 780, 100, 0.0710319, -0.00082029, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.243, 7, "ICAO"], - ["7.62x51mm Mk319" , 910, 100, 0.0584524, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO"], - ["7.62x51mm M993" , 930, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO"], - ["7.62x51mm Subsonic", 320, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.235, 7, "ICAO"], + ["7.62x51mm M80" , 810, 100, 0.0679374, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 25.40, 0.398, 1, "ICAO", [[-15,783],[0,790],[10,797],[15,802],[25,816],[30,825],[35,836]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["7.62x51mm M118LR" , 765, 100, 0.0710319, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.482, 1, "ICAO", [[-15,738],[0,745],[10,752],[15,757],[25,771],[30,780],[35,791]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["7.62x51mm Mk316" , 782, 100, 0.0710319, -0.00082029, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.483, 1, "ICAO", [[-15,777],[0,778],[10,779],[15,781],[25,783],[30,785],[35,787]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["7.62x51mm Mk319" , 901, 100, 0.0584524, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO", [[-15,898],[0,899],[10,900],[15,900],[25,902],[30,903],[35,904]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["7.62x51mm M993" , 920, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO", [[-15,893],[0,900],[10,907],[15,912],[25,926],[30,935],[35,946]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["7.62x51mm Subsonic", 315, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.502, 1, "ICAO", [[-15,312],[0,313],[10,314],[15,314],[25,316],[30,317],[35,318]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["6.5x39mm" , 800, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"], - ["6.5x47mm Lapua" , 800, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"], - ["6.5mm Creedmor" , 840, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.317, 7, "ICAO"], + ["6.5x39mm" , 774, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.524, 1, "ICAO", [[-15,747],[0,754],[10,761],[15,766],[25,780],[30,789],[35,800]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["6.5x47mm Lapua" , 775, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.577, 1, "ICAO", [[-15,748],[0,755],[10,762],[15,767],[25,781],[30,790],[35,801]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["6.5mm Creedmor" , 830, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.632, 1, "ICAO", [[-15,803],[0,810],[10,817],[15,822],[25,836],[30,845],[35,856]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["5.8x42mm DBP87" , 930, 100, 0.0572574, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.156, 7, "ICAO" ], + ["5.8x42mm DBP87" , 950, 100, 0.0572574, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.313, 1, "ICAO", [[-15,923],[0,930],[10,937],[15,942],[25,956],[30,965],[35,976]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ], - ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ], - ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ], - ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" ], + ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.302, 1, "ASM" , [[-15,843],[0,849],[10,857],[15,862],[25,876],[30,885],[35,898]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" , [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" , [[-15,842],[0,849],[10,856],[15,861],[25,875],[30,884],[35,895]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["5.45x39mm 7N6M" , 735, 100, 0.0787205, -0.00116278, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.168, 7, "ICAO"]]; + ["5.45x39mm 7N6M" , 735, 100, 0.0787205, -0.00116278, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.336, 1, "ICAO", [[-15,708],[0,715],[10,722],[15,727],[25,741],[30,750],[35,761]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]]]; [] call FUNC(clear_user_data); profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; diff --git a/addons/atragmx/functions/fnc_add_new_gun.sqf b/addons/atragmx/functions/fnc_add_new_gun.sqf index dbc85cc27f..bca41f8b6b 100644 --- a/addons/atragmx/functions/fnc_add_new_gun.sqf +++ b/addons/atragmx/functions/fnc_add_new_gun.sqf @@ -17,7 +17,7 @@ private _gunName = ctrlText 11001; if (_gunName != "") then { - private _gunProfileEntry = [_gunName, 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.393, 1, "ICAO"], + private _gunProfileEntry = [_gunName, 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.393, 1, "ICAO", [[-15,0],[0,0],[10,0],[15,0],[25,0],[30,0],[35,0]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]]; GVAR(gunList) = GVAR(gunList) + [_gunProfileEntry]; diff --git a/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf b/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf new file mode 100644 index 0000000000..f86ef5d28a --- /dev/null +++ b/addons/atragmx/functions/fnc_calculate_distance_at_velocity.sqf @@ -0,0 +1,41 @@ +/* + * Author: Ruthberg + * Calculates distance at which the bullet velocity drops below the threshold velocity + * + * Arguments: + * theshold velocity + * + * Return Value: + * distance _thresholdVelocity} do { + private _bc = GVAR(targetSolutionInput) select 14; + private _dragModel = GVAR(targetSolutionInput) select 15; + private _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { + parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _velocity])) + } else { + ([_dragModel, _bc, _velocity] call EFUNC(advanced_ballistics,calculateRetardation)) + }; + _distance = _distance + _velocity * __DELTA_T; + _velocity = _velocity - (_drag * __DELTA_T); +}; + +_distance diff --git a/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf b/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf index e59cdee37d..be21a09927 100644 --- a/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_range_assist.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" private _angle = parseNumber(ctrlText 7012); -private _targetSize = parseNumber(ctrlText 7010); +private _targetSize = abs(parseNumber(ctrlText 7010)); if (GVAR(rangeAssistUseTargetHeight)) then { _targetSize = _targetSize * cos(_angle); }; @@ -43,7 +43,7 @@ switch (GVAR(rangeAssistImageSizeUnit)) do { _imageSize = _imageSize / 60 / 1.047; }; }; -private _estRange = parseNumber(ctrlText 7013); +private _estRange = abs(parseNumber(ctrlText 7013)); if (GVAR(currentUnit) == 1) then { _estRange = _estRange / 1.0936133; }; @@ -52,7 +52,7 @@ switch (_this) do { case 0: { _targetSize = tan(_imageSize) * _estRange; - if (GVAR(rangeAssistUseTargetHeight)) then { + if (GVAR(rangeAssistUseTargetHeight) && cos(_angle) != 0) then { _targetSize = _targetSize / cos(_angle); }; @@ -71,8 +71,10 @@ switch (_this) do { ctrlSetText [7010, Str(Round(_targetSize * 100) / 100)]; }; case 1: { - _imageSize = atan(_targetSize / _estRange); - + if (_estRange > 0) then { + _imageSize = atan(_targetSize / _estRange); + }; + switch (GVAR(rangeAssistImageSizeUnit)) do { case 0: { _imageSize = _imageSize * 6400 / 360; @@ -88,8 +90,10 @@ switch (_this) do { ctrlSetText [7011, Str(Round(_imageSize * 100) / 100)]; }; case 2: { - _estRange = _targetSize / tan(_imageSize); - + if (tan(_imageSize) != 0) then { + _estRange = _targetSize / tan(_imageSize); + }; + ctrlSetText [7013, Str(Round(_estRange))]; }; }; diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 8bd844938f..ced57df973 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -70,9 +70,10 @@ _inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget); _targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget); _targetRange = GVAR(targetRange) select GVAR(currentTarget); -private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, - [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude, _directionOfFire] call FUNC(calculate_solution); +GVAR(targetSolutionInput) = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, + [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude, _directionOfFire]; + +private _result = GVAR(targetSolutionInput) call FUNC(calculate_solution); GVAR(elevationOutput) set [GVAR(currentTarget), _result select 0]; GVAR(windage1Output) set [GVAR(currentTarget), (_result select 1) select 0]; @@ -80,5 +81,8 @@ GVAR(windage2Output) set [GVAR(currentTarget), (_result select 1) select 1]; GVAR(leadOutput) set [GVAR(currentTarget), _result select 2]; GVAR(tofOutput) set [GVAR(currentTarget), _result select 3]; GVAR(velocityOutput) set [GVAR(currentTarget), _result select 4]; +GVAR(verticalCoriolisOutput) set [GVAR(currentTarget), _result select 6]; +GVAR(horizontalCoriolisOutput) set [GVAR(currentTarget), _result select 7]; +GVAR(spinDriftOutput) set [GVAR(currentTarget), _result select 8]; [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_calculate_truing_drop.sqf b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf new file mode 100644 index 0000000000..ddc57bdb96 --- /dev/null +++ b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf @@ -0,0 +1,107 @@ +/* + * Author: Ruthberg + * Calculates the truing drop and updates the output fields + * + * Arguments: + * parse input + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_calculate_truing_drop + * + * Public: No + */ +#include "script_component.hpp" + +private _parseInput = _this; + +private _transonicRange = GVAR(truingDropRangeData) select 0; +private _subsonicRange = GVAR(truingDropRangeData) select 1; +private _transonicDrop = GVAR(truingDropDropData) select 1; +private _subsonicDrop = GVAR(truingDropDropData) select 2; + +if (_parseInput) then { + _transonicRange = 0 max abs(parseNumber(ctrlText 18011)) min 4000; + _subsonicRange = 0 max abs(parseNumber(ctrlText 18012)) min 4000; + if (GVAR(currentUnit) != 2) then { + _transonicRange = _transonicRange * 0.9144; + _subsonicRange = _subsonicRange * 0.9144; + }; + _transonicRange = Round(_transonicRange); + _subsonicRange = Round(_subsonicRange); + + _subsonicRange = _transonicRange max _subsonicRange; + + _transonicDrop = 0 max abs(parseNumber(ctrlText 18013)) min 1000; + _subsonicDrop = 0 max abs(parseNumber(ctrlText 18014)) min 1000; + private _dropUnit = GVAR(currentScopeUnit); + if (_dropUnit == 3) then { + switch (GVAR(currentScopeClickUnit)) do { + case 0: { _dropUnit = 1; }; + case 1: { _dropUnit = 2; }; + case 2: { _dropUnit = 0; }; + }; + }; + switch (_dropUnit) do { + case 0: { + _transonicDrop = _transonicDrop * 3.38; + _subsonicDrop = _subsonicDrop * 3.38; + }; + case 2: { + _transonicDrop = _transonicDrop / 1.047; + _subsonicDrop = _subsonicDrop / 1.047; + }; + }; + _transonicDrop = Round(_transonicDrop * 100) / 100; + _subsonicDrop = Round(_subsonicDrop * 100) / 100; + + _subsonicDrop = _transonicDrop max _subsonicDrop; +}; + +if ((GVAR(truingDropDropData) select 0) == 0 || {!([_transonicRange, _subsonicRange] isEqualTo GVAR(truingDropRangeData))}) then { + if (isNil QGVAR(targetSolutionInput)) then { + call FUNC(calculate_target_solution); + }; + private _solutionInput = +GVAR(targetSolutionInput); + + if (_transonicRange == 0) then { + _transonicRange = Round(403 call FUNC(calculate_distance_at_velocity)); + }; + _solutionInput set [13, _transonicRange]; + private _result1 = _solutionInput call FUNC(calculate_solution); + _transonicDrop = Round((_result1 select 0) * 100) / 100; + GVAR(truingDropRangeData) set [0, _transonicRange]; + GVAR(truingDropDropData) set [1, _transonicDrop]; + GVAR(truingDropReferenceDropData) set [0, _transonicDrop]; + + private _speedOfSound = (_solutionInput select 5) call EFUNC(weather,calculateSpeedOfSound); + if (_subsonicRange == 0) then { + _subsonicRange = _speedOfSound call FUNC(calculate_distance_at_velocity); + if (GVAR(currentUnit) == 2) then { + _subsonicRange = _subsonicRange + 200; + } else { + _subsonicRange = _subsonicRange + 200 * 1.0936133; + }; + _subsonicRange = Round(_subsonicRange); + }; + _solutionInput set [13, _subsonicRange]; + private _result2 = _solutionInput call FUNC(calculate_solution); + _subsonicDrop = Round((_result2 select 0) * 100) / 100; + GVAR(truingDropRangeData) set [1, _subsonicRange]; + GVAR(truingDropDropData) set [2, _subsonicDrop]; + GVAR(truingDropReferenceDropData) set [1, _subsonicDrop]; +} else { + if (_transonicDrop != GVAR(truingDropDropData) select 1 || _subsonicDrop != GVAR(truingDropDropData) select 2) then { + GVAR(truingDropDropData) set [1, _transonicDrop]; + GVAR(truingDropDropData) set [2, _subsonicDrop]; + if (GVAR(truingDropMode) == 0) then { + call FUNC(true_muzzle_velocity); + } else { + call FUNC(true_c1_ballistic_coefficient); + }; + }; +}; + +call FUNC(update_truing_drop_data); diff --git a/addons/atragmx/functions/fnc_change_gun.sqf b/addons/atragmx/functions/fnc_change_gun.sqf index babd4e733c..b6e5e24658 100644 --- a/addons/atragmx/functions/fnc_change_gun.sqf +++ b/addons/atragmx/functions/fnc_change_gun.sqf @@ -26,6 +26,12 @@ if (_restoreMemory) then { }; GVAR(currentGun) = _gunID; +[false, false] call FUNC(recalculate_muzzle_velocity); +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + false call FUNC(restore_truing_drop); + [false, false] call FUNC(recalculate_c1_ballistic_coefficient); +}; + if (_updateDisplay) then { lbSetCurSel [6000, GVAR(currentGun)]; }; @@ -37,6 +43,8 @@ GVAR(currentScopeClickNumber) = 1 max (GVAR(workingMemory) select 8) min 10; if (_updateDisplay) then { [] call FUNC(update_gun); [] call FUNC(update_gun_ammo_data); + [] call FUNC(update_muzzle_velocity_data); + [] call FUNC(update_c1_ballistic_coefficient_data); }; GVAR(elevationOutput) set [GVAR(currentTarget), 0]; @@ -45,6 +53,9 @@ GVAR(windage2Output) set [GVAR(currentTarget), 0]; GVAR(leadOutput) set [GVAR(currentTarget), 0]; GVAR(tofOutput) set [GVAR(currentTarget), 0]; GVAR(velocityOutput) set [GVAR(currentTarget), 0]; +GVAR(verticalCoriolisOutput) set [GVAR(currentTarget), 0]; +GVAR(horizontalCoriolisOutput) set [GVAR(currentTarget), 0]; +GVAR(spinDriftOutput) set [GVAR(currentTarget), 0]; if (_updateDisplay) then { [] call FUNC(calculate_target_solution); diff --git a/addons/atragmx/functions/fnc_change_target_slot.sqf b/addons/atragmx/functions/fnc_change_target_slot.sqf index a867749f21..7c660ff7de 100644 --- a/addons/atragmx/functions/fnc_change_target_slot.sqf +++ b/addons/atragmx/functions/fnc_change_target_slot.sqf @@ -17,9 +17,8 @@ private _target = 0 max _this min 3; -call FUNC(parse_input); +[] call FUNC(parse_input); GVAR(currentTarget) = _target; call FUNC(update_target_selection); - -[] call FUNC(calculate_target_solution); +call FUNC(calculate_target_solution); diff --git a/addons/atragmx/functions/fnc_clear_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_clear_c1_ballistic_coefficient_data.sqf new file mode 100644 index 0000000000..c6f2d47134 --- /dev/null +++ b/addons/atragmx/functions/fnc_clear_c1_ballistic_coefficient_data.sqf @@ -0,0 +1,21 @@ +/* + * Author: Ruthberg + * Clears the c1 ballistic coefficient data fields + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_clear_c1_ballistic_coefficient_data + * + * Public: No + */ +#include "script_component.hpp" + +// Distances +{ctrlSetText [_x, "0"]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027]; +// Ballistic Coefficients +{ctrlSetText [_x, "0"]} forEach [170031, 170032, 170033, 170034, 170035, 170036, 170037]; diff --git a/addons/atragmx/functions/fnc_clear_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_clear_muzzle_velocity_data.sqf new file mode 100644 index 0000000000..d76fa5864b --- /dev/null +++ b/addons/atragmx/functions/fnc_clear_muzzle_velocity_data.sqf @@ -0,0 +1,21 @@ +/* + * Author: Ruthberg + * Clears the muzzle velocity data fields + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_clear_muzzle_velocity_data + * + * Public: No + */ +#include "script_component.hpp" + +// Temperatures +{ctrlSetText [_x, "0"]} forEach [160021, 160022, 160023, 160024, 160025, 160026, 160027]; +// Muzzle velocities +{ctrlSetText [_x, "0"]} forEach [160031, 160032, 160033, 160034, 160035, 160036, 160037]; diff --git a/addons/atragmx/functions/fnc_clear_user_data.sqf b/addons/atragmx/functions/fnc_clear_user_data.sqf index 308b5bbf12..faa9af07f7 100644 --- a/addons/atragmx/functions/fnc_clear_user_data.sqf +++ b/addons/atragmx/functions/fnc_clear_user_data.sqf @@ -28,6 +28,7 @@ profileNamespace setVariable ["ACE_ATragMX_temperature", nil]; profileNamespace setVariable ["ACE_ATragMX_barometricPressure", nil]; profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", nil]; +profileNamespace setVariable ["ACE_ATragMX_showCoriolis", nil]; profileNamespace setVariable ["ACE_ATragMX_showWind2", nil]; profileNamespace setVariable ["ACE_ATragMX_latitude", nil]; profileNamespace setVariable ["ACE_ATragMX_directionOfFire", nil]; diff --git a/addons/atragmx/functions/fnc_create_dialog.sqf b/addons/atragmx/functions/fnc_create_dialog.sqf index 2eee7c1824..322f135b45 100644 --- a/addons/atragmx/functions/fnc_create_dialog.sqf +++ b/addons/atragmx/functions/fnc_create_dialog.sqf @@ -30,8 +30,10 @@ GVAR(showMainPage) call FUNC(show_main_page); GVAR(showAddNewGun) call FUNC(show_add_new_gun); GVAR(showAtmoEnvData) call FUNC(show_atmo_env_data); +GVAR(showC1BallisticCoefficientData) call FUNC(show_c1_ballistic_coefficient_data); GVAR(showGunAmmoData) call FUNC(show_gun_ammo_data); GVAR(showGunList) call FUNC(show_gun_list); +GVAR(showMuzzleVelocityData) call FUNC(show_muzzle_velocity_data); GVAR(showRangeCard) call FUNC(show_range_card); if (GVAR(showRangeCard)) then { ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 5001); @@ -43,6 +45,7 @@ GVAR(showTargetData) call FUNC(show_target_data); GVAR(showTargetRangeAssist) call FUNC(show_target_range_assist); GVAR(showTargetSpeedAssist) call FUNC(show_target_speed_assist); GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer); +GVAR(showTruingDrop) call FUNC(show_truing_drop); [GVAR(currentGun), false, true] call FUNC(change_gun); @@ -50,6 +53,13 @@ GVAR(showTargetSpeedAssistTimer) call FUNC(show_target_speed_assist_timer); lbAdd [6000, _x select 0]; } forEach GVAR(gunList); +ctrlShow [3001, false]; +ctrlShow [3002, false]; + +{ + (__dsp displayCtrl _x) ctrlEnable false; +} forEach [18006, 18007, 18008]; + GVAR(active) = true; GVAR(DialogPFH) = [{ diff --git a/addons/atragmx/functions/fnc_cycle_scope_unit.sqf b/addons/atragmx/functions/fnc_cycle_scope_unit.sqf index d83236bc78..f1cc9c2219 100644 --- a/addons/atragmx/functions/fnc_cycle_scope_unit.sqf +++ b/addons/atragmx/functions/fnc_cycle_scope_unit.sqf @@ -15,10 +15,10 @@ */ #include "script_component.hpp" -[] call FUNC(parse_input); - GVAR(currentScopeUnit) = (GVAR(currentScopeUnit) + 1) % (count GVAR(scopeUnits)); GVAR(workingMemory) set [6, GVAR(currentScopeUnit)]; +true call FUNC(show_main_page); + [] call FUNC(update_scope_unit); [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_evaluate_option_menu_input.sqf b/addons/atragmx/functions/fnc_evaluate_option_menu_input.sqf new file mode 100644 index 0000000000..f74f8678a4 --- /dev/null +++ b/addons/atragmx/functions/fnc_evaluate_option_menu_input.sqf @@ -0,0 +1,30 @@ +/* + * Author: Ruthberg + * Evalutes input from the option menu + * + * Arguments: + * option menu id + * + * Return Value: + * Nothing + * + * Example: + * 1 call ace_atragmx_fnc_evaluate_option_menu_input + * + * Public: No + */ +#include "script_component.hpp" + +params ["_optionID"]; + +switch (_optionID) do { + case 0: {}; // Accuracy 1st + case 1: { 0 call FUNC(toggle_muzzle_velocity_data); }; // MuzVel Table + case 2: { 0 call FUNC(toggle_c1_ballistic_coefficient_data); }; // Bal Coef Table + case 3: { 0 call FUNC(toggle_target_speed_assist); }; // Target Speed Est + case 4: { 0 call FUNC(toggle_target_range_assist); }; // Target Range Est + case 5: { 0 call FUNC(toggle_truing_drop); }; // Truing Drop + case 6: { 0 call FUNC(toggle_coriolis); }; // Show Coriolis + case 7: { 0 call FUNC(toggle_solution_setup); }; // Set Clicks + case 8: {}; // Gun Note +}; diff --git a/addons/atragmx/functions/fnc_init.sqf b/addons/atragmx/functions/fnc_init.sqf index 30b17ebf90..eda2cc1ee0 100644 --- a/addons/atragmx/functions/fnc_init.sqf +++ b/addons/atragmx/functions/fnc_init.sqf @@ -65,18 +65,33 @@ GVAR(targetSpeedDirection) = [1, 1, 1, 1]; GVAR(targetRange) = [0, 0, 0, 0]; GVAR(showWind2) = false; +GVAR(showCoriolis) = false; GVAR(elevationOutput) = [0, 0, 0, 0]; GVAR(windage1Output) = [0, 0, 0, 0]; GVAR(windage2Output) = [0, 0, 0, 0]; GVAR(leadOutput) = [0, 0, 0, 0]; GVAR(tofOutput) = [0, 0, 0, 0]; GVAR(velocityOutput) = [0, 0, 0, 0]; +GVAR(verticalCoriolisOutput) = [0, 0, 0, 0]; +GVAR(horizontalCoriolisOutput) = [0, 0, 0, 0]; +GVAR(spinDriftOutput) = [0, 0, 0, 0]; + +GVAR(truingDropMode) = 0; +GVAR(truingDropRangeData) = [0, 0]; +GVAR(truingDropDropData) = [0, 0, 0]; +GVAR(truingDropReferenceDropData) = [0, 0, 0]; +GVAR(truingDropC1) = 0; +GVAR(truingDropMuzzleVelocity) = 0; + +GVAR(targetSolutionInput) = nil; GVAR(showMainPage) = true; GVAR(showAddNewGun) = false; GVAR(showAtmoEnvData) = false; +GVAR(showC1BallisticCoefficientData) = false; GVAR(showGunAmmoData) = false; GVAR(showGunList) = false; +GVAR(showMuzzleVelocityData) = false; GVAR(showRangeCard) = false; GVAR(showRangeCardSetup) = false; GVAR(showSolutionSetup) = false; @@ -84,3 +99,4 @@ GVAR(showTargetData) = false; GVAR(showTargetRangeAssist) = false; GVAR(showTargetSpeedAssist) = false; GVAR(showTargetSpeedAssistTimer) = false; +GVAR(showTruingDrop) = false; diff --git a/addons/atragmx/functions/fnc_insert_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_insert_c1_ballistic_coefficient_data.sqf new file mode 100644 index 0000000000..5b03c11475 --- /dev/null +++ b/addons/atragmx/functions/fnc_insert_c1_ballistic_coefficient_data.sqf @@ -0,0 +1,55 @@ +/* + * Author: Ruthberg + * Inserts entry in the c1 ballistic coefficient vs. distance interpolation table + * + * Arguments: + * transonic range - + * subsonic range - + * c1 ballistic coefficient - + * + * Return Value: + * Nothing + * + * Example: + * [800, 0.485] call ace_atragmx_fnc_insert_c1_ballistic_coefficient_data + * + * Public: No + */ +#include "script_component.hpp" + +params ["_transonicRange", "_subsonicRange", "_c1"]; + +private _entries = {(_x select 1) > 0} count (GVAR(workingMemory) select 19); + +if (_entries > 0) then { + // Insert + private _insertIndex = 0; + private _minDiff = 10000; + { + if (_minDiff > 0 && {(((GVAR(workingMemory) select 19) select _forEachIndex) select 1) == 0}) then { + _insertIndex = _forEachIndex; + _minDiff = 0; + }; + private _tr = ((GVAR(workingMemory) select 19) select _forEachIndex) select 0; + private _diff = abs(_subsonicRange - _tr); + if (_diff == 0) exitWith { + _insertIndex = _forEachIndex; + }; + if (_diff < _minDiff) then { + _insertIndex = _forEachIndex; + _minDiff = _diff; + }; + } forEach (GVAR(workingMemory) select 19); + + (GVAR(workingMemory) select 19) set [_insertIndex, [_subsonicRange, 0.1 max _c1 min 2.0]]; +} else { + // Reset + private _zeroRange = GVAR(workingMemory) select 2; + private _bc = GVAR(workingMemory) select 15; + GVAR(workingMemory) set [19, [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]]; + (GVAR(workingMemory) select 19) set [0, [_zeroRange, _bc]]; + (GVAR(workingMemory) select 19) set [1, [_transonicRange + (_subsonicRange - _transonicRange) * 0.75, _bc]]; + (GVAR(workingMemory) select 19) set [2, [_subsonicRange, 0.1 max _c1 min 2.0]]; +}; + +call FUNC(update_c1_ballistic_coefficient_data); diff --git a/addons/atragmx/functions/fnc_insert_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_insert_muzzle_velocity_data.sqf new file mode 100644 index 0000000000..1eb25b2f62 --- /dev/null +++ b/addons/atragmx/functions/fnc_insert_muzzle_velocity_data.sqf @@ -0,0 +1,41 @@ +/* + * Author: Ruthberg + * Inserts entry in the muzzle velocity vs. temperature interpolation table + * + * Arguments: + * temperature - + * muzzle velocity - + * + * Return Value: + * Nothing + * + * Example: + * [10, 800] call ace_atragmx_fnc_insert_muzzle_velocity_data + * + * Public: No + */ +#include "script_component.hpp" + +params ["_temperature", "_muzzleVelocity"]; + +private _insertIndex = 0; +private _minDiff = 1000; +{ + if (_minDiff > 0 && {(((GVAR(workingMemory) select 18) select _forEachIndex) select 1) == 0}) then { + _insertIndex = _forEachIndex; + _minDiff = 0; + }; + private _t = ((GVAR(workingMemory) select 18) select _forEachIndex) select 0; + private _diff = abs(_temperature - _t); + if (_diff == 0) exitWith { + _insertIndex = _forEachIndex; + }; + if (_diff < _minDiff) then { + _insertIndex = _forEachIndex; + _minDiff = _diff; + }; +} forEach (GVAR(workingMemory) select 18); + +(GVAR(workingMemory) select 18) set [_insertIndex, [_temperature, 0 max _muzzleVelocity min 1400]]; + +call FUNC(update_muzzle_velocity_data); diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index 61a8caea6a..2f73ecebba 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -1,6 +1,6 @@ /* * Author: Ruthberg - * Parses all input fields in the gun, atmosphere and target column and the result input fields + * Parses all input fields in the gun-, atmosphere- and target column, the result input fields and the muzzle velocity data input fields * * Arguments: * Nothing @@ -15,6 +15,35 @@ */ #include "script_component.hpp" +// Muzzle velocity vs. temperature interpolation data +{ + private _temperature = -50 max parseNumber(ctrlText _x) min 160; + if (GVAR(currentUnit) == 1) then { + _temperature = (_temperature - 32) / 1.8; + }; + ((GVAR(workingMemory) select 18) select _forEachIndex) set [0, _temperature]; +} forEach [160021, 160022, 160023, 160024, 160025, 160026, 160027]; +{ + private _muzzleVelocity = parseNumber(ctrlText _x); + if (GVAR(currentUnit) == 1) then { + _muzzleVelocity = _muzzleVelocity / 3.2808399; + }; + ((GVAR(workingMemory) select 18) select _forEachIndex) set [1, 0 max _muzzleVelocity min 1400]; +} forEach [160031, 160032, 160033, 160034, 160035, 160036, 160037]; + +// C1 coefficient vs. distance interpolation data +{ + private _distance = 0 max parseNumber(ctrlText _x) min 4000; + if (GVAR(currentUnit) != 2) then { + _distance = _distance * 0.9144; + }; + ((GVAR(workingMemory) select 19) select _forEachIndex) set [0, _distance]; +} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027]; +{ + private _c1 = 0 max parseNumber(ctrlText _x) min 2.0; + ((GVAR(workingMemory) select 19) select _forEachIndex) set [1, _c1]; +} forEach [170031, 170032, 170033, 170034, 170035, 170036, 170037]; + GVAR(altitude) = -1000 max parseNumber(ctrlText 130030) min 20000; GVAR(temperature) = -50 max parseNumber(ctrlText 130040) min 160; GVAR(barometricPressure) = 10 max parseNumber(ctrlText 130050) min 1350; @@ -49,11 +78,11 @@ if ((ctrlText 140051) == ">") then { GVAR(targetRange) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140060)) min 4000]; if (GVAR(currentUnit) != 2) then { GVAR(windSpeed1) set [GVAR(currentTarget), (GVAR(windSpeed1) select GVAR(currentTarget)) * 0.44704]; - GVAR(windSpeed2) set [GVAR(currentTarget), (GVAR(windSpeed2) select GVAR(currentTarget)) * 0.44704]; - GVAR(targetSpeed) set [GVAR(currentTarget), (GVAR(targetSpeed) select GVAR(currentTarget)) * 0.44704]; + GVAR(windSpeed2) set [GVAR(currentTarget), (GVAR(windSpeed2) select GVAR(currentTarget)) * 0.44704]; + GVAR(targetSpeed) set [GVAR(currentTarget), (GVAR(targetSpeed) select GVAR(currentTarget)) * 0.44704]; }; if (GVAR(currentUnit) == 1) then { - GVAR(targetRange) set [GVAR(currentTarget), (GVAR(targetRange) select GVAR(currentTarget)) * 0.9144]; + GVAR(targetRange) set [GVAR(currentTarget), (GVAR(targetRange) select GVAR(currentTarget)) * 0.9144]; }; private ["_boreHeight", "_bulletMass", "_bulletDiameter", "_airFriction", "_rifleTwist", "_muzzleVelocity", "_zeroRange"]; @@ -67,7 +96,7 @@ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) t }; _rifleTwist = parseNumber(ctrlText 120040); _muzzleVelocity = parseNumber(ctrlText 120050); -_zeroRange = parseNumber (ctrlText 120060); +_zeroRange = parseNumber(ctrlText 120060); if (GVAR(currentUnit) != 2) then { _boreHeight = _boreHeight * 2.54; _bulletMass = _bulletMass * 0.06479891; @@ -88,10 +117,16 @@ GVAR(workingMemory) set [12, _bulletMass]; GVAR(workingMemory) set [13, _bulletDiameter]; GVAR(workingMemory) set [14, _rifleTwist]; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + if (_airFriction != GVAR(workingMemory) select 15) then { + (_airFriction - (GVAR(workingMemory) select 15)) call FUNC(shift_c1_ballistic_coefficient_data); + }; GVAR(workingMemory) set [15, _airFriction]; } else { GVAR(workingMemory) set [4, _airFriction]; }; +if (_muzzleVelocity != GVAR(workingMemory) select 1) then { + (_muzzleVelocity - (GVAR(workingMemory) select 1)) call FUNC(shift_muzzle_velocity_data); +}; GVAR(workingMemory) set [1, _muzzleVelocity]; GVAR(workingMemory) set [2, _zeroRange]; @@ -101,5 +136,7 @@ GVAR(workingMemory) set [2, _zeroRange]; [] call FUNC(update_atmo_env_data); [] call FUNC(update_target); [] call FUNC(update_target_data); +[] call FUNC(update_muzzle_velocity_data); +[] call FUNC(update_c1_ballistic_coefficient_data); [] call FUNC(store_user_data); diff --git a/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf b/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf new file mode 100644 index 0000000000..3ad4f26845 --- /dev/null +++ b/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf @@ -0,0 +1,57 @@ +/* + * Author: Ruthberg + * Recalculates the c1 ballistic coefficient based on the c1 ballistic coefficient vs. distance interpolation input + * + * Arguments: + * parse input + * update display + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_recalculate_c1_ballistic_coefficient + * + * Public: No + */ +#include "script_component.hpp" + +params ["_parseInput", "_updateDisplay"]; + +if (_parseInput) then { + [] call FUNC(parse_input); +}; + +private _lookupTable = []; +{ + if ((_x select 1) > 0) then { + _lookupTable pushBack _x; + }; +} forEach (GVAR(workingMemory) select 19); + +private _lookupTableSize = count _lookupTable; +if (_lookupTableSize < 2) exitWith {}; +_lookupTable sort true; + +private ["_lowerIndex", "_upperIndex"]; +for "_index" from 1 to (_lookupTableSize - 1) do { + _upperIndex = _index; + _lowerIndex = _upperIndex - 1; + if (((_lookupTable select _index) select 0) >= (GVAR(targetRange) select GVAR(currentTarget))) exitWith {} +}; + +private ["_lowerDistance", "_upperDistance", "_lowerC1", "_upperC1", "_slope", "_c1"]; +_lowerDistance = (_lookupTable select _lowerIndex) select 0; +_upperDistance = (_lookupTable select _upperIndex) select 0; +_lowerC1 = (_lookupTable select _lowerIndex) select 1; +_upperC1 = (_lookupTable select _upperIndex) select 1; +_slope = (_upperC1 - _lowerC1) / (_upperDistance - _lowerDistance); +_c1 = 0.1 max (_lowerC1 + ((GVAR(targetRange) select GVAR(currentTarget)) - _lowerDistance) * _slope) min 2.0; + +if (_c1 != GVAR(workingMemory) select 15) then { + GVAR(workingMemory) set [15, _c1]; + if (_updateDisplay) then { + call FUNC(update_gun); + call FUNC(update_gun_ammo_data); + }; +}; diff --git a/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf b/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf new file mode 100644 index 0000000000..430e8ecc68 --- /dev/null +++ b/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf @@ -0,0 +1,57 @@ +/* + * Author: Ruthberg + * Recalculates the muzzle velocity based on the muzzle velocity vs. temperature interpolation input + * + * Arguments: + * parse input + * update display + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_recalculate_muzzle_velocity + * + * Public: No + */ +#include "script_component.hpp" + +params ["_parseInput", "_updateDisplay"]; + +if (_parseInput) then { + [] call FUNC(parse_input); +}; + +private _lookupTable = []; +{ + if ((_x select 1) > 0) then { + _lookupTable pushBack _x; + }; +} forEach (GVAR(workingMemory) select 18); + +private _lookupTableSize = count _lookupTable; +if (_lookupTableSize < 2) exitWith {}; +_lookupTable sort true; + +private ["_lowerIndex", "_upperIndex"]; +for "_index" from 1 to (_lookupTableSize - 1) do { + _upperIndex = _index; + _lowerIndex = _upperIndex - 1; + if (((_lookupTable select _index) select 0) >= GVAR(temperature)) exitWith {} +}; + +private ["_lowerTemperature", "_upperTemperature", "_lowerMuzzleVelocity", "_upperMuzzleVelocity", "_slope", "_muzzleVelocity"]; +_lowerTemperature = (_lookupTable select _lowerIndex) select 0; +_upperTemperature = (_lookupTable select _upperIndex) select 0; +_lowerMuzzleVelocity = (_lookupTable select _lowerIndex) select 1; +_upperMuzzleVelocity = (_lookupTable select _upperIndex) select 1; +_slope = (_upperMuzzleVelocity - _lowerMuzzleVelocity) / (_upperTemperature - _lowerTemperature); +_muzzleVelocity = _lowerMuzzleVelocity + (GVAR(temperature) - _lowerTemperature) * _slope; + +if (_muzzleVelocity != GVAR(workingMemory) select 1) then { + GVAR(workingMemory) set [1, _muzzleVelocity]; + if (_updateDisplay) then { + call FUNC(update_gun); + call FUNC(update_gun_ammo_data); + }; +}; diff --git a/addons/atragmx/functions/fnc_restore_truing_drop.sqf b/addons/atragmx/functions/fnc_restore_truing_drop.sqf new file mode 100644 index 0000000000..b8541152a0 --- /dev/null +++ b/addons/atragmx/functions/fnc_restore_truing_drop.sqf @@ -0,0 +1,33 @@ +/* + * Author: Ruthberg + * Restores the truing drop defaults + * + * Arguments: + * update display + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_restore_truing_drop + * + * Public: No + */ +#include "script_component.hpp" + +private _updateDisplay = _this; + +GVAR(truingDropMode) = 0; +GVAR(truingDropRangeData) = [0, 0]; +GVAR(truingDropDropData) = [0, 0, 0]; +GVAR(truingDropReferenceDropData) = [0, 0, 0]; +GVAR(truingDropC1) = 0; +GVAR(truingDropMuzzleVelocity) = 0; + +// Resets input fields +call FUNC(update_truing_drop_selection); + +if (_updateDisplay) then { + // Repopulates input fields + false call FUNC(calculate_truing_drop); +}; diff --git a/addons/atragmx/functions/fnc_restore_user_data.sqf b/addons/atragmx/functions/fnc_restore_user_data.sqf index 896455ec7a..de91a7cd0e 100644 --- a/addons/atragmx/functions/fnc_restore_user_data.sqf +++ b/addons/atragmx/functions/fnc_restore_user_data.sqf @@ -26,6 +26,7 @@ GVAR(barometricPressure) = 340 max (profileNamespace getVariable ["ACE_ATragMX_b GVAR(relativeHumidity) = 0 max (profileNamespace getVariable ["ACE_ATragMX_relativeHumidity", 0.5]) min 1; GVAR(showWind2) = profileNamespace getVariable ["ACE_ATragMX_showWind2", false]; +GVAR(showCoriolis) = profileNamespace getVariable ["ACE_ATragMX_showCoriolis", true]; GVAR(latitude) = profileNamespace getVariable ["ACE_ATragMX_latitude", [38, 38, 38, 38]]; GVAR(directionOfFire) = profileNamespace getVariable ["ACE_ATragMX_directionOfFire", [0, 0, 0, 0]]; GVAR(windSpeed1) = profileNamespace getVariable ["ACE_ATragMX_windSpeed1", [0, 0, 0, 0]]; diff --git a/addons/atragmx/functions/fnc_shift_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_shift_c1_ballistic_coefficient_data.sqf new file mode 100644 index 0000000000..241d7fe7e0 --- /dev/null +++ b/addons/atragmx/functions/fnc_shift_c1_ballistic_coefficient_data.sqf @@ -0,0 +1,25 @@ +/* + * Author: Ruthberg + * Shifts all c1 ballistic coefficient entries in the c1 ballistic coefficient vs. distance interpolation table + * + * Arguments: + * ballistic coefficient - + * + * Return Value: + * Nothing + * + * Example: + * 10 call ace_atragmx_fnc_shift_c1_ballistic_coefficient_data + * + * Public: No + */ +#include "script_component.hpp" + +if (_this == 0) exitWith {}; + +{ + private _c1 = _x select 1; + if (_c1 > 0) then { + ((GVAR(workingMemory) select 19) select _forEachIndex) set [1, 0.1 max (_c1 + _this) min 2]; + } +} forEach (GVAR(workingMemory) select 19); diff --git a/addons/atragmx/functions/fnc_shift_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_shift_muzzle_velocity_data.sqf new file mode 100644 index 0000000000..4bbd9337fd --- /dev/null +++ b/addons/atragmx/functions/fnc_shift_muzzle_velocity_data.sqf @@ -0,0 +1,25 @@ +/* + * Author: Ruthberg + * Shifts all muzzle velocity entries in the muzzle velocity vs. temperature interpolation table + * + * Arguments: + * velocity - + * + * Return Value: + * Nothing + * + * Example: + * 10 call ace_atragmx_fnc_shift_muzzle_velocity_data + * + * Public: No + */ +#include "script_component.hpp" + +if (_this == 0) exitWith {}; + +{ + private _velocity = _x select 1; + if (_velocity > 0) then { + ((GVAR(workingMemory) select 18) select _forEachIndex) set [1, 0 max (_velocity + _this) min 1400]; + } +} forEach (GVAR(workingMemory) select 18); diff --git a/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf new file mode 100644 index 0000000000..b96902f5fa --- /dev/null +++ b/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf @@ -0,0 +1,25 @@ +/* + * Author: Ruthberg + * Shows/Hides the c1 ballistic coefficient data controls + * + * Arguments: + * visible - + * + * Return Value: + * Nothing + * + * Example: + * false call ace_atragmx_fnc_show_c1_ballistic_coefficient_data + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(showC1BallisticCoefficientData) = _this; + +{ctrlShow [_x, _this]} forEach [17000, 17001, 170021, 170022, 170023, 170024, 170025, 170026, 170027, 170031, 170032, 170033, 170034, 170035, 170036, 170037, 17004, 17005, 17006, 17007, 17008, 17009]; + +if (_this) then { + ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 170031); + [] call FUNC(update_c1_ballistic_coefficient_data); +}; diff --git a/addons/atragmx/functions/fnc_show_main_page.sqf b/addons/atragmx/functions/fnc_show_main_page.sqf index 486ea1655a..591554d632 100644 --- a/addons/atragmx/functions/fnc_show_main_page.sqf +++ b/addons/atragmx/functions/fnc_show_main_page.sqf @@ -21,6 +21,18 @@ GVAR(showMainPage) = _this; 500, 501, 502, 503, 600, 601, 602, 603, 1000, 1001, 1002, 1003, 1004, 2000, 2001, 3000, 4000, 4001, 4002, 4003, 4004, 4005, 4006, 4007, 4008]; if (_this) then { + if (GVAR(showCoriolis)) then { + ctrlSetText [4003, "Hold"]; + ctrlSetText [4004, "Cor"]; + ctrlSetText [4005, "Spin"]; + {ctrlShow [_x, false]} forEach [402, 4006, 4007]; + } else { + ctrlSetText [4003, "Abs"]; + ctrlSetText [4004, "Rel"]; + ctrlSetText [4005, "Cur"]; + private _visible = (GVAR(currentScopeUnit) == 3); + {ctrlShow [_x, _visible]} forEach [401, 402, 411, 412, 4004, 4005, 4006, 4007]; + }; if (GVAR(atmosphereModeTBH)) then { {ctrlShow [_x, false]} forEach [23, 230]; } else { diff --git a/addons/atragmx/functions/fnc_show_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_show_muzzle_velocity_data.sqf new file mode 100644 index 0000000000..8a5d39f2b5 --- /dev/null +++ b/addons/atragmx/functions/fnc_show_muzzle_velocity_data.sqf @@ -0,0 +1,25 @@ +/* + * Author: Ruthberg + * Shows/Hides the muzzle velocity data controls + * + * Arguments: + * visible - + * + * Return Value: + * Nothing + * + * Example: + * false call ace_atragmx_fnc_show_muzzle_velocity_data + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(showMuzzleVelocityData) = _this; + +{ctrlShow [_x, _this]} forEach [16000, 16001, 160021, 160022, 160023, 160024, 160025, 160026, 160027, 160031, 160032, 160033, 160034, 160035, 160036, 160037, 16004, 16005, 16006, 16007, 16008, 16009]; + +if (_this) then { + ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 160031); + [] call FUNC(update_muzzle_velocity_data); +}; diff --git a/addons/atragmx/functions/fnc_show_truing_drop.sqf b/addons/atragmx/functions/fnc_show_truing_drop.sqf new file mode 100644 index 0000000000..d4b7ce551f --- /dev/null +++ b/addons/atragmx/functions/fnc_show_truing_drop.sqf @@ -0,0 +1,43 @@ +/* + * Author: Ruthberg + * Shows/Hides the truing drop controls + * + * Arguments: + * visible - + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_show_truing_drop + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(showTruingDrop) = _this; + +{ctrlShow [_x, _this]} forEach [18000, 18001, 18002, 18003, 18004, 18005, 18006, 18007, 18008, 18009, 18010, 18011, 18012, 18013, 18014, 18015, 18016, 18017, 18018, 18019, 18020]; + +if (_this) then { + if (GVAR(currentUnit) == 2) then { + ctrlSetText [18000, format["ZR=%1meters", Round(GVAR(workingMemory) select 2)]]; + } else { + ctrlSetText [18000, format["ZR=%1yards", Round((GVAR(workingMemory) select 2) * 1.0936133)]]; + }; + private _dropUnit = GVAR(currentScopeUnit); + if (_dropUnit == 3) then { + switch (GVAR(currentScopeClickUnit)) do { + case 0: { _dropUnit = 1; }; + case 1: { _dropUnit = 2; }; + case 2: { _dropUnit = 0; }; + }; + }; + switch (_dropUnit) do { + case 0: { ctrlSetText [18001, "Drop=mils"]; }; + case 1: { ctrlSetText [18001, "Drop=tmoa"]; }; + case 2: { ctrlSetText [18001, "Drop=smoa"]; }; + }; + false call FUNC(calculate_truing_drop); + call FUNC(update_truing_drop_selection); +}; diff --git a/addons/atragmx/functions/fnc_store_user_data.sqf b/addons/atragmx/functions/fnc_store_user_data.sqf index 5cfe7f2ae0..a0b3f9fe80 100644 --- a/addons/atragmx/functions/fnc_store_user_data.sqf +++ b/addons/atragmx/functions/fnc_store_user_data.sqf @@ -28,6 +28,7 @@ profileNamespace setVariable ["ACE_ATragMX_barometricPressure", GVAR(barometricP profileNamespace setVariable ["ACE_ATragMX_relativeHumidity", GVAR(relativeHumidity)]; profileNamespace setVariable ["ACE_ATragMX_showWind2", GVAR(showWind2)]; +profileNamespace setVariable ["ACE_ATragMX_showCoriolis", GVAR(showCoriolis)]; profileNamespace setVariable ["ACE_ATragMX_latitude", GVAR(latitude)]; profileNamespace setVariable ["ACE_ATragMX_directionOfFire", GVAR(directionOfFire)]; profileNamespace setVariable ["ACE_ATragMX_windSpeed1", GVAR(windSpeed1)]; diff --git a/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf b/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf index 87e973c7c0..bda24a48f4 100644 --- a/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf +++ b/addons/atragmx/functions/fnc_toggle_atmo_env_data.sqf @@ -20,7 +20,11 @@ if (ctrlVisible 13000) then { true call FUNC(show_main_page); if (_this == 1) then { + GVAR(truingDropDropData) set [0, 0]; + [true, true] call FUNC(recalculate_muzzle_velocity); call FUNC(calculate_target_solution); + } else { + call FUNC(update_atmo_env_data); }; } else { true call FUNC(show_atmo_env_data); diff --git a/addons/atragmx/functions/fnc_toggle_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_toggle_c1_ballistic_coefficient_data.sqf new file mode 100644 index 0000000000..e83f0d985c --- /dev/null +++ b/addons/atragmx/functions/fnc_toggle_c1_ballistic_coefficient_data.sqf @@ -0,0 +1,33 @@ +/* + * Author: Ruthberg + * Toggles the c1 ballistic coefficient data screen on/off + * + * Arguments: + * Apply new data? + * + * Return Value: + * Nothing + * + * Example: + * 1 call ace_atragmx_fnc_toggle_c1_ballistic_coefficient_data + * + * Public: No + */ +#include "script_component.hpp" + +if (!(missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])) exitWith {}; + +if (ctrlVisible 17000) then { + false call FUNC(show_c1_ballistic_coefficient_data); + true call FUNC(show_main_page); + + if (_this == 1) then { + [true, true] call FUNC(recalculate_c1_ballistic_coefficient); + call FUNC(calculate_target_solution); + } else { + call FUNC(update_c1_ballistic_coefficient_data); + }; +} else { + true call FUNC(show_c1_ballistic_coefficient_data); + false call FUNC(show_main_page); +}; diff --git a/addons/atragmx/functions/fnc_toggle_coriolis.sqf b/addons/atragmx/functions/fnc_toggle_coriolis.sqf new file mode 100644 index 0000000000..17b081131e --- /dev/null +++ b/addons/atragmx/functions/fnc_toggle_coriolis.sqf @@ -0,0 +1,19 @@ +/* + * Author: Ruthberg + * Toggles the coriolis and spin drift output on/off + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_toggle_coriolis + * + * Public: No + */ +#include "script_component.hpp" + +GVAR(showCoriolis) = !GVAR(showCoriolis); +true call FUNC(show_main_page); diff --git a/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf index f3eb814da7..c8cfe0f8f3 100644 --- a/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf +++ b/addons/atragmx/functions/fnc_toggle_gun_ammo_data.sqf @@ -20,8 +20,11 @@ if (ctrlVisible 12000) then { true call FUNC(show_main_page); if (_this == 1) then { + GVAR(truingDropDropData) set [0, 0]; call FUNC(update_zero_range); call FUNC(calculate_target_solution); + } else { + call FUNC(update_gun_ammo_data); }; } else { true call FUNC(show_gun_ammo_data); diff --git a/addons/atragmx/functions/fnc_toggle_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_toggle_muzzle_velocity_data.sqf new file mode 100644 index 0000000000..9a334b35ca --- /dev/null +++ b/addons/atragmx/functions/fnc_toggle_muzzle_velocity_data.sqf @@ -0,0 +1,33 @@ +/* + * Author: Ruthberg + * Toggles the muzzle velocity data screen on/off + * + * Arguments: + * Apply new data? + * + * Return Value: + * Nothing + * + * Example: + * 1 call ace_atragmx_fnc_toggle_muzzle_velocity_data + * + * Public: No + */ +#include "script_component.hpp" + +if (!(missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])) exitWith {}; + +if (ctrlVisible 16000) then { + false call FUNC(show_muzzle_velocity_data); + true call FUNC(show_main_page); + + if (_this == 1) then { + [true, true] call FUNC(recalculate_muzzle_velocity); + call FUNC(calculate_target_solution); + } else { + call FUNC(update_muzzle_velocity_data); + }; +} else { + true call FUNC(show_muzzle_velocity_data); + false call FUNC(show_main_page); +}; diff --git a/addons/atragmx/functions/fnc_toggle_option_menu.sqf b/addons/atragmx/functions/fnc_toggle_option_menu.sqf new file mode 100644 index 0000000000..ea14baedad --- /dev/null +++ b/addons/atragmx/functions/fnc_toggle_option_menu.sqf @@ -0,0 +1,51 @@ +/* + * Author: Ruthberg + * Toggles the option menu on/off + * + * Arguments: + * open menu item + * + * Return Value: + * Nothing + * + * Example: + * 1 call ace_atragmx_fnc_toggle_option_menu + * + * Public: No + */ +#include "script_component.hpp" + +if (ctrlVisible 3001) then { + if (_this) then { + private _optionID = lbCurSel 3002; + if (_optionID > 0) then { + ctrlShow [3001, false]; + ctrlShow [3002, false]; + [_optionID] call FUNC(evaluate_option_menu_input); + }; + } else { + ctrlShow [3001, false]; + ctrlShow [3002, false]; + }; +} else { + lbClear 3002; + + lbAdd [3002, "Accuracy 1st"]; + lbAdd [3002, "Muz Vel Table"]; + lbAdd [3002, "Drag Coef Table"]; + lbAdd [3002, "Target Speed Est"]; + lbAdd [3002, "Target Range Est"]; + lbAdd [3002, "Truing Drop"]; + if (GVAR(showCoriolis)) then { + lbAdd [3002, "Show Coriolis *"]; + } else { + lbAdd [3002, "Show Coriolis"]; + }; + lbAdd [3002, "Set Clicks"]; + lbAdd [3002, "Gun Note"]; + + lbSetCurSel [3002, 0]; + + ctrlShow [3001, true]; + ctrlShow [3002, true]; +}; diff --git a/addons/atragmx/functions/fnc_toggle_target_data.sqf b/addons/atragmx/functions/fnc_toggle_target_data.sqf index 2cfa2f8df5..44892ca882 100644 --- a/addons/atragmx/functions/fnc_toggle_target_data.sqf +++ b/addons/atragmx/functions/fnc_toggle_target_data.sqf @@ -21,6 +21,8 @@ if (ctrlVisible 14000) then { if (_this == 1) then { call FUNC(calculate_target_solution); + } else { + call FUNC(update_target_data); }; } else { true call FUNC(show_target_data); diff --git a/addons/atragmx/functions/fnc_toggle_truing_drop.sqf b/addons/atragmx/functions/fnc_toggle_truing_drop.sqf new file mode 100644 index 0000000000..8c2e72587c --- /dev/null +++ b/addons/atragmx/functions/fnc_toggle_truing_drop.sqf @@ -0,0 +1,39 @@ +/* + * Author: Ruthberg + * Toggles the truing drop screen on/off + * + * Arguments: + * Apply new data? + * + * Return Value: + * Nothing + * + * Example: + * 1 call ace_atragmx_fnc_toggle_truing_drop + * + * Public: No + */ +#include "script_component.hpp" + +if (!(missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])) exitWith {}; + +if (ctrlVisible 18000) then { + false call FUNC(show_truing_drop); + true call FUNC(show_main_page); + + if (_this == 1) then { + if (GVAR(truingDropMode) == 0) then { + [GVAR(temperature), GVAR(truingDropMuzzleVelocity)] call FUNC(insert_muzzle_velocity_data); + [false, true] call FUNC(recalculate_muzzle_velocity); + } else { + [GVAR(truingDropRangeData) select 0, GVAR(truingDropRangeData) select 1, GVAR(truingDropC1)] call FUNC(insert_c1_ballistic_coefficient_data); + [false, true] call FUNC(recalculate_c1_ballistic_coefficient); + }; + call FUNC(calculate_target_solution); + } else { + call FUNC(update_truing_drop_data); + }; +} else { + false call FUNC(show_main_page); + true call FUNC(show_truing_drop); +}; diff --git a/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf b/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf new file mode 100644 index 0000000000..42bb18b875 --- /dev/null +++ b/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf @@ -0,0 +1,42 @@ +/* + * Author: Ruthberg + * Trues the c1 ballistic coefficient + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_true_c1_ballistic_coefficient + * + * Public: No + */ +#include "script_component.hpp" + +private _referenceDrop = GVAR(truingDropDropData) select 0; +private _actualDrop = GVAR(truingDropDropData) select 2; + +if (Round(_actualDrop * 10) / 10 == Round(_referenceDrop * 10) / 10) exitWith {}; + +private _step = 0.01; +if (_actualDrop > _referenceDrop) then { + _step = -0.01; +}; + +private _solutionInput = +GVAR(targetSolutionInput); +_solutionInput set [13, GVAR(truingDropRangeData) select 1]; +private _c1 = _solutionInput select 14; + +{ + _step = _step * _x; + while { _actualDrop * _step < _referenceDrop * _step } do { + _c1 = _c1 + _step; + _solutionInput set [14, _c1]; + private _result = _solutionInput call FUNC(calculate_solution); + _referenceDrop = (_result select 0); + }; +} forEach [1, -0.1]; + +GVAR(truingDropC1) = _c1; diff --git a/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf b/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf new file mode 100644 index 0000000000..26ee2a18ce --- /dev/null +++ b/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf @@ -0,0 +1,42 @@ +/* + * Author: Ruthberg + * Trues the muzzle velocity + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_true_muzzle_velocity + * + * Public: No + */ +#include "script_component.hpp" + +private _referenceDrop = GVAR(truingDropDropData) select 0; +private _actualDrop = GVAR(truingDropDropData) select 1; + +if (Round(_actualDrop * 10) / 10 == Round(_referenceDrop * 10) / 10) exitWith {}; + +private _step = 10; +if (_actualDrop > _referenceDrop) then { + _step = -10; +}; + +private _solutionInput = +GVAR(targetSolutionInput); +_solutionInput set [13, GVAR(truingDropRangeData) select 0]; +private _muzzleVelocity = _solutionInput select 4; + +{ + _step = _step * _x; + while { _actualDrop * _step < _referenceDrop * _step } do { + _muzzleVelocity = _muzzleVelocity + _step; + _solutionInput set [4, _muzzleVelocity]; + private _result = _solutionInput call FUNC(calculate_solution); + _referenceDrop = (_result select 0); + }; +} forEach [1, -0.1]; + +GVAR(truingDropMuzzleVelocity) = _muzzleVelocity; diff --git a/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf new file mode 100644 index 0000000000..09148fd156 --- /dev/null +++ b/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf @@ -0,0 +1,25 @@ +/* + * Author: Ruthberg + * Updates the c1 ballistic coefficient data fields + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_update_c1_ballistic_coefficient_data + * + * Public: No + */ +#include "script_component.hpp" + +// Distances +if (GVAR(currentUnit) == 2) then { + {ctrlSetText [_x, Str(Round(((GVAR(workingMemory) select 19) select _forEachIndex) select 0))]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027]; +} else { + {ctrlSetText [_x, Str(Round((((GVAR(workingMemory) select 19) select _forEachIndex) select 0) * 1.0936133))]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027]; +}; +// Ballistic coefficients +{ctrlSetText [_x, Str(Round((((GVAR(workingMemory) select 19) select _forEachIndex) select 1) * 1000) / 1000)]} forEach [170031, 170032, 170033, 170034, 170035, 170036, 170037]; diff --git a/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf b/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf new file mode 100644 index 0000000000..989d3d113c --- /dev/null +++ b/addons/atragmx/functions/fnc_update_muzzle_velocity_data.sqf @@ -0,0 +1,28 @@ +/* + * Author: Ruthberg + * Updates the muzzle velocity data fields + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_update_muzzle_velocity_data + * + * Public: No + */ +#include "script_component.hpp" + +if (GVAR(currentUnit) == 2) then { + // Temperatures + {ctrlSetText [_x, Str(Round((((GVAR(workingMemory) select 18) select _forEachIndex) select 0) * 10) / 10)]} forEach [160021, 160022, 160023, 160024, 160025, 160026, 160027]; + // Muzzle velocities + {ctrlSetText [_x, Str(Round(((GVAR(workingMemory) select 18) select _forEachIndex) select 1))]} forEach [160031, 160032, 160033, 160034, 160035, 160036, 160037]; +} else { + // Temperatures + {ctrlSetText [_x, Str(Round(((((GVAR(workingMemory) select 18) select _forEachIndex) select 0) * 1.8 + 32) * 10) / 10)]} forEach [160021, 160022, 160023, 160024, 160025, 160026, 160027]; + // Muzzle velocities + {ctrlSetText [_x, Str(Round((((GVAR(workingMemory) select 18) select _forEachIndex) select 1) * 3.2808399))]} forEach [160031, 160032, 160033, 160034, 160035, 160036, 160037]; +}; diff --git a/addons/atragmx/functions/fnc_update_result.sqf b/addons/atragmx/functions/fnc_update_result.sqf index 2b6ca29e23..2541222583 100644 --- a/addons/atragmx/functions/fnc_update_result.sqf +++ b/addons/atragmx/functions/fnc_update_result.sqf @@ -15,17 +15,28 @@ */ #include "script_component.hpp" -private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_wind2", "_windageRel", "_windageCur", "_lead", "_clickSize", "_clickNumber", "_clickInterval"]; +private ["_elevationAbs", "_elevationRel", "_elevationCur", "_windageAbs", "_windageRel", "_windageCur", "_wind2", "_lead", "_clickSize", "_clickNumber", "_clickInterval"]; _elevationAbs = GVAR(elevationOutput) select GVAR(currentTarget); +_elevationRel = 0; +_elevationCur = 0; _windageAbs = GVAR(windage1Output) select GVAR(currentTarget); +_windageRel = 0; +_windageCur = 0; _wind2 = GVAR(windage2Output) select GVAR(currentTarget); -_elevationCur = GVAR(workingMemory) select 10; -_windageCur = GVAR(workingMemory) select 11; +if (GVAR(showCoriolis)) then { + _elevationRel = GVAR(verticalCoriolisOutput) select GVAR(currentTarget); + _windageRel = GVAR(horizontalCoriolisOutput) select GVAR(currentTarget); + + _windageCur = GVAR(spinDriftOutput) select GVAR(currentTarget); +} else { + _elevationCur = GVAR(workingMemory) select 10; + _windageCur = GVAR(workingMemory) select 11; -_elevationRel = _elevationAbs - _elevationCur; -_windageRel = _windageAbs - _windageCur; + _elevationRel = _elevationAbs - _elevationCur; + _windageRel = _windageAbs - _windageCur; +}; _lead = GVAR(leadOutput) select GVAR(currentTarget); diff --git a/addons/atragmx/functions/fnc_update_truing_drop_data.sqf b/addons/atragmx/functions/fnc_update_truing_drop_data.sqf new file mode 100644 index 0000000000..5d97780d49 --- /dev/null +++ b/addons/atragmx/functions/fnc_update_truing_drop_data.sqf @@ -0,0 +1,77 @@ +/* + * Author: Ruthberg + * Updates the truing drop data fields + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_update_truing_drop_data + * + * Public: No + */ +#include "script_component.hpp" + +if (GVAR(currentUnit) == 2) then { + ctrlSetText [18011, Str(Round(GVAR(truingDropRangeData) select 0))]; + ctrlSetText [18012, Str(Round(GVAR(truingDropRangeData) select 1))]; +} else { + ctrlSetText [18011, Str(Round((GVAR(truingDropRangeData) select 0) * 1.0936133))]; + ctrlSetText [18012, Str(Round((GVAR(truingDropRangeData) select 1) * 1.0936133))]; +}; + +if (GVAR(truingDropMode) == 0) then { + GVAR(truingDropDropData) set [0, GVAR(truingDropReferenceDropData) select 0]; +} else { + GVAR(truingDropDropData) set [0, GVAR(truingDropReferenceDropData) select 1]; +}; + +private _dropUnit = GVAR(currentScopeUnit); +if (_dropUnit == 3) then { + switch (GVAR(currentScopeClickUnit)) do { + case 0: { _dropUnit = 1; }; + case 1: { _dropUnit = 2; }; + case 2: { _dropUnit = 0; }; + }; +}; + +private _dropData = +GVAR(truingDropDropData); + +switch (_dropUnit) do { + case 0: { + _dropData set [0, (_dropData select 0) / 3.38]; + _dropData set [1, (_dropData select 1) / 3.38]; + _dropData set [2, (_dropData select 2) / 3.38]; + }; + case 2: { + _dropData set [0, (_dropData select 0) * 1.047]; + _dropData set [1, (_dropData select 1) * 1.047]; + _dropData set [2, (_dropData select 2) * 1.047]; + }; +}; + +ctrlSetText [18006, Str(Round((_dropData select 0) * 100) / 100)]; +ctrlSetText [18013, Str(Round((_dropData select 1) * 100) / 100)]; +ctrlSetText [18014, Str(Round((_dropData select 2) * 100) / 100)]; + +if (GVAR(currentUnit) != 2) then { + ctrlSetText [18007, Str(Round((GVAR(workingMemory) select 1) * 3.2808399))]; + ctrlSetText [18016, Str(Round((GVAR(workingMemory) select 1) * 3.2808399))]; + if (GVAR(truingDropMuzzleVelocity) > 0) then { + ctrlSetText [18016, Str(Round(GVAR(truingDropMuzzleVelocity) * 3.2808399))]; + }; +} else { + ctrlSetText [18007, Str(Round(GVAR(workingMemory) select 1))]; + ctrlSetText [18016, Str(Round(GVAR(workingMemory) select 1))]; + if (GVAR(truingDropMuzzleVelocity) > 0) then { + ctrlSetText [18016, Str(Round(GVAR(truingDropMuzzleVelocity)))]; + }; +}; +ctrlSetText [18008, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)]; +ctrlSetText [18017, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)]; +if (GVAR(truingDropC1) > 0) then { + ctrlSetText [18017, Str(Round(GVAR(truingDropC1) * 1000) / 1000)]; +}; diff --git a/addons/atragmx/functions/fnc_update_truing_drop_selection.sqf b/addons/atragmx/functions/fnc_update_truing_drop_selection.sqf new file mode 100644 index 0000000000..98f7483276 --- /dev/null +++ b/addons/atragmx/functions/fnc_update_truing_drop_selection.sqf @@ -0,0 +1,43 @@ +/* + * Author: Ruthberg + * Updates the truing drop input method + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_update_truing_drop_selection + * + * Public: No + */ +#include "script_component.hpp" + +#define __dsp (uiNamespace getVariable "ATragMX_Display") + +(__dsp displayCtrl 18009) ctrlEnable true; +(__dsp displayCtrl 18010) ctrlEnable true; + +if (GVAR(truingDropMode) == 0) then { + (__dsp displayCtrl 18009) ctrlEnable false; + { + (__dsp displayCtrl _x) ctrlEnable true; + } forEach [18011, 18013, 18016]; + { + (__dsp displayCtrl _x) ctrlEnable false; + } forEach [18012, 18014, 18017]; + ctrlSetFocus (__dsp displayCtrl 18011); +} else { + (__dsp displayCtrl 18010) ctrlEnable false; + { + (__dsp displayCtrl _x) ctrlEnable true; + } forEach [18012, 18014, 18017]; + { + (__dsp displayCtrl _x) ctrlEnable false; + } forEach [18011, 18013, 18016]; + ctrlSetFocus (__dsp displayCtrl 18012); +}; + +[] call FUNC(update_truing_drop_data); diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 3b09c0ad2f..054d95b9fe 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -16,4 +16,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.8 +#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.9 From 51c12dba1dd511a82a344cd37706106ae97bf83d Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 6 Nov 2016 19:30:18 +0100 Subject: [PATCH 111/826] Allow adding gun list entries via config --- addons/atragmx/XEH_PREP.hpp | 2 + addons/atragmx/XEH_postInit.sqf | 61 ++++----- addons/atragmx/functions/fnc_add_new_gun.sqf | 4 +- addons/atragmx/functions/fnc_delete_gun.sqf | 2 +- .../fnc_read_gun_list_entries_from_config.sqf | 120 ++++++++++++++++++ addons/atragmx/functions/fnc_save_gun.sqf | 2 +- .../atragmx/functions/fnc_store_gun_list.sqf | 25 ++++ 7 files changed, 182 insertions(+), 34 deletions(-) create mode 100644 addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf create mode 100644 addons/atragmx/functions/fnc_store_gun_list.sqf diff --git a/addons/atragmx/XEH_PREP.hpp b/addons/atragmx/XEH_PREP.hpp index 29433f9313..fc4c5a0224 100644 --- a/addons/atragmx/XEH_PREP.hpp +++ b/addons/atragmx/XEH_PREP.hpp @@ -27,6 +27,7 @@ PREP(init); PREP(insert_c1_ballistic_coefficient_data); PREP(insert_muzzle_velocity_data); PREP(parse_input); +PREP(read_gun_list_entries_from_config); PREP(recalculate_c1_ballistic_coefficient); PREP(recalculate_muzzle_velocity); PREP(reset_relative_click_memory); @@ -52,6 +53,7 @@ PREP(show_target_speed_assist); PREP(show_target_speed_assist_timer); PREP(show_truing_drop); PREP(sord); +PREP(store_gun_list); PREP(store_user_data); PREP(target_speed_assist_timer); PREP(toggle_atmo_env_data); diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 3caecd2c83..9d4c903b06 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -5,49 +5,49 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ATRAGMX_PROFILE_NAMESPACE_VERSION && count (profileNamespace getVariable ["ACE_ATragMX_gunList", []]) > 0) then { GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { - // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657485, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation, Persistent + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657485, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" , [[-15,833],[0,840],[10,847],[15,852],[25,866],[30,875],[35,886]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" , [[-15,873],[0,880],[10,887],[15,892],[25,906],[30,915],[35,926]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" , [[-15,833],[0,840],[10,847],[15,852],[25,866],[30,875],[35,886]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" , [[-15,873],[0,880],[10,887],[15,892],[25,906],[30,915],[35,926]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" , [[-15,297],[0,298],[10,299],[15,299],[25,301],[30,302],[35,303]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" , [[-15,297],[0,298],[10,299],[15,299],[25,301],[30,302],[35,303]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".50 Beowulf" , 563, 100, 0.0657485, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" , [[-15,560],[0,561],[10,562],[15,562],[25,564],[30,565],[35,566]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + [".50 Beowulf" , 563, 100, 0.0657485, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" , [[-15,560],[0,561],[10,562],[15,562],[25,564],[30,565],[35,566]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".408 Chey Tac" , 910, 100, 0.0569400, -0.00038944, 3.81, 0, 2, 10, 120, 0, 0, 26.57, 10.4, 33.02, 0.970, 1, "ASM" , [[-15,883],[0,890],[10,897],[15,902],[25,916],[30,925],[35,936]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + [".408 Chey Tac" , 910, 100, 0.0569400, -0.00038944, 3.81, 0, 2, 10, 120, 0, 0, 26.57, 10.4, 33.02, 0.970, 1, "ASM" , [[-15,883],[0,890],[10,897],[15,902],[25,916],[30,925],[35,936]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["9.3×64mm" , 870, 100, 0.0619295, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" , [[-15,843],[0,850],[10,857],[15,862],[25,876],[30,885],[35,896]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["9.3×64mm" , 870, 100, 0.0619295, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" , [[-15,843],[0,850],[10,857],[15,862],[25,876],[30,885],[35,896]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".338LM 250gr" , 880, 100, 0.0598469, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.645, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - [".338LM 300gr" , 800, 100, 0.0677343, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.759, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - [".338LM API526" , 880, 100, 0.0588865, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.760, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + [".338LM 250gr" , 880, 100, 0.0598469, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.645, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".338LM 300gr" , 800, 100, 0.0677343, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.759, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".338LM API526" , 880, 100, 0.0588865, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.760, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".300WM Mk248 Mod0" , 900, 100, 0.0584442, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.537, 1, "ICAO", [[-15,838],[0,845],[10,852],[15,857],[25,871],[30,880],[35,891]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - [".300WM Mk248 Mod1" , 867, 100, 0.0610738, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.619, 1, "ICAO", [[-15,820],[0,827],[10,834],[15,839],[25,853],[30,862],[35,873]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - [".300WM Berger OTM" , 853, 100, 0.0622179, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.715, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + [".300WM Mk248 Mod0" , 900, 100, 0.0584442, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.537, 1, "ICAO", [[-15,838],[0,845],[10,852],[15,857],[25,871],[30,880],[35,891]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".300WM Mk248 Mod1" , 867, 100, 0.0610738, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.619, 1, "ICAO", [[-15,820],[0,827],[10,834],[15,839],[25,853],[30,862],[35,873]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".300WM Berger OTM" , 853, 100, 0.0622179, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.715, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x54mmR" , 820, 100, 0.0691878, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO", [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["7.62x54mmR" , 820, 100, 0.0691878, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO", [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm M80" , 810, 100, 0.0679374, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 25.40, 0.398, 1, "ICAO", [[-15,783],[0,790],[10,797],[15,802],[25,816],[30,825],[35,836]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["7.62x51mm M118LR" , 765, 100, 0.0710319, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.482, 1, "ICAO", [[-15,738],[0,745],[10,752],[15,757],[25,771],[30,780],[35,791]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["7.62x51mm Mk316" , 782, 100, 0.0710319, -0.00082029, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.483, 1, "ICAO", [[-15,777],[0,778],[10,779],[15,781],[25,783],[30,785],[35,787]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["7.62x51mm Mk319" , 901, 100, 0.0584524, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO", [[-15,898],[0,899],[10,900],[15,900],[25,902],[30,903],[35,904]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["7.62x51mm M993" , 920, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO", [[-15,893],[0,900],[10,907],[15,912],[25,926],[30,935],[35,946]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["7.62x51mm Subsonic", 315, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.502, 1, "ICAO", [[-15,312],[0,313],[10,314],[15,314],[25,316],[30,317],[35,318]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["7.62x51mm M80" , 810, 100, 0.0679374, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 25.40, 0.398, 1, "ICAO", [[-15,783],[0,790],[10,797],[15,802],[25,816],[30,825],[35,836]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm M118LR" , 765, 100, 0.0710319, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.482, 1, "ICAO", [[-15,738],[0,745],[10,752],[15,757],[25,771],[30,780],[35,791]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm Mk316" , 782, 100, 0.0710319, -0.00082029, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.483, 1, "ICAO", [[-15,777],[0,778],[10,779],[15,781],[25,783],[30,785],[35,787]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm Mk319" , 901, 100, 0.0584524, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO", [[-15,898],[0,899],[10,900],[15,900],[25,902],[30,903],[35,904]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm M993" , 920, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO", [[-15,893],[0,900],[10,907],[15,912],[25,926],[30,935],[35,946]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm Subsonic", 315, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.502, 1, "ICAO", [[-15,312],[0,313],[10,314],[15,314],[25,316],[30,317],[35,318]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["6.5x39mm" , 774, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.524, 1, "ICAO", [[-15,747],[0,754],[10,761],[15,766],[25,780],[30,789],[35,800]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["6.5x47mm Lapua" , 775, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.577, 1, "ICAO", [[-15,748],[0,755],[10,762],[15,767],[25,781],[30,790],[35,801]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["6.5mm Creedmor" , 830, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.632, 1, "ICAO", [[-15,803],[0,810],[10,817],[15,822],[25,836],[30,845],[35,856]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["6.5x39mm" , 774, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.524, 1, "ICAO", [[-15,747],[0,754],[10,761],[15,766],[25,780],[30,789],[35,800]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["6.5x47mm Lapua" , 775, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.577, 1, "ICAO", [[-15,748],[0,755],[10,762],[15,767],[25,781],[30,790],[35,801]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["6.5mm Creedmor" , 830, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.632, 1, "ICAO", [[-15,803],[0,810],[10,817],[15,822],[25,836],[30,845],[35,856]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.8x42mm DBP87" , 950, 100, 0.0572574, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.313, 1, "ICAO", [[-15,923],[0,930],[10,937],[15,942],[25,956],[30,965],[35,976]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["5.8x42mm DBP87" , 950, 100, 0.0572574, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.313, 1, "ICAO", [[-15,923],[0,930],[10,937],[15,942],[25,956],[30,965],[35,976]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.302, 1, "ASM" , [[-15,843],[0,849],[10,857],[15,862],[25,876],[30,885],[35,898]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" , [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], - ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" , [[-15,842],[0,849],[10,856],[15,861],[25,875],[30,884],[35,895]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]], + ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.302, 1, "ASM" , [[-15,843],[0,849],[10,857],[15,862],[25,876],[30,885],[35,898]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" , [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" , [[-15,842],[0,849],[10,856],[15,861],[25,875],[30,884],[35,895]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.45x39mm 7N6M" , 735, 100, 0.0787205, -0.00116278, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.336, 1, "ICAO", [[-15,708],[0,715],[10,722],[15,727],[25,741],[30,750],[35,761]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]]]; + ["5.45x39mm 7N6M" , 735, 100, 0.0787205, -0.00116278, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.336, 1, "ICAO", [[-15,708],[0,715],[10,722],[15,727],[25,741],[30,750],[35,761]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true]]; [] call FUNC(clear_user_data); profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; @@ -55,5 +55,6 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == [] call FUNC(init); [] call FUNC(restore_user_data); +[] call FUNC(read_gun_list_entries_from_config); [QEGVAR(vector,rangefinderData), {_this call FUNC(sord)}] call CBA_fnc_addEventHandler; diff --git a/addons/atragmx/functions/fnc_add_new_gun.sqf b/addons/atragmx/functions/fnc_add_new_gun.sqf index bca41f8b6b..75d0ddd5f1 100644 --- a/addons/atragmx/functions/fnc_add_new_gun.sqf +++ b/addons/atragmx/functions/fnc_add_new_gun.sqf @@ -17,11 +17,11 @@ private _gunName = ctrlText 11001; if (_gunName != "") then { - private _gunProfileEntry = [_gunName, 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.393, 1, "ICAO", [[-15,0],[0,0],[10,0],[15,0],[25,0],[30,0],[35,0]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]]]; + private _gunProfileEntry = [_gunName, 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.393, 1, "ICAO", [[-15,0],[0,0],[10,0],[15,0],[25,0],[30,0],[35,0]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true]; GVAR(gunList) = GVAR(gunList) + [_gunProfileEntry]; lbAdd [6000, _gunProfileEntry select 0]; - profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; + call FUNC(store_gun_list); }; diff --git a/addons/atragmx/functions/fnc_delete_gun.sqf b/addons/atragmx/functions/fnc_delete_gun.sqf index 42970d7aab..c94739035e 100644 --- a/addons/atragmx/functions/fnc_delete_gun.sqf +++ b/addons/atragmx/functions/fnc_delete_gun.sqf @@ -28,4 +28,4 @@ GVAR(gunList) = GVAR(gunList) - [0]; lbDelete [6000, _index]; -profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; +call FUNC(store_gun_list); diff --git a/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf b/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf new file mode 100644 index 0000000000..717fb07084 --- /dev/null +++ b/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf @@ -0,0 +1,120 @@ +/* + * Author: Ruthberg + * Reads gun list entries from the config and appends them to the gun list + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_read_gun_list_entries_from_config + * + * Public: No + */ +#include "script_component.hpp" + +private _validate_preset = { + private _valid = true; + if (count _this != 20) then { + private _errorMsg = format ["Invalid preset array size: %1", count _this]; + ERROR(_errorMsg); + _valid = false; + }; + if (_this select 0 == "") then { + ERROR("Invalid gun profile name"); + _valid = false; + }; + if (_this select 1 < 0 || _this select 1 > 1400) then { + private _errorMsg = format ["Invalid muzzle velocity: %1", _this select 1]; + ERROR(_errorMsg); + _valid = false; + }; + if (_this select 2 < 25 || _this select 2 > 1000) then { + private _errorMsg = format ["Invalid zero range: %1", _this select 2]; + ERROR(_errorMsg); + _valid = false; + }; + if (_this select 4 > 0) then { + private _errorMsg = format ["Invalid airFriction value: %1", _this select 4]; + ERROR(_errorMsg); + _valid = false; + }; + if (_this select 5 < 0.1 || _this select 5 > 10) then { + private _errorMsg = format ["Invalid bore height value: %1", _this select 4]; + ERROR(_errorMsg); + _valid = false; + }; + if (_this select 12 < 1 || _this select 12 > 100) then { + private _errorMsg = format ["Invalid bullet weight: %1", _this select 12]; + ERROR(_errorMsg); + _valid = false; + }; + if (_this select 13 < 1 || _this select 13 > 25) then { + private _errorMsg = format ["Invalid bullet diameter: %1", _this select 13]; + ERROR(_errorMsg); + _valid = false; + }; + if (_this select 14 < 1 || _this select 14 > 75) then { + private _errorMsg = format ["Invalid rifle twist: %1", _this select 14]; + ERROR(_errorMsg); + _valid = false; + }; + if (_this select 15 < 0.1 || _this select 15 > 2.0) then { + private _errorMsg = format ["Invalid ballistic coefficient: %1", _this select 15]; + ERROR(_errorMsg); + _valid = false; + }; + if (_this select 16 != 1) then { + private _errorMsg = format ["Invalid drag model: %1", _this select 16]; + ERROR(_errorMsg); + _valid = false; + }; + if (!((_this select 17) in ["ASM", "ICAO"])) then { + private _errorMsg = format ["Invalid atmosphere model: %1", _this select 17]; + ERROR(_errorMsg); + _valid = false; + }; + if (count (_this select 18) != 7) then { + private _errorMsg = format ["Invalid muzzle velocity table array size: %1", count (_this select 18)]; + ERROR(_errorMsg); + _valid = false; + } else { + { + if (count _x != 2) exitWith { + private _errorMsg = format ["Invalid muzzle velocity table subarray size: %1", count _x]; + ERROR(_errorMsg); + _valid = false; + }; + } forEach (_this select 18); + }; + if (count (_this select 19) != 7) then { + private _errorMsg = format ["Invalid drag coefficient table array size: %1", count (_this select 19)]; + ERROR(_errorMsg); + _valid = false; + } else { + { + if (count _x != 2) exitWith { + private _errorMsg = format ["Invalid drag coefficient table subarray size: %1", count _x]; + ERROR(_errorMsg); + _valid = false; + }; + } forEach (_this select 19); + }; + _valid +}; + +{ + private _preset = _x >> "preset"; + + if (isArray(_preset)) then { + private _gun = getArray _preset; + + if (_gun call _validate_preset) then { + _gun set [20, false]; + GVAR(gunList) = GVAR(gunList) + [_gun]; + lbAdd [6000, _gunProfileEntry select 0]; + }; + }; +} forEach ("true" configClasses (configFile >> "ACE_ATragMX_Presets")); diff --git a/addons/atragmx/functions/fnc_save_gun.sqf b/addons/atragmx/functions/fnc_save_gun.sqf index 64fe17e4c4..73e26ee5fd 100644 --- a/addons/atragmx/functions/fnc_save_gun.sqf +++ b/addons/atragmx/functions/fnc_save_gun.sqf @@ -25,4 +25,4 @@ lbClear 6000; lbAdd [6000, _x select 0]; } forEach GVAR(gunList); -profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; +call FUNC(store_gun_list); diff --git a/addons/atragmx/functions/fnc_store_gun_list.sqf b/addons/atragmx/functions/fnc_store_gun_list.sqf new file mode 100644 index 0000000000..3e569f8a59 --- /dev/null +++ b/addons/atragmx/functions/fnc_store_gun_list.sqf @@ -0,0 +1,25 @@ +/* + * Author: Ruthberg + * Saves the persistent gun list entries into profileNamespace + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_store_user_data + * + * Public: No + */ +#include "script_component.hpp" + +private _gunList = []; +{ + if (_x select 20) then { + _gunList pushBack _x; + }; +} forEach GVAR(gunList); + +profileNamespace setVariable ["ACE_ATragMX_gunList", _gunList]; From 8c2b88da859bc4e544e856db288f695daec123b8 Mon Sep 17 00:00:00 2001 From: William Giokas <1007380@gmail.com> Date: Sat, 5 Nov 2016 06:20:02 -0500 Subject: [PATCH 112/826] ballistics: Added 20 round 6.5 Lapua and Creedmoor --- addons/ballistics/CfgMagazines.hpp | 14 ++++++ addons/ballistics/CfgWeapons.hpp | 5 ++ addons/ballistics/stringtable.xml | 79 ++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index efde366d8c..077430f7ce 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -241,6 +241,13 @@ class CfgMagazines { displayNameShort = CSTRING(30Rnd_65x47_Scenar_mag_NameShort); descriptionShort = CSTRING(30Rnd_65x47_Scenar_mag_Description); }; + class ACE_20Rnd_65x47_Scenar_mag: 20Rnd_650x39_Cased_Mag_F { + author = ECSTRING(common,ACETeam); + ammo = "ACE_65x47_Ball_Scenar"; + displayName = CSTRING(20Rnd_65x47_Scenar_mag_Name); + displayNameShort = CSTRING(20Rnd_65x47_Scenar_mag_NameShort); + descriptionShort = CSTRING(20Rnd_65x47_Scenar_mag_Description); + }; class ACE_30Rnd_65_Creedmor_mag: 30Rnd_65x39_caseless_mag { author = ECSTRING(common,ACETeam); ammo = "ACE_65_Creedmor_Ball"; @@ -248,6 +255,13 @@ class CfgMagazines { displayNameShort = CSTRING(30Rnd_65_Creedmor_mag_NameShort); descriptionShort = CSTRING(30Rnd_65_Creedmor_mag_Description); }; + class ACE_20Rnd_65_Creedmor_mag: 20Rnd_650x39_Cased_Mag_F { + author = ECSTRING(common,ACETeam); + ammo = "ACE_65_Creedmor_Ball"; + displayName = CSTRING(20Rnd_65_Creedmor_mag_Name); + displayNameShort = CSTRING(20Rnd_65_Creedmor_mag_NameShort); + descriptionShort = CSTRING(20Rnd_65_Creedmor_mag_Description); + }; class 10Rnd_338_Mag; class ACE_10Rnd_338_300gr_HPBT_Mag: 10Rnd_338_Mag { author = ECSTRING(common,ACETeam); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index b1791d7fe7..ad24430b30 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -31,6 +31,11 @@ class CfgWeapons { initSpeed = -0.982908; ACE_barrelTwist = 228.6; ACE_barrelLength = 640.0; + magazines[] = { + "20Rnd_650x39_Cased_Mag_F", + "ACE_20Rnd_65x47_Scenar_mag", + "ACE_20Rnd_65_Creedmor_mag" + }; }; class DMR_06_base_F: Rifle_Long_Base_F { diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index d7a4ea65b9..08325cad96 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -1,6 +1,85 @@  + + + 6.5x47mm 20Rnd Mag (HPBT Scenar) + Ch. 6.5x47mm 20Cps (HPBT Scenar) + Cargador de 20 balas de 6.5x47mm (HPBT Scenar) + Magazynek 6,5x47mm 20rd (HPBT Scenar) + Магазин из 20-ти 6,5x47 мм (экспансивные Scenar) + 6,5x47mm 20-Patronen-Magazin (HPBT Scenar) + 6.5x47mm 20Rnd Mag (HPBT Scenar) + 6.5x47mm 20náb. Zásobník (HPBT Scenar) + Carregador 6.5x47mm com 20 cartuchos (HPBT Scenar) + 6,5x47mm 20-lövedékes tár (HPBT Scenar) + 6.5x47mm 20発入り 弾倉 (HPBT Scenar) + + + 6.5mm Lapua + 6.5mm Lapua + 6.5mm Lapua + 6,5mm Lapua + 6,5 мм Lapua + 6,5mm Lapua + 6.5mm Lapua + 6.5mm Lapua + 6.5mm Lapua + 6,5mm Lapua + 6.5mm Lapua + + + Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 20<br />Used in: QBU-88 + Calibre: 6.5x47mm (HPBT Scenar)<br />Cartouches: 20 + Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 20<br />Se usa en: QBU-88 + Kaliber: 6,5x47mm (HPBT Scenar)<br />Pociski: 20 + Калибр: 6,5x47 мм (экспансивные Scenar)<br />Патронов: 20<br />Используются с: QBU-88 + Kaliber: 6,5x47mm (HPBT Scenar)<br />Patronen: 20<br />Eingesetzt von: QBU-88 + Calibro: 6.5x47mm (HPBT Scenar)<br />Munizioni: 20<br />In uso su: QBU-88 + Ráže: 6.5x47mm (HPBT Scenar)<br />Nábojů: 20<br />Použití u: QBU-88 + Calibre: 6.5x47mm (HPBT Scenar)<br/>Cartuchos: 20<br/>Usado em: QBU-88 + Kaliber: 6,5x47mm (HPBT Scenar)<br />Lövedékek: 20<br />Használható: QBU-88 + 口径: 6.5x47mm (HPBT Scenar)&lt;br /&gt;装填数: 20&lt;br /&gt;次で使用: QBU-88 + + + 6.5mm Creedmor 20Rnd Mag + Magazynek 6,5mm Creedmor 20rd + 6.5mm Creedmor 20Rnd Mag + Магазин из 20-ти 6,5 мм Creedmor + 6,5mm Creedmor 20-Patronen-Magazin + Cargador de 20 balas Creedmor de 6.5mm + Ch. 6.5mm Creedmor 20Cps + 6.5mm Creedmor 20náb. Zásobník + Carregador 6.5mm com 20 cartuchos Creedmor + 6,5mm Creedmor 20-lövedékes tár + 6.5mm Creedmor 20発入り 弾倉 + + + 6.5mm CM + 6.5mm CM + 6.5mm CM + 6,5mm CM + 6,5 мм CM + 6,5mm CM + 6.5mm CM + 6.5mm CM + 6.5mm CM + 6,5mm CM + 6.5mm CM + + + Caliber: 6.5x47mm Creedmor<br />Rounds: 20<br />Used in: QBU-88 + Kaliber: 6,5x47mm Creedmor<br />Pociski: 20<br />Używany w: QBU-88 + Kaliber: 6,5x47mm Creedmor<br />Patronen: 20<br />Eingesetzt von: QBU-88 + Calibre: 6.5x47mm Creedmor <br />Cartouches: 20<br />Utilisé avec: QBU-88 + Calibro: 6.5mm Creedmor<br />Munizioni: 20<br />In uso su: QBU-88 + Calibre: 6.5mm Creedmor<br />Balas: 20<br />Se usa en: QBU-88 + Калибр: 6,5x47мм Creedmor<br />Патронов: 20<br />Используются c: QBU-88 + Ráže: 6.5x47mm Creedmor<br />Nábojů: 20<br />Použití u: QBU-88 + Calibre: 6.5x47mm Creedmor<br/>Cartuchos: 20<br/>Usado em: QBU-88 + Kaliber: 6,5x47mm Creedmor<br />Lövedékek: 20<br />Használható: QBU-88 + 口径: 6.5x47mm Creedmor&lt;br /&gt;装填数: 20&lt;br /&gt;次で使用: QBU-88 + 6.5mm 30Rnd Tracer IR-DIM Mag From 0580bdcc8e402dedf09e968987e9eac7fed73757 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 6 Nov 2016 20:22:16 +0100 Subject: [PATCH 113/826] Added 20rnd 6.5 Creedmor and 6.5 Lapua Scenar mags * Fixed incorrect QBU-88 (DMR_07_base_F) initSpeed --- addons/ballistics/CfgMagazines.hpp | 7 +++++++ addons/ballistics/CfgWeapons.hpp | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 077430f7ce..ef690b41aa 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -8,6 +8,9 @@ class CfgMagazines { class 100Rnd_580x42_Mag_F: 30Rnd_580x42_Mag_F { initSpeed = 930; }; + class 20Rnd_650x39_Cased_Mag_F: CA_Magazine { + initSpeed = 760; + }; class 30Rnd_65x39_caseless_mag: CA_Magazine { initSpeed = 760; }; @@ -237,6 +240,7 @@ class CfgMagazines { class ACE_30Rnd_65x47_Scenar_mag: 30Rnd_65x39_caseless_mag { author = ECSTRING(common,ACETeam); ammo = "ACE_65x47_Ball_Scenar"; + initSpeed = 761; displayName = CSTRING(30Rnd_65x47_Scenar_mag_Name); displayNameShort = CSTRING(30Rnd_65x47_Scenar_mag_NameShort); descriptionShort = CSTRING(30Rnd_65x47_Scenar_mag_Description); @@ -244,6 +248,7 @@ class CfgMagazines { class ACE_20Rnd_65x47_Scenar_mag: 20Rnd_650x39_Cased_Mag_F { author = ECSTRING(common,ACETeam); ammo = "ACE_65x47_Ball_Scenar"; + initSpeed = 779; displayName = CSTRING(20Rnd_65x47_Scenar_mag_Name); displayNameShort = CSTRING(20Rnd_65x47_Scenar_mag_NameShort); descriptionShort = CSTRING(20Rnd_65x47_Scenar_mag_Description); @@ -251,6 +256,7 @@ class CfgMagazines { class ACE_30Rnd_65_Creedmor_mag: 30Rnd_65x39_caseless_mag { author = ECSTRING(common,ACETeam); ammo = "ACE_65_Creedmor_Ball"; + initSpeed = 815; displayName = CSTRING(30Rnd_65_Creedmor_mag_Name); displayNameShort = CSTRING(30Rnd_65_Creedmor_mag_NameShort); descriptionShort = CSTRING(30Rnd_65_Creedmor_mag_Description); @@ -258,6 +264,7 @@ class CfgMagazines { class ACE_20Rnd_65_Creedmor_mag: 20Rnd_650x39_Cased_Mag_F { author = ECSTRING(common,ACETeam); ammo = "ACE_65_Creedmor_Ball"; + initSpeed = 808; displayName = CSTRING(20Rnd_65_Creedmor_mag_Name); displayNameShort = CSTRING(20Rnd_65_Creedmor_mag_NameShort); descriptionShort = CSTRING(20Rnd_65_Creedmor_mag_Description); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index ad24430b30..3cbf8de544 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -28,7 +28,7 @@ class CfgWeapons { }; class DMR_07_base_F: Rifle_Long_Base_F { - initSpeed = -0.982908; + initSpeed = -1.06051; ACE_barrelTwist = 228.6; ACE_barrelLength = 640.0; magazines[] = { From 370e746068f8d3cbb4971ffd66febdee2244554c Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 9 Nov 2016 20:02:48 +0100 Subject: [PATCH 114/826] fix tripflares script error (#4647) --- addons/explosives/functions/fnc_spawnFlare.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/explosives/functions/fnc_spawnFlare.sqf b/addons/explosives/functions/fnc_spawnFlare.sqf index acd5dc2a99..79f105b67b 100644 --- a/addons/explosives/functions/fnc_spawnFlare.sqf +++ b/addons/explosives/functions/fnc_spawnFlare.sqf @@ -21,3 +21,5 @@ TRACE_3("Params",_posX,_posY,_posZ); private _flare = "ACE_TripFlare_FlareEffect" createVehicle [_posX,_posY,_posZ]; TRACE_1("",_flare); + +nil From 09b89a0bbcb4ddb7fb46905467577426b5ed949e Mon Sep 17 00:00:00 2001 From: Karan Singh Date: Wed, 9 Nov 2016 13:07:29 -0600 Subject: [PATCH 115/826] Fix typo in Eden Options (#4615) * Fix typo in Eden Options This fixes a typo in line 25, ace_isMeidc_temp to ace_isMedic_temp * Fix L13 --- addons/medical/CfgEden.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical/CfgEden.hpp b/addons/medical/CfgEden.hpp index e4d034a413..9579f29c61 100644 --- a/addons/medical/CfgEden.hpp +++ b/addons/medical/CfgEden.hpp @@ -10,7 +10,7 @@ class Cfg3DEN { }; class GVAR(isMedicControl): Title { attributeLoad = "(_this controlsGroupCtrl 100) lbsetcursel (((_value + 1) min 3) max 0);"; - attributeSave = "(missionnamespace getvariable ['ace_isMeidc_temp',0]) - 1;"; + attributeSave = "(missionnamespace getvariable ['ace_isMedic_temp',0]) - 1;"; class Controls: Controls { class Title: Title{}; class Value: ctrlToolbox { @@ -22,7 +22,7 @@ class Cfg3DEN { rows = 1; columns = 4; strings[] = {"$STR_3DEN_Attributes_Lock_Default_text", CSTRING(AssignMedicRoles_role_none), CSTRING(AssignMedicRoles_role_medic), CSTRING(AssignMedicRoles_role_doctorShort)}; - onToolboxSelChanged = "missionnamespace setvariable ['ace_isMeidc_temp',_this select 1];"; + onToolboxSelChanged = "missionnamespace setvariable ['ace_isMedic_temp',_this select 1];"; }; }; }; From ff961a5bd6a0f6688450e1fdc9cb6e586900cc59 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Wed, 9 Nov 2016 22:11:47 +0300 Subject: [PATCH 116/826] Fix Full Repair menu not shown when damage returns 0 (#4621) --- addons/repair/ACE_Repair.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/repair/ACE_Repair.hpp b/addons/repair/ACE_Repair.hpp index 6e5eac4fa8..3cea9ed7ca 100644 --- a/addons/repair/ACE_Repair.hpp +++ b/addons/repair/ACE_Repair.hpp @@ -72,7 +72,7 @@ class ACE_Repair { requiredEngineer = QGVAR(engineerSetting_fullRepair); repairLocations[] = {QGVAR(fullRepairLocation)}; repairingTime = 30; - condition = "damage _target > 0"; + condition = "0 < ({_x>0} count (getAllHitPointsDamage _target param [2,[]]))"; callbackSuccess = QUOTE(call FUNC(doFullRepair)); itemConsumed = QGVAR(consumeItem_ToolKit); }; From eb6319641e785be9a65ad6bd9f9dd4657258a440 Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 31 Oct 2016 12:57:24 +0100 Subject: [PATCH 117/826] Fix Kestrel4500 wind speed calculation (#4609) --- addons/kestrel4500/functions/fnc_generateOutputData.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/kestrel4500/functions/fnc_generateOutputData.sqf b/addons/kestrel4500/functions/fnc_generateOutputData.sqf index c3bce5efa2..ccc2ab57e3 100644 --- a/addons/kestrel4500/functions/fnc_generateOutputData.sqf +++ b/addons/kestrel4500/functions/fnc_generateOutputData.sqf @@ -107,7 +107,7 @@ if (GVAR(referenceHeadingMenu) == 0) then { }; case 2: { // Wind SPD if (!GVAR(MinAvgMax)) then { - _textCenterBig = Str(round(abs(_windSpeed) * 10) / 10); + _textCenterBig = Str(round(_windSpeed * 10) / 10); } else { _textCenterLine1Left = "Max"; _textCenterLine2Left = "Avg"; @@ -134,7 +134,7 @@ if (GVAR(referenceHeadingMenu) == 0) then { if (!GVAR(MinAvgMax)) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _textCenterBig = Str(round(abs(sin(GVAR(RefHeading) - _playerDir) * _windSpeed) * 10) / 10); - _textInfoLine1 = format["%1 m/s @ %2", round((abs(cos(_playerDir - _windDir)) * _windSpeed) * 10) / 10, round(_playerDir)]; + _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_playerDir)]; } else { _textCenterBig = Str(round(abs(sin(GVAR(RefHeading)) * _windSpeed) * 10) / 10); _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_windDir)]; @@ -166,7 +166,7 @@ if (GVAR(referenceHeadingMenu) == 0) then { if (!GVAR(MinAvgMax)) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _textCenterBig = Str(round(cos(GVAR(RefHeading) - _playerDir) * _windSpeed * 10) / 10); - _textInfoLine1 = format["%1 m/s @ %2", round((abs(cos(_playerDir - _windDir)) * _windSpeed) * 10) / 10, round(_playerDir)]; + _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_playerDir)]; } else { _textCenterBig = Str(round(cos(GVAR(RefHeading)) * _windSpeed * 10) / 10); _textInfoLine1 = format["%1 m/s @ %2", round(_windSpeed * 10) / 10, round(_windDir)]; From 91def9396c790bde6029421a3b45bc9d22479c7a Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 30 Oct 2016 00:28:25 +0200 Subject: [PATCH 119/826] Updates the ballistics module to support Apex * Made the new ammo types ready for advanced ballistics * Made the new weapons ready for advanced ballistics * Recalculated all initSpeed coefficients * Updated the airFrictionAnalysis report --- addons/ballistics/CfgAmmo.hpp | 56 ++++++++++--- addons/ballistics/CfgMagazines.hpp | 30 ++++++- addons/ballistics/CfgWeapons.hpp | 123 ++++++++++++++++++++++------- extras/airFrictionAnalysis.txt | 44 +++++++---- 4 files changed, 195 insertions(+), 58 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 0819f8aa4b..652cc8ece7 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -79,8 +79,8 @@ class CfgAmmo { class ACE_B_556x45_Ball_Tracer_Dim: B_556x45_Ball_Tracer_Red { nvgOnly = 1; }; - class ACE_545x39_Ball_7N6M : B_556x45_Ball { - airFriction=-0.00114744; + class B_545x39_Ball_F : BulletBase { + airFriction=-0.00116278; caliber=0.6; deflecting=18; hit=7; @@ -93,12 +93,14 @@ class CfgAmmo { ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; - ACE_muzzleVelocities[]={780, 880, 920}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; + ACE_muzzleVelocities[]={735, 883, 892}; + ACE_barrelLengths[]={206.5, 414.02, 508.0}; }; + class ACE_545x39_Ball_7N6M : B_545x39_Ball_F { + } class B_556x45_Ball_Tracer_Green; class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Green { - airFriction=-0.00114744; + airFriction=-0.00116278; caliber=0.6; deflecting=18; hit=7; @@ -113,12 +115,26 @@ class CfgAmmo { ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; - ACE_muzzleVelocities[]={785, 883, 925}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; + ACE_muzzleVelocities[]={740, 886, 897}; + ACE_barrelLengths[]={206.5, 414.02, 508.0}; }; class B_56x15_dual: BulletBase { tracerScale = 0.5; }; + class B_580x42_Ball_F: BulletBase { + airFriction=-0.00117956; + typicalSpeed=930; + ACE_caliber=5.9944; + ACE_bulletLength=24.2; + ACE_bulletMass=4.15; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.156}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={790, 930, 970}; + ACE_barrelLengths[]={369.0, 463.0, 600.0}; + }; class B_65x39_Caseless : BulletBase { airFriction=-0.00075308; typicalSpeed=800; @@ -439,7 +455,7 @@ class CfgAmmo { ACE_muzzleVelocities[]={620, 655, 675}; ACE_barrelLengths[]={228.6, 406.4, 508.0}; }; - class ACE_762x39_Ball : B_762x51_Ball { + class B_762x39_Ball_F : BulletBase { airFriction=-0.00151621; hit=12; caliber=1.5; @@ -455,6 +471,8 @@ class CfgAmmo { ACE_muzzleVelocities[]={650, 716, 750}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; + class ACE_762x39_Ball : B_762x39_Ball_F { + }; class ACE_762x39_Ball_57N231P : B_762x54_Tracer_Green { airFriction=-0.00151621; hit=12; @@ -474,7 +492,7 @@ class CfgAmmo { ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; class B_9x21_Ball : BulletBase { - airFriction=-0.00226847; + airFriction=-0.00208292; typicalSpeed=390; tracerScale = 0.5; hit=6; @@ -486,8 +504,8 @@ class CfgAmmo { ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=1; - ACE_muzzleVelocities[]={440, 460, 480}; - ACE_barrelLengths[]={101.6, 127.0, 228.6}; + ACE_muzzleVelocities[]={380, 390, 420, 435}; + ACE_barrelLengths[]={93.5, 101.6, 127.0, 228.6}; }; class B_9x21_Ball_Tracer_Green: B_9x21_Ball { tracerScale = 0.5; @@ -508,7 +526,7 @@ class CfgAmmo { ACE_barrelLengths[]={96.52, 127.0, 228.6}; }; class ACE_9x19_Ball : B_9x21_Ball { - airFriction=-0.0018577; + airFriction=-0.0019835; typicalSpeed=370; hit=6; ACE_caliber=9.017; @@ -771,6 +789,20 @@ class CfgAmmo { ACE_muzzleVelocities[]={230, 250, 285}; ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; + class B_50BW_Ball_F : BulletBase { + airFriction=-0.00202645; + typicalSpeed=550; + ACE_caliber=12.7; + ACE_bulletLength=24.13; + ACE_bulletMass=21.7076; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.21}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={510, 550, 596}; + ACE_barrelLengths[]={304.8, 406.4, 609.6}; + }; class B_19mm_HE: BulletBase { tracerScale = 1; }; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 931a6c2309..4c79e7ef51 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -2,6 +2,12 @@ class CfgMagazines { class CA_Magazine; + class 30Rnd_580x42_Mag_F: CA_Magazine { + initSpeed = 930; + }; + class 100Rnd_580x42_Mag_F: 30Rnd_580x42_Mag_F { + initSpeed = 930; + }; class 30Rnd_65x39_caseless_mag: CA_Magazine { initSpeed = 760; }; @@ -47,6 +53,10 @@ class CfgMagazines { descriptionShort = CSTRING(30Rnd_65x39_caseless_green_mag_Tracer_DimDescription); }; + class 30Rnd_545x39_Mag_F: CA_Magazine { + initSpeed = 735; + }; + class 30Rnd_556x45_Stanag: CA_Magazine { }; class ACE_30Rnd_556x45_Stanag_M995_AP_mag: 30Rnd_556x45_Stanag { @@ -84,6 +94,14 @@ class CfgMagazines { picture = "\A3\weapons_f\data\ui\m_20stanag_red_ca.paa"; }; + class 200Rnd_556x45_Box_F: CA_Magazine { + initSpeed = 872; + }; + + class 30Rnd_762x39_Mag_F: CA_Magazine { + initSpeed = 715; + }; + class 20Rnd_762x51_Mag: CA_Magazine { initSpeed = 833; }; @@ -276,7 +294,7 @@ class CfgMagazines { class 30Rnd_9x21_Mag: CA_Magazine { - initSpeed = 450; + initSpeed = 390; }; class ACE_30Rnd_9x19_mag: 30Rnd_9x21_Mag { author = ECSTRING(common,ACETeam); @@ -287,6 +305,10 @@ class CfgMagazines { initSpeed = 370; }; + class 10Rnd_50BW_Mag_F: CA_Magazine { + initSpeed = 552; + }; + class 11Rnd_45ACP_Mag: CA_Magazine { initSpeed = 250; }; @@ -307,8 +329,12 @@ class CfgMagazines { initSpeed = 250; }; + class 10Rnd_9x21_Mag: 30Rnd_9x21_Mag { + initSpeed = 390; + }; + class 16Rnd_9x21_Mag: 30Rnd_9x21_Mag { - initSpeed = 450; + initSpeed = 390; }; class ACE_16Rnd_9x19_mag: 16Rnd_9x21_Mag { author = ECSTRING(common,ACETeam); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 2446aeb3b3..51f815f938 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -27,6 +27,12 @@ class CfgWeapons { }; }; + class DMR_07_base_F: Rifle_Long_Base_F { + initSpeed = -0.982908; + ACE_barrelTwist = 228.6; + ACE_barrelLength = 640.0; + }; + class DMR_06_base_F: Rifle_Long_Base_F { class Single: Mode_SemiAuto { dispersion = 0.00029; // radians. Equal to 1.00 MOA. @@ -112,7 +118,7 @@ class CfgWeapons { "ACE_30Rnd_65x47_Scenar_mag", "ACE_30Rnd_65_Creedmor_mag" }; - initSpeed = -1.018; + initSpeed = -1.01842; ACE_barrelTwist=228.6; ACE_barrelLength=457.2; class Single: Single { @@ -142,6 +148,14 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; + initSpeed = -0.859238; + ACE_barrelTwist=177.8; + ACE_barrelLength=264.0; + }; + class arifle_SPAR_02_base_F: Rifle_Base_F { + initSpeed = -0.934282; + ACE_barrelTwist=177.8; + ACE_barrelLength=368.0; }; class arifle_SPAR_03_base_F: Rifle_Base_F { magazines[] = { @@ -154,6 +168,9 @@ class CfgWeapons { "ACE_20Rnd_762x51_M993_AP_Mag", "ACE_20Rnd_762x51_Mag_SD" }; + initSpeed = -0.984394; + ACE_barrelTwist=279.4; + ACE_barrelLength=508.0; }; /* Other */ @@ -163,21 +180,26 @@ class CfgWeapons { "200Rnd_65x39_cased_Box_Tracer", "ACE_200Rnd_65x39_cased_Box_Tracer_Dim" }; - initSpeed = -0.9763; + initSpeed = -0.976974; ACE_barrelTwist=177.8; ACE_barrelLength=317.5; }; class LMG_Zafir_F: Rifle_Long_Base_F { - initSpeed = -1.0; + initSpeed = -1.00333; ACE_barrelTwist=304.8; ACE_barrelLength=459.74; }; + class LMG_03_base_F: Rifle_Long_Base_F { + initSpeed = -1.02002; + ACE_barrelTwist=177.8; + ACE_barrelLength=414.02; + }; class Tavor_base_F: Rifle_Base_F {}; class mk20_base_F: Rifle_Base_F {}; /* SMGs */ class SDAR_base_F: Rifle_Base_F { - initSpeed = -0.989; + initSpeed = -1.211; class Single: Mode_SemiAuto { dispersion = 0.0008727; // radians. Equal to 3 MOA. }; @@ -190,9 +212,6 @@ class CfgWeapons { dispersion = 0.0008727; // radians. Equal to 3 MOA. }; }; - class pdw2000_base_F: Rifle_Short_Base_F {}; - class SMG_01_Base: Rifle_Short_Base_F {}; - class SMG_02_base_F: Rifle_Base_F {}; /* Pistols */ @@ -200,13 +219,13 @@ class CfgWeapons { class Pistol_Base_F: Pistol {}; class hgun_P07_F: Pistol_Base_F { - initSpeed = -0.9778; + initSpeed = -1.0; ACE_barrelTwist=254.0; ACE_barrelLength=101.6; }; class hgun_Rook40_F: Pistol_Base_F { - initSpeed = -1.0; + initSpeed = -1.03077; ACE_barrelTwist=254.0; ACE_barrelLength=111.76; }; @@ -228,18 +247,57 @@ class CfgWeapons { ACE_barrelTwist=406.4; ACE_barrelLength=76.2; }; - class hgun_PDW2000_F: pdw2000_base_F { - initSpeed = -1.157; + + class hgun_Pistol_01_F: Pistol_Base_F { + initSpeed = -0.974359; + ACE_barrelTwist=254.0; + ACE_barrelLength=93.5; + }; + + class pdw2000_base_F: Rifle_Short_Base_F { + initSpeed = -1.09615; ACE_barrelTwist=228.6; ACE_barrelLength=177.8; }; + + /* Rifles */ + class arifle_AKS_base_F: Rifle_Base_F { + initSpeed = -1.00419; + ACE_barrelTwist=160.02; + ACE_barrelLength=210.82; + }; + class arifle_AKM_base_F: Rifle_Base_F { + initSpeed = -1.0014; + ACE_barrelTwist = 199.898; + ACE_barrelLength = 414.02; + }; + class arifle_AK12_base_F: Rifle_Base_F { + initSpeed = -1.0014; + ACE_barrelTwist = 199.898; + ACE_barrelLength = 414.02; + }; + class arifle_CTAR_base_F: Rifle_Base_F { + initSpeed = -1.0; + ACE_barrelTwist = 244.0; + ACE_barrelLength = 463.0; + }; + class arifle_CTARS_base_F: Rifle_Base_F { + initSpeed = -1.04301; + ACE_barrelTwist = 244.0; + ACE_barrelLength = 600.0; + }; + class arifle_ARX_base_F: Rifle_Base_F { + initSpeed = -1.02052; + ACE_barrelTwist = 228.6; + ACE_barrelLength = 463.0; + }; class arifle_Katiba_F: arifle_katiba_Base_F { magazines[] = { "30Rnd_65x39_caseless_green", "30Rnd_65x39_caseless_green_mag_Tracer", "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" }; - initSpeed = -1.08; + initSpeed = -1.08355; ACE_barrelTwist=203.2; ACE_barrelLength=728.98; }; @@ -249,7 +307,7 @@ class CfgWeapons { "30Rnd_65x39_caseless_green_mag_Tracer", "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" }; - initSpeed = -1.07; + initSpeed = -1.07105; ACE_barrelTwist=203.2; ACE_barrelLength=680.72; }; @@ -259,7 +317,7 @@ class CfgWeapons { "30Rnd_65x39_caseless_green_mag_Tracer", "ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim" }; - initSpeed = -1.08; + initSpeed = -1.08355; ACE_barrelTwist=203.2; ACE_barrelLength=728.98; }; @@ -269,7 +327,7 @@ class CfgWeapons { "30Rnd_65x39_caseless_mag_Tracer", "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim" }; - initSpeed = -0.99; + initSpeed = -0.990132; ACE_barrelTwist=228.6; ACE_barrelLength=368.3; }; @@ -295,7 +353,7 @@ class CfgWeapons { "30Rnd_65x39_caseless_mag_Tracer", "ACE_30Rnd_65x39_caseless_mag_Tracer_Dim" }; - initSpeed = -0.965; + initSpeed = -0.963816; ACE_barrelTwist=203.2; ACE_barrelLength=266.7; }; @@ -323,11 +381,16 @@ class CfgWeapons { ACE_barrelTwist=285.75; ACE_barrelLength=457.2; }; - class SMG_02_F: SMG_02_base_F { - initSpeed = -1.054; + class SMG_02_base_F: Rifle_Base_F { + initSpeed = -1.10288; ACE_barrelTwist=254.0; ACE_barrelLength=195.58; }; + class SMG_05_base_F: Rifle_Short_Base_F { + initSpeed = -1.04058; + ACE_barrelTwist=254.0; + ACE_barrelLength=115.0; + }; class arifle_TRG20_F: Tavor_base_F { magazines[] = { "30Rnd_556x45_Stanag", @@ -358,7 +421,7 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.989; + initSpeed = -0.988043; ACE_barrelTwist=177.8; ACE_barrelLength=459.74; }; @@ -375,7 +438,7 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.989; + initSpeed = -0.988043; ACE_barrelTwist=177.8; ACE_barrelLength=459.74; }; @@ -398,7 +461,7 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.98; + initSpeed = -0.980978; ACE_barrelTwist=177.8; ACE_barrelLength=441.96; }; @@ -415,7 +478,7 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.956; + initSpeed = -0.962648; ACE_barrelTwist=177.8; ACE_barrelLength=406.4; }; @@ -432,12 +495,12 @@ class CfgWeapons { "ACE_30Rnd_556x45_Stanag_Mk318_mag", "ACE_30Rnd_556x45_Stanag_Tracer_Dim" }; - initSpeed = -0.956; + initSpeed = -0.962648; ACE_barrelTwist=177.8; ACE_barrelLength=406.4; }; - class SMG_01_F: SMG_01_Base { - initSpeed = -1.016; + class SMG_01_Base: Rifle_Short_Base_F { + initSpeed = -1.0175; ACE_barrelTwist=406.4; ACE_barrelLength=139.7; }; @@ -461,7 +524,7 @@ class CfgWeapons { "ACE_20Rnd_762x51_M993_AP_Mag", "ACE_20Rnd_762x51_Mag_SD" }; - initSpeed = -0.9724; + initSpeed = -0.972389; ACE_barrelTwist=304.8; ACE_barrelLength=457.2; }; @@ -498,7 +561,7 @@ class CfgWeapons { "ACE_20Rnd_762x67_Mk248_Mod_1_Mag", "ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag" }; - initSpeed = -0.962; + initSpeed = -0.961749; ACE_barrelTwist=254.0; ACE_barrelLength=508.0; }; @@ -513,7 +576,7 @@ class CfgWeapons { "ACE_20Rnd_762x51_M993_AP_Mag", "ACE_20Rnd_762x51_Mag_SD" }; - initSpeed = -0.9843; + initSpeed = -0.984394; ACE_barrelTwist=254.0; ACE_barrelLength=508.0; }; @@ -538,12 +601,12 @@ class CfgWeapons { "ACE_20Rnd_762x51_M993_AP_Mag", "ACE_20Rnd_762x51_Mag_SD" }; - initSpeed = -0.9916; + initSpeed = -0.992197; ACE_barrelTwist=304.8; ACE_barrelLength=558.8; }; class MMG_01_hex_F: MMG_01_base_F { - initSpeed = -1.0; + initSpeed = -0.997073; ACE_barrelTwist=359.918; ACE_barrelLength=549.91; }; diff --git a/extras/airFrictionAnalysis.txt b/extras/airFrictionAnalysis.txt index 722077578b..0f825e55d5 100644 --- a/extras/airFrictionAnalysis.txt +++ b/extras/airFrictionAnalysis.txt @@ -31,13 +31,21 @@ Max. drop difference (cm): 1.25 Max. tof difference (ms): 7.0 Optimal airFriction: 0.00123272 ########################################## -Ammo Class: ACE_545x39_Ball_7N6M +Ammo Class: B_545x39_Ball_F MaxRanges (m): [400, 500] -MuzzleVelocities (m/s): [780, 880, 920] -Max. velocity difference (m/s): 19.71 -Max. drop difference (cm): 2.04 +MuzzleVelocities (m/s): [735, 892] +Max. velocity difference (m/s): 23.07 +Max. drop difference (cm): 3.76 +Max. tof difference (ms): 12.0 +Optimal airFriction: 0.00116278 +########################################## +Ammo Class: B_580x42_Ball_F +MaxRanges (m): [500, 500] +MuzzleVelocities (m/s): [930, 970] +Max. velocity difference (m/s): 24.7 +Max. drop difference (cm): 1.51 Max. tof difference (ms): 8.0 -Optimal airFriction: 0.00114744 +Optimal airFriction: 0.00117956 ########################################## Ammo Class: B_65x39_Caseless MaxRanges (m): [400, 800, 800] @@ -247,6 +255,14 @@ Max. drop difference (cm): 14.52 Max. tof difference (ms): 29.0 Optimal airFriction: 0.00069611 ########################################## +Ammo Class: B_50BW_Ball_F +MaxRanges (m): [300, 400] +MuzzleVelocities (m/s): [510, 596] +Max. velocity difference (m/s): 29.6 +Max. drop difference (cm): 2.19 +Max. tof difference (ms): 18.0 +Optimal airFriction: 0.00202645 +########################################## Ammo Class: B_127x99_Ball MaxRanges (m): [1300, 1300] MuzzleVelocities (m/s): [895, 905] @@ -280,12 +296,12 @@ Max. tof difference (ms): 9.0 Optimal airFriction: 0.00049899 ########################################## Ammo Class: B_9x21_Ball -MaxRanges (m): [200, 300, 300] -MuzzleVelocities (m/s): [440, 460, 480] -Max. velocity difference (m/s): 37.94 -Max. drop difference (cm): 5.27 +MaxRanges (m): [200, 300] +MuzzleVelocities (m/s): [380, 420] +Max. velocity difference (m/s): 34.77 +Max. drop difference (cm): 4.7 Max. tof difference (ms): 31.0 -Optimal airFriction: 0.00226847 +Optimal airFriction: 0.00208292 ########################################## Ammo Class: ACE_9x18_Ball_57N181S MaxRanges (m): [100, 200, 200] @@ -298,10 +314,10 @@ Optimal airFriction: 0.00190333 Ammo Class: ACE_9x19_Ball MaxRanges (m): [100, 200, 200] MuzzleVelocities (m/s): [340, 370, 400] -Max. velocity difference (m/s): 17.59 -Max. drop difference (cm): 6.56 -Max. tof difference (ms): 10.0 -Optimal airFriction: 0.0018577 +Max. velocity difference (m/s): 23.95 +Max. drop difference (cm): 3.75 +Max. tof difference (ms): 17.0 +Optimal airFriction: 0.0019835 ########################################## Ammo Class: ACE_10x25_Ball MaxRanges (m): [200, 300, 300] From 298a90b68a054488c65bac2c6af760ce1fbb8429 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 30 Oct 2016 12:05:17 +0100 Subject: [PATCH 120/826] Updates the ATragMX gun list --- addons/atragmx/XEH_postInit.sqf | 11 ++++++++--- addons/atragmx/script_component.hpp | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 4a68aac749..992f9e657a 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -10,9 +10,10 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ], ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ], - ["12.7x99mm API" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.99, 12.9, 38.10, 0.670, 1, "ASM" ], ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ], + + [".50 Beowulf" , 563, 100, 0.0657485, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" ], [".408 Chey Tac" , 910, 100, 0.0569400, -0.00038944, 3.81, 0, 2, 10, 120, 0, 0, 26.57, 10.4, 33.02, 0.970, 1, "ASM" ], @@ -38,11 +39,15 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ["6.5x39mm" , 800, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"], ["6.5x47mm Lapua" , 800, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"], ["6.5mm Creedmor" , 840, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.317, 7, "ICAO"], - + + ["5.8x42mm DBP87" , 930, 100, 0.0572574, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.156, 7, "ICAO" ], + ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ], ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ], ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" ], - ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" ]]; + ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" ], + + ["5.45x39mm 7N6M" , 735, 100, 0.0787205, -0.00116278, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.168, 7, "ICAO"]]; [] call FUNC(clear_user_data); profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 0eae4ee5a0..3b09c0ad2f 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -16,4 +16,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.7 +#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.8 From 76dbdaaecf7479893933c8d3d1dbc40db890d275 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 30 Oct 2016 18:43:43 -0500 Subject: [PATCH 121/826] Add semi-colon --- addons/ballistics/CfgAmmo.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 652cc8ece7..065dcdf17d 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -97,7 +97,7 @@ class CfgAmmo { ACE_barrelLengths[]={206.5, 414.02, 508.0}; }; class ACE_545x39_Ball_7N6M : B_545x39_Ball_F { - } + }; class B_556x45_Ball_Tracer_Green; class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Green { airFriction=-0.00116278; From 910f97527630625c3ad512d9a78081bdb126f6ca Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 30 Oct 2016 18:46:55 -0500 Subject: [PATCH 122/826] Fix ubc --- addons/ballistics/CfgMagazines.hpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 4c79e7ef51..efde366d8c 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -329,11 +329,10 @@ class CfgMagazines { initSpeed = 250; }; - class 10Rnd_9x21_Mag: 30Rnd_9x21_Mag { + class 16Rnd_9x21_Mag: 30Rnd_9x21_Mag { initSpeed = 390; }; - - class 16Rnd_9x21_Mag: 30Rnd_9x21_Mag { + class 10Rnd_9x21_Mag: 16Rnd_9x21_Mag { initSpeed = 390; }; class ACE_16Rnd_9x19_mag: 16Rnd_9x21_Mag { From c5322bff37ee843474235ba1c1836d669079e4be Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 2 Nov 2016 18:05:19 +0100 Subject: [PATCH 123/826] Fixes the ATragMX 'Done' button issue (#4617) --- .../functions/fnc_update_zero_range.sqf | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index 299c321d33..3d56dc81eb 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -15,6 +15,8 @@ */ #include "script_component.hpp" +[] call FUNC(parse_input); + private ["_scopeBaseAngle"]; _scopeBaseAngle = (GVAR(workingMemory) select 3); @@ -28,10 +30,7 @@ _dragModel = GVAR(workingMemory) select 16; _atmosphereModel = GVAR(workingMemory) select 17; private ["_zeroRange"]; -_zeroRange = Round(parseNumber(ctrlText 120060)); -if (GVAR(currentUnit) == 1) then { - _zeroRange = _zeroRange / 1.0936133; -}; +_zeroRange = GVAR(workingMemory) select 2; if (_zeroRange < 10) exitWith { GVAR(workingMemory) set [2, _zeroRange]; GVAR(workingMemory) set [3, 0]; @@ -42,9 +41,17 @@ _altitude = GVAR(altitude); _temperature = GVAR(temperature); _barometricPressure = GVAR(barometricPressure); _relativeHumidity = GVAR(relativeHumidity); +if (!GVAR(atmosphereModeTBH)) then { + _barometricPressure = 1013.25 * (1 - (0.0065 * _altitude) / (273.15 + _temperature + 0.0065 * _altitude)) ^ 5.255754495; + _relativeHumidity = 50; +}; -private ["_result"]; -_result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0, 0] call FUNC(calculate_solution); +{ + private _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0, 0] call FUNC(calculate_solution); + private _offset = (_result select 0) / 60; + _scopeBaseAngle = _scopeBaseAngle + _offset; + if (_offset < 0.01) exitWith {}; +} forEach [1, 2, 3]; GVAR(workingMemory) set [2, _zeroRange]; -GVAR(workingMemory) set [3, _scopeBaseAngle + (_result select 0) / 60]; +GVAR(workingMemory) set [3, _scopeBaseAngle]; From 272ec37603b63510155bb4ea1d4b1a3f1ee171f8 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Wed, 9 Nov 2016 22:11:47 +0300 Subject: [PATCH 124/826] Fix Full Repair menu not shown when damage returns 0 (#4621) --- addons/repair/ACE_Repair.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/repair/ACE_Repair.hpp b/addons/repair/ACE_Repair.hpp index 6e5eac4fa8..3cea9ed7ca 100644 --- a/addons/repair/ACE_Repair.hpp +++ b/addons/repair/ACE_Repair.hpp @@ -72,7 +72,7 @@ class ACE_Repair { requiredEngineer = QGVAR(engineerSetting_fullRepair); repairLocations[] = {QGVAR(fullRepairLocation)}; repairingTime = 30; - condition = "damage _target > 0"; + condition = "0 < ({_x>0} count (getAllHitPointsDamage _target param [2,[]]))"; callbackSuccess = QUOTE(call FUNC(doFullRepair)); itemConsumed = QGVAR(consumeItem_ToolKit); }; From 962a29671067b8efb8a3c8952d161d62a2bb87e8 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 2 Nov 2016 13:54:22 +0100 Subject: [PATCH 125/826] Minor corrections in the ballistics module * Corrected AKS-U barrel length * Corrected .338 250gr BC * Corrected .338 API526 BC and muzzle velocity * Slightly reduced 5.8x42mm muzzle velocity --- addons/ballistics/CfgAmmo.hpp | 12 ++++++------ addons/ballistics/CfgWeapons.hpp | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 065dcdf17d..5884e63577 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -132,7 +132,7 @@ class CfgAmmo { ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; - ACE_muzzleVelocities[]={790, 930, 970}; + ACE_muzzleVelocities[]={790, 930, 950}; ACE_barrelLengths[]={369.0, 463.0, 600.0}; }; class B_65x39_Caseless : BulletBase { @@ -667,7 +667,7 @@ class CfgAmmo { ACE_bulletLength=43.18; ACE_bulletMass=19.44; ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.381}; + ACE_ballisticCoefficients[]={0.368}; ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; @@ -683,12 +683,12 @@ class CfgAmmo { ACE_bulletLength=38.989; ACE_bulletMass=16.3941242; ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.560}; + ACE_ballisticCoefficients[]={0.290}; ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={880, 915, 925}; - ACE_barrelLengths[]={508.0, 660.4, 711.2}; + ACE_dragModel=7; + ACE_muzzleVelocities[]={880, 895, 900}; + ACE_barrelLengths[]={508.0, 685,8, 711.2}; }; class B_127x33_Ball: BulletBase { tracerScale = 1.3; //1.2; diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 51f815f938..b1791d7fe7 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -262,9 +262,9 @@ class CfgWeapons { /* Rifles */ class arifle_AKS_base_F: Rifle_Base_F { - initSpeed = -1.00419; + initSpeed = -1.0; ACE_barrelTwist=160.02; - ACE_barrelLength=210.82; + ACE_barrelLength=206.5; }; class arifle_AKM_base_F: Rifle_Base_F { initSpeed = -1.0014; From f2a85b63cf03522fab6b0d4a0dc8a2c411f21370 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 2 Nov 2016 14:27:26 +0100 Subject: [PATCH 126/826] Fixed a typo --- addons/ballistics/CfgAmmo.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 5884e63577..5fc2168b84 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -688,7 +688,7 @@ class CfgAmmo { ACE_standardAtmosphere="ICAO"; ACE_dragModel=7; ACE_muzzleVelocities[]={880, 895, 900}; - ACE_barrelLengths[]={508.0, 685,8, 711.2}; + ACE_barrelLengths[]={508.0, 685.8, 711.2}; }; class B_127x33_Ball: BulletBase { tracerScale = 1.3; //1.2; From 6a910e7fe4b494167068fc09625daa0109bd3851 Mon Sep 17 00:00:00 2001 From: William Giokas <1007380@gmail.com> Date: Sat, 5 Nov 2016 06:20:02 -0500 Subject: [PATCH 127/826] ballistics: Added 20 round 6.5 Lapua and Creedmoor --- addons/ballistics/CfgMagazines.hpp | 14 ++++++ addons/ballistics/CfgWeapons.hpp | 5 ++ addons/ballistics/stringtable.xml | 79 ++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index efde366d8c..077430f7ce 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -241,6 +241,13 @@ class CfgMagazines { displayNameShort = CSTRING(30Rnd_65x47_Scenar_mag_NameShort); descriptionShort = CSTRING(30Rnd_65x47_Scenar_mag_Description); }; + class ACE_20Rnd_65x47_Scenar_mag: 20Rnd_650x39_Cased_Mag_F { + author = ECSTRING(common,ACETeam); + ammo = "ACE_65x47_Ball_Scenar"; + displayName = CSTRING(20Rnd_65x47_Scenar_mag_Name); + displayNameShort = CSTRING(20Rnd_65x47_Scenar_mag_NameShort); + descriptionShort = CSTRING(20Rnd_65x47_Scenar_mag_Description); + }; class ACE_30Rnd_65_Creedmor_mag: 30Rnd_65x39_caseless_mag { author = ECSTRING(common,ACETeam); ammo = "ACE_65_Creedmor_Ball"; @@ -248,6 +255,13 @@ class CfgMagazines { displayNameShort = CSTRING(30Rnd_65_Creedmor_mag_NameShort); descriptionShort = CSTRING(30Rnd_65_Creedmor_mag_Description); }; + class ACE_20Rnd_65_Creedmor_mag: 20Rnd_650x39_Cased_Mag_F { + author = ECSTRING(common,ACETeam); + ammo = "ACE_65_Creedmor_Ball"; + displayName = CSTRING(20Rnd_65_Creedmor_mag_Name); + displayNameShort = CSTRING(20Rnd_65_Creedmor_mag_NameShort); + descriptionShort = CSTRING(20Rnd_65_Creedmor_mag_Description); + }; class 10Rnd_338_Mag; class ACE_10Rnd_338_300gr_HPBT_Mag: 10Rnd_338_Mag { author = ECSTRING(common,ACETeam); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index b1791d7fe7..ad24430b30 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -31,6 +31,11 @@ class CfgWeapons { initSpeed = -0.982908; ACE_barrelTwist = 228.6; ACE_barrelLength = 640.0; + magazines[] = { + "20Rnd_650x39_Cased_Mag_F", + "ACE_20Rnd_65x47_Scenar_mag", + "ACE_20Rnd_65_Creedmor_mag" + }; }; class DMR_06_base_F: Rifle_Long_Base_F { diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index d7a4ea65b9..08325cad96 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -1,6 +1,85 @@  + + + 6.5x47mm 20Rnd Mag (HPBT Scenar) + Ch. 6.5x47mm 20Cps (HPBT Scenar) + Cargador de 20 balas de 6.5x47mm (HPBT Scenar) + Magazynek 6,5x47mm 20rd (HPBT Scenar) + Магазин из 20-ти 6,5x47 мм (экспансивные Scenar) + 6,5x47mm 20-Patronen-Magazin (HPBT Scenar) + 6.5x47mm 20Rnd Mag (HPBT Scenar) + 6.5x47mm 20náb. Zásobník (HPBT Scenar) + Carregador 6.5x47mm com 20 cartuchos (HPBT Scenar) + 6,5x47mm 20-lövedékes tár (HPBT Scenar) + 6.5x47mm 20発入り 弾倉 (HPBT Scenar) + + + 6.5mm Lapua + 6.5mm Lapua + 6.5mm Lapua + 6,5mm Lapua + 6,5 мм Lapua + 6,5mm Lapua + 6.5mm Lapua + 6.5mm Lapua + 6.5mm Lapua + 6,5mm Lapua + 6.5mm Lapua + + + Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 20<br />Used in: QBU-88 + Calibre: 6.5x47mm (HPBT Scenar)<br />Cartouches: 20 + Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 20<br />Se usa en: QBU-88 + Kaliber: 6,5x47mm (HPBT Scenar)<br />Pociski: 20 + Калибр: 6,5x47 мм (экспансивные Scenar)<br />Патронов: 20<br />Используются с: QBU-88 + Kaliber: 6,5x47mm (HPBT Scenar)<br />Patronen: 20<br />Eingesetzt von: QBU-88 + Calibro: 6.5x47mm (HPBT Scenar)<br />Munizioni: 20<br />In uso su: QBU-88 + Ráže: 6.5x47mm (HPBT Scenar)<br />Nábojů: 20<br />Použití u: QBU-88 + Calibre: 6.5x47mm (HPBT Scenar)<br/>Cartuchos: 20<br/>Usado em: QBU-88 + Kaliber: 6,5x47mm (HPBT Scenar)<br />Lövedékek: 20<br />Használható: QBU-88 + 口径: 6.5x47mm (HPBT Scenar)&lt;br /&gt;装填数: 20&lt;br /&gt;次で使用: QBU-88 + + + 6.5mm Creedmor 20Rnd Mag + Magazynek 6,5mm Creedmor 20rd + 6.5mm Creedmor 20Rnd Mag + Магазин из 20-ти 6,5 мм Creedmor + 6,5mm Creedmor 20-Patronen-Magazin + Cargador de 20 balas Creedmor de 6.5mm + Ch. 6.5mm Creedmor 20Cps + 6.5mm Creedmor 20náb. Zásobník + Carregador 6.5mm com 20 cartuchos Creedmor + 6,5mm Creedmor 20-lövedékes tár + 6.5mm Creedmor 20発入り 弾倉 + + + 6.5mm CM + 6.5mm CM + 6.5mm CM + 6,5mm CM + 6,5 мм CM + 6,5mm CM + 6.5mm CM + 6.5mm CM + 6.5mm CM + 6,5mm CM + 6.5mm CM + + + Caliber: 6.5x47mm Creedmor<br />Rounds: 20<br />Used in: QBU-88 + Kaliber: 6,5x47mm Creedmor<br />Pociski: 20<br />Używany w: QBU-88 + Kaliber: 6,5x47mm Creedmor<br />Patronen: 20<br />Eingesetzt von: QBU-88 + Calibre: 6.5x47mm Creedmor <br />Cartouches: 20<br />Utilisé avec: QBU-88 + Calibro: 6.5mm Creedmor<br />Munizioni: 20<br />In uso su: QBU-88 + Calibre: 6.5mm Creedmor<br />Balas: 20<br />Se usa en: QBU-88 + Калибр: 6,5x47мм Creedmor<br />Патронов: 20<br />Используются c: QBU-88 + Ráže: 6.5x47mm Creedmor<br />Nábojů: 20<br />Použití u: QBU-88 + Calibre: 6.5x47mm Creedmor<br/>Cartuchos: 20<br/>Usado em: QBU-88 + Kaliber: 6,5x47mm Creedmor<br />Lövedékek: 20<br />Használható: QBU-88 + 口径: 6.5x47mm Creedmor&lt;br /&gt;装填数: 20&lt;br /&gt;次で使用: QBU-88 + 6.5mm 30Rnd Tracer IR-DIM Mag From a43b70fe89846a957a77deb0d4a48e08a20f99d4 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 6 Nov 2016 20:22:16 +0100 Subject: [PATCH 128/826] Added 20rnd 6.5 Creedmor and 6.5 Lapua Scenar mags * Fixed incorrect QBU-88 (DMR_07_base_F) initSpeed --- addons/ballistics/CfgMagazines.hpp | 7 +++++++ addons/ballistics/CfgWeapons.hpp | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 077430f7ce..ef690b41aa 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -8,6 +8,9 @@ class CfgMagazines { class 100Rnd_580x42_Mag_F: 30Rnd_580x42_Mag_F { initSpeed = 930; }; + class 20Rnd_650x39_Cased_Mag_F: CA_Magazine { + initSpeed = 760; + }; class 30Rnd_65x39_caseless_mag: CA_Magazine { initSpeed = 760; }; @@ -237,6 +240,7 @@ class CfgMagazines { class ACE_30Rnd_65x47_Scenar_mag: 30Rnd_65x39_caseless_mag { author = ECSTRING(common,ACETeam); ammo = "ACE_65x47_Ball_Scenar"; + initSpeed = 761; displayName = CSTRING(30Rnd_65x47_Scenar_mag_Name); displayNameShort = CSTRING(30Rnd_65x47_Scenar_mag_NameShort); descriptionShort = CSTRING(30Rnd_65x47_Scenar_mag_Description); @@ -244,6 +248,7 @@ class CfgMagazines { class ACE_20Rnd_65x47_Scenar_mag: 20Rnd_650x39_Cased_Mag_F { author = ECSTRING(common,ACETeam); ammo = "ACE_65x47_Ball_Scenar"; + initSpeed = 779; displayName = CSTRING(20Rnd_65x47_Scenar_mag_Name); displayNameShort = CSTRING(20Rnd_65x47_Scenar_mag_NameShort); descriptionShort = CSTRING(20Rnd_65x47_Scenar_mag_Description); @@ -251,6 +256,7 @@ class CfgMagazines { class ACE_30Rnd_65_Creedmor_mag: 30Rnd_65x39_caseless_mag { author = ECSTRING(common,ACETeam); ammo = "ACE_65_Creedmor_Ball"; + initSpeed = 815; displayName = CSTRING(30Rnd_65_Creedmor_mag_Name); displayNameShort = CSTRING(30Rnd_65_Creedmor_mag_NameShort); descriptionShort = CSTRING(30Rnd_65_Creedmor_mag_Description); @@ -258,6 +264,7 @@ class CfgMagazines { class ACE_20Rnd_65_Creedmor_mag: 20Rnd_650x39_Cased_Mag_F { author = ECSTRING(common,ACETeam); ammo = "ACE_65_Creedmor_Ball"; + initSpeed = 808; displayName = CSTRING(20Rnd_65_Creedmor_mag_Name); displayNameShort = CSTRING(20Rnd_65_Creedmor_mag_NameShort); descriptionShort = CSTRING(20Rnd_65_Creedmor_mag_Description); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index ad24430b30..3cbf8de544 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -28,7 +28,7 @@ class CfgWeapons { }; class DMR_07_base_F: Rifle_Long_Base_F { - initSpeed = -0.982908; + initSpeed = -1.06051; ACE_barrelTwist = 228.6; ACE_barrelLength = 640.0; magazines[] = { From 0975a4f004fca4194989cdfb8a75964b86d26d17 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 3 Nov 2016 18:01:58 -0500 Subject: [PATCH 129/826] MedicalAI - Fix treatment animion with no weapon (#4633) --- addons/medical_ai/functions/fnc_playTreatmentAnim.sqf | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf index 93a784922d..f013486cc1 100644 --- a/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf +++ b/addons/medical_ai/functions/fnc_playTreatmentAnim.sqf @@ -32,7 +32,12 @@ if (stance _unit == "PRONE") then { }; private _anim = getText (_animConfig >> _configProperty); -private _wpn = ["non", "rfl", "pst"] select (1 + ([primaryWeapon _unit, handgunWeapon _unit] find (currentWeapon _unit))); +private _wpn = switch (true) do { + case ((currentWeapon _unit) == ""): {"non"}; + case ((currentWeapon _unit) == (primaryWeapon _unit)): {"rfl"}; + case ((currentWeapon _unit) == (handgunWeapon _unit)): {"pst"}; + default {"non"}; +}; _anim = [_anim, "[wpn]", _wpn] call CBA_fnc_replace; [_unit, _anim] call EFUNC(common,doAnimation); From 9e6ee0363d9beafcce07f912d4042613291c5392 Mon Sep 17 00:00:00 2001 From: commy2 Date: Wed, 9 Nov 2016 20:02:48 +0100 Subject: [PATCH 130/826] fix tripflares script error (#4647) --- addons/explosives/functions/fnc_spawnFlare.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/explosives/functions/fnc_spawnFlare.sqf b/addons/explosives/functions/fnc_spawnFlare.sqf index acd5dc2a99..79f105b67b 100644 --- a/addons/explosives/functions/fnc_spawnFlare.sqf +++ b/addons/explosives/functions/fnc_spawnFlare.sqf @@ -21,3 +21,5 @@ TRACE_3("Params",_posX,_posY,_posZ); private _flare = "ACE_TripFlare_FlareEffect" createVehicle [_posX,_posY,_posZ]; TRACE_1("",_flare); + +nil From 3417c433fd61dd3a3514ab31b7e375f5960292a1 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Wed, 9 Nov 2016 22:06:48 +0100 Subject: [PATCH 131/826] Prep v3.8.2 --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 1bc29e4831..95d44ca2c9 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 8 -#define PATCHLVL 1 +#define PATCHLVL 2 #define BUILD 11 From 0394ea56b492dce4db25efaae3e8f38c47ed0405 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Wed, 9 Nov 2016 22:07:07 +0100 Subject: [PATCH 132/826] Increment build --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 95d44ca2c9..2104cda997 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 8 #define PATCHLVL 2 -#define BUILD 11 +#define BUILD 12 From f15522a88fdc8af347f141c4f9e44bf381064ae8 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 10 Nov 2016 18:35:57 +0100 Subject: [PATCH 133/826] ATragMX - Estimate bullet length instead of using a fixed value (#4651) --- addons/atragmx/functions/fnc_calculate_target_solution.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index ced57df973..eb4f2817c8 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -52,7 +52,7 @@ if (!GVAR(atmosphereModeTBH)) then { }; private ["_bulletLength", "_stabilityFactor"]; -_bulletLength = 45.72; +_bulletLength = 50 * _bulletMass / ((_bulletDiameter/2)^2); _stabilityFactor = 1.5; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { if (_bulletDiameter > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { From 5bf8b642f7dc583f25f8611c529a39aa0f9f0984 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 10 Nov 2016 12:05:08 -0600 Subject: [PATCH 134/826] Add cargo configs for some planes (#4650) --- addons/cargo/CfgVehicles.hpp | 7 ++++++- optionals/compat_rhs_usf3/CfgVehicles.hpp | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/addons/cargo/CfgVehicles.hpp b/addons/cargo/CfgVehicles.hpp index 9d4c34182f..a89375e4a0 100644 --- a/addons/cargo/CfgVehicles.hpp +++ b/addons/cargo/CfgVehicles.hpp @@ -259,12 +259,17 @@ class CfgVehicles { GVAR(space) = 4; }; - // jets + // planes (off by default as most are attack jets) class Plane: Air { GVAR(space) = 0; GVAR(hasCargo) = 0; }; + class Plane_Base_F: Plane {}; + class Plane_Civil_01_base_F: Plane_Base_F { // Tanoa Civilian Prop Plane + GVAR(space) = 2; + GVAR(hasCargo) = 1; + }; class VTOL_Base_F; class VTOL_01_base_F: VTOL_Base_F { GVAR(space) = 4; diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp index b2460e5824..9e9cc99c2a 100644 --- a/optionals/compat_rhs_usf3/CfgVehicles.hpp +++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp @@ -390,5 +390,7 @@ class CfgVehicles { class Plane_Base_F; class RHS_C130J_Base: Plane_Base_F { EGVAR(refuel,fuelCapacity) = 25704; + EGVAR(cargo,space) = 4; + EGVAR(cargo,hasCargo) = 1; }; }; From e086a33e4daebdbbc3dabb342bf4ba6783844539 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 10 Nov 2016 17:49:18 -0600 Subject: [PATCH 135/826] Hide advFatigue bar on map / spectator --- addons/advanced_fatigue/XEH_postInit.sqf | 9 +++++---- addons/advanced_fatigue/functions/fnc_mainLoop.sqf | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index d566e3b042..dd68a843c0 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -12,10 +12,11 @@ if (!hasInterface) exitWith {}; GVAR(ppeBlackout) ppEffectCommit 0.4; // - GVAR updating and initialization ----------------------------------------- - if !(isNull ACE_player) then { - [ACE_player, objNull] call FUNC(handlePlayerChanged); - }; - ["unit", FUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler; + ["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; + ["visibleMap", { + private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; + _staminaBarContainer ctrlShow (!visibleMap); + }, true] call CBA_fnc_addPlayerEventHandler; // - Duty factors ------------------------------------------------------------- if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { diff --git a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf index f438d6ef08..ee8f33f5c7 100644 --- a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf +++ b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf @@ -11,6 +11,9 @@ #include "script_component.hpp" if (!alive ACE_player) exitWith { // Dead people don't breath, Will also handle null (Map intros) [FUNC(mainLoop), [], 1] call CBA_fnc_waitAndExecute; + private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; + _staminaBarContainer ctrlSetFade 1; + _staminaBarContainer ctrlCommit 1; }; private _currentWork = REE; From eec0c62dc58470ca6462bcba0e3f9a91d78fb06d Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 12 Nov 2016 17:36:21 +0100 Subject: [PATCH 136/826] FCS - removed dead code (#4663) --- extensions/fcs/ace_fcs.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/extensions/fcs/ace_fcs.cpp b/extensions/fcs/ace_fcs.cpp index 18be398b55..c43b1c227f 100644 --- a/extensions/fcs/ace_fcs.cpp +++ b/extensions/fcs/ace_fcs.cpp @@ -73,10 +73,6 @@ double traceBullet(double initSpeed, double airFriction, double angle, double an } double getSolution(double initSpeed, double airFriction, double angleTarget, double distance) { - double posTargetX, posTargetY; - posTargetX = cos(RADIANS(angleTarget)) * distance; - posTargetY = sin(RADIANS(angleTarget)) * distance; - if (traceBullet(initSpeed, airFriction, MAXELEVATION, angleTarget, distance) < 0) { return MAXELEVATION - angleTarget; } From 9e85508f0d185e6df0473ea972e16fca39d13417 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 12 Nov 2016 15:46:29 -0600 Subject: [PATCH 137/826] Fix tagTestingThread error (#4662) Close #4659 --- addons/tagging/functions/fnc_tagTestingThread.sqf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/tagging/functions/fnc_tagTestingThread.sqf b/addons/tagging/functions/fnc_tagTestingThread.sqf index ead21f8d91..a21cf69f2b 100644 --- a/addons/tagging/functions/fnc_tagTestingThread.sqf +++ b/addons/tagging/functions/fnc_tagTestingThread.sqf @@ -27,12 +27,13 @@ GVAR(tagsToTest) = GVAR(tagsToTest) select { private _intersections = lineIntersectsSurfaces [_tagPosASL, _endPosASL, _tag, objNull, true, 1, "GEOM", "FIRE"]; // If there's no intersections - if (_intersections isEqualTo []) exitWith { + if (_intersections isEqualTo []) then { TRACE_1("No intersections, deleting:",_tag); deleteVehicle _tag; false + } else { + true }; - true }; // If there's no more tag From 26ae3b807545b239fa5bf900d5bffdc31a994266 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 12 Nov 2016 15:51:44 -0600 Subject: [PATCH 138/826] Hide bar when mounted --- addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf index 2f865ac821..476fd23799 100644 --- a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf @@ -13,6 +13,11 @@ params ["_stamina"]; private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; +if ((vehicle ACE_player) != ACE_player) exitWith { // Hide when mounted + _staminaBarContainer ctrlSetFade 1; + _staminaBarContainer ctrlCommit 1; +}; + // - Size --------------------------------------------------------------------- // Shrink the container to cut off the image (other wise it would just get stretched) private _posAndSize = ctrlPosition _staminaBarContainer; From ae0eab3a51d3793837a5526b77b82b5159b7ad7a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 12 Nov 2016 16:15:42 -0600 Subject: [PATCH 139/826] Use isEqualTo for checking seeker return --- .../missileguidance/functions/fnc_doAttackProfile.sqf | 2 +- .../missileguidance/functions/fnc_doSeekerSearch.sqf | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/addons/missileguidance/functions/fnc_doAttackProfile.sqf b/addons/missileguidance/functions/fnc_doAttackProfile.sqf index 3f390a39a2..0d8de543ee 100644 --- a/addons/missileguidance/functions/fnc_doAttackProfile.sqf +++ b/addons/missileguidance/functions/fnc_doAttackProfile.sqf @@ -26,7 +26,7 @@ private _attackProfileFunction = getText (configFile >> QGVAR(AttackProfiles) >> private _attackProfilePos = _this call (missionNamespace getVariable _attackProfileFunction); -if ((isNil "_attackProfilePos") || {(vectorMagnitude _attackProfilePos) == 0}) exitWith { +if ((isNil "_attackProfilePos") || {_attackProfilePos isEqualTo [0,0,0]}) exitWith { ERROR_1("attack profile returned bad pos",_attackProfilePos); [0,0,0] }; diff --git a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf index 3b36aeaf58..8dd70f0163 100644 --- a/addons/missileguidance/functions/fnc_doSeekerSearch.sqf +++ b/addons/missileguidance/functions/fnc_doSeekerSearch.sqf @@ -27,17 +27,19 @@ private _seekerFunction = getText (configFile >> QGVAR(SeekerTypes) >> _seekerTy private _seekerTargetPos = _this call (missionNamespace getVariable _seekerFunction); -if ((isNil "_seekerTargetPos") || {(vectorMagnitude _seekerTargetPos) == 0}) then { - // Seeker returned nil / bad pos - if (_seekLastTargetPos && {(vectorMagnitude _lastKnownPos) != 0}) then { +if ((isNil "_seekerTargetPos") || {_seekerTargetPos isEqualTo [0,0,0]}) then { // A return of nil or [0,0,0] indicates the seeker has no target + if (_seekLastTargetPos && {!(_lastKnownPos isEqualTo [0,0,0])}) then { // if enabled for the ammo, use last known position if we have one stored TRACE_2("seeker returned bad pos - using last known",_seekLastTargetPos,_lastKnownPos); _seekerTargetPos = _lastKnownPos; + #ifdef DRAW_GUIDANCE_INFO + drawIcon3D ["\A3\ui_f\data\map\markers\military\unknown_CA.paa", [1,1,0,1], ASLtoAGL _lastKnownPos, 0.25, 0.25, 0, "LastKnownPos", 1, 0.02, "TahomaB"]; + #endif } else { TRACE_1("seeker returned no pos",_seekerTargetPos); _seekerTargetPos = [0,0,0]; }; } else { - if (_seekLastTargetPos) then { + if (_seekLastTargetPos) then { // if enabled for the ammo, store last known position TRACE_1("saving current pos",_seekLastTargetPos); _lastKnownPosState set [1, _seekerTargetPos]; }; From c4c98696e0a49b0b07669f41b51d2a9e34b9453c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Sat, 12 Nov 2016 23:19:50 +0100 Subject: [PATCH 140/826] ACE_Chemlight_Shield not public (#4612) Changed `ACE_Chemlight_Shield` to `public` from `protected` --- addons/chemlights/CfgWeapons.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/chemlights/CfgWeapons.hpp b/addons/chemlights/CfgWeapons.hpp index de5fc8aea5..c182ded34b 100644 --- a/addons/chemlights/CfgWeapons.hpp +++ b/addons/chemlights/CfgWeapons.hpp @@ -44,7 +44,7 @@ class CfgWeapons { descriptionShort = CSTRING(Shield_Empty_DescriptionShort); model = "\A3\weapons_F\ammo\mag_univ.p3d"; picture = QPATHTOF(UI\ace_chemlight_shield_x_ca.paa); - scope = 1; + scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; }; From 76eea8924f0468c90fed5546ce04e1f960be202a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 12 Nov 2016 16:37:41 -0600 Subject: [PATCH 141/826] Invert logic for isRefueling --- addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf index 687af9e072..2a23b5eb99 100644 --- a/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf +++ b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf @@ -33,7 +33,8 @@ if (_nozzle getVariable [QGVAR(jerryCan), false]) exitWith {}; ["_nozzle", (_args select 0) getVariable [QGVAR(nozzle), objNull], [objNull]] ]; - if (_unit getVariable [QGVAR(isRefueling), false]) exitWith { + if (!(_unit getVariable [QGVAR(isRefueling), false])) exitWith { + TRACE_1("player not isRefueling",_unit); [_pfID] call CBA_fnc_removePerFrameHandler; }; From 3935299e3ca8ab16d421de9160d878295d5768fd Mon Sep 17 00:00:00 2001 From: Daniel Jupp Date: Sat, 12 Nov 2016 17:52:17 -0600 Subject: [PATCH 142/826] Fix cargo find nearest vehicle (#4592) * Inital Commit * read function call change added object to exclude to function call * Removed TODO comment --- addons/cargo/functions/fnc_canLoad.sqf | 2 +- addons/cargo/functions/fnc_canLoadItemIn.sqf | 5 +++ .../functions/fnc_findNearestVehicle.sqf | 32 +++++++++++-------- addons/cargo/functions/fnc_startLoadIn.sqf | 2 +- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/addons/cargo/functions/fnc_canLoad.sqf b/addons/cargo/functions/fnc_canLoad.sqf index f576ea3e79..e0fd172eef 100644 --- a/addons/cargo/functions/fnc_canLoad.sqf +++ b/addons/cargo/functions/fnc_canLoad.sqf @@ -21,7 +21,7 @@ TRACE_2("params",_player,_object); if (!([_player, _object, []] call EFUNC(common,canInteractWith))) exitWith {false}; -private _nearestVehicle = [_player] call FUNC(findNearestVehicle); +private _nearestVehicle = [_player, _object] call FUNC(findNearestVehicle); if (_nearestVehicle isKindOf "Cargo_Base_F" || isNull _nearestVehicle) then { { diff --git a/addons/cargo/functions/fnc_canLoadItemIn.sqf b/addons/cargo/functions/fnc_canLoadItemIn.sqf index e2bb1ecc4d..77a230108c 100644 --- a/addons/cargo/functions/fnc_canLoadItemIn.sqf +++ b/addons/cargo/functions/fnc_canLoadItemIn.sqf @@ -20,6 +20,11 @@ params [["_item", "", [objNull,""]], "_vehicle"]; if (speed _vehicle > 1 || {((getPos _vehicle) select 2) > 3}) exitWith {TRACE_1("vehicle not stable",_vehicle); false}; +if (_item isEqualType objNull && {{alive _x && {getText (configFile >> "CfgVehicles" >> typeOf _x >> "simulation") != "UAVPilot"}} count crew _item > 0}) exitWith { + TRACE_1("item is occupied",_item); + false +}; + private _itemSize = [_item] call FUNC(getSizeItem); private _validItem = false; if (_item isEqualType "") then { diff --git a/addons/cargo/functions/fnc_findNearestVehicle.sqf b/addons/cargo/functions/fnc_findNearestVehicle.sqf index 6d5b7ce1a8..7981782255 100644 --- a/addons/cargo/functions/fnc_findNearestVehicle.sqf +++ b/addons/cargo/functions/fnc_findNearestVehicle.sqf @@ -1,35 +1,41 @@ /* * Author: Glowbal - * Get nearest vehicle from unit, priority: Car-Air-Tank-Ship. + * Get nearest vehicle from unit that is not excluded, priority: Car-Air-Tank-Ship. * * Arguments: * 0: Unit + * 1: Object to exclude * * Return Value: * Vehicle in Distance * * Example: - * [unit] call ace_cargo_fnc_findNearestVehicle + * [unit, object] call ace_cargo_fnc_findNearestVehicle * * Public: No */ #include "script_component.hpp" -params ["_unit"]; +params ["_unit","_object"]; -private _loadCar = nearestObject [_unit, "car"]; -if (_unit distance _loadCar <= MAX_LOAD_DISTANCE) exitWith {_loadCar}; +private _loadCar = nearestObjects [_unit, ["car"], MAX_LOAD_DISTANCE]; +_loadCar deleteAt (_loadCar find _object); +if !(_loadCar isEqualTo []) exitWith {_loadCar select 0}; -private _loadHelicopter = nearestObject [_unit, "air"]; -if (_unit distance _loadHelicopter <= MAX_LOAD_DISTANCE) exitWith {_loadHelicopter}; +private _loadHelicopter = nearestObjects [_unit, ["air"], MAX_LOAD_DISTANCE]; +_loadHelicopter deleteAt (_loadHelicopter find _object); +if !(_loadHelicopter isEqualTo []) exitWith {_loadHelicopter select 0}; -private _loadTank = nearestObject [_unit, "tank"]; -if (_unit distance _loadTank <= MAX_LOAD_DISTANCE) exitWith {_loadTank}; +private _loadTank = nearestObjects [_unit, ["tank"], MAX_LOAD_DISTANCE]; +_loadTank deleteAt (_loadTank find _object); +if !(_loadTank isEqualTo []) exitWith {_loadTank select 0}; -private _loadShip = nearestObject [_unit, "ship"]; -if (_unit distance _loadShip <= MAX_LOAD_DISTANCE) exitWith {_loadShip}; +private _loadShip = nearestObjects [_unit, ["ship"], MAX_LOAD_DISTANCE]; +_loadShip deleteAt (_loadShip find _object);; +if !(_loadShip isEqualTo []) exitWith {_loadShip select 0}; -private _loadContainer = nearestObject [_unit,"Cargo_base_F"]; -if (_unit distance _loadContainer <= MAX_LOAD_DISTANCE) exitWith {_loadContainer}; +private _loadContainer = nearestObjects [_unit, ["Cargo_base_F"], MAX_LOAD_DISTANCE]; +_loadContainer deleteAt (_loadContainer find _object); +if !(_loadContainer isEqualTo []) exitWith {_loadContainer select 0}; objNull diff --git a/addons/cargo/functions/fnc_startLoadIn.sqf b/addons/cargo/functions/fnc_startLoadIn.sqf index 466471c375..8af411bddd 100644 --- a/addons/cargo/functions/fnc_startLoadIn.sqf +++ b/addons/cargo/functions/fnc_startLoadIn.sqf @@ -19,7 +19,7 @@ params ["_player", "_object"]; TRACE_2("params",_player,_object); -private _vehicle = [_player] call FUNC(findNearestVehicle); +private _vehicle = [_player, _object] call FUNC(findNearestVehicle); if ((isNull _vehicle) || {_vehicle isKindOf "Cargo_Base_F"}) then { { From e32bca3d140d22f59c5c88ea384fb70e248977d5 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 12 Nov 2016 19:39:40 -0600 Subject: [PATCH 143/826] Don't compile action menu for playable logics (#4666) Fix #4664 --- addons/interact_menu/functions/fnc_compileMenu.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 78232af4e2..225ebc59b4 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -99,6 +99,11 @@ private _recurseFnc = { _actions }; +if ((getNumber (configFile >> "CfgVehicles" >> _objectType >> "isPlayableLogic")) == 1) exitWith { + TRACE_1("skipping playable logic",_objectType); + _namespace setVariable [_objectType, []]; +}; + private _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; TRACE_1("Building ACE_Actions",_objectType); From b3e313f52b4601ab797983f7fefb8ff586abb052 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 13 Nov 2016 10:55:57 -0600 Subject: [PATCH 144/826] Use vehicle eh to hide bar --- addons/advanced_fatigue/XEH_postInit.sqf | 9 ++++++--- .../advanced_fatigue/functions/fnc_handleStaminaBar.sqf | 5 ----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index dd68a843c0..f64f0a5a81 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -13,10 +13,13 @@ if (!hasInterface) exitWith {}; // - GVAR updating and initialization ----------------------------------------- ["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; - ["visibleMap", { + + private _fnc_showStaminaBar = { private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; - _staminaBarContainer ctrlShow (!visibleMap); - }, true] call CBA_fnc_addPlayerEventHandler; + _staminaBarContainer ctrlShow ((!visibleMap) && {(vehicle ACE_player) == ACE_player}); + }; + ["visibleMap", _fnc_showStaminaBar, true] call CBA_fnc_addPlayerEventHandler; + ["vehicle", _fnc_showStaminaBar, true] call CBA_fnc_addPlayerEventHandler; // - Duty factors ------------------------------------------------------------- if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { diff --git a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf index 476fd23799..2f865ac821 100644 --- a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf @@ -13,11 +13,6 @@ params ["_stamina"]; private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; -if ((vehicle ACE_player) != ACE_player) exitWith { // Hide when mounted - _staminaBarContainer ctrlSetFade 1; - _staminaBarContainer ctrlCommit 1; -}; - // - Size --------------------------------------------------------------------- // Shrink the container to cut off the image (other wise it would just get stretched) private _posAndSize = ctrlPosition _staminaBarContainer; From 6f640ddc4513323aa13f97f6991978fbf61fc982 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 13 Nov 2016 10:56:45 -0600 Subject: [PATCH 145/826] spaces --- addons/advanced_fatigue/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index f64f0a5a81..57be761607 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -13,7 +13,7 @@ if (!hasInterface) exitWith {}; // - GVAR updating and initialization ----------------------------------------- ["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; - + private _fnc_showStaminaBar = { private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; _staminaBarContainer ctrlShow ((!visibleMap) && {(vehicle ACE_player) == ACE_player}); From 95699f267cf498d04ba50b42cdbf1d9c5b90b79d Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 14 Nov 2016 12:13:41 -0600 Subject: [PATCH 146/826] Use head direction for drawing microdag wp --- addons/microdagr/functions/fnc_mapOnDrawEH.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf index 92d647f348..b3b28775d9 100644 --- a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf +++ b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf @@ -42,7 +42,7 @@ if (GVAR(currentApplicationPage) == 1) then { }; }; if ((count _targetPos) == 3) then { - _relBearing = [ACE_player, _targetPos] call BIS_fnc_relativeDirTo; + _relBearing = (ACE_player getDir _targetPos) - (([ACE_player] call CBA_fnc_headDir) select 0); _theMap drawIcon [QUOTE(PATHTO_R(images\compass_needle.paa)), [1,0.564,0.564,1], DUMMY_POS, _size, _size, _relBearing, '', 0 ]; }; }; From a4c6daef505f32a9682caa73a9aaa19f308512fd Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Mon, 14 Nov 2016 19:24:21 +0100 Subject: [PATCH 147/826] Fix AF for adjusted stances, fixes #4591 --- addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf index b91e8a09bf..106ae0c16e 100644 --- a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf +++ b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf @@ -22,7 +22,7 @@ private _animType = _animName select [1, 3]; GVAR(isSwimming) = false; -if (_animType in ["idl", "mov"]) then { +if (_animType in ["idl", "mov", "adj"]) then { switch (_animName select [5, 3]) do { case ("knl"): { _duty = 1.5; From 2e81f7c10422aa922e47f5c4f06a310098182740 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 13 Nov 2016 18:09:28 +0100 Subject: [PATCH 148/826] Ballistics - Overworked .408 CheyTac based on new JBM Ballistics data * Added 419gr and 305gr variants (vanilla ammo == 419gr) * Muzzle velocities from http://www.cheytac.com * G7 BCs from http://www.jbmballistics.com/ --- addons/atragmx/XEH_postInit.sqf | 65 +++++++++++++++--------------- addons/ballistics/CfgAmmo.hpp | 35 +++++++++++----- addons/ballistics/CfgMagazines.hpp | 12 ++++++ addons/ballistics/CfgVehicles.hpp | 4 ++ addons/ballistics/CfgWeapons.hpp | 4 ++ addons/ballistics/stringtable.xml | 39 ++++++++++++++++++ extras/airFrictionAnalysis.txt | 18 ++++++--- 7 files changed, 131 insertions(+), 46 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 9d4c903b06..9c3ce012e3 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -6,47 +6,48 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation, Persistent - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657485, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657485, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" , [[-15,833],[0,840],[10,847],[15,852],[25,866],[30,875],[35,886]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" , [[-15,873],[0,880],[10,887],[15,892],[25,906],[30,915],[35,926]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" , [[-15,833],[0,840],[10,847],[15,852],[25,866],[30,875],[35,886]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" , [[-15,873],[0,880],[10,887],[15,892],[25,906],[30,915],[35,926]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" , [[-15,297],[0,298],[10,299],[15,299],[25,301],[30,302],[35,303]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - - [".50 Beowulf" , 563, 100, 0.0657485, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" , [[-15,560],[0,561],[10,562],[15,562],[25,564],[30,565],[35,566]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" , [[-15,297],[0,298],[10,299],[15,299],[25,301],[30,302],[35,303]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".408 Chey Tac" , 910, 100, 0.0569400, -0.00038944, 3.81, 0, 2, 10, 120, 0, 0, 26.57, 10.4, 33.02, 0.970, 1, "ASM" , [[-15,883],[0,890],[10,897],[15,902],[25,916],[30,925],[35,936]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".50 Beowulf" , 563, 100, 0.0657485, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" , [[-15,560],[0,561],[10,562],[15,562],[25,564],[30,565],[35,566]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["9.3×64mm" , 870, 100, 0.0619295, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" , [[-15,843],[0,850],[10,857],[15,862],[25,876],[30,885],[35,896]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".408 CheyTac 305gr", 1067, 100, 0.0482451, -0.00063655, 3.81, 0, 2, 10, 120, 0, 0, 19.76, 10.4, 33.02, 0.569, 1, "ICAO", [[-15,1040],[0,1047],[10,1054],[15,1059],[25,1073],[30,1082],[35,1093]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".408 CheyTac 419gr", 867, 100, 0.0613501, -0.00044958, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.866, 1, "ICAO", [[-15,840],[0,847],[10,854],[15,859],[25,873],[30,882],[35,893]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".338LM 250gr" , 880, 100, 0.0598469, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.645, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".338LM 300gr" , 800, 100, 0.0677343, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.759, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".338LM API526" , 880, 100, 0.0588865, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.760, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["9.3×64mm" , 870, 100, 0.0619295, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" , [[-15,843],[0,850],[10,857],[15,862],[25,876],[30,885],[35,896]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".300WM Mk248 Mod0" , 900, 100, 0.0584442, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.537, 1, "ICAO", [[-15,838],[0,845],[10,852],[15,857],[25,871],[30,880],[35,891]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".300WM Mk248 Mod1" , 867, 100, 0.0610738, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.619, 1, "ICAO", [[-15,820],[0,827],[10,834],[15,839],[25,853],[30,862],[35,873]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".300WM Berger OTM" , 853, 100, 0.0622179, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.715, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".338LM 250gr" , 880, 100, 0.0598469, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.645, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".338LM 300gr" , 800, 100, 0.0677343, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.759, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".338LM API526" , 880, 100, 0.0588865, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.760, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x54mmR" , 820, 100, 0.0691878, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO", [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".300WM Mk248 Mod0" , 900, 100, 0.0584442, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.537, 1, "ICAO", [[-15,838],[0,845],[10,852],[15,857],[25,871],[30,880],[35,891]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".300WM Mk248 Mod1" , 867, 100, 0.0610738, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.619, 1, "ICAO", [[-15,820],[0,827],[10,834],[15,839],[25,853],[30,862],[35,873]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".300WM Berger OTM" , 853, 100, 0.0622179, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.715, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm M80" , 810, 100, 0.0679374, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 25.40, 0.398, 1, "ICAO", [[-15,783],[0,790],[10,797],[15,802],[25,816],[30,825],[35,836]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm M118LR" , 765, 100, 0.0710319, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.482, 1, "ICAO", [[-15,738],[0,745],[10,752],[15,757],[25,771],[30,780],[35,791]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm Mk316" , 782, 100, 0.0710319, -0.00082029, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.483, 1, "ICAO", [[-15,777],[0,778],[10,779],[15,781],[25,783],[30,785],[35,787]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm Mk319" , 901, 100, 0.0584524, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO", [[-15,898],[0,899],[10,900],[15,900],[25,902],[30,903],[35,904]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm M993" , 920, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO", [[-15,893],[0,900],[10,907],[15,912],[25,926],[30,935],[35,946]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm Subsonic", 315, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.502, 1, "ICAO", [[-15,312],[0,313],[10,314],[15,314],[25,316],[30,317],[35,318]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x54mmR" , 820, 100, 0.0691878, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO", [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + + ["7.62x51mm M80" , 810, 100, 0.0679374, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 25.40, 0.398, 1, "ICAO", [[-15,783],[0,790],[10,797],[15,802],[25,816],[30,825],[35,836]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm M118LR" , 765, 100, 0.0710319, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.482, 1, "ICAO", [[-15,738],[0,745],[10,752],[15,757],[25,771],[30,780],[35,791]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm Mk316" , 782, 100, 0.0710319, -0.00082029, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.483, 1, "ICAO", [[-15,777],[0,778],[10,779],[15,781],[25,783],[30,785],[35,787]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm Mk319" , 901, 100, 0.0584524, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO", [[-15,898],[0,899],[10,900],[15,900],[25,902],[30,903],[35,904]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm M993" , 920, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO", [[-15,893],[0,900],[10,907],[15,912],[25,926],[30,935],[35,946]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm Subsonic", 315, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.502, 1, "ICAO", [[-15,312],[0,313],[10,314],[15,314],[25,316],[30,317],[35,318]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + + ["6.5x39mm" , 774, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.524, 1, "ICAO", [[-15,747],[0,754],[10,761],[15,766],[25,780],[30,789],[35,800]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["6.5x47mm Lapua" , 775, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.577, 1, "ICAO", [[-15,748],[0,755],[10,762],[15,767],[25,781],[30,790],[35,801]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["6.5mm Creedmor" , 830, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.632, 1, "ICAO", [[-15,803],[0,810],[10,817],[15,822],[25,836],[30,845],[35,856]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + + ["5.8x42mm DBP87" , 950, 100, 0.0572574, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.313, 1, "ICAO", [[-15,923],[0,930],[10,937],[15,942],[25,956],[30,965],[35,976]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + + ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.302, 1, "ASM" , [[-15,843],[0,849],[10,857],[15,862],[25,876],[30,885],[35,898]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" , [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" , [[-15,842],[0,849],[10,856],[15,861],[25,875],[30,884],[35,895]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["6.5x39mm" , 774, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.524, 1, "ICAO", [[-15,747],[0,754],[10,761],[15,766],[25,780],[30,789],[35,800]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["6.5x47mm Lapua" , 775, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.577, 1, "ICAO", [[-15,748],[0,755],[10,762],[15,767],[25,781],[30,790],[35,801]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["6.5mm Creedmor" , 830, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.632, 1, "ICAO", [[-15,803],[0,810],[10,817],[15,822],[25,836],[30,845],[35,856]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - - ["5.8x42mm DBP87" , 950, 100, 0.0572574, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.313, 1, "ICAO", [[-15,923],[0,930],[10,937],[15,942],[25,956],[30,965],[35,976]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - - ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.302, 1, "ASM" , [[-15,843],[0,849],[10,857],[15,862],[25,876],[30,885],[35,898]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" , [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" , [[-15,842],[0,849],[10,856],[15,861],[25,875],[30,884],[35,895]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.45x39mm 7N6M" , 735, 100, 0.0787205, -0.00116278, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.336, 1, "ICAO", [[-15,708],[0,715],[10,722],[15,727],[25,741],[30,750],[35,761]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true]]; [] call FUNC(clear_user_data); diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 5fc2168b84..04bfb45643 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -601,19 +601,36 @@ class CfgAmmo { }; class B_408_Ball : BulletBase { timeToLive=10; - airFriction=-0.00038944; - typicalSpeed=910; - tracerScale = 1.3; //1.2; + airFriction=-0.00044958; + typicalSpeed=867; + tracerScale = 1.3; ACE_caliber=10.363; - ACE_bulletLength=54.0; - ACE_bulletMass=26.568; + ACE_bulletLength=55.1942; + ACE_bulletMass=27.1507; // 419 gr ACE_transonicStabilityCoef=1; ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.97}; + ACE_ballisticCoefficients[]={0.434}; ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={910}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={867}; + ACE_barrelLengths[]={736.6}; + }; + class ACE_408_Ball : BulletBase { + timeToLive=10; + airFriction=-0.00063655; + typicalSpeed=1067; + tracerScale = 1.3; + ACE_caliber=10.363; + ACE_bulletLength=41.4528; + ACE_bulletMass=19.7637; // 305 gr + ACE_transonicStabilityCoef=1; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.279}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={1067}; ACE_barrelLengths[]={736.6}; }; class ACE_106x83mm_Ball : B_408_Ball { diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index ef690b41aa..072fedde3c 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -286,6 +286,18 @@ class CfgMagazines { descriptionShort = CSTRING(10Rnd_338_API526_Mag_Description); initSpeed = 880; }; + + class 7Rnd_408_Mag: CA_Magazine { + initSpeed = 867; + }; + class ACE_7Rnd_408_305gr_Mag: 7Rnd_408_Mag { + author = ECSTRING(common,ACETeam); + ammo = "ACE_408_Ball"; + displayName = CSTRING(7Rnd_408_305gr_Mag_Name); + displayNameShort = CSTRING(7Rnd_408_305gr_Mag_NameShort); + descriptionShort = CSTRING(7Rnd_408_305gr_Mag_Description); + initSpeed = 1067; + }; class 5Rnd_127x108_Mag; class ACE_5Rnd_127x99_Mag: 5Rnd_127x108_Mag { diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index bb50dcdc2e..7a4dd477d3 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -26,6 +26,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,1); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); + MACRO_ADDMAGAZINE(ACE_7Rnd_408_305gr_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_API_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4); @@ -46,6 +47,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); + MACRO_ADDMAGAZINE(ACE_7Rnd_408_305gr_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_API_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4); @@ -67,6 +69,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M993_AP_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); + MACRO_ADDMAGAZINE(ACE_7Rnd_408_305gr_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_API_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4); @@ -221,6 +224,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); + MACRO_ADDMAGAZINE(ACE_7Rnd_408_305gr_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_API_Mag,4); MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 3cbf8de544..07ab255365 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -541,6 +541,10 @@ class CfgWeapons { }; */ class srifle_LRR_F: LRR_base_F { + magazines[] = { + "7Rnd_408_Mag", + "ACE_7Rnd_408_305gr_Mag" + }; initSpeed = -1.0; ACE_barrelTwist=330.2; ACE_barrelLength=736.6; diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 08325cad96..a9cab83480 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -1686,6 +1686,45 @@ Kaliber: 8,6x70mm (API526)<br />Lövedékek: 10 口径: 8.6x70mm (API526)&lt;br /&gt;装填数: 10 + + .408 7Rnd Mag (305gr) + Ch. .408 7Cps (305gr) + Cargador de 7 balas de .408 (305gr) + Magazynek .408 7rd (305gr) + Магазин из 7-ти .408 (305gr) + .408 7-Patronen-Magazin (305gr) + .408 7Rnd Mag (305gr) + .408 7náb. Zásobník (305gr) + Carregador .408 (305gr) com 7 cartuchos + .408 7-lövedékes tár (305gr) + .408 7発入り 弾倉 (305gr) + + + .408 + .408 + .408 + .408 + .408 + .408 + .408 + .408 + .408 + .408 + .408 + + + Caliber: .408 CheyTac (305gr)<br />Rounds: 7 + Calibre: .408 CheyTac (305gr)<br />Cartouches: 7 + Calibre: .408 CheyTac (305gr)<br />Balas: 7 + Kaliber: .408 CheyTac (305gr)<br />Pociski: 7 + Калибр: .408 CheyTac (305gr)<br />Патронов: 7 + Kaliber: .408 CheyTac (305gr)<br />Patronen: 7 + Calibro: .408 CheyTac (305gr)<br />Munizioni: 7 + Ráže: .408 CheyTac (305gr)<br />Nábojů: 7 + Calibre: .408 CheyTac (305gr)<br/>Cartuchos: 7 + Kaliber: .408 CheyTac (305gr)<br />Lövedékek: 7 + 口径: .408 CheyTac (305gr)&lt;br /&gt;装填数: 7 + 12.7x99mm 5Rnd Mag Ch. 12.7x99mm 5Cps diff --git a/extras/airFrictionAnalysis.txt b/extras/airFrictionAnalysis.txt index 0f825e55d5..1e91e50f2b 100644 --- a/extras/airFrictionAnalysis.txt +++ b/extras/airFrictionAnalysis.txt @@ -209,11 +209,19 @@ Optimal airFriction: 0.00108571 ########################################## Ammo Class: B_408_Ball MaxRanges (m): [1600, 1600] -MuzzleVelocities (m/s): [905, 915] -Max. velocity difference (m/s): 19.47 -Max. drop difference (cm): 9.17 -Max. tof difference (ms): 22.0 -Optimal airFriction: 0.00038944 +MuzzleVelocities (m/s): [862, 872] +Max. velocity difference (m/s): 28.15 +Max. drop difference (cm): 15.97 +Max. tof difference (ms): 77.0 +Optimal airFriction: 0.00044958 +########################################## +Ammo Class: ACE_408_Ball +MaxRanges (m): [1200, 1200] +MuzzleVelocities (m/s): [1057, 1067] +Max. velocity difference (m/s): 37.45 +Max. drop difference (cm): 7.45 +Max. tof difference (ms): 56.0 +Optimal airFriction: 0.00063655 ########################################## Ammo Class: ACE_106x83mm_Ball MaxRanges (m): [1400, 1400] From 608f8bbfdc8d6268fc06f3966719588dae079dd5 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 13 Nov 2016 18:10:00 +0100 Subject: [PATCH 149/826] ATragMX - Added 7.62x39mm ammo to gun profile --- addons/atragmx/XEH_postInit.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index 9c3ce012e3..a0b4f18424 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -37,6 +37,8 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == ["7.62x51mm M993" , 920, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO", [[-15,893],[0,900],[10,907],[15,912],[25,926],[30,935],[35,946]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], ["7.62x51mm Subsonic", 315, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.502, 1, "ICAO", [[-15,312],[0,313],[10,314],[15,314],[25,316],[30,317],[35,318]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x39mm" , 716, 100, 0.0829603, -0.00151621, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 7.82, 25.40, 0.275, 1, "ICAO", [[-15,689],[0,696],[10,703],[15,708],[25,722],[30,731],[35,742]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["6.5x39mm" , 774, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.524, 1, "ICAO", [[-15,747],[0,754],[10,761],[15,766],[25,780],[30,789],[35,800]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], ["6.5x47mm Lapua" , 775, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.577, 1, "ICAO", [[-15,748],[0,755],[10,762],[15,767],[25,781],[30,790],[35,801]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], ["6.5mm Creedmor" , 830, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.632, 1, "ICAO", [[-15,803],[0,810],[10,817],[15,822],[25,836],[30,845],[35,856]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], From e4a4d8f56dbca894725e4507dbffb4c9b2468107 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Mon, 14 Nov 2016 21:54:51 +0100 Subject: [PATCH 150/826] Tweaked prone animation duty --- addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf index 106ae0c16e..21eec5a88b 100644 --- a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf +++ b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf @@ -28,7 +28,7 @@ if (_animType in ["idl", "mov", "adj"]) then { _duty = 1.5; }; case ("pne"): { - _duty = 12; + _duty = 10; }; default { _duty = 1; From 1d8030d196d195b755dad0fba1166cf48b9b5c28 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Mon, 14 Nov 2016 21:55:26 +0100 Subject: [PATCH 151/826] Tweaked fatigue in water --- .../advanced_fatigue/functions/fnc_getAnimDuty.sqf | 12 +++++++++--- .../advanced_fatigue/functions/fnc_handleEffects.sqf | 10 +++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf index 21eec5a88b..3698ff9113 100644 --- a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf +++ b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf @@ -47,9 +47,15 @@ if (_animType in ["idl", "mov", "adj"]) then { }; } else { // swimming and diving - if (_animType in ["swm", "ssw", "bsw", "dve", "sdv", "bdv"]) then { - _duty = 5; - GVAR(isSwimming) = true; + switch (true) do { + case (_animType in ["swm", "ssw", "bsw"]): { + _duty = 6.5; + GVAR(isSwimming) = true; + }; + case (_animType in ["dve", "sdv", "bdv"]): { + _duty = 2.5; + GVAR(isSwimming) = true; + }; }; }; diff --git a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf index 1ecfb34a88..111727c826 100644 --- a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf @@ -58,7 +58,15 @@ if (GVAR(ppeBlackoutLast) == 1) then { // - Physical effects --------------------------------------------------------- if (GVAR(isSwimming)) exitWith { - _unit setAnimSpeedCoef (1 - _fatigue / 3); + _unit setAnimSpeedCoef linearConversion [0.7, 0.9, _fatigue, 1, 0.5, true]; + + if ((isSprintAllowed _unit) && {_fatigue > 0.7}) then { + [_unit, "blockSprint", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); + } else { + if ((!isSprintAllowed _unit) && {_fatigue < 0.7}) then { + [_unit, "blockSprint", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set); + }; + }; }; if ((getAnimSpeedCoef _unit) != 1) then { _unit setAnimSpeedCoef 1; From 4bb02a320bd2e5db1c322c56d18a23fad939b42c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 14 Nov 2016 20:19:24 -0600 Subject: [PATCH 152/826] Run attack profile even if no target --- .../functions/fnc_attackProfile_JAV_DIR.sqf | 2 ++ .../functions/fnc_attackProfile_JAV_TOP.sqf | 2 ++ addons/missileguidance/functions/fnc_attackProfile_LIN.sqf | 2 ++ addons/missileguidance/functions/fnc_guidancePFH.sqf | 7 ++++--- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf index 4740bf6f0f..e709aed112 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_DIR.sqf @@ -27,6 +27,8 @@ params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; _args params ["_firedEH"]; _firedEH params ["_shooter","","","","","","_projectile"]; +if (_seekerTargetPos isEqualTo [0,0,0]) exitWith {_seekerTargetPos}; + if (_attackProfileStateParams isEqualTo []) then { _attackProfileStateParams set [0, STAGE_LAUNCH]; }; diff --git a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf index 06ef934ea5..0e502c9c21 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_JAV_TOP.sqf @@ -27,6 +27,8 @@ params ["_seekerTargetPos", "_args", "_attackProfileStateParams"]; _args params ["_firedEH"]; _firedEH params ["_shooter","","","","","","_projectile"]; +if (_seekerTargetPos isEqualTo [0,0,0]) exitWith {_seekerTargetPos}; + if (_attackProfileStateParams isEqualTo []) then { _attackProfileStateParams set [0, STAGE_LAUNCH]; }; diff --git a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf index 58d2768607..de8061a27c 100644 --- a/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf +++ b/addons/missileguidance/functions/fnc_attackProfile_LIN.sqf @@ -22,6 +22,8 @@ params ["_seekerTargetPos", "_args"]; _args params ["_firedEH"]; _firedEH params ["_shooter","","","","","","_projectile"]; +if (_seekerTargetPos isEqualTo [0,0,0]) exitWith {_seekerTargetPos}; + private _shooterPos = getPosASL _shooter; private _projectilePos = getPosASL _projectile; diff --git a/addons/missileguidance/functions/fnc_guidancePFH.sqf b/addons/missileguidance/functions/fnc_guidancePFH.sqf index e7fe71ca39..45db7c536b 100644 --- a/addons/missileguidance/functions/fnc_guidancePFH.sqf +++ b/addons/missileguidance/functions/fnc_guidancePFH.sqf @@ -52,10 +52,11 @@ private _projectilePos = getPosASL _projectile; // Run seeker function: private _seekerTargetPos = [[0,0,0], _args, _seekerStateParams, _lastKnownPosState] call FUNC(doSeekerSearch); +// Run attack profile function: +private _profileAdjustedTargetPos = [_seekerTargetPos, _args, _attackProfileStateParams] call FUNC(doAttackProfile); + // If we have no seeker target, then do not change anything -if (!(_seekerTargetPos isEqualTo [0,0,0])) then { - // Run attack profile function: - private _profileAdjustedTargetPos = [_seekerTargetPos, _args, _attackProfileStateParams] call FUNC(doAttackProfile); +if (!(_profileAdjustedTargetPos isEqualTo [0,0,0])) then { private _targetVector = _projectilePos vectorFromTo _profileAdjustedTargetPos; private _adjustVector = _targetVector vectorDiff (vectorDir _projectile); From 324bf68614375d9f55b604a690c194ce43a8d030 Mon Sep 17 00:00:00 2001 From: Remco Speekenbrink Date: Tue, 15 Nov 2016 13:07:48 +0100 Subject: [PATCH 153/826] Add Zeus utility modules - Add categories to zeus modules to group them based on their functionality - Add new utility modules: 1. Toggle simulation 2. Update editable objects - Clean up some of the zeus module code (standardise function headers, camel case, etc.) --- addons/zeus/CfgFactionClasses.hpp | 27 ++++++++ addons/zeus/CfgVehicles.hpp | 27 ++++++++ addons/zeus/XEH_PREP.hpp | 2 + addons/zeus/XEH_postInit.sqf | 23 +++++++ addons/zeus/config.cpp | 3 + .../zeus/functions/fnc_bi_moduleCurator.sqf | 4 +- addons/zeus/functions/fnc_bi_moduleMine.sqf | 2 +- .../functions/fnc_bi_moduleProjectile.sqf | 2 +- .../functions/fnc_bi_moduleRemoteControl.sqf | 2 +- .../functions/fnc_handleZeusUnitAssigned.sqf | 2 +- addons/zeus/functions/fnc_moduleCaptive.sqf | 2 +- .../functions/fnc_moduleGlobalSetSkill.sqf | 5 +- addons/zeus/functions/fnc_moduleGroupSide.sqf | 2 +- .../zeus/functions/fnc_moduleSearchNearby.sqf | 2 +- addons/zeus/functions/fnc_moduleSetMedic.sqf | 2 +- .../fnc_moduleSetMedicalFacility.sqf | 2 +- .../functions/fnc_moduleSetMedicalVehicle.sqf | 2 +- .../zeus/functions/fnc_moduleSimulation.sqf | 27 ++++++++ addons/zeus/functions/fnc_moduleSurrender.sqf | 2 +- .../functions/fnc_moduleTeleportPlayers.sqf | 2 +- .../zeus/functions/fnc_moduleUnconscious.sqf | 2 +- .../zeus/functions/fnc_moduleZeusSettings.sqf | 2 +- .../zeus/functions/fnc_ui_attributeCargo.sqf | 7 +- .../functions/fnc_ui_attributePosition.sqf | 6 +- .../zeus/functions/fnc_ui_attributeRadius.sqf | 4 +- addons/zeus/functions/fnc_ui_defendArea.sqf | 6 +- .../zeus/functions/fnc_ui_editableObjects.sqf | 65 +++++++++++++++++++ .../zeus/functions/fnc_ui_globalSetSkill.sqf | 13 ++-- addons/zeus/functions/fnc_ui_groupSide.sqf | 13 ++-- addons/zeus/functions/fnc_ui_patrolArea.sqf | 6 +- addons/zeus/functions/fnc_ui_searchArea.sqf | 6 +- .../zeus/functions/fnc_ui_teleportPlayers.sqf | 13 ++-- addons/zeus/functions/fnc_zeusAttributes.sqf | 2 +- addons/zeus/stringtable.xml | 22 ++++++- addons/zeus/ui/RscAttributes.hpp | 53 +++++++++++++++ 35 files changed, 288 insertions(+), 74 deletions(-) create mode 100644 addons/zeus/CfgFactionClasses.hpp create mode 100644 addons/zeus/functions/fnc_moduleSimulation.sqf create mode 100644 addons/zeus/functions/fnc_ui_editableObjects.sqf diff --git a/addons/zeus/CfgFactionClasses.hpp b/addons/zeus/CfgFactionClasses.hpp new file mode 100644 index 0000000000..7d758adfc0 --- /dev/null +++ b/addons/zeus/CfgFactionClasses.hpp @@ -0,0 +1,27 @@ +class CfgFactionClasses { + class GVAR(AI) { + displayName = "ACE AI"; + priority = 2; + side = 7; + }; + class GVAR(Captive) { + displayName = "ACE Captive"; + priority = 2; + side = 7; + }; + class GVAR(Medical) { + displayName = "ACE Medical"; + priority = 2; + side = 7; + }; + class GVAR(Repair) { + displayName = "ACE Repair"; + priority = 2; + side = 7; + }; + class GVAR(Utility) { + displayName = "ACE Utility"; + priority = 2; + side = 7; + }; +}; diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 4ab9ad871c..22d827e16f 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -94,82 +94,109 @@ class CfgVehicles { }; class GVAR(moduleAddSpareTrack): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Repair); displayName = CSTRING(ModuleAddSpareTrack_DisplayName); function = QFUNC(moduleAddSpareTrack); icon = QPATHTOF(UI\Icon_Module_Zeus_Medic_ca.paa);//@todo }; class GVAR(moduleAddSpareWheel): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Repair); displayName = CSTRING(ModuleAddSpareWheel_DisplayName); function = QFUNC(moduleAddSpareWheel); icon = QPATHTOF(UI\Icon_Module_Zeus_Medic_ca.paa);//@todo }; class GVAR(moduleCaptive): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Captive); displayName = CSTRING(ModuleCaptive_DisplayName); function = QFUNC(moduleCaptive); icon = QPATHTOF(UI\Icon_Module_Zeus_Captive_ca.paa); }; class GVAR(moduleDefendArea): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(AI); displayName = CSTRING(ModuleDefendArea_DisplayName); curatorInfoType = QGVAR(RscDefendArea); }; + class GVAR(moduleEditableObjects): GVAR(moduleBase) { + curatorCanAttach = 1; + category = QGVAR(Utility); + displayName = CSTRING(ModuleEditableObjects_DisplayName); + curatorInfoType = QGVAR(RscEditableObjects); + }; class GVAR(moduleGlobalSetSkill): GVAR(moduleBase) { + category = QGVAR(AI); displayName = CSTRING(ModuleGlobalSetSkill_DisplayName); curatorInfoType = QGVAR(RscGlobalSetSkill); }; class GVAR(moduleGroupSide): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Utility); displayName = CSTRING(ModuleGroupSide_DisplayName); curatorInfoType = QGVAR(RscGroupSide); }; class GVAR(modulePatrolArea): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(AI); displayName = CSTRING(ModulePatrolArea_DisplayName); curatorInfoType = QGVAR(RscPatrolArea); }; class GVAR(moduleSearchArea): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(AI); displayName = CSTRING(ModuleSearchArea_DisplayName); curatorInfoType = QGVAR(RscSearchArea); }; class GVAR(moduleSearchNearby): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(AI); displayName = CSTRING(ModuleSearchNearby_DisplayName); function = QFUNC(moduleSearchNearby); }; class GVAR(moduleSetMedic): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Medical); displayName = CSTRING(ModuleSetMedic_DisplayName); function = QFUNC(moduleSetMedic); icon = QPATHTOF(UI\Icon_Module_Zeus_Medic_ca.paa); }; class GVAR(moduleSetMedicalFacility): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Medical); displayName = CSTRING(ModuleSetMedicalFacility_DisplayName); function = QFUNC(moduleSetMedicalFacility); icon = QPATHTOF(UI\Icon_Module_Zeus_Medic_ca.paa); }; class GVAR(moduleSetMedicalVehicle): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Medical); displayName = CSTRING(ModuleSetMedicalVehicle_DisplayName); function = QFUNC(moduleSetMedicalVehicle); icon = QPATHTOF(UI\Icon_Module_Zeus_Medic_ca.paa); }; + class GVAR(moduleSimulation): GVAR(moduleBase) { + curatorCanAttach = 1; + category = QGVAR(Utility); + displayName = CSTRING(ModuleSimulation_DisplayName); + function = QFUNC(moduleSimulation); + }; class GVAR(moduleSurrender): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Captive); displayName = CSTRING(ModuleSurrender_DisplayName); function = QFUNC(moduleSurrender); icon = QPATHTOF(UI\Icon_Module_Zeus_Surrender_ca.paa); }; class GVAR(moduleTeleportPlayers): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Utility); displayName = CSTRING(ModuleTeleportPlayers_DisplayName); curatorInfoType = QGVAR(RscTeleportPlayers); }; class GVAR(moduleUnconscious): GVAR(moduleBase) { curatorCanAttach = 1; + category = QGVAR(Medical); displayName = CSTRING(ModuleUnconscious_DisplayName); function = QFUNC(moduleUnconscious); icon = QPATHTOF(UI\Icon_Module_Zeus_Unconscious_ca.paa); diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp index eb70a8529d..4a54c03920 100644 --- a/addons/zeus/XEH_PREP.hpp +++ b/addons/zeus/XEH_PREP.hpp @@ -14,6 +14,7 @@ PREP(moduleSearchNearby); PREP(moduleSetMedic); PREP(moduleSetMedicalVehicle); PREP(moduleSetMedicalFacility); +PREP(moduleSimulation); PREP(moduleSurrender); PREP(moduleTeleportPlayers); PREP(moduleUnconscious); @@ -22,6 +23,7 @@ PREP(ui_attributeCargo); //PREP(ui_attributePosition); PREP(ui_attributeRadius); PREP(ui_defendArea); +PREP(ui_editableObjects); PREP(ui_globalSetSkill); PREP(ui_groupSide); PREP(ui_patrolArea); diff --git a/addons/zeus/XEH_postInit.sqf b/addons/zeus/XEH_postInit.sqf index 9062ae5e9a..1ddcaf30d8 100644 --- a/addons/zeus/XEH_postInit.sqf +++ b/addons/zeus/XEH_postInit.sqf @@ -14,3 +14,26 @@ QGVAR(GlobalSkillAI) addPublicVariableEventHandler FUNC(moduleGlobalSetSkill); [QGVAR(modulePatrolArea), CBA_fnc_taskPatrol] call CBA_fnc_addEventHandler; [QGVAR(moduleSearchNearby), CBA_fnc_searchNearby] call CBA_fnc_addEventHandler; [QGVAR(moduleSearchArea), CBA_fnc_taskSearchArea] call CBA_fnc_addEventHandler; + +// Editable object commands must be ran on server, this events are used in the respective module +if (isServer) then { + [QGVAR(addObjects), { + params ["_objects", ["_curator",objNull]]; + + if !(isNull _curator) exitWith { _curator addCuratorEditableObjects [_objects, true]; }; + + { + _x addCuratorEditableObjects [_objects, true]; + } forEach allCurators; + }] call CBA_fnc_addEventHandler; + + [QGVAR(removeObjects), { + params ["_objects", ["_curator",objNull]]; + + if !(isNull _curator) exitWith { _curator removeCuratorEditableObjects [_objects, true]; }; + + { + _x removeCuratorEditableObjects [_objects, true]; + } forEach allCurators; + }] call CBA_fnc_addEventHandler; +}; diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index ac7ac9832a..84659b0641 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -5,11 +5,13 @@ class CfgPatches { name = COMPONENT_NAME; units[] = { QGVAR(moduleDefendArea), + QGVAR(moduleEditableObjects), QGVAR(moduleGlobalSetSkill), QGVAR(moduleGroupSide), QGVAR(modulePatrolArea), QGVAR(moduleSearchArea), QGVAR(moduleSearchNearby), + QGVAR(moduleSimulation), QGVAR(moduleTeleportPlayers) }; weapons[] = {}; @@ -49,6 +51,7 @@ class ACE_Curator { GVAR(cargoAndRepair)[] = {"ace_cargo", "ace_repair"}; }; +#include "CfgFactionClasses.hpp" #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "ACE_Settings.hpp" diff --git a/addons/zeus/functions/fnc_bi_moduleCurator.sqf b/addons/zeus/functions/fnc_bi_moduleCurator.sqf index 231f2cb08d..66395fbb0c 100644 --- a/addons/zeus/functions/fnc_bi_moduleCurator.sqf +++ b/addons/zeus/functions/fnc_bi_moduleCurator.sqf @@ -10,7 +10,7 @@ * 2: activated * * Return Value: - * nil + * None * * Public: No */ @@ -98,7 +98,7 @@ if (_activated) then { //--- Handle ownership [_logic,_ownerVar,_ownerUID,_adminVar] spawn { scriptname "BIS_fnc_moduleCurator: Owner"; - + params ["_logic", "_ownerVar", "_ownerUID", "_adminVar"]; if (_adminVar != "") then {_ownerVar = _adminVar;}; diff --git a/addons/zeus/functions/fnc_bi_moduleMine.sqf b/addons/zeus/functions/fnc_bi_moduleMine.sqf index 5a14fbe218..940dd94f38 100644 --- a/addons/zeus/functions/fnc_bi_moduleMine.sqf +++ b/addons/zeus/functions/fnc_bi_moduleMine.sqf @@ -9,7 +9,7 @@ * 2: activated * * Return Value: - * nil + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_bi_moduleProjectile.sqf b/addons/zeus/functions/fnc_bi_moduleProjectile.sqf index 1a9da0ab02..70002cc215 100644 --- a/addons/zeus/functions/fnc_bi_moduleProjectile.sqf +++ b/addons/zeus/functions/fnc_bi_moduleProjectile.sqf @@ -10,7 +10,7 @@ * 2: activated * * Return Value: - * nil + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf b/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf index f32afef130..79cd35477f 100644 --- a/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf +++ b/addons/zeus/functions/fnc_bi_moduleRemoteControl.sqf @@ -9,7 +9,7 @@ * 2: activated * * Return Value: - * nil + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf index 65663e65fd..fada3f1e32 100644 --- a/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf +++ b/addons/zeus/functions/fnc_handleZeusUnitAssigned.sqf @@ -12,7 +12,7 @@ * 1: The zeus player * * Return Value: - * nil + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleCaptive.sqf b/addons/zeus/functions/fnc_moduleCaptive.sqf index 7d1c46f873..732c165fa4 100644 --- a/addons/zeus/functions/fnc_moduleCaptive.sqf +++ b/addons/zeus/functions/fnc_moduleCaptive.sqf @@ -8,7 +8,7 @@ * 2: Activated * * Return Value: - * None + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf index 35c6476cc0..58e7ad19c5 100644 --- a/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf +++ b/addons/zeus/functions/fnc_moduleGlobalSetSkill.sqf @@ -7,10 +7,7 @@ * 1: Variable new value * * Return Value: - * None - * - * Example: - * "ace_zeus_GlobalSkillAI" addPublicVariableEventHandler ace_zeus_fnc_moduleGlobalSetSkill + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleGroupSide.sqf b/addons/zeus/functions/fnc_moduleGroupSide.sqf index fa37ca3463..050b92a9fc 100644 --- a/addons/zeus/functions/fnc_moduleGroupSide.sqf +++ b/addons/zeus/functions/fnc_moduleGroupSide.sqf @@ -7,7 +7,7 @@ * 1: Chosen side * * Return Value: - * None + * None * * Example: * [this, west] call ace_zeus_fnc_moduleGroupSide diff --git a/addons/zeus/functions/fnc_moduleSearchNearby.sqf b/addons/zeus/functions/fnc_moduleSearchNearby.sqf index 48f35bbfee..76f77c489e 100644 --- a/addons/zeus/functions/fnc_moduleSearchNearby.sqf +++ b/addons/zeus/functions/fnc_moduleSearchNearby.sqf @@ -8,7 +8,7 @@ * 2: Activated * * Return Value: - * None + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleSetMedic.sqf b/addons/zeus/functions/fnc_moduleSetMedic.sqf index d4acda3f54..14dfca4f6f 100644 --- a/addons/zeus/functions/fnc_moduleSetMedic.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedic.sqf @@ -8,7 +8,7 @@ * 2: Activated * * Return Value: - * None + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf b/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf index 1e710bf41b..4c26ccdd71 100644 --- a/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedicalFacility.sqf @@ -8,7 +8,7 @@ * 2: Activated * * Return Value: - * None + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf b/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf index 4ffec3460e..abbc26b1ed 100644 --- a/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf +++ b/addons/zeus/functions/fnc_moduleSetMedicalVehicle.sqf @@ -8,7 +8,7 @@ * 2: Activated * * Return Value: - * None + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleSimulation.sqf b/addons/zeus/functions/fnc_moduleSimulation.sqf new file mode 100644 index 0000000000..fab59e48eb --- /dev/null +++ b/addons/zeus/functions/fnc_moduleSimulation.sqf @@ -0,0 +1,27 @@ +/* + * Author: Fisher, SilentSpike + * Toggle Simulation on object. + * + * Arguments: + * 0: The module logic + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_logic"]; + +if !(local _logic) exitWith {}; + +private _object = attachedTo _logic; +if (isNull _object) then { + [LSTRING(NothingSelected)] call EFUNC(common,displayTextStructured); +} else { + [QEGVAR(common,enableSimulationGlobal), [_object, !(simulationEnabled _object)]] call CBA_fnc_serverEvent; +}; + +deleteVehicle _logic; diff --git a/addons/zeus/functions/fnc_moduleSurrender.sqf b/addons/zeus/functions/fnc_moduleSurrender.sqf index e14501feb0..d6d030a4c5 100644 --- a/addons/zeus/functions/fnc_moduleSurrender.sqf +++ b/addons/zeus/functions/fnc_moduleSurrender.sqf @@ -8,7 +8,7 @@ * 2: Activated * * Return Value: - * None + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf b/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf index 2a43f26ed1..4a1855ba65 100644 --- a/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf +++ b/addons/zeus/functions/fnc_moduleTeleportPlayers.sqf @@ -8,7 +8,7 @@ * 2: Teleport group * * Return Value: - * None + * None * * Example: * [player, "5854854754", false] call ace_zeus_fnc_moduleTeleportPlayers diff --git a/addons/zeus/functions/fnc_moduleUnconscious.sqf b/addons/zeus/functions/fnc_moduleUnconscious.sqf index d9f9031cee..502847feda 100644 --- a/addons/zeus/functions/fnc_moduleUnconscious.sqf +++ b/addons/zeus/functions/fnc_moduleUnconscious.sqf @@ -8,7 +8,7 @@ * 2: Activated * * Return Value: - * None + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_moduleZeusSettings.sqf b/addons/zeus/functions/fnc_moduleZeusSettings.sqf index 0f3d720599..0b4e3b4027 100644 --- a/addons/zeus/functions/fnc_moduleZeusSettings.sqf +++ b/addons/zeus/functions/fnc_moduleZeusSettings.sqf @@ -8,7 +8,7 @@ * 2: activated * * Return Value: - * None + * None * * Public: No */ diff --git a/addons/zeus/functions/fnc_ui_attributeCargo.sqf b/addons/zeus/functions/fnc_ui_attributeCargo.sqf index 444fa5e7e2..49e5c6b2ea 100644 --- a/addons/zeus/functions/fnc_ui_attributeCargo.sqf +++ b/addons/zeus/functions/fnc_ui_attributeCargo.sqf @@ -7,10 +7,7 @@ * 0: ace_cargo controls group * * Return Value: - * None - * - * Example: - * onSetFocus = "_this call ace_zeus_fnc_ui_vehCargo" + * None * * Public: No */ @@ -20,7 +17,7 @@ params ["_control"]; TRACE_1("params",_control); -private _veh = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +private _veh = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); TRACE_1("",_veh); private _loaded = _veh getVariable [QEGVAR(cargo,loaded), []]; diff --git a/addons/zeus/functions/fnc_ui_attributePosition.sqf b/addons/zeus/functions/fnc_ui_attributePosition.sqf index 95557a891b..d6ae581ae4 100644 --- a/addons/zeus/functions/fnc_ui_attributePosition.sqf +++ b/addons/zeus/functions/fnc_ui_attributePosition.sqf @@ -6,19 +6,17 @@ * 0: position controls group * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -disableSerialization; - //Generic Init: params ["_control"]; private _display = ctrlParent _control; -private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); _control ctrlRemoveAllEventHandlers "setFocus"; diff --git a/addons/zeus/functions/fnc_ui_attributeRadius.sqf b/addons/zeus/functions/fnc_ui_attributeRadius.sqf index c26f8ac97d..7330d1b170 100644 --- a/addons/zeus/functions/fnc_ui_attributeRadius.sqf +++ b/addons/zeus/functions/fnc_ui_attributeRadius.sqf @@ -6,15 +6,13 @@ * 0: radius controls group * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -disableSerialization; - //Generic Init: params ["_control"]; private _display = ctrlParent _control; diff --git a/addons/zeus/functions/fnc_ui_defendArea.sqf b/addons/zeus/functions/fnc_ui_defendArea.sqf index 6fcb4a17d5..492f74cf48 100644 --- a/addons/zeus/functions/fnc_ui_defendArea.sqf +++ b/addons/zeus/functions/fnc_ui_defendArea.sqf @@ -6,19 +6,17 @@ * 0: dummy controls group * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -disableSerialization; - //Generic Init: params ["_control"]; private _display = ctrlParent _control; -private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); _control ctrlRemoveAllEventHandlers "setFocus"; diff --git a/addons/zeus/functions/fnc_ui_editableObjects.sqf b/addons/zeus/functions/fnc_ui_editableObjects.sqf new file mode 100644 index 0000000000..040bd2630f --- /dev/null +++ b/addons/zeus/functions/fnc_ui_editableObjects.sqf @@ -0,0 +1,65 @@ +/* + * Author: Fisher, SilentSpike + * Updated all/local curator with objects in the module radius. + * + * Arguments: + * 0: editableObjects controls group + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_control"]; + +//Generic Init: +private _display = ctrlParent _control; +private _ctrlButtonOK = _display displayCtrl 1; //IDC_OK +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); +TRACE_1("logicObject",_logic); + +_control ctrlRemoveAllEventHandlers "setFocus"; + +//Specific on-load stuff: +(_display displayCtrl 16188) cbSetChecked true; + +private _fnc_onUnload = { + private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); + if (isNull _logic) exitWith {}; + + if (_this select 1 == 2) then { + deleteVehicle _logic; + }; +}; + +private _fnc_onConfirm = { + params [["_ctrlButtonOK", controlNull, [controlNull]]]; + + private _display = ctrlParent _ctrlButtonOK; + if (isNull _display) exitWith {}; + + private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); + if (isNull _logic) exitWith {}; + + private _radius = GETVAR(_display,GVAR(radius),50); + private _position = GETVAR(_display,GVAR(position),getPos _logic); + private _allCurators = cbChecked (_display displayCtrl 16188); + private _removeObjects = cbChecked (_display displayCtrl 16189); + + private _objects = nearestObjects [_position, ["All"], _radius]; + private _localCurator = [getAssignedCuratorLogic player, objNull] select _allCurators; + + if (_removeObjects) then { + [QGVAR(removeObjects), [_objects, _localCurator]] call CBA_fnc_serverEvent; + } else { + [QGVAR(addObjects), [_objects, _localCurator]] call CBA_fnc_serverEvent; + }; + + deleteVehicle _logic; +}; + +_display displayAddEventHandler ["unload", _fnc_onUnload]; +_ctrlButtonOK ctrlAddEventHandler ["buttonClick", _fnc_onConfirm]; diff --git a/addons/zeus/functions/fnc_ui_globalSetSkill.sqf b/addons/zeus/functions/fnc_ui_globalSetSkill.sqf index 8dcac19bce..68ffc95033 100644 --- a/addons/zeus/functions/fnc_ui_globalSetSkill.sqf +++ b/addons/zeus/functions/fnc_ui_globalSetSkill.sqf @@ -6,25 +6,20 @@ * 0: globalSetSkill controls group * * Return Value: - * None - * - * Example: - * onSetFocus = "_this call ace_zeus_fnc_ui_globalSetSkill" + * None * * Public: No */ #include "script_component.hpp" -disableSerialization; - params ["_control"]; TRACE_1("params",_control); //Generic Init: -private _display = ctrlparent _control; -private _ctrlButtonOK = _display displayctrl 1; //IDC_OK -private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +private _display = ctrlParent _control; +private _ctrlButtonOK = _display displayCtrl 1; //IDC_OK +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); TRACE_1("logicObject",_logic); _control ctrlRemoveAllEventHandlers "setFocus"; diff --git a/addons/zeus/functions/fnc_ui_groupSide.sqf b/addons/zeus/functions/fnc_ui_groupSide.sqf index be3298c8da..46418a71fc 100644 --- a/addons/zeus/functions/fnc_ui_groupSide.sqf +++ b/addons/zeus/functions/fnc_ui_groupSide.sqf @@ -6,10 +6,7 @@ * 0: groupSide controls group * * Return Value: - * NONE - * - * Example: - * onSetFocus = "_this call ace_zeus_fnc_ui_groupSide" + * None * * Public: No */ @@ -17,14 +14,12 @@ #include "script_component.hpp" #define IDCs [31201,31200,31202,31203] -disableSerialization; - params ["_control"]; //Generic Init: -private _display = ctrlparent _control; -private _ctrlButtonOK = _display displayctrl 1; //IDC_OK -private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +private _display = ctrlParent _control; +private _ctrlButtonOK = _display displayCtrl 1; //IDC_OK +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); TRACE_1("logicObject",_logic); _control ctrlRemoveAllEventHandlers "setFocus"; diff --git a/addons/zeus/functions/fnc_ui_patrolArea.sqf b/addons/zeus/functions/fnc_ui_patrolArea.sqf index d4fbc092a0..9db2df9773 100644 --- a/addons/zeus/functions/fnc_ui_patrolArea.sqf +++ b/addons/zeus/functions/fnc_ui_patrolArea.sqf @@ -6,19 +6,17 @@ * 0: dummy controls group * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -disableSerialization; - //Generic Init: params ["_control"]; private _display = ctrlParent _control; -private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); _control ctrlRemoveAllEventHandlers "setFocus"; diff --git a/addons/zeus/functions/fnc_ui_searchArea.sqf b/addons/zeus/functions/fnc_ui_searchArea.sqf index 3da147b963..d30af4e234 100644 --- a/addons/zeus/functions/fnc_ui_searchArea.sqf +++ b/addons/zeus/functions/fnc_ui_searchArea.sqf @@ -6,19 +6,17 @@ * 0: dummy controls group * * Return Value: - * None + * None * * Public: No */ #include "script_component.hpp" -disableSerialization; - //Generic Init: params ["_control"]; private _display = ctrlParent _control; -private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); _control ctrlRemoveAllEventHandlers "setFocus"; diff --git a/addons/zeus/functions/fnc_ui_teleportPlayers.sqf b/addons/zeus/functions/fnc_ui_teleportPlayers.sqf index bdcd8ae93f..cd5fd82d8d 100644 --- a/addons/zeus/functions/fnc_ui_teleportPlayers.sqf +++ b/addons/zeus/functions/fnc_ui_teleportPlayers.sqf @@ -6,24 +6,19 @@ * 0: teleportPlayers controls group * * Return Value: - * NONE - * - * Example: - * onSetFocus = "_this call ace_zeus_fnc_ui_teleportPlayers" + * None * * Public: No */ #include "script_component.hpp" -disableSerialization; - params ["_control"]; //Generic Init: -private _display = ctrlparent _control; -private _ctrlButtonOK = _display displayctrl 1; //IDC_OK -private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objnull); +private _display = ctrlParent _control; +private _ctrlButtonOK = _display displayCtrl 1; //IDC_OK +private _logic = GETMVAR(BIS_fnc_initCuratorAttributes_target,objNull); TRACE_1("logicObject",_logic); _control ctrlRemoveAllEventHandlers "setFocus"; diff --git a/addons/zeus/functions/fnc_zeusAttributes.sqf b/addons/zeus/functions/fnc_zeusAttributes.sqf index dcbef69510..5481120cd3 100644 --- a/addons/zeus/functions/fnc_zeusAttributes.sqf +++ b/addons/zeus/functions/fnc_zeusAttributes.sqf @@ -9,7 +9,7 @@ * 2: Display class name * * Return Value: - * None + * None * * Example: * onLoad = "['onLoad',_this,'RscDisplayExample'] call ace_zeus_fnc_zeusAttributes" diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 317f423b4e..a120c27c08 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -205,6 +205,21 @@ Osłaniaj obszar Verteidige Gebiet + + Update Editable Objects + + + All Curators + + + Apply changes to all curators + + + Remove Objects + + + Remove existing instead of adding new + Global AI Skill Compétence global de l'IA @@ -465,6 +480,9 @@ Assigner installation médicale 医療施設として割り当て + + Toggle Simulation + Add Spare Wheel Adicionar roda sobressalente @@ -696,4 +714,4 @@ Ungültiger Radius eingegeben - \ No newline at end of file + diff --git a/addons/zeus/ui/RscAttributes.hpp b/addons/zeus/ui/RscAttributes.hpp index 1efcde2c66..27f89d89c0 100644 --- a/addons/zeus/ui/RscAttributes.hpp +++ b/addons/zeus/ui/RscAttributes.hpp @@ -97,6 +97,59 @@ class GVAR(RscDefendArea): RscDisplayAttributes { }; }; +class GVAR(RscEditableObjects): RscDisplayAttributes { + onLoad = QUOTE([ARR_3('onLoad', _this, QQGVAR(RscEditableObjects))] call FUNC(zeusAttributes)); + onUnload = QUOTE([ARR_3('onUnload', _this, QQGVAR(RscEditableObjects))] call FUNC(zeusAttributes)); + class Controls: Controls { + class Background: Background {}; + class Title: Title {}; + class Content: Content { + class Controls { + class radius: GVAR(AttributeRadius) {}; + //class position: GVAR(AttributePosition) {}; + class editableObjects: RscControlsGroupNoScrollbars { + onSetFocus = QUOTE(_this call FUNC(ui_editableObjects)); + idc = 26422; + x = 0; + y = 0; + w = W_PART(11.1); + h = H_PART(2.5); + class controls { + class Label: RscText { + idc = -1; + text = CSTRING(ModuleEditableObjects_curators); + toolTip = CSTRING(ModuleEditableObjects_curators_desc); + x = 0; + y = 0; + w = W_PART(10); + h = H_PART(1); + colorBackground[] = {0,0,0,0.5}; + }; + class AllCurators: RscCheckBox { + idc = 16188; + x = W_PART(10.1); + y = 0; + w = W_PART(1); + h = H_PART(1); + }; + class Label2: Label { + text = CSTRING(ModuleEditableObjects_removal); + toolTip = CSTRING(ModuleEditableObjects_removal_desc); + y = H_PART(1.1); + }; + class EditingMode: AllCurators { + idc = 16189; + y = H_PART(1.1); + }; + }; + }; + }; + }; + class ButtonOK: ButtonOK {}; + class ButtonCancel: ButtonCancel {}; + }; +}; + class GVAR(RscGlobalSetSkill): RscDisplayAttributes { onLoad = QUOTE([ARR_3('onLoad', _this, QUOTE(QGVAR(RscGlobalSetSkill)))] call FUNC(zeusAttributes)); onUnload = QUOTE([ARR_3('onUnload', _this, QUOTE(QGVAR(RscGlobalSetSkill)))] call FUNC(zeusAttributes)); From f0279726ceb4985f0c71c5c66a815fdc75d896bb Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 15 Nov 2016 16:14:35 +0100 Subject: [PATCH 154/826] Fixed typo (copy & paste remains) (#4673) --- .../atragmx/functions/fnc_read_gun_list_entries_from_config.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf b/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf index 717fb07084..d9c38c328e 100644 --- a/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf +++ b/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf @@ -114,7 +114,6 @@ private _validate_preset = { if (_gun call _validate_preset) then { _gun set [20, false]; GVAR(gunList) = GVAR(gunList) + [_gun]; - lbAdd [6000, _gunProfileEntry select 0]; }; }; } forEach ("true" configClasses (configFile >> "ACE_ATragMX_Presets")); From b4315b6a65f78b8ca5500271f995a911eb7760c1 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 15 Nov 2016 12:15:25 -0600 Subject: [PATCH 155/826] Javelin overhaul (#4580) * Javelin overhaul * header spelling fix --- .../functions/fnc_worldToScreenBounds.sqf | 12 +- addons/javelin/CfgEventhandlers.hpp | 13 +- addons/javelin/CfgVehicles.hpp | 18 +- addons/javelin/CfgWeapons.hpp | 13 +- addons/javelin/README.md | 1 + addons/javelin/RscInGameUI.hpp | 281 ++++++------- addons/javelin/XEH_PREP.hpp | 11 +- addons/javelin/XEH_clientInit.sqf | 3 +- addons/javelin/XEH_post_init.sqf | 2 - .../{XEH_pre_init.sqf => XEH_preInit.sqf} | 12 +- .../javelin/functions/fnc_cycleFireMode.sqf | 27 +- addons/javelin/functions/fnc_getTarget.sqf | 81 ++++ addons/javelin/functions/fnc_lockKeyDown.sqf | 3 - addons/javelin/functions/fnc_lockKeyUp.sqf | 3 - .../javelin/functions/fnc_mapHelperDraw.sqf | 52 +++ addons/javelin/functions/fnc_onFired.sqf | 15 - addons/javelin/functions/fnc_onOpticDraw.sqf | 374 +++++++----------- addons/javelin/functions/fnc_onOpticLoad.sqf | 39 -- .../javelin/functions/fnc_onOpticUnload.sqf | 20 - addons/javelin/functions/fnc_showFireMode.sqf | 20 +- addons/javelin/initKeybinds.sqf | 8 +- addons/javelin/script_component.hpp | 5 - 22 files changed, 495 insertions(+), 518 deletions(-) delete mode 100644 addons/javelin/XEH_post_init.sqf rename addons/javelin/{XEH_pre_init.sqf => XEH_preInit.sqf} (58%) create mode 100644 addons/javelin/functions/fnc_getTarget.sqf delete mode 100644 addons/javelin/functions/fnc_lockKeyDown.sqf delete mode 100644 addons/javelin/functions/fnc_lockKeyUp.sqf create mode 100644 addons/javelin/functions/fnc_mapHelperDraw.sqf delete mode 100644 addons/javelin/functions/fnc_onFired.sqf delete mode 100644 addons/javelin/functions/fnc_onOpticLoad.sqf delete mode 100644 addons/javelin/functions/fnc_onOpticUnload.sqf diff --git a/addons/common/functions/fnc_worldToScreenBounds.sqf b/addons/common/functions/fnc_worldToScreenBounds.sqf index 65b0164ca0..77df6e47bf 100644 --- a/addons/common/functions/fnc_worldToScreenBounds.sqf +++ b/addons/common/functions/fnc_worldToScreenBounds.sqf @@ -38,13 +38,13 @@ _bounds params ["_boundsMin", "_boundsMax"]; _boundsMin params ["_boundsMinX", "_boundsMinY", "_boundsMinZ"]; _boundsMax params ["_boundsMaxX", "_boundsMaxY", "_boundsMaxZ"]; -_boundsMinX = _boundsMinX - _marginsX + _offsetsX; -_boundsMinY = _boundsMinY - _marginsY + _offsetsY; -_boundsMinZ = _boundsMinZ - _marginsZ + _offsetsZ; +_boundsMinX = ((_boundsMinX - _marginsX) min 0) + _offsetsX; +_boundsMinY = ((_boundsMinY - _marginsY) min 0) + _offsetsY; +_boundsMinZ = ((_boundsMinZ - _marginsZ) min 0) + _offsetsZ; -_boundsMaxX = _boundsMaxX + _marginsX + _offsetsX; -_boundsMaxY = _boundsMaxY + _marginsY + _offsetsY; -_boundsMaxZ = _boundsMaxZ + _marginsZ + _offsetsZ; +_boundsMaxX = ((_boundsMaxX + _marginsX) max 0) + _offsetsX; +_boundsMaxY = ((_boundsMaxY + _marginsY) max 0) + _offsetsY; +_boundsMaxZ = ((_boundsMaxZ + _marginsZ) max 0) + _offsetsZ; private _boundsCorners = [ [_boundsMinX, _boundsMinY, _boundsMinZ], diff --git a/addons/javelin/CfgEventhandlers.hpp b/addons/javelin/CfgEventhandlers.hpp index 7b76e00d43..789cfeb05c 100644 --- a/addons/javelin/CfgEventhandlers.hpp +++ b/addons/javelin/CfgEventhandlers.hpp @@ -6,20 +6,13 @@ class Extended_PreStart_EventHandlers { }; class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_pre_init)); + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_post_init)); + class ADDON { clientInit = QUOTE(call COMPILE_FILE(XEH_clientInit)); }; }; - -class Extended_FiredBIS_EventHandlers { - class All { - ADDON = QUOTE(_this call FUNC(onFired)); - }; -}; diff --git a/addons/javelin/CfgVehicles.hpp b/addons/javelin/CfgVehicles.hpp index a30489ad14..790b802230 100644 --- a/addons/javelin/CfgVehicles.hpp +++ b/addons/javelin/CfgVehicles.hpp @@ -1,19 +1,19 @@ class CfgVehicles { class LandVehicle; - class StaticWeapon : LandVehicle { + class StaticWeapon: LandVehicle { class Turrets; }; - class StaticMGWeapon : StaticWeapon { - class Turrets : Turrets { + class StaticMGWeapon: StaticWeapon { + class Turrets: Turrets { class MainTurret; }; }; class AT_01_base_F: StaticMGWeapon {}; class B_static_AT_F: AT_01_base_F { - class Turrets : Turrets { - class MainTurret : MainTurret { + class Turrets: Turrets { + class MainTurret: MainTurret { weapons[] = { QGVAR(Titan_Static) }; magazines[] = {"1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles"}; @@ -30,8 +30,8 @@ class CfgVehicles { }; }; class O_static_AT_F: AT_01_base_F { - class Turrets : Turrets { - class MainTurret : MainTurret { + class Turrets: Turrets { + class MainTurret: MainTurret { weapons[] = { QGVAR(Titan_Static) }; magazines[] = {"1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles"}; @@ -48,8 +48,8 @@ class CfgVehicles { }; }; class I_static_AT_F: AT_01_base_F { - class Turrets : Turrets { - class MainTurret : MainTurret { + class Turrets: Turrets { + class MainTurret: MainTurret { weapons[] = { QGVAR(Titan_Static) }; magazines[] = {"1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles"}; diff --git a/addons/javelin/CfgWeapons.hpp b/addons/javelin/CfgWeapons.hpp index 45c8c5942c..e8e5d382b2 100644 --- a/addons/javelin/CfgWeapons.hpp +++ b/addons/javelin/CfgWeapons.hpp @@ -2,17 +2,17 @@ class CfgWeapons { class Launcher; class MissileLauncher; - class Launcher_Base_F : Launcher { + class Launcher_Base_F: Launcher { class WeaponSlotsInfo; }; // @TODO: AA by default, motherfuckers - class missiles_titan : MissileLauncher { + class missiles_titan: MissileLauncher { }; - class missiles_titan_at : missiles_titan { }; - class GVAR(Titan_Static) : missiles_titan_at { + class missiles_titan_at: missiles_titan { }; + class GVAR(Titan_Static): missiles_titan_at { GVAR(enabled) = 1; weaponInfoType = "ACE_RscOptics_javelin"; modelOptics = QPATHTOF(data\reticle_titan.p3d); @@ -24,9 +24,9 @@ class CfgWeapons { }; // @TODO: AA by default, motherfuckers - class launch_Titan_base : Launcher_Base_F {}; + class launch_Titan_base: Launcher_Base_F {}; - class launch_Titan_short_base : launch_Titan_base { }; + class launch_Titan_short_base: launch_Titan_base { }; class launch_B_Titan_short_F: launch_Titan_short_base { GVAR(enabled) = 1; @@ -58,7 +58,6 @@ class CfgWeapons { canLock = 0; - lockingTargetSound[] = {"",0,1}; lockedTargetSound[] = {"",0,1}; }; diff --git a/addons/javelin/README.md b/addons/javelin/README.md index 37685d9cce..ecbf3743b4 100644 --- a/addons/javelin/README.md +++ b/addons/javelin/README.md @@ -9,3 +9,4 @@ Adds the Javelin AT launcher. The people responsible for merging changes to this component or answering potential questions. - [jaynus](https://github.com/walterpearce) +- [PabstMirror](https://github.com/PabstMirror) diff --git a/addons/javelin/RscInGameUI.hpp b/addons/javelin/RscInGameUI.hpp index e6136a52d3..e34630dde3 100644 --- a/addons/javelin/RscInGameUI.hpp +++ b/addons/javelin/RscInGameUI.hpp @@ -1,26 +1,33 @@ - class RscOpticsValue; class RscControlsGroupNoScrollbars; class RscPicture; -class RscMapControl; class RscLine; +class RscMapControl; + // Taken from AGM for optics management. + class RscInGameUI { class ACE_RscOptics_javelin { idd = 300; - controls[] = { QGVAR(elements_group), "ACE_Targeting" }; //, "ACE_TargetingConstrains", "ACE_TargetingGate", "ACE_TargetingLines"}; - onLoad = QUOTE(_this call FUNC(onOpticLoad)); - onUnload = QUOTE(_this call FUNC(onOpticUnload)); + controls[] = { QGVAR(elements_group), "ACE_Targeting", QGVAR(mapHelper) }; + onLoad = QUOTE(with uiNamespace do {ACE_RscOptics_javelin = _this select 0;};); + class GVAR(mapHelper): RscMapControl { + onDraw = QUOTE(_this call FUNC(mapHelperDraw);); + x = -10; + y = -10; + w = 0; + h = 0; + }; + class GVAR(elements_group): RscControlsGroupNoScrollbars { - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW"; - h = "SafezoneH"; + x = "safeZoneX"; + y = "safeZoneY"; + w = "safeZoneW"; + h = "safeZoneH"; idc = 170; - - class Controls { + class Controls { class CA_Distance: RscOpticsValue { idc = 151; sizeEx = "0"; @@ -30,13 +37,12 @@ class RscInGameUI { w = 0; h = 0; }; - class GVAR(Day_mode_off): RscPicture { idc = 1001; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.03/4)*3*SafezoneH - SafezoneX"; - y = "SafezoneY+SafezoneH*0.031 - SafezoneY"; - w = "0.1045752* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; - h = "SafezoneH*0.1045752"; + x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (0.03/4)*3*safeZoneH - safeZoneX"; + y = "safeZoneY+safeZoneH*0.031 - safeZoneY"; + w = "0.1045752* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)"; + h = "safeZoneH*0.1045752"; colorText[] = {0.2941,0.2941,0.2941,1}; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\day_co.paa"; }; @@ -44,126 +50,135 @@ class RscInGameUI { idc = 160; colorText[] = {0.2941,0.8745,0.2157,1}; }; - class CA_Javelin_WFOV_mode_off : GVAR(Day_mode_off) { + class GVAR(WFOV_mode_off): GVAR(Day_mode_off) { idc = 1004; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; + x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (0.307/4)*3*safeZoneH - safeZoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\wfov_co.paa"; }; class GVAR(WFOV_mode_group): RscControlsGroupNoScrollbars { - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW"; - h = "SafezoneH"; + x = "safeZoneX"; + y = "safeZoneY"; + w = "safeZoneW"; + h = "safeZoneH"; idc = 163; - class Controls { + class GVAR(WFOV_mode_on): GVAR(WFOV_mode_off) { + idc = -1; + y = "0.031*SafeZoneH - SafezoneY"; + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; class StadiaL: RscLine { - x = "0.4899*SafezoneW - SafezoneX"; - y = "0.171*SafezoneH - SafezoneY"; + x = "0.4899*safeZoneW - safeZoneX"; + y = "0.171*safeZoneH - safeZoneY"; w = 0; - h = "0.049*SafezoneH"; + h = "0.049*safeZoneH"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class StadiaR: RscLine { - x = "0.5109*SafezoneW- SafezoneX"; - y = "0.171*SafezoneH - SafezoneY"; + x = "0.5109*safeZoneW- safeZoneX"; + y = "0.171*safeZoneH - safeZoneY"; w = 0; - h = "0.049*SafezoneH"; + h = "0.049*safeZoneH"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class BracketL: RscLine { - x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.293/4)*3*SafezoneH - SafezoneX"; - y = "0.4677*SafezoneH - SafezoneY"; + x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.293/4)*3*safeZoneH - safeZoneX"; + y = "0.4677*safeZoneH - safeZoneY"; w = 0; - h = "0.0646*SafezoneH"; + h = "0.0646*safeZoneH"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class BracketR: RscLine { - x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.70/4)*3*SafezoneH - SafezoneX"; - y = "0.4677*SafezoneH - SafezoneY"; + x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.70/4)*3*safeZoneH - safeZoneX"; + y = "0.4677*safeZoneH - safeZoneY"; w = 0; - h = "0.0646*SafezoneH"; + h = "0.0646*safeZoneH"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class BracketT: RscLine { - x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.467/4)*3*SafezoneH - SafezoneX"; - y = "0.3535*SafezoneH - SafezoneY"; - w = "0.065* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; + x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.467/4)*3*safeZoneH - safeZoneX"; + y = "0.3535*safeZoneH - safeZoneY"; + w = "0.065* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)"; h = 0; colorText[] = {0.2941,0.8745,0.2157,1}; }; class BracketB: RscLine { - x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.467/4)*3*SafezoneH - SafezoneX"; - y = "0.6465*SafezoneH - SafezoneY"; - w = "0.065* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; + x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.467/4)*3*safeZoneH - safeZoneX"; + y = "0.6465*safeZoneH - safeZoneY"; + w = "0.065* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)"; h = 0; colorText[] = {0.2941,0.8745,0.2157,1}; }; }; }; - class CA_Javelin_NFOV_mode_off: GVAR(Day_mode_off) { + class GVAR(NFOV_mode_off): GVAR(Day_mode_off) { idc = 1003; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; + x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (0.586/4)*3*safeZoneH - safeZoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\nfov_co.paa"; }; class GVAR(NFOV_mode_group): RscControlsGroupNoScrollbars { - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW-SafezoneX"; - h = "SafezoneH-SafezoneY"; + x = "safeZoneX"; + y = "safeZoneY"; + w = "safeZoneW-safeZoneX"; + h = "safeZoneH-safeZoneY"; idc = 162; - class Controls { + class GVAR(NFOV_mode_on): GVAR(NFOV_mode_off) { + idc = -1; + x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX"; + y = "0.031*SafeZoneH - SafezoneY"; + colorText[] = {0.2941,0.8745,0.2157,1}; + }; class StadiaL: RscLine { - x = "0.4788*SafezoneW - SafezoneX"; - y = "0.171*SafezoneH - SafezoneY"; + x = "0.4788*safeZoneW - safeZoneX"; + y = "0.171*safeZoneH - safeZoneY"; w = 0; - h = "0.049*SafezoneH"; + h = "0.049*safeZoneH"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class StadiaR: RscLine { - x = "0.5212*SafezoneW - SafezoneX"; - y = "0.171*SafezoneH - SafezoneY"; + x = "0.5212*safeZoneW - safeZoneX"; + y = "0.171*safeZoneH - safeZoneY"; w = 0; - h = "0.049*SafezoneH"; + h = "0.049*safeZoneH"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class LineHL: RscLine { - x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.01/4)*3*SafezoneH - SafezoneX"; - y = "SafezoneH*0.5 - SafezoneY"; - w = "0.29* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; - h = "SafezoneH*0.0"; + x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.01/4)*3*safeZoneH - safeZoneX"; + y = "safeZoneH*0.5 - safeZoneY"; + w = "0.29* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)"; + h = "safeZoneH*0.0"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class LineHR: RscLine { - x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.695/4)*3*SafezoneH - SafezoneX"; - y = "SafezoneH*0.5 - SafezoneY"; - w = "0.29* (((SafezoneW*3)/4)/SafezoneW)/(1/SafezoneH)"; - h = "SafezoneH*0.0"; + x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.695/4)*3*safeZoneH - safeZoneX"; + y = "safeZoneH*0.5 - safeZoneY"; + w = "0.29* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)"; + h = "safeZoneH*0.0"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class LineVT: RscLine { - x = "0.5*SafezoneW - SafezoneX"; - y = "0.171*SafezoneH - SafezoneY"; + x = "0.5*safeZoneW - safeZoneX"; + y = "0.171*safeZoneH - safeZoneY"; w = 0; - h = "0.1825*SafezoneH"; + h = "0.1825*safeZoneH"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class LineVB: RscLine { - x = "0.5*SafezoneW - SafezoneX"; - y = "0.6465*SafezoneH - SafezoneY"; + x = "0.5*safeZoneW - safeZoneX"; + y = "0.6465*safeZoneH - safeZoneY"; w = 0; - h = "0.1895*SafezoneH"; + h = "0.1895*safeZoneH"; colorText[] = {0.2941,0.8745,0.2157,1}; }; - }; }; class GVAR(SEEK_off): GVAR(Day_mode_off) { idc = 699000; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (0.863/4)*3*SafezoneH - SafezoneX"; + x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (0.863/4)*3*safeZoneH - safeZoneX"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\seek_co.paa"; }; class GVAR(SEEK): GVAR(SEEK_off) { @@ -172,8 +187,8 @@ class RscInGameUI { }; class GVAR(Missle_off): GVAR(Day_mode_off) { idc = 1032; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (-0.134/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; + x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (-0.134/4)*3*safeZoneH - safeZoneX"; + y = "(safeZoneY + 0.208*safeZoneH) - safeZoneY"; colorText[] = {0.2941,0.2941,0.2941,1}; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\missle_co.paa"; }; @@ -183,32 +198,32 @@ class RscInGameUI { }; class GVAR(CLU_off): GVAR(Missle_off) { idc = 1027; - y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; + y = "(safeZoneY + 0.436*safeZoneH) - safeZoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\clu_co.paa"; }; class GVAR(HangFire_off): GVAR(Missle_off) { idc = 1028; - y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; + y = "(safeZoneY + 0.669*safeZoneH) - safeZoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\hangfire_co.paa"; }; class GVAR(TOP_off): GVAR(Day_mode_off) { idc = 699001; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.208*SafezoneH) - SafezoneY"; + x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (1.023/4)*3*safeZoneH - safeZoneX"; + y = "(safeZoneY + 0.208*safeZoneH) - safeZoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\top_co.paa"; colorText[] = {0.2941,0.8745,0.2157,1}; }; class GVAR(DIR): GVAR(Day_mode) { idc = 699002; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.436*SafezoneH) - SafezoneY"; + x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (1.023/4)*3*safeZoneH - safeZoneX"; + y = "(safeZoneY + 0.436*safeZoneH) - safeZoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\dir_co.paa"; colorText[] = {0.2941,0.2941,0.2941,1}; }; class GVAR(FLTR_mode_off): GVAR(Day_mode_off) { idc = 1002; - x = "(SafezoneX+(SafezoneW -SafezoneH*3/4)/2)+ (1.023/4)*3*SafezoneH - SafezoneX"; - y = "(SafezoneY + 0.669*SafezoneH) - SafezoneY"; + x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (1.023/4)*3*safeZoneH - safeZoneX"; + y = "(safeZoneY + 0.669*safeZoneH) - safeZoneY"; text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\fltr_co.paa"; }; class GVAR(FLTR_mode): GVAR(FLTR_mode_off) { @@ -219,139 +234,137 @@ class RscInGameUI { }; class ACE_Targeting: RscControlsGroupNoScrollbars { idc = 6999; - - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW"; - h = "SafezoneH"; - - enabled = 0; + x = "safeZoneX"; + y = "safeZoneY"; + w = "safeZoneW"; + h = "safeZoneH"; + enabled = 0; + show = 0; class Controls { class ACE_TargetingConstrains: RscControlsGroupNoScrollbars { - x = "SafezoneX"; - y = "SafezoneY"; - w = "SafezoneW-SafezoneX"; - h = "SafezoneH-SafezoneY"; + x = "safeZoneX"; + y = "safeZoneY"; + w = "safeZoneW-safeZoneX"; + h = "safeZoneH-safeZoneY"; enabled = 0; - class Controls { class Top: RscPicture { idc = 699101; text = "#(argb,8,8,3)color(1,1,1,1)"; colorText[] = {0.2941,0.2941,0.2941,1}; - x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; - y = "0.15*SafezoneH-SafezoneY"; - w = "(3/4)*SafezoneH"; - h = "0.21*SafezoneH"; + x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX"; + y = "0.15*safeZoneH-safeZoneY"; + w = "(3/4)*safeZoneH"; + h = "0.21*safeZoneH"; }; class Bottom: Top { idc = 699102; - y = "0.64*SafezoneH-SafezoneY"; + y = "0.64*safeZoneH-safeZoneY"; }; class Left: Top { idc = 699103; - x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; - y = "0.36*SafezoneH-SafezoneY"; - w = "0.31*(3/4)*SafezoneH"; - h = "0.28*SafezoneH"; + x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX"; + y = "0.36*safeZoneH-safeZoneY"; + w = "0.31*(3/4)*safeZoneH"; + h = "0.28*safeZoneH"; }; class Right: Left { idc = 699104; - x = "((SafezoneW -(3/4)*SafezoneH)/2)+ 0.69*(3/4)*SafezoneH - SafezoneX"; + x = "((safeZoneW -(3/4)*safeZoneH)/2)+ 0.69*(3/4)*safeZoneH - safeZoneX"; }; class OpticsBorders: RscPicture { idc = 699105; text = QPATHTOF(data\javelin_ui_border_ca.paa); colorText[] = {0,0,0,1}; - x = "((SafezoneW -(3.1/4)*SafezoneH)/2) - SafezoneX"; - y = "0.15*SafezoneH-SafezoneY"; - w = "(3.1/4)*SafezoneH"; - h = "0.7*SafezoneH"; + x = "((safeZoneW -(3.1/4)*safeZoneH)/2) - safeZoneX"; + y = "0.15*safeZoneH-safeZoneY"; + w = "(3.1/4)*safeZoneH"; + h = "0.7*safeZoneH"; }; }; }; - class ACE_TargetingGate : ACE_TargetingConstrains { + class ACE_TargetingGate: ACE_TargetingConstrains { idc = 699200; class Controls { class TargetingGateTL: ACE_TargetingConstrains { - x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; - y = "0.15*SafezoneH - SafezoneY"; + x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX"; + y = "0.15*safeZoneH - safeZoneY"; idc = 699201; class Controls { class LineH: RscLine { idc = 699210; x = "0"; y = "0"; - w = "0.025*(3/4)*SafezoneH"; + w = "0.025*(3/4)*safeZoneH"; h = "0"; colorText[] = {0.8745,0.8745,0.8745,1}; }; class LineV: LineH { idc = 699211; w = "0"; - h = "0.025*SafezoneH"; + h = "0.025*safeZoneH"; }; }; }; class TargetingGateTR: TargetingGateTL { - x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX + 0.975*(3/4)*SafezoneH"; - y = "0.15*SafezoneH - SafezoneY"; + x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX + 0.975*(3/4)*safeZoneH"; + y = "0.15*safeZoneH - safeZoneY"; idc = 699202; class Controls { class LineH: RscLine { idc = 699220; x = "0"; y = "0"; - w = "0.025*(3/4)*SafezoneH"; + w = "0.025*(3/4)*safeZoneH"; h = "0"; colorText[] = {0.8745,0.8745,0.8745,1}; }; class LineV: LineH { idc = 699221; - x = "0.025*(3/4)*SafezoneH"; + x = "0.025*(3/4)*safeZoneH"; w = "0"; - h = "0.025*SafezoneH"; + h = "0.025*safeZoneH"; }; }; }; class TargetingGateBL: TargetingGateTL { - x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; - y = "0.825*SafezoneH - SafezoneY"; + x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX"; + y = "0.825*safeZoneH - safeZoneY"; idc = 699203; class Controls { class LineH: RscLine { x = "0"; - y = "0.025*SafezoneH"; - w = "0.025*(3/4)*SafezoneH"; + y = "0.025*safeZoneH"; + w = "0.025*(3/4)*safeZoneH"; h = "0"; colorText[] = {0.8745,0.8745,0.8745,1}; }; class LineV: LineH { y = "0"; w = "0"; - h = "0.025*SafezoneH"; + h = "0.025*safeZoneH"; }; }; }; class TargetingGateBR: TargetingGateBL { - x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX + 0.975*(3/4)*SafezoneH"; - y = "0.825*SafezoneH - SafezoneY"; + x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX + 0.975*(3/4)*safeZoneH"; + y = "0.825*safeZoneH - safeZoneY"; idc = 699204; class Controls { class LineH: RscLine { x = "0"; - y = "0.025*SafezoneH"; - w = "0.025*(3/4)*SafezoneH"; + y = "0.025*safeZoneH"; + w = "0.025*(3/4)*safeZoneH"; h = "0"; colorText[] = {0.8745,0.8745,0.8745,1}; }; class LineV: LineH { - x = "0.025*(3/4)*SafezoneH"; + x = "0.025*(3/4)*safeZoneH"; y = "0"; w = "0"; - h = "0.025*SafezoneH"; + h = "0.025*safeZoneH"; }; }; }; @@ -364,18 +377,18 @@ class RscInGameUI { class Controls { class LineH: RscLine { idc = 699301; - x = "((SafezoneW -(3/4)*SafezoneH)/2) - SafezoneX"; - y = "0.5*SafezoneH - SafezoneY"; - w = "(3/4)*SafezoneH"; + x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX"; + y = "0.5*safeZoneH - safeZoneY"; + w = "(3/4)*safeZoneH"; h = "0"; colorText[] = {0.8745,0.8745,0.8745,1}; }; class LineV: RscLine { idc = 699302; - x = "0.5*SafezoneW - SafezoneX"; - y = "0.15*SafezoneH - SafezoneY"; + x = "0.5*safeZoneW - safeZoneX"; + y = "0.15*safeZoneH - safeZoneY"; w = "0"; - h = "0.7*SafezoneH"; + h = "0.7*safeZoneH"; colorText[] = {0.8745,0.8745,0.8745,1}; }; }; @@ -407,4 +420,4 @@ ACE_Titan_TOP_off: 1006 ACE_Titan_DIR: 1007 ACE_Titan_FLTR_mode_off: 1002 ACE_Titan_FLTR_mode: 161 -*/ + */ diff --git a/addons/javelin/XEH_PREP.hpp b/addons/javelin/XEH_PREP.hpp index fe9bbc553b..cce2482932 100644 --- a/addons/javelin/XEH_PREP.hpp +++ b/addons/javelin/XEH_PREP.hpp @@ -1,11 +1,6 @@ -PREP(lockKeyDown); -PREP(lockKeyUp); - PREP(cycleFireMode); -PREP(showFireMode); - -PREP(onFired); -PREP(onOpticLoad); +PREP(getTarget); +PREP(mapHelperDraw); PREP(onOpticDraw); -PREP(onOpticUnload); +PREP(showFireMode); diff --git a/addons/javelin/XEH_clientInit.sqf b/addons/javelin/XEH_clientInit.sqf index 1286be3697..66d645968f 100644 --- a/addons/javelin/XEH_clientInit.sqf +++ b/addons/javelin/XEH_clientInit.sqf @@ -1,5 +1,6 @@ +// #define DEBUG_MODE_FULL #include "script_component.hpp" if (!hasInterface) exitWith {}; -#include "initKeybinds.sqf" \ No newline at end of file +#include "initKeybinds.sqf" diff --git a/addons/javelin/XEH_post_init.sqf b/addons/javelin/XEH_post_init.sqf deleted file mode 100644 index 6eccf9d1dd..0000000000 --- a/addons/javelin/XEH_post_init.sqf +++ /dev/null @@ -1,2 +0,0 @@ -#include "script_component.hpp" - diff --git a/addons/javelin/XEH_pre_init.sqf b/addons/javelin/XEH_preInit.sqf similarity index 58% rename from addons/javelin/XEH_pre_init.sqf rename to addons/javelin/XEH_preInit.sqf index 27cbb54cfc..8c892c87cd 100644 --- a/addons/javelin/XEH_pre_init.sqf +++ b/addons/javelin/XEH_preInit.sqf @@ -10,13 +10,13 @@ GVAR(pfehID) = -1; DFUNC(disableFire) = { params ["_firedEH"]; - if(_firedEH < 0 && {difficulty > 0}) then { + if (_firedEH < 0 && {difficulty > 0}) then { _firedEH = [ACE_player, "DefaultAction", {true}, { - _canFire = (_this select 1) getVariable["ace_missileguidance_target", nil]; - if(!isNil "_canFire") exitWith { false }; + private _canFire = (_this select 1) getVariable ["ace_missileguidance_target", nil]; + if (!isNil "_canFire") exitWith { false }; true }] call EFUNC(common,addActionEventHandler); - TRACE_1("added",_firedEH); + TRACE_1("Locking Fire Button",_firedEH); }; _firedEH @@ -24,8 +24,8 @@ DFUNC(disableFire) = { DFUNC(enableFire) = { params ["_firedEH"]; - if(_firedEH >= 0 && {difficulty > 0}) then { - TRACE_1("removing",_firedEH); + if (_firedEH >= 0 && {difficulty > 0}) then { + TRACE_1("Unlocking Fire Button",_firedEH); [ACE_player, "DefaultAction", _firedEH] call EFUNC(common,removeActionEventHandler); }; -1 diff --git a/addons/javelin/functions/fnc_cycleFireMode.sqf b/addons/javelin/functions/fnc_cycleFireMode.sqf index 50609b3468..5eeb4dd9b3 100644 --- a/addons/javelin/functions/fnc_cycleFireMode.sqf +++ b/addons/javelin/functions/fnc_cycleFireMode.sqf @@ -1,13 +1,30 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus + * Cycles fire mode (top/dir) + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_javelin_fnc_cycleFireMode + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -TRACE_1("enter", _this); + +TRACE_1("cycle fire mode", _this); private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player}; -private _currentFireMode = _currentShooter getVariable["ace_missileguidance_attackProfile", "JAV_TOP"]; +private _currentFireMode = _currentShooter getVariable ["ace_missileguidance_attackProfile", "JAV_TOP"]; -if(_currentFireMode == "JAV_DIR") then { +if (_currentFireMode == "JAV_DIR") then { _currentFireMode = "JAV_TOP"; } else { _currentFireMode = "JAV_DIR"; }; -_currentShooter setVariable["ace_missileguidance_attackProfile", _currentFireMode, false]; +_currentShooter setVariable ["ace_missileguidance_attackProfile", _currentFireMode, false]; +TRACE_2("set",_currentFireMode,_currentShooter); diff --git a/addons/javelin/functions/fnc_getTarget.sqf b/addons/javelin/functions/fnc_getTarget.sqf new file mode 100644 index 0000000000..04d9c76ef0 --- /dev/null +++ b/addons/javelin/functions/fnc_getTarget.sqf @@ -0,0 +1,81 @@ +/* + * Author: PabstMirror + * Find a target within the optic range + * + * Arguments: + * 0: Last Target (seeds the scan) + * 1: Max Range (meters) + * + * Example: + * [] call ace_javelin_fnc_getTarget + * + * Public: No + */ +// #define DEBUG_MODE_FULL +#include "script_component.hpp" + +params ["_lastTarget", "_maxRange"]; + +scopeName "main"; + +private _viewASL = AGLtoASL positionCameraToWorld [0,0,0]; +private _viewDir = _viewASL vectorFromTo (AGLtoASL positionCameraToWorld [0,0,1]); + +// Attempt to lock onto current target if it is still valid +if (!isNull _lastTarget) then { + private _aimASL = aimPos _lastTarget; + + if ((_viewASL vectorDistance _aimASL) > _maxRange) exitWith {}; + if ((acos ((_viewASL vectorFromTo _aimASL) vectorDotProduct _viewDir)) > 0.6) exitWith {}; + + private _relAngle = (_lastTarget getRelDir _viewASL); + + for "_xOffset" from -2.5 to 2.5 step 0.5 do { + for "_yOffset" from -2 to 1 step 0.5 do { + // Find test points in the model based on the angle that we are viewing it from (not true 3d projection, but not bad) + private _testPosASL = AGLtoASL (_lastTarget modelToWorld [_xOffset * - cos _relAngle, _xOffset * sin _relAngle, _yOffset]); + private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, _testPosASL, ace_player, vehicle ace_player, true, 1]; + // drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [[0,1,1,1], [1,0,1,1]] select (count _intersectionsToCursorTarget), (ASLtoAGL _testPosASL), 0.25, 0.25, 0, "", 0.5, 0.025, "TahomaB"]; + if (!(_intersectionsToCursorTarget isEqualTo [])) then { + (_intersectionsToCursorTarget select 0) params ["", "", "_intersectedObject"]; + if (_intersectedObject isKindOf "AllVehicles") then { + _intersectedObject breakOut "main"; + }; + }; + }; + }; +}; + +// Try cursorObject/Target as they are very fast +if ((cursorObject isKindOf "AllVehicles") && {(cursorObject distance ace_player) < _maxRange}) then { + private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, aimPos cursorObject, ace_player, cursorObject, true, 1]; + if (_intersectionsToCursorTarget isEqualTo []) then { + cursorObject breakOut "main"; + }; +}; +if ((cursorTarget isKindOf "AllVehicles") && {(cursorObject distance ace_player) < _maxRange}) then { + private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, aimPos cursorTarget, ace_player, cursorTarget, true, 1]; + if (_intersectionsToCursorTarget isEqualTo []) then { + cursorTarget breakOut "main"; + }; +}; + +// Attempt to scan using multiple rayscasts - This is expensive (n^2) and care should be given to balance accuracy vs speed +for "_xOffset" from -14 to 14 step 2 do { + for "_yOffset" from -12 to 12 step 4 do { + private _testPosASL = AGLtoASL (positionCameraToWorld [_xOffset, _yOffset, _maxRange]); + private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, _testPosASL, ace_player, vehicle ace_player, true, 1]; + // drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [[0,1,0,1], [1,0,0,1]] select (count _intersectionsToCursorTarget), (ASLtoAGL _testPosASL), 0.25, 0.25, 0, "", 0.5, 0.025, "TahomaB"]; + if (!(_intersectionsToCursorTarget isEqualTo [])) then { + (_intersectionsToCursorTarget select 0) params ["", "", "_intersectedObject"]; + if (_intersectedObject isKindOf "AllVehicles") then { + _intersectedObject breakOut "main"; + }; + }; + }; +}; + +objNull diff --git a/addons/javelin/functions/fnc_lockKeyDown.sqf b/addons/javelin/functions/fnc_lockKeyDown.sqf deleted file mode 100644 index 3eabbd9c28..0000000000 --- a/addons/javelin/functions/fnc_lockKeyDown.sqf +++ /dev/null @@ -1,3 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); \ No newline at end of file diff --git a/addons/javelin/functions/fnc_lockKeyUp.sqf b/addons/javelin/functions/fnc_lockKeyUp.sqf deleted file mode 100644 index 3eabbd9c28..0000000000 --- a/addons/javelin/functions/fnc_lockKeyUp.sqf +++ /dev/null @@ -1,3 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); \ No newline at end of file diff --git a/addons/javelin/functions/fnc_mapHelperDraw.sqf b/addons/javelin/functions/fnc_mapHelperDraw.sqf new file mode 100644 index 0000000000..20ec3ab349 --- /dev/null +++ b/addons/javelin/functions/fnc_mapHelperDraw.sqf @@ -0,0 +1,52 @@ +/* + * Author: PabstMirror + * Handles the map helper's draw event + * Resets arguments if not run recently + * And starts a watchdog to detect when weapon display unloaded + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_javelin_fnc_mapHelperDraw + * + * Public: No + */ +// #define DEBUG_MODE_FULL +#include "script_component.hpp" + +if (isNil QGVAR(arguments)) then { + TRACE_1("Starting optic draw", _this); + + // reset shooter var: + private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player}; + _currentShooter setVariable ["ace_missileguidance_target", nil, false]; + + GVAR(arguments) = [ + diag_frameno, // Last run frame + objNull, // currentTargetObject + 0, // Lock Start Time + 0, // Next Sound timer + -1, // _fireDisabledEH + 0 // _nextTargetScan + ]; + + // Start up a watchdog for when the display is no longer shown (but might not be unloaded or null) + [{ + if (isNull (uiNamespace getVariable ["ACE_RscOptics_javelin", displayNull])) exitWith {true}; + GVAR(arguments) params ["_lastRunFrame"]; + (diag_frameno < _lastRunFrame) || {diag_frameno > (_lastRunFrame + 1)} + }, { + TRACE_1("old/null display - ending optic draw",_this); + private _fireDisabledEH = GVAR(arguments) param [4, -1]; + [_fireDisabledEH] call FUNC(enableFire); + GVAR(arguments) = nil; + }, []] call CBA_fnc_waitUntilAndExecute; +}; + +BEGIN_COUNTER(onOpticDraw); +GVAR(arguments) call FUNC(onOpticDraw); +END_COUNTER(onOpticDraw); diff --git a/addons/javelin/functions/fnc_onFired.sqf b/addons/javelin/functions/fnc_onFired.sqf deleted file mode 100644 index 220ddc37f0..0000000000 --- a/addons/javelin/functions/fnc_onFired.sqf +++ /dev/null @@ -1,15 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" - -PARAMS_2(_shooter,_weapon); - -// Bail on not missile or javelin PFEH not running -if ((_shooter != ACE_player) || {(GVAR(pfehID) == -1)}) exitWith { false }; - -private _configs = configProperties [configFile >> "CfgWeapons" >> _weapon, QUOTE(configName _x == QUOTE(QGVAR(enabled))), false]; -if (((count _configs) < 1) || {(getNumber (_configs select 0)) != 1}) exitWith {}; - -__JavelinIGUITargeting ctrlShow false; -__JavelinIGUITargetingGate ctrlShow false; -__JavelinIGUITargetingLines ctrlShow false; -__JavelinIGUITargetingConstraints ctrlShow false; diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index dede3ae69c..8a473669f9 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -1,69 +1,67 @@ -//#define DEBUG_MODE_FULL +/* + * Author: jaynus, PabstMirror + * Main loop, handles scaning for targets and drawing the javelin optic + * + * Arguments: + * 0: Last run frame + * 0: Current target (what we locked last run) + * 0: Lock start time (cba mission time) + * 0: Next sound play time (ticktime) + * 0: Next target scan (ticktime) + * + * Return Value: + * None + * + * Example: + * [] call ace_javelin_fnc_mapHelperDraw + * + * Public: No + */ +// #define DEBUG_MODE_FULL #include "script_component.hpp" -TRACE_1("enter", _this); -#define __TRACKINTERVAL 0 // how frequent the check should be. -#define __LOCKONTIME 3 // Lock on won't occur sooner +// TRACE_1("onOpticDraw",diag_frameno); -private ["_apos", "_aposX", "_aposY", "_args", "_boundsInput", "_bpos", "_canFire", "_constraintBottom"]; -private ["_constraintLeft", "_constraintRight", "_constraintTop", "_currentTarget", "_fireDisabledEH"]; -private ["_firedEH", "_fov", "_lastTick", "_lockTime", "_maxX", "_maxY", "_minX", "_minY", "_newTarget"]; -private ["_offsetX", "_offsetY", "_pos", "_randomLockInterval", "_randomPosWithinBounds", "_range"]; -private ["_runTime", "_soundTime", "_targetArray", "_zamerny", "_currentShooter"]; - -_currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player}; - -#define __OffsetX ((ctrlPosition __JavelinIGUITargetingLineV) select 0) - 0.5 -#define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5 - -// Reset arguments if we havnt rendered in over a second -_args = uiNamespace getVariable[QGVAR(arguments), [] ]; -if( (count _args) > 0) then { - _lastTick = _args select 0; - if(diag_tickTime - _lastTick > 1) then { - [] call FUNC(onOpticLoad); - }; -}; - -TRACE_1("Running", "Running"); +#define __TRACKINTERVAL 0 // how frequent the ui update should be. +#define __SCANNTERVAL 0.05 // how frequent the target scan check should be. +#define __LOCKONTIME 3 // Lock on won't occur sooner // Pull the arguments -_currentTarget = _args select 1; -_runTime = _args select 2; -_lockTime = _args select 3; -_soundTime = _args select 4; -_randomLockInterval = _args select 5; -_fireDisabledEH = _args select 6; +params ["_lastRunFrame", "_currentTarget", "_lockStartTime", "_soundNextPlayTime", "_fireDisabledEH", "_nextTargetScan"]; -private ["_ammo", "_magazineConfig", "_weaponConfig"]; -_weaponConfig = configProperties [configFile >> "CfgWeapons" >> (currentWeapon _currentShooter), QUOTE(configName _x == QUOTE(QGVAR(enabled))), false]; -_magazineConfig = if ((currentMagazine _currentShooter) != "") then { - _ammo = getText (configFile >> "CfgMagazines" >> (currentMagazine _currentShooter) >> "ammo"); - configProperties [(configFile >> "CfgAmmo" >> _ammo), "(configName _x) == 'ace_missileguidance'", false]; +// Get shooter info +private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player}; +private _currentWeapon = currentWeapon _currentShooter; +private _currentMagazine = currentMagazine _currentShooter; + +// Get weapon / ammo configs +private _ammoCount = _currentShooter ammo _currentWeapon; +private _weaponConfig = configProperties [configFile >> "CfgWeapons" >> _currentWeapon, QUOTE(configName _x == QUOTE(QGVAR(enabled))), false]; +private _ammoConfig = if (_currentMagazine != "") then { + private _ammoType = getText (configFile >> "CfgMagazines" >> _currentMagazine >> "ammo"); + configProperties [(configFile >> "CfgAmmo" >> _ammoType), "(configName _x) == 'ace_missileguidance'", false]; } else { [] }; -//If weapon does not have "javelin enabled", then exit PFEH -if (((count _weaponConfig) < 1) || {(getNumber (_weaponConfig select 0)) != 1}) exitWith { +// Check if loaded and javelin enabled for wepaon and missile guidance enabled for loaded ammo +if ((_ammoCount == 0) || // No ammo loaded + {(count _weaponConfig) < 1} || {(getNumber (_weaponConfig select 0)) != 1} || // Not enabled for weapon + {(count _ammoConfig) < 1} || {(getNumber ((_ammoConfig select 0) >> "enabled")) != 1} // Not enabled for ammo + ) exitWith { + __JavelinIGUITargeting ctrlShow false; - __JavelinIGUITargetingGate ctrlShow false; - __JavelinIGUITargetingLines ctrlShow false; - __JavelinIGUITargetingConstraints ctrlShow false; + __JavelinIGUISeek ctrlSetTextColor __ColorGray; - if(!isNil "_fireDisabledEH") then { - _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); - }; - - [(_this select 1)] call CBA_fnc_removePerFrameHandler; - GVAR(pfehID) = -1; + _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); + _this set [0, diag_frameno]; + _this set [4, _fireDisabledEH]; }; -// Find a target within the optic range -_newTarget = objNull; -// Bail on fast movement -if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && {cameraOn == ACE_player}) exitWith { // keep it steady. +// Bail on fast movement (keep it steady) +if ((velocity ACE_player) distance [0,0,0] > 0.75 && {cameraView == "GUNNER"} && {cameraOn == ACE_player}) exitWith { + TRACE_1("exiting gunner because movement",velocity ACE_player); ACE_player switchCamera "INTERNAL"; if (player != ACE_player) then { TRACE_2("Zeus, manually reseting RC after switchCamera",player,ACE_player); @@ -71,222 +69,122 @@ if ((velocity ACE_player) distance [0,0,0] > 0.5 && {cameraView == "GUNNER"} && }; }; -// Refresh the firemode +// Refresh the firemode (top/dir) [] call FUNC(showFireMode); -_ammo = _currentShooter ammo (currentWeapon _currentShooter); -// not loaded or not "javelin enabled" for magazine, hide targeting and enable firing -if ((_ammo == 0) || {(count _magazineConfig) < 1} || {(getNumber ((_magazineConfig select 0) >> "enabled")) != 1}) exitWith { +// Get UI constants +private _offsetX = 0.5 * safeZoneW - safeZoneX - 0.5; +private _offsetY = 0.5 * safeZoneH - safeZoneY - 0.5; + +private _newTarget = objNull; +if (GVAR(isLockKeyDown) && {cameraView == "GUNNER"} && {(currentVisionMode ACE_player) == 2}) then { + // Attempting to lock; getTarget can be expensive so it's rate is limited + if (diag_tickTime > _nextTargetScan) then { + BEGIN_COUNTER(getTarget); + _newTarget = [_currentTarget, 2500, 0.6] call FUNC(getTarget); + END_COUNTER(getTarget); + _nextTargetScan = diag_tickTime + __SCANNTERVAL; + } else { + _newTarget = _currentTarget; + }; + + // Show gate box + private _boundsInput = if (_currentTarget isKindOf "CAManBase") then { + [_currentTarget,[-0.5,-0.5,-0.25],[0,0,0]]; + } else { + [_currentTarget,[-1,-1,-1],_currentTarget selectionPosition "zamerny"]; + }; + + private _bpos = _boundsInput call EFUNC(common,worldToScreenBounds); + + private _lockTime = if (isNull _currentTarget) then {0} else {CBA_missionTime - _lockStartTime}; + private _minX = ((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 - 0.075*safeZoneW, (_bpos select 0), true]) + _offsetX) max __ConstraintLeft; + private _minY = ((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 - 0.075*safeZoneH, (_bpos select 1), true]) + _offsetY) max __ConstraintTop; + private _maxX = (((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 + 0.075*safeZoneW, (_bpos select 2), true]) + _offsetX) min __ConstraintRight) - (0.025 * (3 / 4) * safeZoneH); + private _maxY = (((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 + 0.075*safeZoneH, (_bpos select 3), true]) + _offsetY) min __ConstraintBottom) - (0.025 * safeZoneH); + + // TRACE_3("",_boundsInput,_bpos,_lockTime); + // TRACE_4("",_minX,_maxX,_minY,_maxY); + + __JavelinIGUITargetingGateTL ctrlSetPosition [_minX, _minY]; + __JavelinIGUITargetingGateTR ctrlSetPosition [_maxX, _minY]; + __JavelinIGUITargetingGateBL ctrlSetPosition [_minX, _maxY]; + __JavelinIGUITargetingGateBR ctrlSetPosition [_maxX, _maxY]; + {_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingGateTL, __JavelinIGUITargetingGateTR, __JavelinIGUITargetingGateBL, __JavelinIGUITargetingGateBR]; + + __JavelinIGUITargeting ctrlShow true; + __JavelinIGUITargetingGate ctrlShow true; +} else { + // Not trying to lock __JavelinIGUITargeting ctrlShow false; __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; - __JavelinIGUITargetingConstraints ctrlShow false; - - if(!isNil "_fireDisabledEH") then { - _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); - }; -}; - -_range = parseNumber (ctrlText __JavelinIGUIRangefinder); -TRACE_1("Viewing range", _range); -if (_range > 50 && {_range < 2500}) then { - _pos = positionCameraToWorld [0,0,_range]; - _targetArray = _pos nearEntities ["AllVehicles", _range/100]; - TRACE_1("Searching at range", _targetArray); - if (count (_targetArray) > 0) then { - _newTarget = _targetArray select 0; - }; -}; - -if ((isNull _newTarget) && {cursorObject isKindOf "AllVehicles"}) then { - private _intersectionsToCursorTarget = lineIntersectsSurfaces [(AGLtoASL positionCameraToWorld [0,0,0]), aimPos cursorObject, ace_player, cursorObject, true, 1]; - if (_intersectionsToCursorTarget isEqualTo []) then { - _newTarget = cursorObject; - }; -}; -if ((isNull _newTarget) && {cursorTarget isKindOf "AllVehicles"}) then { - private _intersectionsToCursorTarget = lineIntersectsSurfaces [(AGLtoASL positionCameraToWorld [0,0,0]), aimPos cursorTarget, ace_player, cursorTarget, true, 1]; - if (_intersectionsToCursorTarget isEqualTo []) then { - _newTarget = cursorTarget; - }; -}; - -// Create constants -_constraintTop = __ConstraintTop; -_constraintLeft = __ConstraintLeft; -_constraintBottom = __ConstraintBottom; -_constraintRight = __ConstraintRight; - -_offsetX = __OffsetX; -_offsetY = __OffsetY; - -__JavelinIGUITargeting ctrlShow true; -__JavelinIGUITargetingConstrains ctrlShow true; - -_zamerny = _currentTarget selectionPosition (["zamerny", "body"] select (_currentTarget isKindOf "CAManBase")); -_randomPosWithinBounds = [(_zamerny select 0) + 1 - (random 2.0),(_zamerny select 1) + 1 - (random 2.0),(_zamerny select 2) + 0.5 - (random 1.0)]; - -_apos = worldToScreen (_currentTarget modelToWorld _randomPosWithinBounds); - -_aposX = 0; -_aposY = 0; -if (count _apos < 2) then { - _aposX = 1; - _aposY = 0; -} else { - _aposX = (_apos select 0) + _offsetX; - _aposY = (_apos select 1) + _offsetY; -}; - -if((call CBA_fnc_getFoV) select 1 > 9) then { - __JavelinIGUINFOV ctrlSetTextColor __ColorGreen; - __JavelinIGUIWFOV ctrlSetTextColor __ColorGray; -} else { - __JavelinIGUINFOV ctrlSetTextColor __ColorGray; - __JavelinIGUIWFOV ctrlSetTextColor __ColorGreen; }; if (isNull _newTarget) then { - // No targets found + // No target found _currentTarget = objNull; - _lockTime = 0; - + _lockStartTime = 0; __JavelinIGUISeek ctrlSetTextColor __ColorGray; - __JavelinIGUITargeting ctrlShow false; - __JavelinIGUITargetingGate ctrlShow false; + _currentShooter setVariable ["ace_missileguidance_target", nil, false]; + __JavelinIGUITargetingLines ctrlShow false; - __JavelinIGUITargetingConstraints ctrlShow false; - - _currentShooter setVariable ["ace_missileguidance_target",nil, false]; - + // Disallow fire _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); } else { - _fov = [] call CBA_fnc_getFoV; - TRACE_1("FOV", _fov); - if (_newTarget distance ACE_player < 2500 - && {(call CBA_fnc_getFoV) select 1 > 9} - && { (currentVisionMode ACE_player == 2)} - && GVAR(isLockKeyDown) - ) then { - // Lock on after 3 seconds - if(_currentTarget != _newTarget) then { - TRACE_1("New Target, reseting locking", _newTarget); - _lockTime = diag_tickTime; - _currentTarget = _newTarget; + if ((!isNull _newTarget) && {_currentTarget != _newTarget}) then { + TRACE_1("New Target, reseting locking", _newTarget); + _lockStartTime = CBA_missionTime; + _currentTarget = _newTarget; + }; - playSound "ACE_Javelin_Locking"; - } else { - if(diag_tickTime - _lockTime > __LOCKONTIME + _randomLockInterval) then { - TRACE_2("LOCKED!", _currentTarget, _lockTime); + if ((CBA_missionTime - _lockStartTime) > __LOCKONTIME) then { // Lock on after 3 seconds + TRACE_2("LOCKED!", _currentTarget, _lockStartTime); + __JavelinIGUISeek ctrlSetTextColor __ColorGreen; + __JavelinIGUITargetingLines ctrlShow true; - __JavelinIGUISeek ctrlSetTextColor __ColorGreen; + // Move target marker (the crosshair) to aimpoint on the target + private _aimPointOnTarget = _currentTarget selectionPosition (["zamerny", "body"] select (_currentTarget isKindOf "CAManBase")); + (worldToScreen (_currentTarget modelToWorld _aimPointOnTarget)) params [["_aposX", 0.5], ["_aposY", 0.5]]; + private _ctrlPos = ctrlPosition __JavelinIGUITargetingLineV; + _ctrlPos set [0, _aposX + _offsetX]; + __JavelinIGUITargetingLineV ctrlSetPosition _ctrlPos; + __JavelinIGUITargetingLineV ctrlCommit __TRACKINTERVAL; + _ctrlPos = ctrlPosition __JavelinIGUITargetingLineH; + _ctrlPos set [1, _aposY + _offsetY]; + __JavelinIGUITargetingLineH ctrlSetPosition _ctrlPos; + __JavelinIGUITargetingLineH ctrlCommit __TRACKINTERVAL; - __JavelinIGUITargeting ctrlShow true; - __JavelinIGUITargetingConstrains ctrlShow false; - __JavelinIGUITargetingGate ctrlShow true; - __JavelinIGUITargetingLines ctrlShow true; + _currentShooter setVariable ["ace_missileguidance_target", _currentTarget, false]; - // Move target marker to coords. - //__JavelinIGUITargetingLineV ctrlSetPosition [_aposX,ctrlPosition __JavelinIGUITargetingLineV select 1]; - //__JavelinIGUITargetingLineH ctrlSetPosition [ctrlPosition __JavelinIGUITargetingLineH select 0,_aposY]; - //{_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingLineH,__JavelinIGUITargetingLineV]; + // Allow fire + _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); - _boundsInput = if (_currentTarget isKindOf "CAManBase") then { - [_currentTarget,[-1,-1,-2],_currentTarget selectionPosition "body"]; - } else { - [_currentTarget,[-1,-1,-2],_currentTarget selectionPosition "zamerny"]; - }; - - _bpos = _boundsInput call EFUNC(common,worldToScreenBounds); - - _minX = ((_bpos select 0) + _offsetX) max _constraintLeft; - _minY = ((_bpos select 1) + _offsetY) max _constraintTop; - _maxX = ((_bpos select 2) + _offsetX) min (_constraintRight - 0.025 * (3 / 4) * SafezoneH); - _maxY = ((_bpos select 3) + _offsetY) min (_constraintBottom - 0.025 * SafezoneH); - - TRACE_4("", _boundsInput, _bpos, _minX, _minY); - - __JavelinIGUITargetingGateTL ctrlSetPosition [_minX, _minY]; - __JavelinIGUITargetingGateTR ctrlSetPosition [_maxX, _minY]; - __JavelinIGUITargetingGateBL ctrlSetPosition [_minX, _maxY]; - __JavelinIGUITargetingGateBR ctrlSetPosition [_maxX, _maxY]; - - {_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingGateTL, __JavelinIGUITargetingGateTR, __JavelinIGUITargetingGateBL, __JavelinIGUITargetingGateBR]; - - _currentShooter setVariable["ace_missileguidance_target", _currentTarget, false]; - - // Allow fire - _fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire); - - if(diag_tickTime > _soundTime) then { - playSound "ACE_Javelin_Locked"; - _soundTime = diag_tickTime + 0.25; - }; - } else { - __JavelinIGUITargeting ctrlShow true; - __JavelinIGUITargetingGate ctrlShow true; - __JavelinIGUITargetingConstrains ctrlShow true; - __JavelinIGUITargetingLines ctrlShow false; - - _currentShooter setVariable["ace_missileguidance_target", nil, false]; - - _boundsInput = if (_currentTarget isKindOf "CAManBase") then { - [_newTarget,[-1,-1,-2],_currentTarget selectionPosition "body"]; - } else { - [_newTarget,[-1,-1,-1],_currentTarget selectionPosition "zamerny"]; - }; - - _bpos = _boundsInput call EFUNC(common,worldToScreenBounds); - - _minX = ((_bpos select 0) + _offsetX) max _constraintLeft; - _minY = ((_bpos select 1) + _offsetY) max _constraintTop; - _maxX = ((_bpos select 2) + _offsetX) min (_constraintRight - 0.025 * (3 / 4) * SafezoneH); - _maxY = ((_bpos select 3) + _offsetY) min (_constraintBottom - 0.025 * SafezoneH); - - TRACE_4("", _boundsInput, _bpos, _minX, _minY); - - __JavelinIGUITargetingGateTL ctrlSetPosition [_minX,_minY]; - __JavelinIGUITargetingGateTR ctrlSetPosition [_maxX,_minY]; - __JavelinIGUITargetingGateBL ctrlSetPosition [_minX,_maxY]; - __JavelinIGUITargetingGateBR ctrlSetPosition [_maxX,_maxY]; - - {_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingGateTL,__JavelinIGUITargetingGateTR,__JavelinIGUITargetingGateBL,__JavelinIGUITargetingGateBR]; - - if(diag_tickTime > _soundTime) then { - playSound "ACE_Javelin_Locking"; - _soundTime = diag_tickTime + 0.25; - }; - // Disallow fire - _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); - }; + if (diag_tickTime > _soundNextPlayTime) then { + playSound "ACE_Javelin_Locked"; + _soundNextPlayTime = diag_tickTime + 0.25; }; } else { - // No targets found - _currentTarget = objNull; - _lockTime = 0; - + // Lock in progress __JavelinIGUISeek ctrlSetTextColor __ColorGray; - __JavelinIGUITargeting ctrlShow false; - __JavelinIGUITargetingGate ctrlShow false; __JavelinIGUITargetingLines ctrlShow false; - __JavelinIGUITargetingConstraints ctrlShow false; _currentShooter setVariable ["ace_missileguidance_target", nil, false]; + if (diag_tickTime > _soundNextPlayTime) then { + playSound "ACE_Javelin_Locking"; + _soundNextPlayTime = diag_tickTime + 0.25; + }; // Disallow fire _fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire); }; }; -//TRACE_2("", _newTarget, _currentTarget); - // Save arguments for next run -_args set[0, diag_tickTime]; -_args set[1, _currentTarget]; -_args set[2, _runTime]; -_args set[3, _lockTime]; -_args set[4, _soundTime]; -_args set[6, _fireDisabledEH]; - -uiNamespace setVariable[QGVAR(arguments), _args ]; +_this set [0, diag_frameno]; +_this set [1, _currentTarget]; +_this set [2, _lockStartTime]; +_this set [3, _soundNextPlayTime]; +_this set [4, _fireDisabledEH]; +_this set [5, _nextTargetScan]; diff --git a/addons/javelin/functions/fnc_onOpticLoad.sqf b/addons/javelin/functions/fnc_onOpticLoad.sqf deleted file mode 100644 index 5148ca983f..0000000000 --- a/addons/javelin/functions/fnc_onOpticLoad.sqf +++ /dev/null @@ -1,39 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); - -#define __LOCKONTIMERANDOM 1 // Deviation in lock on time - -if((count _this) > 0) then { - uiNameSpace setVariable ['ACE_RscOptics_javelin',_this select 0]; -}; - -private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player}; -TRACE_2("shooter",_currentShooter,typeOf _currentShooter); -_currentShooter setVariable ["ace_missileguidance_target", nil, false]; - -__JavelinIGUISeek ctrlSetTextColor __ColorGray; -__JavelinIGUINFOV ctrlSetTextColor __ColorGray; - -__JavelinIGUITargeting ctrlShow false; -__JavelinIGUITargetingConstrains ctrlShow false; -__JavelinIGUITargetingGate ctrlShow false; -__JavelinIGUITargetingLines ctrlShow false; - -if(GVAR(pfehID) != -1) then { - [] call FUNC(onOpticUnload); // Unload optic if it was already loaded -}; - -uiNameSpace setVariable [QGVAR(arguments), - [ - diag_tickTime, // Last runtime - objNull, // currentTargetObject - 0, // Run Time - 0, // Lock Time - 0, // Sound timer - (random __LOCKONTIMERANDOM), // random lock time addition - -1 - ] -]; - -GVAR(pfehID) = [FUNC(onOpticDraw), 0, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/javelin/functions/fnc_onOpticUnload.sqf b/addons/javelin/functions/fnc_onOpticUnload.sqf deleted file mode 100644 index 221fe3b5f6..0000000000 --- a/addons/javelin/functions/fnc_onOpticUnload.sqf +++ /dev/null @@ -1,20 +0,0 @@ -//#define DEBUG_MODE_FULL -#include "script_component.hpp" -TRACE_1("enter", _this); -private ["_args", "_disableFireEH"]; - -// uiNameSpace setVariable ['ACE_RscOptics_javelin',nil]; - -if(GVAR(pfehID) != -1) then { - [GVAR(pfehID)] call CBA_fnc_removePerFrameHandler; - GVAR(pfehID) = -1; -}; - -_args = uiNamespace getVariable[QGVAR(arguments), nil ]; -if(!isNil "_args") then { - _disableFireEH = _args select 6; - if(_disableFireEH > 0 && difficulty > 0) then { - [ACE_player, "DefaultAction", _disableFireEH] call EFUNC(common,removeActionEventHandler); - }; - uiNameSpace setVariable [QGVAR(arguments),nil]; -}; diff --git a/addons/javelin/functions/fnc_showFireMode.sqf b/addons/javelin/functions/fnc_showFireMode.sqf index 95dd038b92..525289d031 100644 --- a/addons/javelin/functions/fnc_showFireMode.sqf +++ b/addons/javelin/functions/fnc_showFireMode.sqf @@ -1,11 +1,27 @@ +/* + * Author: jaynus + * Updates fire mode on javelin display (top/dir) + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_javelin_fnc_showFireMode + * + * Public: No + */ //#define DEBUG_MODE_FULL #include "script_component.hpp" -TRACE_1("enter", _this); private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player}; private _currentFireMode = _currentShooter getVariable ["ace_missileguidance_attackProfile", "JAV_TOP"]; -if(_currentFireMode == "JAV_TOP") then { +TRACE_1("showFireMode", _currentFireMode); + +if (_currentFireMode == "JAV_TOP") then { __JavelinIGUITop ctrlSetTextColor __ColorGreen; __JavelinIGUIDir ctrlSetTextColor __ColorGray; } else { diff --git a/addons/javelin/initKeybinds.sqf b/addons/javelin/initKeybinds.sqf index cbfafa326d..ec5c9a27ac 100644 --- a/addons/javelin/initKeybinds.sqf +++ b/addons/javelin/initKeybinds.sqf @@ -5,18 +5,16 @@ if (GETGVAR(isLockKeyDown,false)) exitWith {false}; GVAR(isLockKeyDown) = true; + TRACE_1("lock key down",GVAR(isLockKeyDown)); - // Statement - [ACE_player] call FUNC(lockKeyDown); // Return false so it doesn't block the rest weapon action false }, { // prevent holding down GVAR(isLockKeyDown) = false; + TRACE_1("lock key up",GVAR(isLockKeyDown)); - // Statement - [ACE_player] call FUNC(lockKeyUp); false }, [15, [false, false, false]], false] call CBA_fnc_addKeybind; //Tab Key @@ -27,4 +25,4 @@ [ACE_player] call FUNC(cycleFireMode); false }, -[15, [false, true, false]], false] call CBA_fnc_addKeybind; //Ctrl+Tab Key \ No newline at end of file +[15, [false, true, false]], false] call CBA_fnc_addKeybind; //Ctrl+Tab Key diff --git a/addons/javelin/script_component.hpp b/addons/javelin/script_component.hpp index 4b1a66efdb..b78032439d 100644 --- a/addons/javelin/script_component.hpp +++ b/addons/javelin/script_component.hpp @@ -16,9 +16,6 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ACE_JAV_FIREMODE_DIR 1 -#define ACE_JAV_FIREMODE_TOP 2 - // Javelin IGUI defines #define __JavelinIGUI (uinamespace getVariable "ACE_RscOptics_javelin") @@ -29,8 +26,6 @@ #define __JavelinIGUISeek (__JavelinIGUI displayCtrl 699000) #define __JavelinIGUITop (__JavelinIGUI displayCtrl 699001) #define __JavelinIGUIDir (__JavelinIGUI displayCtrl 699002) -#define __JavelinIGUINFOV (__JavelinIGUI displayCtrl 1003) -#define __JavelinIGUIWFOV (__JavelinIGUI displayCtrl 1004) #define __JavelinIGUIRangefinder (__JavelinIGUI displayCtrl 151) // Constrains From 36c14c5dc4e51dac8e3ece13213d8a0744c52816 Mon Sep 17 00:00:00 2001 From: ulteq Date: Mon, 7 Nov 2016 12:01:36 +0100 Subject: [PATCH 156/826] Feature - Vanilla zeroing fix --- .../functions/fnc_updateRangeCard.sqf | 18 ++-- addons/scopes/CfgWeapons.hpp | 68 ++++++++++++++- addons/scopes/XEH_PREP.hpp | 2 + addons/scopes/XEH_postInit.sqf | 2 + addons/scopes/functions/fnc_adjustScope.sqf | 4 - .../functions/fnc_calculateZeroAngle.sqf | 84 +++++++++++++++++++ .../fnc_calculateZeroAngleCorrection.sqf | 73 ++++++++++++++++ addons/scopes/functions/fnc_firedEH.sqf | 48 ++++++++++- .../scopes/functions/fnc_inventoryCheck.sqf | 3 - 9 files changed, 284 insertions(+), 18 deletions(-) create mode 100644 addons/scopes/functions/fnc_calculateZeroAngle.sqf create mode 100644 addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf index a7b0b996e2..2febb7b8ff 100644 --- a/addons/rangecard/functions/fnc_updateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf @@ -20,7 +20,7 @@ disableSerialization; #define __dsp (uiNamespace getVariable "RangleCard_Display") -private ["_airFriction", "_ammoConfig", "_atmosphereModel", "_barometricPressure", "_barrelLength", "_barrelTwist", "_bc", "_bulletMass", "_boreHeight", "_cacheEntry", "_column", "_control", "_dragModel", "_i", "_muzzleVelocity", "_mv", "_mvShift", "_offset", "_relativeHumidity", "_result", "_row", "_scopeBaseAngle", "_weaponConfig", "_zeroRange", "_initSpeed", "_initSpeedCoef", "_useABConfig"]; +private ["_airFriction", "_ammoConfig", "_atmosphereModel", "_barometricPressure", "_barrelLength", "_barrelTwist", "_bc", "_bulletMass", "_boreHeight", "_cacheEntry", "_column", "_control", "_dragModel", "_i", "_muzzleVelocity", "_offset", "_relativeHumidity", "_result", "_row", "_weaponConfig", "_zeroRange", "_initSpeed", "_initSpeedCoef", "_useABConfig"]; _useABConfig = (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]); PARAMS_3(_ammoClass,_magazineClass,_weaponClass); @@ -163,17 +163,21 @@ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) t _cacheEntry = missionNamespace getVariable format[QGVAR(%1_%2_%3), _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]]; if (isNil {_cacheEntry}) then { - _result = [0, 0, _boreHeight, _airFriction, _muzzleVelocity, 15, 1013.25, 0.5, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0, 0, 0, _useABConfig] call FUNC(calculateSolution); - _scopeBaseAngle = (_result select 0) / 60; - if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + private _scopeBaseAngle = 0; + { + private _offset = [_scopeBaseAngle, 100, _muzzleVelocity, _airFriction, 1000, _boreHeight, 15, 1013.25, 0.5, _bc, _dragModel, _atmosphereModel, _useABConfig] call EFUNC(scopes,calculateZeroAngle); + _scopeBaseAngle = _scopeBaseAngle + _offset; + if (_offset < 0.01) exitWith {}; + } forEach [1, 2, 3]; + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false] && missionNamespace getVariable [QEGVAR(advanced_ballistics,ammoTemperatureEnabled), false]) then { { - _mvShift = [_ammoConfig select 9, _x] call EFUNC(advanced_ballistics,calculateAmmoTemperatureVelocityShift); - _mv = _muzzleVelocity + _mvShift; + private _mvShift = [_ammoConfig select 9, _x] call EFUNC(advanced_ballistics,calculateAmmoTemperatureVelocityShift); + private _mv = _muzzleVelocity + _mvShift; [_scopeBaseAngle,_bulletMass,_boreHeight,_airFriction,_mv,_x,_barometricPressure,_relativeHumidity,1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,_forEachIndex,_useABConfig] call FUNC(calculateSolution); } forEach [-15, -5, 5, 10, 15, 20, 25, 30, 35]; } else { - [_scopeBaseAngle,_bulletMass,_boreHeight,_airFriction,_muzzleVelocity,15,_barometricPressure,_relativeHumidity,1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,3,_useABConfig] call FUNC(calculateSolution); + [_scopeBaseAngle,_bulletMass,_boreHeight,_airFriction,_muzzleVelocity,15,_barometricPressure,_relativeHumidity,1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,4,_useABConfig] call FUNC(calculateSolution); }; for "_i" from 0 to 9 do { diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index cd87167f22..5698398ade 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -1,8 +1,69 @@ class CfgWeapons { class ItemCore; class InventoryOpticsItem_Base_F; - + + class optic_Yorris : ItemCore { + ACE_ScopeHeightAboveRail = 0.4; + }; + + class optic_MRD : ItemCore { + ACE_ScopeHeightAboveRail = 0.6; + }; + + class optic_Aco : ItemCore { + ACE_ScopeHeightAboveRail = 1.8; + }; + + class optic_ACO_grn : ItemCore { + ACE_ScopeHeightAboveRail = 1.8; + }; + + class optic_ACO_grn_smg : ItemCore { + ACE_ScopeHeightAboveRail = 1.8; + }; + + class optic_ACO_smg : ItemCore { + ACE_ScopeHeightAboveRail = 1.8; + }; + + class optic_Holosight : ItemCore { + ACE_ScopeHeightAboveRail = 2.4; + }; + + class optic_Holosight_smg : ItemCore { + ACE_ScopeHeightAboveRail = 2.4; + }; + + class optic_Arco : ItemCore { + ACE_ScopeHeightAboveRail = 3.0; + }; + + class optic_ERCO_blk_F : optic_Arco { + ACE_ScopeHeightAboveRail = 2.6; + }; + + class optic_Hamr : ItemCore { + ACE_ScopeHeightAboveRail = 3.2; + }; + + class optic_MRCO : ItemCore { + ACE_ScopeHeightAboveRail = 2.5; + }; + + class optic_Nightstalker : ItemCore { + ACE_ScopeHeightAboveRail = 4.2; + }; + + class optic_NVS : ItemCore { + ACE_ScopeHeightAboveRail = 4.2; + }; + + class optic_TWS : ItemCore { + ACE_ScopeHeightAboveRail = 4.2; + }; + class optic_LRPS : ItemCore { + ACE_ScopeHeightAboveRail = 4.0; ACE_ScopeAdjust_Vertical[] = {-4, 30}; ACE_ScopeAdjust_Horizontal[] = {-6, 6}; ACE_ScopeAdjust_VerticalIncrement = 0.1; @@ -22,6 +83,7 @@ class CfgWeapons { }; class optic_SOS : ItemCore { + ACE_ScopeHeightAboveRail = 3.8; ACE_ScopeAdjust_Vertical[] = {-4, 30}; ACE_ScopeAdjust_Horizontal[] = {-6, 6}; ACE_ScopeAdjust_VerticalIncrement = 0.1; @@ -37,6 +99,7 @@ class CfgWeapons { }; class optic_DMS : ItemCore { + ACE_ScopeHeightAboveRail = 3.6; ACE_ScopeAdjust_Vertical[] = {-4, 20}; ACE_ScopeAdjust_Horizontal[] = {-6, 6}; ACE_ScopeAdjust_VerticalIncrement = 0.1; @@ -52,6 +115,7 @@ class CfgWeapons { }; class optic_AMS_base : ItemCore { + ACE_ScopeHeightAboveRail = 3.6; ACE_ScopeAdjust_Vertical[] = {-4, 30}; ACE_ScopeAdjust_Horizontal[] = {-6, 6}; ACE_ScopeAdjust_VerticalIncrement = 0.1; @@ -71,6 +135,7 @@ class CfgWeapons { }; class optic_KHS_base : ItemCore { + ACE_ScopeHeightAboveRail = 4.0; ACE_ScopeAdjust_Vertical[] = {-4, 30}; ACE_ScopeAdjust_Horizontal[] = {-6, 6}; ACE_ScopeAdjust_VerticalIncrement = 0.1; @@ -90,6 +155,7 @@ class CfgWeapons { }; class optic_KHS_old : ItemCore { + ACE_ScopeHeightAboveRail = 4.0; ACE_ScopeAdjust_Vertical[] = {-4, 30}; ACE_ScopeAdjust_Horizontal[] = {-6, 6}; ACE_ScopeAdjust_VerticalIncrement = 0.1; diff --git a/addons/scopes/XEH_PREP.hpp b/addons/scopes/XEH_PREP.hpp index 908d8064f0..80ef9b5b5e 100644 --- a/addons/scopes/XEH_PREP.hpp +++ b/addons/scopes/XEH_PREP.hpp @@ -2,6 +2,8 @@ PREP(adjustScope); PREP(adjustZero); PREP(applyScopeAdjustment); +PREP(calculateZeroAngle); +PREP(calculateZeroAngleCorrection); PREP(canAdjustZero); PREP(firedEH); PREP(getOptics); diff --git a/addons/scopes/XEH_postInit.sqf b/addons/scopes/XEH_postInit.sqf index bef16a0bc1..7b36617a18 100644 --- a/addons/scopes/XEH_postInit.sqf +++ b/addons/scopes/XEH_postInit.sqf @@ -9,6 +9,8 @@ if (!hasInterface) exitWith {}; +GVAR(Optics) = ["", "", ""]; + // Check inventory when it changes ["loadout", FUNC(inventoryCheck)] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index 9a38ef40cb..825b68805b 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -32,10 +32,6 @@ if (isNil "_adjustment") then { _adjustment = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; // [Windage, Elevation, Zero] }; -if (isNil QGVAR(Optics)) then { - GVAR(Optics) = ["", "", ""]; -}; - _optic = GVAR(Optics) select _weaponIndex; _opticConfig = configFile >> "CfgWeapons" >> _optic; _verticalIncrement = getNumber (_opticConfig >> "ACE_ScopeAdjust_VerticalIncrement"); diff --git a/addons/scopes/functions/fnc_calculateZeroAngle.sqf b/addons/scopes/functions/fnc_calculateZeroAngle.sqf new file mode 100644 index 0000000000..a65a6e99d7 --- /dev/null +++ b/addons/scopes/functions/fnc_calculateZeroAngle.sqf @@ -0,0 +1,84 @@ +/* + * Author: Ruthberg + * Calculates zero angle + * + * Arguments: + * 0: zero angle + * 1: zero range + * 2: muzzle velocity + * 3: air friction + * 4: simulation steps + * 5: bore height + * 6: temperature + * 7: barometric pressure + * 8: relative humidity + * 9: ballistic coefficient + * 10: drag model + * 11: atmosphere model + * 12: advanced_ballistics + * + * Return Value: + * 0: zero angle (Degrees) + * + * Example: + * call ace_scopes_fnc_calculateZeroAngle + * + * Public: No + */ +#include "script_component.hpp" +params [ + "_zeroAngle", "_zeroRange", "_muzzleVelocity", "_airFriction", "_simSteps", "_boreHeight", + "_temperature", "_barometricPressure", "_relativeHumidity", "_bc", "_dragModel", "_atmosphereModel", + "_advancedBallistics" +]; + +private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"]; +_bulletPos = [0, 0, 0]; +_bulletVelocity = [0, 0, 0]; +_bulletAccel = [0, 0, 0]; +_bulletSpeed = 0; +_gravity = [0, sin(_zeroAngle) * -9.80665, cos(_zeroAngle) * -9.80665]; +_deltaT = 1 / _simSteps; + +private ["_TOF"]; +_TOF = 0; + +if (_advancedBallistics) then { + _bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection); +}; + +_bulletPos set [0, 0]; +_bulletPos set [1, 0]; +_bulletPos set [2, -(_boreHeight / 100)]; + +_bulletVelocity set [0, 0]; +_bulletVelocity set [1, Cos(_zeroAngle) * _muzzleVelocity]; +_bulletVelocity set [2, Sin(_zeroAngle) * _muzzleVelocity]; + +while {_TOF < 15 && (_bulletPos select 1) < _zeroRange} do { + _bulletSpeed = vectorMagnitude _bulletVelocity; + + if (_advancedBallistics) then { + private _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { + parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _bulletSpeed])) + } else { + ([_dragModel, _bc, _bulletSpeed] call EFUNC(advanced_ballistics,calculateRetardation)) + }; + _bulletAccel = (vectorNormalized _bulletVelocity) vectorMultiply (-1 * _drag); + } else { + _bulletAccel = _bulletVelocity vectorMultiply (_bulletSpeed * _airFriction); + }; + + _bulletAccel = _bulletAccel vectorAdd _gravity; + + _bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT); + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply _deltaT); + + _TOF = _TOF + _deltaT; +}; + +if ((_bulletPos select 1) > 0) then { + _zeroAngle = - atan((_bulletPos select 2) / (_bulletPos select 1)); +}; + +_zeroAngle diff --git a/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf new file mode 100644 index 0000000000..d9229e9301 --- /dev/null +++ b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf @@ -0,0 +1,73 @@ +/* + * Author: Ruthberg + * Calculates the zero angle correction for the new zero range based on current zero range and bore height (distance between bore- and sight axis) + * + * Arguments: + * 0: Zero range + * 1: Bore height + * 2: Weapon + * 3: Ammo + * 4: Magazine + * 5: Advanced Ballistics enabled? + * + * Return Value: + * zeroAngleCorrection + * + * Public: No + */ +#include "script_component.hpp" + +params ["_oldZeroRange", "_newZeroRange", "_boreHeight"/*in cm*/, "_weapon", "_ammo", "_magazine", "_advancedBallistics"]; + +// Get Weapon and Ammo Configurations +private _AmmoCacheEntry = uiNamespace getVariable format[QEGVAR(advanced_ballistics,%1), _ammo]; +if (isNil "_AmmoCacheEntry") then { + _AmmoCacheEntry = _ammo call EFUNC(advanced_ballistics,readAmmoDataFromConfig); +}; +private _WeaponCacheEntry = uiNamespace getVariable format[QEGVAR(advanced_ballistics,%1), _weapon]; +if (isNil "_WeaponCacheEntry") then { + _WeaponCacheEntry = _weapon call EFUNC(advanced_ballistics,readWeaponDataFromConfig); +}; + +_AmmoCacheEntry params ["_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable"]; +_WeaponCacheEntry params ["_barrelTwist", "_twistDirection", "_barrelLength"]; + +_initSpeed = getNumber(configFile >> "CfgMagazines" >> _magazine >> "initSpeed"); +_initSpeedCoef = getNumber(configFile >> "CfgWeapons" >> _weapon >> "initSpeed"); +if (_initSpeedCoef > 0) then { + _initSpeed = _initSpeedCoef; +}; +if (_initSpeedCoef < 0) then { + _initSpeed = _initSpeed * (-1 * _initSpeedCoef); +}; +private _vanillaZero = 0; // in degrees +{ + private _offset = [_vanillaZero, _oldZeroRange, _initSpeed, _airFriction, 1000, 0, 0, 0, 0, 0, 0, "", false] call FUNC(calculateZeroAngle); + _vanillaZero = _vanillaZero + _offset; + if (_offset < 0.01) exitWith {}; +} forEach [1, 2, 3]; + +// Standard atmosphere (optionally overwrite with ace setting) +private _temperature = 15; +private _barometricPressure = 1013.25; +private _relativeHumidity = 0.5; + +if (_advancedBallistics) then { + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,barrelLengthInfluenceEnabled), false]) then { + private _barrelVelocityShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, _initSpeed] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift); + _initSpeed = _initSpeed + _barrelVelocityShift; + }; +}; + +private _zeroAngle = 0; // in degrees +{ + private _offset = [_zeroAngle, _newZeroRange, _initSpeed, _airFriction, 1000, _boreHeight, _temperature, _barometricPressure, _relativeHumidity, _ballisticCoefficients select 0, _dragModel, _atmosphereModel, _advancedBallistics] call FUNC(calculateZeroAngle); + _zeroAngle = _zeroAngle + _offset; + if (_offset < 0.01) exitWith {}; +} forEach [1, 2, 3]; + +private _zeroAngleCorrection = _zeroAngle - _vanillaZero; + +missionNamespace setVariable [format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics], _zeroAngleCorrection]; + +_zeroAngleCorrection diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index 5d3b975dbf..9553668946 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -21,13 +21,55 @@ if (_adjustment isEqualTo []) exitWith {}; private _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {}; -private _zeroing = _adjustment select _weaponIndex; +private _zeroing = +(_adjustment select _weaponIndex); TRACE_1("Adjusting With",_zeroing); -if (_zeroing isEqualTo [0, 0, 0]) exitWith {}; - // Convert zeroing from mils to degrees _zeroing = _zeroing vectorMultiply 0.05625; + +if (_ammo isKindOf "BulletBase") then { + private _railHeightAboveBore = 0; + private _scopeHeightAboveRail = 0; + // Determine rail height above bore + private _weaponConfig = configFile >> "CfgWeapons" >> _weapon; + if (isNumber (_weaponConfig >> "ACE_RailHeightAboveBore")) then { + _railHeightAboveBore = getNumber(_weaponConfig >> "ACE_RailHeightAboveBore"); + } else { + switch (_weaponIndex) do { + case 0: { _railHeightAboveBore = 2.0; }; // Rifle + case 2: { _railHeightAboveBore = 0.7; }; // Pistol + }; + }; + // Determine scope height above rail + private _optic = GVAR(Optics) select _weaponIndex; + private _opticConfig = configFile >> "CfgWeapons" >> _optic; + if (isNumber (_opticConfig >> "ACE_ScopeHeightAboveRail")) then { + _scopeHeightAboveRail = getNumber(_opticConfig >> "ACE_ScopeHeightAboveRail"); + } else { + switch (getNumber(_opticConfig >> "ItemInfo" >> "opticType")) do { + case 1: { _scopeHeightAboveRail = 3.0; }; // RCO or similar + case 2: { _scopeHeightAboveRail = 4.0; }; // High power scope + default { + switch (_weaponIndex) do { + case 0: { _scopeHeightAboveRail = 0.5; }; // Rifle iron sights + case 2: { _scopeHeightAboveRail = 0.3; }; // Pistol iron sights + }; + }; + }; + }; + private _advancedBallistics = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; + private _boreHeight = _railHeightAboveBore + _scopeHeightAboveRail; + private _oldZeroRange = currentZeroing _unit; + private _newZeroRange = _oldZeroRange; // Change this if you want to overwrite the discreteDistance[] setting + private _zeroCorrection = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics]; + if (isNil "_zeroCorrection") then { + _zeroCorrection = [_oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics] call FUNC(calculateZeroAngleCorrection); + }; + _zeroing = _zeroing vectorAdd [0, 0, _zeroCorrection]; +}; + +if (_zeroing isEqualTo [0, 0, 0]) exitWith {}; + _zeroing params ["_elevation", "_windage", "_zero"]; [_projectile, _windage, _elevation + _zero, 0] call EFUNC(common,changeProjectileDirection); diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index 1a79ef0418..674a7a7f42 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -25,9 +25,6 @@ if (isNil "_adjustment") then { [ACE_player, QGVAR(Adjustment), _adjustment, 0.5] call EFUNC(common,setVariablePublic); }; -if (isNil QGVAR(Optics)) then { - GVAR(Optics) = ["", "", ""]; -}; private _newOptics = [_player] call FUNC(getOptics); { From a687c49d2a5653e5c3430630887f302a415d57c3 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 8 Nov 2016 14:47:12 +0100 Subject: [PATCH 157/826] Adds settings module for ace_scopes * Interconnects the rangecard and scopes modules * Hides the zeroing text when the vanilla zeroing is overwritten * Makes the scopes module fully compatible with any 3rd party weapon pack without the need for addition compat pbos (though their use is still recommended) --- addons/rangecard/XEH_postInit.sqf | 2 + addons/rangecard/config.cpp | 2 +- .../rangecard/functions/fnc_openRangeCard.sqf | 4 +- .../functions/fnc_updateClassNames.sqf | 2 + .../functions/fnc_updateRangeCard.sqf | 35 +++++------ addons/scopes/ACE_Settings.hpp | 48 +++++++++++++++ addons/scopes/CfgVehicles.hpp | 59 +++++++++++++++++++ addons/scopes/CfgWeapons.hpp | 2 + addons/scopes/XEH_PREP.hpp | 2 + addons/scopes/XEH_postInit.sqf | 3 + addons/scopes/config.cpp | 3 +- addons/scopes/functions/fnc_adjustScope.sqf | 15 ++--- .../fnc_calculateZeroAngleCorrection.sqf | 9 +-- addons/scopes/functions/fnc_firedEH.sqf | 4 +- .../functions/fnc_getCurrentZeroRange.sqf | 35 +++++++++++ .../functions/fnc_initModuleSettings.sqf | 36 +++++++++++ .../scopes/functions/fnc_inventoryCheck.sqf | 39 +++++++++++- addons/scopes/stringtable.xml | 48 +++++++++++++++ 18 files changed, 304 insertions(+), 44 deletions(-) create mode 100644 addons/scopes/ACE_Settings.hpp create mode 100644 addons/scopes/functions/fnc_getCurrentZeroRange.sqf create mode 100644 addons/scopes/functions/fnc_initModuleSettings.sqf diff --git a/addons/rangecard/XEH_postInit.sqf b/addons/rangecard/XEH_postInit.sqf index 8396d76b39..55005fd0a8 100644 --- a/addons/rangecard/XEH_postInit.sqf +++ b/addons/rangecard/XEH_postInit.sqf @@ -6,10 +6,12 @@ GVAR(RangeCardOpened) = false; GVAR(controls) = []; +GVAR(zeroRange) = 100; GVAR(ammoClass) = "B_65x39_Caseless"; GVAR(magazineClass) = "30Rnd_65x39_caseless_mag"; GVAR(weaponClass) = "arifle_MXM_F"; +GVAR(zeroRangeCopy) = 100; GVAR(ammoClassCopy) = "";//"ACE_762x51_Ball_M118LR"; GVAR(magazineClassCopy) = "";//"ACE_20Rnd_762x51_M118LR_Mag"; GVAR(weaponClassCopy) = "";//srifle_DMR_06_olive_F"; diff --git a/addons/rangecard/config.cpp b/addons/rangecard/config.cpp index 9017583606..f300fb1a30 100644 --- a/addons/rangecard/config.cpp +++ b/addons/rangecard/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {"ACE_Item_RangeCard"}; weapons[] = {"ACE_RangeCard"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ACE_Advanced_Ballistics"}; + requiredAddons[] = {"ACE_Advanced_Ballistics","ace_scopes"}; author = ECSTRING(common,ACETeam); authors[] = {"Ruthberg"}; url = ECSTRING(main,URL); diff --git a/addons/rangecard/functions/fnc_openRangeCard.sqf b/addons/rangecard/functions/fnc_openRangeCard.sqf index ea085ed5b1..e73cdebd2a 100644 --- a/addons/rangecard/functions/fnc_openRangeCard.sqf +++ b/addons/rangecard/functions/fnc_openRangeCard.sqf @@ -23,7 +23,7 @@ if (_this) then { createDialog "ACE_RangeCard_Dialog"; - [GVAR(ammoClassCopy), GVAR(magazineClassCopy), GVAR(weaponClassCopy)] call FUNC(updateRangeCard); + [GVAR(zeroRangeCopy), GVAR(ammoClassCopy), GVAR(magazineClassCopy), GVAR(weaponClassCopy)] call FUNC(updateRangeCard); }; } else { if (ACE_player call FUNC(updateClassNames)) then { @@ -31,6 +31,6 @@ if (_this) then { createDialog "ACE_RangeCard_Dialog"; - [GVAR(ammoClass), GVAR(magazineClass), GVAR(weaponClass)] call FUNC(updateRangeCard); + [GVAR(zeroRange), GVAR(ammoClass), GVAR(magazineClass), GVAR(weaponClass)] call FUNC(updateRangeCard); }; }; diff --git a/addons/rangecard/functions/fnc_updateClassNames.sqf b/addons/rangecard/functions/fnc_updateClassNames.sqf index 70cf25825e..be9256650a 100644 --- a/addons/rangecard/functions/fnc_updateClassNames.sqf +++ b/addons/rangecard/functions/fnc_updateClassNames.sqf @@ -37,10 +37,12 @@ if (_weaponClass == "") exitWith { (GVAR(ammoClass) != "" && GVAR(magazineClass) if (_ammoClass == "") exitWith { (GVAR(ammoClass) != "" && GVAR(magazineClass) != "" && GVAR(weaponClass) != "") }; if (_unit == ACE_player) then { + GVAR(zeroRange) = [_unit] call EFUNC(scopes,getCurrentZeroRange); GVAR(ammoClass) = _ammoClass; GVAR(magazineClass) = _magazineClass; GVAR(weaponClass) = _weaponClass; } else { + GVAR(zeroRangeCopy) = [_unit] call EFUNC(scopes,getCurrentZeroRange); GVAR(ammoClassCopy) = _ammoClass; GVAR(magazineClassCopy) = _magazineClass; GVAR(weaponClassCopy) = _weaponClass; diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf index 2febb7b8ff..37d738648d 100644 --- a/addons/rangecard/functions/fnc_updateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf @@ -3,9 +3,10 @@ * Updates the range card data * * Arguments: - * 0: ammo class - * 1: magazine class - * 2: weapon class + * 0: zero range + * 1: ammo class + * 2: magazine class + * 3: weapon class * * Return Value: * Nothing @@ -20,10 +21,9 @@ disableSerialization; #define __dsp (uiNamespace getVariable "RangleCard_Display") -private ["_airFriction", "_ammoConfig", "_atmosphereModel", "_barometricPressure", "_barrelLength", "_barrelTwist", "_bc", "_bulletMass", "_boreHeight", "_cacheEntry", "_column", "_control", "_dragModel", "_i", "_muzzleVelocity", "_offset", "_relativeHumidity", "_result", "_row", "_weaponConfig", "_zeroRange", "_initSpeed", "_initSpeedCoef", "_useABConfig"]; -_useABConfig = (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]); +private ["_airFriction", "_ammoConfig", "_atmosphereModel", "_barrelLength", "_barrelTwist", "_bc", "_boreHeight", "_cacheEntry", "_column", "_control", "_dragModel", "_i", "_muzzleVelocity", "_offset", "_row", "_weaponConfig", "_initSpeed", "_initSpeedCoef"]; -PARAMS_3(_ammoClass,_magazineClass,_weaponClass); +params ["_zeroRange", "_ammoClass", "_magazineClass", "_weaponClass"]; if (_ammoClass == "" || _magazineClass == "" || _weaponClass == "") exitWith {}; @@ -105,10 +105,9 @@ if (count (_ammoConfig select 6) > 0) then { }; _dragModel = _ammoConfig select 5; _atmosphereModel = _ammoConfig select 8; -_bulletMass = 5; _boreHeight = 3.81; -_zeroRange = 100; +private _useABConfig = (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]); if (_bc == 0) then { _useABConfig = false; }; @@ -147,25 +146,21 @@ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) t lnbAddRow [770300, ["-15°C", " 10°C", " 35°C", "-15°C", " 10°C", " 35°C"]]; }; -_barometricPressure = 1013.25; -if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - _barometricPressure = 1013.25 * (1 - (0.0065 * EGVAR(common,mapAltitude)) / 288.15) ^ 5.255754495; -}; -_relativeHumidity = 0.5; +ctrlSetText [77003, format["%1m ZERO", round(_zeroRange)]]; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - ctrlSetText [770001, format["Drop Tables for B.P.: %1mb; Corrected for MVV at Air/Ammo Temperatures -15-35 °C", round(_barometricPressure * 100) / 100]]; - ctrlSetText [77004 , format["B.P.: %1mb", round(_barometricPressure * 100) / 100]]; + ctrlSetText [770001, format["Drop Tables for B.P.: %1mb; Corrected for MVV at Air/Ammo Temperatures -15-35 °C", round(EGVAR(scopes,zeroReferenceBarometricPressure) * 100) / 100]]; + ctrlSetText [77004 , format["B.P.: %1mb", round(EGVAR(scopes,zeroReferenceBarometricPressure) * 100) / 100]]; } else { ctrlSetText [770001, ""]; ctrlSetText [77004 , ""]; }; -_cacheEntry = missionNamespace getVariable format[QGVAR(%1_%2_%3), _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]]; +_cacheEntry = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4), _zeroRange, _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]]; if (isNil {_cacheEntry}) then { private _scopeBaseAngle = 0; { - private _offset = [_scopeBaseAngle, 100, _muzzleVelocity, _airFriction, 1000, _boreHeight, 15, 1013.25, 0.5, _bc, _dragModel, _atmosphereModel, _useABConfig] call EFUNC(scopes,calculateZeroAngle); + private _offset = [_scopeBaseAngle, _zeroRange, _muzzleVelocity, _airFriction, 1000, _boreHeight, EGVAR(scopes,zeroReferenceTemperature), EGVAR(scopes,zeroReferenceBarometricPressure), EGVAR(scopes,zeroReferenceHumidity), _bc, _dragModel, _atmosphereModel, _useABConfig] call EFUNC(scopes,calculateZeroAngle); _scopeBaseAngle = _scopeBaseAngle + _offset; if (_offset < 0.01) exitWith {}; } forEach [1, 2, 3]; @@ -174,10 +169,10 @@ if (isNil {_cacheEntry}) then { private _mvShift = [_ammoConfig select 9, _x] call EFUNC(advanced_ballistics,calculateAmmoTemperatureVelocityShift); private _mv = _muzzleVelocity + _mvShift; - [_scopeBaseAngle,_bulletMass,_boreHeight,_airFriction,_mv,_x,_barometricPressure,_relativeHumidity,1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,_forEachIndex,_useABConfig] call FUNC(calculateSolution); + [_scopeBaseAngle,0,_boreHeight,_airFriction,_mv,_x,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,_forEachIndex,_useABConfig] call FUNC(calculateSolution); } forEach [-15, -5, 5, 10, 15, 20, 25, 30, 35]; } else { - [_scopeBaseAngle,_bulletMass,_boreHeight,_airFriction,_muzzleVelocity,15,_barometricPressure,_relativeHumidity,1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,4,_useABConfig] call FUNC(calculateSolution); + [_scopeBaseAngle,0,_boreHeight,_airFriction,_muzzleVelocity,15,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,4,_useABConfig] call FUNC(calculateSolution); }; for "_i" from 0 to 9 do { @@ -195,7 +190,7 @@ if (isNil {_cacheEntry}) then { }; }; - missionNamespace setVariable [format[QGVAR(%1_%2_%3), _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]], [GVAR(rangeCardDataElevation), GVAR(rangeCardDataWindage), GVAR(rangeCardDataLead), GVAR(rangeCardDataMVs), GVAR(lastValidRow)]]; + missionNamespace setVariable [format[QGVAR(%1_%2_%3_%4), _zeroRange, _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]], [GVAR(rangeCardDataElevation), GVAR(rangeCardDataWindage), GVAR(rangeCardDataLead), GVAR(rangeCardDataMVs), GVAR(lastValidRow)]]; } else { GVAR(rangeCardDataElevation) = _cacheEntry select 0; GVAR(rangeCardDataWindage) = _cacheEntry select 1; diff --git a/addons/scopes/ACE_Settings.hpp b/addons/scopes/ACE_Settings.hpp new file mode 100644 index 0000000000..faf3f25836 --- /dev/null +++ b/addons/scopes/ACE_Settings.hpp @@ -0,0 +1,48 @@ +class ACE_Settings { + class GVAR(enabled) { + typeName = "BOOL"; + value = 1; + displayName = CSTRING(enabled_displayName); + description = CSTRING(enabled_description); + }; + // ACE_ScopeAdjust_Vertical and ACE_ScopeAdjust_Horizontal will be populated with default values instead of [0,0] + class GVAR(forceUseOfAdjustmentTurrets) { + typeName = "BOOL"; + value = 0; + displayName = CSTRING(forceUseOfAdjustmentTurrets_displayName); + description = CSTRING(forceUseOfAdjustmentTurrets_description); + }; + // Only affects scopes with elevation adjustment turrets (ACE_ScopeAdjust_Vertical != [0,0]) + class GVAR(defaultZeroRange) { + typeName = "SCALAR"; + value = 100; + displayName = CSTRING(defaultZeroRange_displayName); + description = CSTRING(defaultZeroRange_description); + }; + + // Only relevant when advanced ballistics is enabled + class GVAR(zeroReferenceTemperature) { + typeName = "SCALAR"; + value = 15; + displayName = CSTRING(zeroReferenceTemperature_displayName); + description = CSTRING(zeroReferenceTemperature_description); + }; + class GVAR(zeroReferenceBarometricPressure) { + typeName = "SCALAR"; + value = 1013.25; + displayName = CSTRING(zeroReferenceBarometricPressure_displayName); + description = CSTRING(zeroReferenceBarometricPressure_description); + }; + class GVAR(zeroReferenceHumidity) { + typeName = "SCALAR"; + value = 0.5; + displayName = CSTRING(zeroReferenceHumidity_displayName); + description = CSTRING(zeroReferenceHumidity_description); + }; + class GVAR(deduceBarometricPressureFromTerrainAltitude) { + typeName = "BOOL"; + value = 0; + displayName = CSTRING(deduceBarometricPressureFromTerrainAltitude_displayName); + description = CSTRING(deduceBarometricPressureFromTerrainAltitude_description); + }; +}; diff --git a/addons/scopes/CfgVehicles.hpp b/addons/scopes/CfgVehicles.hpp index 8a17384933..6cb40dd59e 100644 --- a/addons/scopes/CfgVehicles.hpp +++ b/addons/scopes/CfgVehicles.hpp @@ -16,4 +16,63 @@ class CfgVehicles { }; }; }; + class ACE_Module; + class GVAR(ModuleSettings): ACE_Module { + scope = 2; + displayName = CSTRING(DisplayName); + //icon = ""; // needs an icon + category = "ACE"; + function = QUOTE(DFUNC(initModuleSettings)); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = ECSTRING(common,ACETeam); + class Arguments { + class enabled { + displayName = CSTRING(enabled_DisplayName); + description = CSTRING(enabled_Description); + typeName = "BOOL"; + defaultValue = 1; + }; + class forceUseOfAdjustmentTurrets { + displayName = CSTRING(forceUseOfAdjustmentTurrets_DisplayName); + description = CSTRING(forceUseOfAdjustmentTurrets_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + class defaultZeroRange { + displayName = CSTRING(defaultZeroRange_DisplayName); + description = CSTRING(defaultZeroRange_Description); + typeName = "NUMBER"; + defaultValue = 100; + }; + class zeroReferenceTemperature { + displayName = CSTRING(zeroReferenceTemperature_DisplayName); + description = CSTRING(zeroReferenceTemperature_Description); + typeName = "NUMBER"; + defaultValue = 15; + }; + class zeroReferenceBarometricPressure { + displayName = CSTRING(zeroReferenceBarometricPressure_DisplayName); + description = CSTRING(zeroReferenceBarometricPressure_Description); + typeName = "NUMBER"; + defaultValue = 1013.25; + }; + class zeroReferenceHumidity { + displayName = CSTRING(zeroReferenceHumidity_DisplayName); + description = CSTRING(zeroReferenceHumidity_Description); + typeName = "NUMBER"; + defaultValue = 0.5; + }; + class deduceBarometricPressureFromTerrainAltitude { + displayName = CSTRING(deduceBarometricPressureFromTerrainAltitude_DisplayName); + description = CSTRING(deduceBarometricPressureFromTerrainAltitude_Description); + typeName = "BOOL"; + defaultValue = 0; + }; + }; + class ModuleDescription { + description = CSTRING(Description); + }; + }; }; diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index 5698398ade..72ce987f4c 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -56,6 +56,8 @@ class CfgWeapons { class optic_NVS : ItemCore { ACE_ScopeHeightAboveRail = 4.2; + ACE_ScopeAdjust_Vertical[] = {0, 0}; + ACE_ScopeAdjust_Horizontal[] = {0, 0}; }; class optic_TWS : ItemCore { diff --git a/addons/scopes/XEH_PREP.hpp b/addons/scopes/XEH_PREP.hpp index 80ef9b5b5e..7bfcf34268 100644 --- a/addons/scopes/XEH_PREP.hpp +++ b/addons/scopes/XEH_PREP.hpp @@ -6,6 +6,8 @@ PREP(calculateZeroAngle); PREP(calculateZeroAngleCorrection); PREP(canAdjustZero); PREP(firedEH); +PREP(getCurrentZeroRange); PREP(getOptics); +PREP(initModuleSettings); PREP(inventoryCheck); PREP(showZeroing); diff --git a/addons/scopes/XEH_postInit.sqf b/addons/scopes/XEH_postInit.sqf index 7b36617a18..5e04faefba 100644 --- a/addons/scopes/XEH_postInit.sqf +++ b/addons/scopes/XEH_postInit.sqf @@ -10,6 +10,9 @@ if (!hasInterface) exitWith {}; GVAR(Optics) = ["", "", ""]; +GVAR(canAdjustElevation) = [false, false, false]; +GVAR(canAdjustWindage) = [false, false, false]; +GVAR(scopeAdjust) = [[[0,0],0,[0,0],0], [[0,0],0,[0,0],0], [[0,0],0,[0,0],0]]; // Check inventory when it changes ["loadout", FUNC(inventoryCheck)] call CBA_fnc_addPlayerEventHandler; diff --git a/addons/scopes/config.cpp b/addons/scopes/config.cpp index 8388b2d04b..85c870b97c 100644 --- a/addons/scopes/config.cpp +++ b/addons/scopes/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = { "ace_common" }; author = ECSTRING(common,ACETeam); - authors[] = {"KoffeinFlummi", "esteldunedain"}; + authors[] = {"KoffeinFlummi", "esteldunedain", "Ruthberg"}; url = ECSTRING(main,URL); VERSION_CONFIG; }; @@ -19,3 +19,4 @@ class CfgPatches { #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" #include "RscTitles.hpp" +#include "ACE_Settings.hpp" diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index 825b68805b..c0a9fb3fdc 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -23,6 +23,7 @@ params ["_unit", "_turretAndDirection", "_majorStep"]; if (!(_unit isKindOf "Man")) exitWith {false}; if (currentMuzzle _unit != currentWeapon _unit) exitWith {false}; +if (!GVAR(enabled)) exitWith {false}; _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {false}; @@ -32,20 +33,14 @@ if (isNil "_adjustment") then { _adjustment = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; // [Windage, Elevation, Zero] }; -_optic = GVAR(Optics) select _weaponIndex; -_opticConfig = configFile >> "CfgWeapons" >> _optic; -_verticalIncrement = getNumber (_opticConfig >> "ACE_ScopeAdjust_VerticalIncrement"); -_horizontalIncrement = getNumber (_opticConfig >> "ACE_ScopeAdjust_HorizontalIncrement"); -_maxVertical = getArray (_opticConfig >> "ACE_ScopeAdjust_Vertical"); -_maxHorizontal = getArray (_opticConfig >> "ACE_ScopeAdjust_Horizontal"); - -if ((count _maxHorizontal < 2) || (count _maxVertical < 2)) exitWith {false}; -if ((_verticalIncrement == 0) && (_turretAndDirection in [ELEVATION_UP, ELEVATION_DOWN])) exitWith {false}; -if ((_horizontalIncrement == 0) && (_turretAndDirection in [WINDAGE_UP, WINDAGE_DOWN])) exitWith {false}; +if (!(GVAR(canAdjustElevation) select _weaponIndex) && (_turretAndDirection in [ELEVATION_UP, ELEVATION_DOWN])) exitWith {false}; +if (!(GVAR(canAdjustWindage) select _weaponIndex) && (_turretAndDirection in [WINDAGE_UP, WINDAGE_DOWN])) exitWith {false}; _zeroing = _adjustment select _weaponIndex; _zeroing params ["_elevation", "_windage", "_zero"]; +(GVAR(scopeAdjust) select _weaponIndex) params ["_maxVertical", "_verticalIncrement", "_maxHorizontal", "_horizontalIncrement"]; + switch (_turretAndDirection) do { case ELEVATION_UP: { _elevation = _elevation + _verticalIncrement }; case ELEVATION_DOWN: { _elevation = _elevation - _verticalIncrement }; diff --git a/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf index d9229e9301..59984a57ae 100644 --- a/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf +++ b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf @@ -47,11 +47,6 @@ private _vanillaZero = 0; // in degrees if (_offset < 0.01) exitWith {}; } forEach [1, 2, 3]; -// Standard atmosphere (optionally overwrite with ace setting) -private _temperature = 15; -private _barometricPressure = 1013.25; -private _relativeHumidity = 0.5; - if (_advancedBallistics) then { if (missionNamespace getVariable [QEGVAR(advanced_ballistics,barrelLengthInfluenceEnabled), false]) then { private _barrelVelocityShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, _initSpeed] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift); @@ -60,8 +55,8 @@ if (_advancedBallistics) then { }; private _zeroAngle = 0; // in degrees -{ - private _offset = [_zeroAngle, _newZeroRange, _initSpeed, _airFriction, 1000, _boreHeight, _temperature, _barometricPressure, _relativeHumidity, _ballisticCoefficients select 0, _dragModel, _atmosphereModel, _advancedBallistics] call FUNC(calculateZeroAngle); +{ + private _offset = [_zeroAngle, _newZeroRange, _initSpeed, _airFriction, 1000, _boreHeight, GVAR(zeroReferenceTemperature), GVAR(zeroReferenceBarometricPressure), GVAR(zeroReferenceHumidity), _ballisticCoefficients select 0, _dragModel, _atmosphereModel, _advancedBallistics] call FUNC(calculateZeroAngle); _zeroAngle = _zeroAngle + _offset; if (_offset < 0.01) exitWith {}; } forEach [1, 2, 3]; diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index 9553668946..7baf19c948 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -1,5 +1,5 @@ /* - * Author: KoffeinFlummi, esteldunedain + * Author: KoffeinFlummi, esteldunedain, Ruthberg * Adjusts the flight path of the bullet according to the zeroing. Called from the unified fired EH only for local and non-local players on foot. * * Arguments: @@ -60,7 +60,7 @@ if (_ammo isKindOf "BulletBase") then { private _advancedBallistics = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; private _boreHeight = _railHeightAboveBore + _scopeHeightAboveRail; private _oldZeroRange = currentZeroing _unit; - private _newZeroRange = _oldZeroRange; // Change this if you want to overwrite the discreteDistance[] setting + private _newZeroRange = [_unit] call FUNC(getCurrentZeroRange); private _zeroCorrection = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics]; if (isNil "_zeroCorrection") then { _zeroCorrection = [_oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics] call FUNC(calculateZeroAngleCorrection); diff --git a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf new file mode 100644 index 0000000000..9c51bc26cf --- /dev/null +++ b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf @@ -0,0 +1,35 @@ +/* + * Author: Ruthberg + * Gets the zero range of the currently used optic + * + * Arguments: + * 0: Unit + * + * Return Value: + * current zero range + * + * Example: + * _unit call ace_scopes_fnc_getCurrentZeroRange + * + * Public: No + */ +#include "script_component.hpp" + +params ["_unit"]; + +private _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); +if (_weaponIndex < 0) exitWith { 0 }; + +private _optic = GVAR(Optics) select _weaponIndex; +private _opticConfig = configFile >> "CfgWeapons" >> _optic; +private _opticType = getNumber(_opticConfig >> "ItemInfo" >> "opticType"); + +private _zeroRange = currentZeroing _unit; +if (_opticType == 2 && {(GVAR(canAdjustElevation) select _weaponIndex) || GVAR(forceUseOfAdjustmentTurrets)}) then { + _zeroRange = GVAR(defaultZeroRange); +}; +if (isNumber (_opticConfig >> "ACE_ScopeZeroRange")) then { + _zeroRange = getNumber(_opticConfig >> "ACE_ScopeZeroRange"); +}; + +_zeroRange diff --git a/addons/scopes/functions/fnc_initModuleSettings.sqf b/addons/scopes/functions/fnc_initModuleSettings.sqf new file mode 100644 index 0000000000..5435e1f0d2 --- /dev/null +++ b/addons/scopes/functions/fnc_initModuleSettings.sqf @@ -0,0 +1,36 @@ +/* + * Author: Glowbal, Ruthberg + * Module for adjusting the scopes settings + * + * Arguments: + * 0: The module logic + * 1: units + * 2: activated + * + * Return Value: + * None + * + * Public: No + */ +#include "script_component.hpp" + +params ["_logic","_units", "_activated"]; + +if !(_activated) exitWith {}; + +[_logic, QGVAR(enabled), "enabled"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(forceUseOfAdjustmentTurrets), "forceUseOfAdjustmentTurrets"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(defaultZeroRange), "defaultZeroRange"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(zeroReferenceTemperature), "zeroReferenceTemperature"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(zeroReferenceBarometricPressure), "zeroReferenceBarometricPressure"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(zeroReferenceHumidity), "zeroReferenceHumidity"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(deduceBarometricPressureFromTerrainAltitude), "deduceBarometricPressureFromTerrainAltitude"] call EFUNC(common,readSettingFromModule); + +GVAR(defaultZeroRange) = 0 max GVAR(defaultZeroRange) min 1000; +GVAR(zeroReferenceTemperature) = -55 max GVAR(zeroReferenceTemperature) max 55; +GVAR(zeroReferenceBarometricPressure) = 0 max GVAR(zeroReferenceBarometricPressure) min 1013.25; +GVAR(zeroReferenceHumidity) = 0 max GVAR(zeroReferenceHumidity) min 1.0; + +if (GVAR(deduceBarometricPressureFromTerrainAltitude)) then { + GVAR(zeroReferenceBarometricPressure) = 1013.25 * (1 - (0.0065 * EGVAR(common,mapAltitude)) / 288.15) ^ 5.255754495; +}; diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index 674a7a7f42..8ec8e50123 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -1,5 +1,5 @@ /* - * Author: KoffeinFlummi, Commy2 + * Author: KoffeinFlummi, Commy2, Ruthberg * Check if weapon optics changed and reset zeroing if needed * * Arguments: @@ -34,6 +34,43 @@ private _newOptics = [_player] call FUNC(getOptics); _adjustment set [_forEachIndex, [0, 0, 0]]; [ACE_player, QGVAR(Adjustment), _adjustment, 0.5] call EFUNC(common,setVariablePublic); }; + private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _forEachIndex); + private _verticalIncrement = -1; + if (isNumber (_opticConfig >> "ACE_ScopeAdjust_VerticalIncrement")) then { + _verticalIncrement = getNumber (_opticConfig >> "ACE_ScopeAdjust_VerticalIncrement"); + }; + private _horizontalIncrement = -1; + if (isNumber (_opticConfig >> "ACE_ScopeAdjust_HorizontalIncrement")) then { + _horizontalIncrement = getNumber (_opticConfig >> "ACE_ScopeAdjust_HorizontalIncrement"); + }; + private _maxVertical = []; + if (isArray (_opticConfig >> "ACE_ScopeAdjust_Vertical")) then { + _maxVertical = getArray (_opticConfig >> "ACE_ScopeAdjust_Vertical"); + }; + private _maxHorizontal = []; + if (isArray (_opticConfig >> "ACE_ScopeAdjust_Horizontal")) then { + _maxHorizontal = getArray (_opticConfig >> "ACE_ScopeAdjust_Horizontal"); + }; + if (GVAR(forceUseOfAdjustmentTurrets)) then { + if (_maxVertical isEqualTo []) then { _maxVertical = [-4, 30]; }; + if (_maxHorizontal isEqualTo []) then { _maxHorizontal = [-6, 6]; }; + if (_verticalIncrement == -1) then { _verticalIncrement = 0.1; }; + if (_horizontalIncrement == -1) then { _horizontalIncrement = 0.1; }; + } else { + if (_maxVertical isEqualTo []) then { _maxVertical = [0, 0]; }; + if (_maxHorizontal isEqualTo []) then { _maxHorizontal = [0, 0]; }; + if (_verticalIncrement == -1) then { _verticalIncrement = 0; }; + if (_horizontalIncrement == -1) then { _horizontalIncrement = 0; }; + }; + (GVAR(scopeAdjust) select _forEachIndex) set [0, _maxVertical]; + (GVAR(scopeAdjust) select _forEachIndex) set [1, _verticalIncrement]; + (GVAR(scopeAdjust) select _forEachIndex) set [2, _maxHorizontal]; + (GVAR(scopeAdjust) select _forEachIndex) set [3, _horizontalIncrement]; + GVAR(canAdjustElevation) set [_forEachIndex, (_verticalIncrement > 0) && !(_maxVertical isEqualTo [0, 0])]; + GVAR(canAdjustWindage) set [_forEachIndex, (_horizontalIncrement > 0) && !(_maxHorizontal isEqualTo [0, 0])]; + // Does not work reliably + //private _hideVanillaZeroing = (getNumber(_opticConfig >> "ItemInfo" >> "opticType") == 2 && (GVAR(canAdjustElevation) select _forEachIndex)) || {isNumber (_opticConfig >> "ACE_ScopeZeroRange")}; + //private _result = ["zeroing", !_hideVanillaZeroing, false] call EFUNC(ui,setAdvancedElement); }; } forEach GVAR(Optics); diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index 33a9e8beef..7da8c971a0 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -1,6 +1,51 @@  + + Scopes + + + Enable ACE Scope adjustment + + + Enable adjustmet turrets on high powered scopes + + + Force adjustment turrets + + + Force usage of adjustmet turrets on high powered scopes + + + Default zero distance + + + High power scopes will be zeroed at this distance + + + Reference temperature + + + Temperature at which the scope was zeroed + + + Reference barometric pressure + + + Barometric pressure at which the scope was zeroed + + + Reference humidity + + + Humidity at which the scope was zeroed + + + Deduce pressure from altitude + + + Deduce the barometric pressure from the terrain altitude + Minor adjustment up Zerowanie powoli w górę @@ -118,5 +163,8 @@ Vynulovat korekci ゼロインを調節 + + This module adds windage and elevation adjustment turrets on high power rifle scopes. + \ No newline at end of file From 429bffd03940886cfa11196b1a9aa2e5542e3094 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 8 Nov 2016 17:15:16 +0100 Subject: [PATCH 158/826] Moves the bore height calculation into FUNC(inventoryCheck) --- addons/scopes/XEH_postInit.sqf | 2 + addons/scopes/functions/fnc_firedEH.sqf | 31 +------------- .../scopes/functions/fnc_inventoryCheck.sqf | 42 +++++++++++++++++-- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/addons/scopes/XEH_postInit.sqf b/addons/scopes/XEH_postInit.sqf index 5e04faefba..cf4df55b57 100644 --- a/addons/scopes/XEH_postInit.sqf +++ b/addons/scopes/XEH_postInit.sqf @@ -10,8 +10,10 @@ if (!hasInterface) exitWith {}; GVAR(Optics) = ["", "", ""]; +GVAR(Guns) = ["", "", ""]; GVAR(canAdjustElevation) = [false, false, false]; GVAR(canAdjustWindage) = [false, false, false]; +GVAR(boreHeight) = [0, 0, 0]; GVAR(scopeAdjust) = [[[0,0],0,[0,0],0], [[0,0],0,[0,0],0], [[0,0],0,[0,0],0]]; // Check inventory when it changes diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index 7baf19c948..47aefb6c26 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -28,37 +28,8 @@ TRACE_1("Adjusting With",_zeroing); _zeroing = _zeroing vectorMultiply 0.05625; if (_ammo isKindOf "BulletBase") then { - private _railHeightAboveBore = 0; - private _scopeHeightAboveRail = 0; - // Determine rail height above bore - private _weaponConfig = configFile >> "CfgWeapons" >> _weapon; - if (isNumber (_weaponConfig >> "ACE_RailHeightAboveBore")) then { - _railHeightAboveBore = getNumber(_weaponConfig >> "ACE_RailHeightAboveBore"); - } else { - switch (_weaponIndex) do { - case 0: { _railHeightAboveBore = 2.0; }; // Rifle - case 2: { _railHeightAboveBore = 0.7; }; // Pistol - }; - }; - // Determine scope height above rail - private _optic = GVAR(Optics) select _weaponIndex; - private _opticConfig = configFile >> "CfgWeapons" >> _optic; - if (isNumber (_opticConfig >> "ACE_ScopeHeightAboveRail")) then { - _scopeHeightAboveRail = getNumber(_opticConfig >> "ACE_ScopeHeightAboveRail"); - } else { - switch (getNumber(_opticConfig >> "ItemInfo" >> "opticType")) do { - case 1: { _scopeHeightAboveRail = 3.0; }; // RCO or similar - case 2: { _scopeHeightAboveRail = 4.0; }; // High power scope - default { - switch (_weaponIndex) do { - case 0: { _scopeHeightAboveRail = 0.5; }; // Rifle iron sights - case 2: { _scopeHeightAboveRail = 0.3; }; // Pistol iron sights - }; - }; - }; - }; private _advancedBallistics = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; - private _boreHeight = _railHeightAboveBore + _scopeHeightAboveRail; + private _boreHeight = GVAR(boreHeight) select _weaponIndex; private _oldZeroRange = currentZeroing _unit; private _newZeroRange = [_unit] call FUNC(getCurrentZeroRange); private _zeroCorrection = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics]; diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index 8ec8e50123..cf33a02c5d 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -26,6 +26,41 @@ if (isNil "_adjustment") then { }; private _newOptics = [_player] call FUNC(getOptics); +private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapon _player]; + +{ + if ((_newOptics select _x) != (GVAR(Optics) select _x) || (_newGuns select _x != GVAR(Guns) select _x)) then { + // Determine rail height above bore + private _railHeightAboveBore = 0; + private _weaponConfig = configFile >> "CfgWeapons" >> (_newGuns select _x); + if (isNumber (_weaponConfig >> "ACE_RailHeightAboveBore")) then { + _railHeightAboveBore = getNumber(_weaponConfig >> "ACE_RailHeightAboveBore"); + } else { + switch (_x) do { + case 0: { _railHeightAboveBore = 2.0; }; // Rifle + case 2: { _railHeightAboveBore = 0.7; }; // Pistol + }; + }; + // Determine scope height above rail + private _scopeHeightAboveRail = 0; + private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _x); + if (isNumber (_opticConfig >> "ACE_ScopeHeightAboveRail")) then { + _scopeHeightAboveRail = getNumber(_opticConfig >> "ACE_ScopeHeightAboveRail"); + } else { + switch (getNumber(_opticConfig >> "ItemInfo" >> "opticType")) do { + case 1: { _scopeHeightAboveRail = 3.0; }; // RCO or similar + case 2: { _scopeHeightAboveRail = 4.0; }; // High power scope + default { + switch (_x) do { + case 0: { _scopeHeightAboveRail = 0.5; }; // Rifle iron sights + case 2: { _scopeHeightAboveRail = 0.3; }; // Pistol iron sights + }; + }; + }; + }; + GVAR(boreHeight) set [_x, _railHeightAboveBore + _scopeHeightAboveRail]; + } +} forEach [0, 1, 2]; { if (_newOptics select _forEachIndex != _x) then { @@ -68,11 +103,12 @@ private _newOptics = [_player] call FUNC(getOptics); (GVAR(scopeAdjust) select _forEachIndex) set [3, _horizontalIncrement]; GVAR(canAdjustElevation) set [_forEachIndex, (_verticalIncrement > 0) && !(_maxVertical isEqualTo [0, 0])]; GVAR(canAdjustWindage) set [_forEachIndex, (_horizontalIncrement > 0) && !(_maxHorizontal isEqualTo [0, 0])]; - // Does not work reliably - //private _hideVanillaZeroing = (getNumber(_opticConfig >> "ItemInfo" >> "opticType") == 2 && (GVAR(canAdjustElevation) select _forEachIndex)) || {isNumber (_opticConfig >> "ACE_ScopeZeroRange")}; - //private _result = ["zeroing", !_hideVanillaZeroing, false] call EFUNC(ui,setAdvancedElement); + private _hideVanillaZeroing = (getNumber(_opticConfig >> "ItemInfo" >> "opticType") == 2 && {GVAR(canAdjustElevation) select _forEachIndex}) || {isNumber (_opticConfig >> "ACE_ScopeZeroRange")}; + ["ace_scopes", true, "zeroing", !_hideVanillaZeroing] call EFUNC(ui,setElementVisibility); }; } forEach GVAR(Optics); _adjustment = ACE_player getVariable QGVAR(Adjustment); GVAR(Optics) = _newOptics; +GVAR(Guns) = _newGuns; + From 789a169b0eb6d9cf4be8bbfff121411d8caaccd2 Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 8 Nov 2016 17:51:55 +0100 Subject: [PATCH 159/826] Allow using adjustment turrets on weapons with integrated scopes --- .../functions/fnc_getCurrentZeroRange.sqf | 4 +- .../scopes/functions/fnc_inventoryCheck.sqf | 96 ++++++++++++------- 2 files changed, 64 insertions(+), 36 deletions(-) diff --git a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf index 9c51bc26cf..f225ba0e21 100644 --- a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf +++ b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf @@ -17,8 +17,10 @@ params ["_unit"]; +if (!GVAR(enabled)) exitWith { currentZeroing _unit }; + private _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); -if (_weaponIndex < 0) exitWith { 0 }; +if (_weaponIndex < 0) exitWith { currentZeroing _unit }; private _optic = GVAR(Optics) select _weaponIndex; private _opticConfig = configFile >> "CfgWeapons" >> _optic; diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index cf33a02c5d..d248b3923b 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -28,40 +28,6 @@ if (isNil "_adjustment") then { private _newOptics = [_player] call FUNC(getOptics); private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapon _player]; -{ - if ((_newOptics select _x) != (GVAR(Optics) select _x) || (_newGuns select _x != GVAR(Guns) select _x)) then { - // Determine rail height above bore - private _railHeightAboveBore = 0; - private _weaponConfig = configFile >> "CfgWeapons" >> (_newGuns select _x); - if (isNumber (_weaponConfig >> "ACE_RailHeightAboveBore")) then { - _railHeightAboveBore = getNumber(_weaponConfig >> "ACE_RailHeightAboveBore"); - } else { - switch (_x) do { - case 0: { _railHeightAboveBore = 2.0; }; // Rifle - case 2: { _railHeightAboveBore = 0.7; }; // Pistol - }; - }; - // Determine scope height above rail - private _scopeHeightAboveRail = 0; - private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _x); - if (isNumber (_opticConfig >> "ACE_ScopeHeightAboveRail")) then { - _scopeHeightAboveRail = getNumber(_opticConfig >> "ACE_ScopeHeightAboveRail"); - } else { - switch (getNumber(_opticConfig >> "ItemInfo" >> "opticType")) do { - case 1: { _scopeHeightAboveRail = 3.0; }; // RCO or similar - case 2: { _scopeHeightAboveRail = 4.0; }; // High power scope - default { - switch (_x) do { - case 0: { _scopeHeightAboveRail = 0.5; }; // Rifle iron sights - case 2: { _scopeHeightAboveRail = 0.3; }; // Pistol iron sights - }; - }; - }; - }; - GVAR(boreHeight) set [_x, _railHeightAboveBore + _scopeHeightAboveRail]; - } -} forEach [0, 1, 2]; - { if (_newOptics select _forEachIndex != _x) then { // The optic for this weapon changed, set adjustment to zero @@ -103,11 +69,71 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo (GVAR(scopeAdjust) select _forEachIndex) set [3, _horizontalIncrement]; GVAR(canAdjustElevation) set [_forEachIndex, (_verticalIncrement > 0) && !(_maxVertical isEqualTo [0, 0])]; GVAR(canAdjustWindage) set [_forEachIndex, (_horizontalIncrement > 0) && !(_maxHorizontal isEqualTo [0, 0])]; - private _hideVanillaZeroing = (getNumber(_opticConfig >> "ItemInfo" >> "opticType") == 2 && {GVAR(canAdjustElevation) select _forEachIndex}) || {isNumber (_opticConfig >> "ACE_ScopeZeroRange")}; + private _hideVanillaZeroing = (GVAR(enabled) && getNumber(_opticConfig >> "ItemInfo" >> "opticType") == 2 && {GVAR(canAdjustElevation) select _forEachIndex}) || {isNumber (_opticConfig >> "ACE_ScopeZeroRange")}; ["ace_scopes", true, "zeroing", !_hideVanillaZeroing] call EFUNC(ui,setElementVisibility); }; } forEach GVAR(Optics); +{ + if ((_newOptics select _x) != (GVAR(Optics) select _x) || (_newGuns select _x != GVAR(Guns) select _x)) then { + // Determine rail height above bore + private _railHeightAboveBore = 0; + private _weaponConfig = configFile >> "CfgWeapons" >> (_newGuns select _x); + if (isNumber (_weaponConfig >> "ACE_RailHeightAboveBore")) then { + _railHeightAboveBore = getNumber(_weaponConfig >> "ACE_RailHeightAboveBore"); + } else { + switch (_x) do { + case 0: { _railHeightAboveBore = 2.0; }; // Rifle + case 2: { _railHeightAboveBore = 0.7; }; // Pistol + }; + }; + // Determine scope height above rail + private _scopeHeightAboveRail = 0; + private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _x); + if (isNumber (_opticConfig >> "ACE_ScopeHeightAboveRail")) then { + _scopeHeightAboveRail = getNumber(_opticConfig >> "ACE_ScopeHeightAboveRail"); + } else { + switch (getNumber(_opticConfig >> "ItemInfo" >> "opticType")) do { + case 1: { _scopeHeightAboveRail = 3.0; }; // RCO or similar + case 2: { _scopeHeightAboveRail = 4.0; }; // High power scope + default { + switch (_x) do { + case 0: { _scopeHeightAboveRail = 0.5; }; // Rifle iron sights + case 2: { _scopeHeightAboveRail = 0.3; }; // Pistol iron sights + }; + }; + }; + }; + GVAR(boreHeight) set [_x, _railHeightAboveBore + _scopeHeightAboveRail]; + + if ((_newOptics select _x) == "") then { + // Check if the weapon comes with an integrated optic + private _verticalIncrement = 0; + if (isNumber (_weaponConfig >> "ACE_ScopeAdjust_VerticalIncrement")) then { + _verticalIncrement = getNumber (_weaponConfig >> "ACE_ScopeAdjust_VerticalIncrement"); + }; + private _horizontalIncrement = 0; + if (isNumber (_weaponConfig >> "ACE_ScopeAdjust_HorizontalIncrement")) then { + _horizontalIncrement = getNumber (_weaponConfig >> "ACE_ScopeAdjust_HorizontalIncrement"); + }; + private _maxVertical = [0, 0]; + if (isArray (_weaponConfig >> "ACE_ScopeAdjust_Vertical")) then { + _maxVertical = getArray (_weaponConfig >> "ACE_ScopeAdjust_Vertical"); + }; + private _maxHorizontal = [0, 0]; + if (isArray (_weaponConfig >> "ACE_ScopeAdjust_Horizontal")) then { + _maxHorizontal = getArray (_weaponConfig >> "ACE_ScopeAdjust_Horizontal"); + }; + (GVAR(scopeAdjust) select _x) set [0, _maxVertical]; + (GVAR(scopeAdjust) select _x) set [1, _verticalIncrement]; + (GVAR(scopeAdjust) select _x) set [2, _maxHorizontal]; + (GVAR(scopeAdjust) select _x) set [3, _horizontalIncrement]; + GVAR(canAdjustElevation) set [_x, (_verticalIncrement > 0) && !(_maxVertical isEqualTo [0, 0])]; + GVAR(canAdjustWindage) set [_x, (_horizontalIncrement > 0) && !(_maxHorizontal isEqualTo [0, 0])]; + }; + } +} forEach [0, 1, 2]; + _adjustment = ACE_player getVariable QGVAR(Adjustment); GVAR(Optics) = _newOptics; GVAR(Guns) = _newGuns; From 10cc0ba9518e6ac92daac5a8adcb0b85416fdfa1 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 9 Nov 2016 14:00:25 +0100 Subject: [PATCH 160/826] Moved all zero angle calculations into the advanced_ballistics.dll * Speeds up ATragMX * Speeds up RangeCards * Speeds up Scopes --- ace_advanced_ballistics.dll | Bin 262656 -> 265216 bytes addons/atragmx/config.cpp | 2 +- .../fnc_calculate_distance_at_velocity.sqf | 6 +- .../functions/fnc_calculate_solution.sqf | 8 +- .../functions/fnc_update_zero_range.sqf | 16 +- .../functions/fnc_calculateSolution.sqf | 8 +- .../functions/fnc_updateRangeCard.sqf | 13 +- addons/scopes/XEH_PREP.hpp | 1 - .../functions/fnc_calculateZeroAngle.sqf | 84 ----------- .../fnc_calculateZeroAngleCorrection.sqf | 57 ++++---- .../AdvancedBallistics.cpp | 137 ++++++++++++++++++ 11 files changed, 184 insertions(+), 148 deletions(-) delete mode 100644 addons/scopes/functions/fnc_calculateZeroAngle.sqf diff --git a/ace_advanced_ballistics.dll b/ace_advanced_ballistics.dll index 705a90b2ef0b1e8713c3db98d0726ef3a505bfc3..f5f5c19c26759564efda46b6e7710d63622e2d46 100644 GIT binary patch delta 101782 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

$w|2^yF8J$9c;kI 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 UkNI4VSj1N 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 _thresholdVelocity} do { private _bc = GVAR(targetSolutionInput) select 14; private _dragModel = GVAR(targetSolutionInput) select 15; - private _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { - parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _velocity])) - } else { - ([_dragModel, _bc, _velocity] call EFUNC(advanced_ballistics,calculateRetardation)) - }; + private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _velocity])); _distance = _distance + _velocity * __DELTA_T; _velocity = _velocity - (_drag * __DELTA_T); }; diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index d98c46c5fb..940b3dc2ec 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -90,7 +90,7 @@ _wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windDirection _wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0]; _windDrift = 0; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - _bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection); + _bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel])); }; private ["_speedTotal", "_stepsTotal", "_speedAverage"]; @@ -125,11 +125,7 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { _trueSpeed = vectorMagnitude _trueVelocity; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - private _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { - parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])) - } else { - ([_dragModel, _bc, _trueSpeed] call EFUNC(advanced_ballistics,calculateRetardation)) - }; + private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])); _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); } else { _bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction); diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index 3d56dc81eb..5cf175faf7 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -17,9 +17,6 @@ [] call FUNC(parse_input); -private ["_scopeBaseAngle"]; -_scopeBaseAngle = (GVAR(workingMemory) select 3); - private ["_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", "_bc", "_dragModel", "_atmosphereModel"]; _bulletMass = GVAR(workingMemory) select 12; _boreHeight = GVAR(workingMemory) select 5; @@ -46,12 +43,13 @@ if (!GVAR(atmosphereModeTBH)) then { _relativeHumidity = 50; }; -{ - private _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, [0, 0], 0, 0, 0, _zeroRange, _bc, _dragModel, _atmosphereModel, false, 1.5, 0, 0, 0] call FUNC(calculate_solution); - private _offset = (_result select 0) / 60; - _scopeBaseAngle = _scopeBaseAngle + _offset; - if (_offset < 0.01) exitWith {}; -} forEach [1, 2, 3]; +private _scopeBaseAngle = if (!(missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])) then { + private _zeroAngle = "ace_advanced_ballistics" callExtension format ["zeroAngleVanilla:%1:%2:%3:%4", _zeroRange, _muzzleVelocity, _airFriction, _boreHeight]; + (parseNumber _zeroAngle) +} else { + private _zeroAngle = "ace_advanced_ballistics" callExtension format ["zeroAngle:%1:%2:%3:%4:%5:%6:%7:%8:%9", _zeroRange, _muzzleVelocity, _boreHeight, _temperature, _barometricPressure, _relativeHumidity, _bc, _dragModel, _atmosphereModel]; + (parseNumber _zeroAngle) +}; GVAR(workingMemory) set [2, _zeroRange]; GVAR(workingMemory) set [3, _scopeBaseAngle]; diff --git a/addons/rangecard/functions/fnc_calculateSolution.sqf b/addons/rangecard/functions/fnc_calculateSolution.sqf index 945c2aa512..1e2cb38ba7 100644 --- a/addons/rangecard/functions/fnc_calculateSolution.sqf +++ b/addons/rangecard/functions/fnc_calculateSolution.sqf @@ -94,7 +94,7 @@ _wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windDirection _wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0]; _windDrift = 0; if (_useABConfig) then { - _bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection); + _bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel])); }; private ["_airFrictionCoef", "_airDensity"]; @@ -131,11 +131,7 @@ while {_TOF < 6 && (_bulletPos select 1) < _targetRange} do { _trueSpeed = vectorMagnitude _trueVelocity; if (_useABConfig) then { - private _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { - parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])) - } else { - ([_dragModel, _bc, _trueSpeed] call EFUNC(advanced_ballistics,calculateRetardation)) - }; + private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])); _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); } else { _bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction * _airFrictionCoef); diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf index 37d738648d..633df5e4c6 100644 --- a/addons/rangecard/functions/fnc_updateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf @@ -158,12 +158,13 @@ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) t _cacheEntry = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4), _zeroRange, _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]]; if (isNil {_cacheEntry}) then { - private _scopeBaseAngle = 0; - { - private _offset = [_scopeBaseAngle, _zeroRange, _muzzleVelocity, _airFriction, 1000, _boreHeight, EGVAR(scopes,zeroReferenceTemperature), EGVAR(scopes,zeroReferenceBarometricPressure), EGVAR(scopes,zeroReferenceHumidity), _bc, _dragModel, _atmosphereModel, _useABConfig] call EFUNC(scopes,calculateZeroAngle); - _scopeBaseAngle = _scopeBaseAngle + _offset; - if (_offset < 0.01) exitWith {}; - } forEach [1, 2, 3]; + private _scopeBaseAngle = if (!_useABConfig) then { + private _zeroAngle = "ace_advanced_ballistics" callExtension format ["zeroAngleVanilla:%1:%2:%3:%4", _zeroRange, _muzzleVelocity, _airFriction, _boreHeight]; + (parseNumber _zeroAngle) + } else { + private _zeroAngle = "ace_advanced_ballistics" callExtension format ["zeroAngle:%1:%2:%3:%4:%5:%6:%7:%8:%9", _zeroRange, _muzzleVelocity, _boreHeight, EGVAR(scopes,zeroReferenceTemperature), EGVAR(scopes,zeroReferenceBarometricPressure), EGVAR(scopes,zeroReferenceHumidity), _bc, _dragModel, _atmosphereModel]; + (parseNumber _zeroAngle) + }; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false] && missionNamespace getVariable [QEGVAR(advanced_ballistics,ammoTemperatureEnabled), false]) then { { private _mvShift = [_ammoConfig select 9, _x] call EFUNC(advanced_ballistics,calculateAmmoTemperatureVelocityShift); diff --git a/addons/scopes/XEH_PREP.hpp b/addons/scopes/XEH_PREP.hpp index 7bfcf34268..8d79196650 100644 --- a/addons/scopes/XEH_PREP.hpp +++ b/addons/scopes/XEH_PREP.hpp @@ -2,7 +2,6 @@ PREP(adjustScope); PREP(adjustZero); PREP(applyScopeAdjustment); -PREP(calculateZeroAngle); PREP(calculateZeroAngleCorrection); PREP(canAdjustZero); PREP(firedEH); diff --git a/addons/scopes/functions/fnc_calculateZeroAngle.sqf b/addons/scopes/functions/fnc_calculateZeroAngle.sqf deleted file mode 100644 index a65a6e99d7..0000000000 --- a/addons/scopes/functions/fnc_calculateZeroAngle.sqf +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Author: Ruthberg - * Calculates zero angle - * - * Arguments: - * 0: zero angle - * 1: zero range - * 2: muzzle velocity - * 3: air friction - * 4: simulation steps - * 5: bore height - * 6: temperature - * 7: barometric pressure - * 8: relative humidity - * 9: ballistic coefficient - * 10: drag model - * 11: atmosphere model - * 12: advanced_ballistics - * - * Return Value: - * 0: zero angle (Degrees) - * - * Example: - * call ace_scopes_fnc_calculateZeroAngle - * - * Public: No - */ -#include "script_component.hpp" -params [ - "_zeroAngle", "_zeroRange", "_muzzleVelocity", "_airFriction", "_simSteps", "_boreHeight", - "_temperature", "_barometricPressure", "_relativeHumidity", "_bc", "_dragModel", "_atmosphereModel", - "_advancedBallistics" -]; - -private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"]; -_bulletPos = [0, 0, 0]; -_bulletVelocity = [0, 0, 0]; -_bulletAccel = [0, 0, 0]; -_bulletSpeed = 0; -_gravity = [0, sin(_zeroAngle) * -9.80665, cos(_zeroAngle) * -9.80665]; -_deltaT = 1 / _simSteps; - -private ["_TOF"]; -_TOF = 0; - -if (_advancedBallistics) then { - _bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection); -}; - -_bulletPos set [0, 0]; -_bulletPos set [1, 0]; -_bulletPos set [2, -(_boreHeight / 100)]; - -_bulletVelocity set [0, 0]; -_bulletVelocity set [1, Cos(_zeroAngle) * _muzzleVelocity]; -_bulletVelocity set [2, Sin(_zeroAngle) * _muzzleVelocity]; - -while {_TOF < 15 && (_bulletPos select 1) < _zeroRange} do { - _bulletSpeed = vectorMagnitude _bulletVelocity; - - if (_advancedBallistics) then { - private _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { - parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _bulletSpeed])) - } else { - ([_dragModel, _bc, _bulletSpeed] call EFUNC(advanced_ballistics,calculateRetardation)) - }; - _bulletAccel = (vectorNormalized _bulletVelocity) vectorMultiply (-1 * _drag); - } else { - _bulletAccel = _bulletVelocity vectorMultiply (_bulletSpeed * _airFriction); - }; - - _bulletAccel = _bulletAccel vectorAdd _gravity; - - _bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT); - _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply _deltaT); - - _TOF = _TOF + _deltaT; -}; - -if ((_bulletPos select 1) > 0) then { - _zeroAngle = - atan((_bulletPos select 2) / (_bulletPos select 1)); -}; - -_zeroAngle diff --git a/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf index 59984a57ae..bcf1779f84 100644 --- a/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf +++ b/addons/scopes/functions/fnc_calculateZeroAngleCorrection.sqf @@ -19,49 +19,46 @@ params ["_oldZeroRange", "_newZeroRange", "_boreHeight"/*in cm*/, "_weapon", "_ammo", "_magazine", "_advancedBallistics"]; -// Get Weapon and Ammo Configurations -private _AmmoCacheEntry = uiNamespace getVariable format[QEGVAR(advanced_ballistics,%1), _ammo]; -if (isNil "_AmmoCacheEntry") then { - _AmmoCacheEntry = _ammo call EFUNC(advanced_ballistics,readAmmoDataFromConfig); -}; -private _WeaponCacheEntry = uiNamespace getVariable format[QEGVAR(advanced_ballistics,%1), _weapon]; -if (isNil "_WeaponCacheEntry") then { - _WeaponCacheEntry = _weapon call EFUNC(advanced_ballistics,readWeaponDataFromConfig); -}; - -_AmmoCacheEntry params ["_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable"]; -_WeaponCacheEntry params ["_barrelTwist", "_twistDirection", "_barrelLength"]; - -_initSpeed = getNumber(configFile >> "CfgMagazines" >> _magazine >> "initSpeed"); -_initSpeedCoef = getNumber(configFile >> "CfgWeapons" >> _weapon >> "initSpeed"); +private _airFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction"); +private _initSpeed = getNumber(configFile >> "CfgMagazines" >> _magazine >> "initSpeed"); +private _initSpeedCoef = getNumber(configFile >> "CfgWeapons" >> _weapon >> "initSpeed"); if (_initSpeedCoef > 0) then { _initSpeed = _initSpeedCoef; }; if (_initSpeedCoef < 0) then { _initSpeed = _initSpeed * (-1 * _initSpeedCoef); }; -private _vanillaZero = 0; // in degrees -{ - private _offset = [_vanillaZero, _oldZeroRange, _initSpeed, _airFriction, 1000, 0, 0, 0, 0, 0, 0, "", false] call FUNC(calculateZeroAngle); - _vanillaZero = _vanillaZero + _offset; - if (_offset < 0.01) exitWith {}; -} forEach [1, 2, 3]; -if (_advancedBallistics) then { +private _zeroAngle = "ace_advanced_ballistics" callExtension format ["zeroAngleVanilla:%1:%2:%3:%4", _oldZeroRange, _initSpeed, _airFriction, 0]; +private _vanillaZero = parseNumber _zeroAngle; + +private _trueZero = if (!_advancedBallistics) then { + _zeroAngle = "ace_advanced_ballistics" callExtension format ["zeroAngleVanilla:%1:%2:%3:%4", _newZeroRange, _initSpeed, _airFriction, _boreHeight]; + (parseNumber _zeroAngle) +} else { + // Get Weapon and Ammo Configurations + private _AmmoCacheEntry = uiNamespace getVariable format[QEGVAR(advanced_ballistics,%1), _ammo]; + if (isNil "_AmmoCacheEntry") then { + _AmmoCacheEntry = _ammo call EFUNC(advanced_ballistics,readAmmoDataFromConfig); + }; + private _WeaponCacheEntry = uiNamespace getVariable format[QEGVAR(advanced_ballistics,%1), _weapon]; + if (isNil "_WeaponCacheEntry") then { + _WeaponCacheEntry = _weapon call EFUNC(advanced_ballistics,readWeaponDataFromConfig); + }; + + _AmmoCacheEntry params ["_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable"]; + _WeaponCacheEntry params ["_barrelTwist", "_twistDirection", "_barrelLength"]; + if (missionNamespace getVariable [QEGVAR(advanced_ballistics,barrelLengthInfluenceEnabled), false]) then { private _barrelVelocityShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, _initSpeed] call EFUNC(advanced_ballistics,calculateBarrelLengthVelocityShift); _initSpeed = _initSpeed + _barrelVelocityShift; }; + + _zeroAngle = "ace_advanced_ballistics" callExtension format ["zeroAngle:%1:%2:%3:%4:%5:%6:%7:%8:%9", _newZeroRange, _initSpeed, _boreHeight, GVAR(zeroReferenceTemperature), GVAR(zeroReferenceBarometricPressure), GVAR(zeroReferenceHumidity), _ballisticCoefficients select 0, _dragModel, _atmosphereModel]; + (parseNumber _zeroAngle) }; -private _zeroAngle = 0; // in degrees -{ - private _offset = [_zeroAngle, _newZeroRange, _initSpeed, _airFriction, 1000, _boreHeight, GVAR(zeroReferenceTemperature), GVAR(zeroReferenceBarometricPressure), GVAR(zeroReferenceHumidity), _ballisticCoefficients select 0, _dragModel, _atmosphereModel, _advancedBallistics] call FUNC(calculateZeroAngle); - _zeroAngle = _zeroAngle + _offset; - if (_offset < 0.01) exitWith {}; -} forEach [1, 2, 3]; - -private _zeroAngleCorrection = _zeroAngle - _vanillaZero; +private _zeroAngleCorrection = _trueZero - _vanillaZero; missionNamespace setVariable [format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics], _zeroAngleCorrection]; diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp index e9082ad2d1..89a0d0b060 100644 --- a/extensions/advanced_ballistics/AdvancedBallistics.cpp +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -5,9 +5,12 @@ #include #include #include +#include +#define DELTA_T 0.02f #define GRAVITY 9.80665f +#define DEGREES(X) (X * 180 / M_PI) #define ABSOLUTE_ZERO_IN_CELSIUS -273.15f #define KELVIN(t) (t - ABSOLUTE_ZERO_IN_CELSIUS) #define CELSIUS(t) (t + ABSOLUTE_ZERO_IN_CELSIUS) @@ -229,6 +232,113 @@ double calculateRetard(int DragFunction, double DragCoefficient, double Velocity return 0.0; } +double calculateVanillaZeroAngle(double zeroRange, double muzzleVelocity, double airFriction, double boreHeight) { + double zeroAngle = 0.0f; + + for (int i = 0; i < 10; i++) { + double lx = 0.0f; + double ly = 0.0f; + + double px = 0.0f; + double py = -boreHeight / 100.0f; + + double gx = std::sin(zeroAngle) * -GRAVITY; + double gy = std::cos(zeroAngle) * -GRAVITY; + + double vx = std::cos(zeroAngle) * muzzleVelocity; + double vy = std::sin(zeroAngle) * muzzleVelocity; + + double tof = 0.0f; + double v = 0.0f; + + while (tof < 8.0f && px < zeroRange) { + lx = px; + ly = py; + + v = std::sqrt(vx*vx + vy*vy); + + double ax = vx * v * airFriction; + double ay = vy * v * airFriction; + ax += gx; + ay += gy; + + px += vx * DELTA_T * 0.5; + py += vy * DELTA_T * 0.5; + vx += ax * DELTA_T; + vy += ay * DELTA_T; + px += vx * DELTA_T * 0.5; + py += vy * DELTA_T * 0.5; + + tof += DELTA_T; + } + + double y = ly + (zeroRange - lx) * (py - ly) / (px - lx); + double offset = -std::atan(y / zeroRange); + zeroAngle += offset; + + if (std::abs(offset) < 0.0001f) { + break; + } + } + + return zeroAngle; +} + +double calculateZeroAngle(double zeroRange, double muzzleVelocity, double boreHeight, double temperature, double pressure, double humidity, double ballisticCoefficient, int dragModel, char* atmosphereModel) { + double zeroAngle = 0.0f; + + ballisticCoefficient = calculateAtmosphericCorrection(ballisticCoefficient, temperature, pressure, humidity, atmosphereModel); + + for (int i = 0; i < 10; i++) { + double lx = 0.0f; + double ly = 0.0f; + + double px = 0.0f; + double py = -boreHeight / 100.0f; + + double gx = std::sin(zeroAngle) * -GRAVITY; + double gy = std::cos(zeroAngle) * -GRAVITY; + + double vx = std::cos(zeroAngle) * muzzleVelocity; + double vy = std::sin(zeroAngle) * muzzleVelocity; + + double tof = 0.0f; + double v = 0.0f; + + while (tof < 8.0f && px < zeroRange) { + lx = px; + ly = py; + + v = std::sqrt(vx*vx + vy*vy); + + double retard = calculateRetard(dragModel, ballisticCoefficient, v); + double ax = vx / v * -retard; + double ay = vy / v * -retard; + ax += gx; + ay += gy; + + px += vx * DELTA_T * 0.5; + py += vy * DELTA_T * 0.5; + vx += ax * DELTA_T; + vy += ay * DELTA_T; + px += vx * DELTA_T * 0.5; + py += vy * DELTA_T * 0.5; + + tof += DELTA_T; + } + + double y = ly + (zeroRange - lx) * (py - ly) / (px - lx); + double offset = -std::atan(y / zeroRange); + zeroAngle += offset; + + if (std::abs(offset) < 0.0001f) { + break; + } + } + + return zeroAngle; +} + extern "C" { EXPORT void __stdcall RVExtension(char *output, int outputSize, const char *function); @@ -639,6 +749,33 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) map->gridBuildingNums.reserve(gridCells); map->gridSurfaceIsWater.reserve(gridCells); + strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + EXTENSION_RETURN(); + } else if (!strcmp(mode, "zeroAngleVanilla")) { + double zeroRange = strtod(strtok_s(NULL, ":", &next_token), NULL); + double initSpeed = strtod(strtok_s(NULL, ":", &next_token), NULL); + double airFriction = strtod(strtok_s(NULL, ":", &next_token), NULL); + double boreHeight = strtod(strtok_s(NULL, ":", &next_token), NULL); + + double zeroAngle = calculateVanillaZeroAngle(zeroRange, initSpeed, airFriction, boreHeight); + + outputStr << DEGREES(zeroAngle); + strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); + EXTENSION_RETURN(); + } else if (!strcmp(mode, "zeroAngle")) { + double zeroRange = strtod(strtok_s(NULL, ":", &next_token), NULL); + double muzzleVelocity = strtod(strtok_s(NULL, ":", &next_token), NULL); + double boreHeight = strtod(strtok_s(NULL, ":", &next_token), NULL); + double temperature = strtod(strtok_s(NULL, ":", &next_token), NULL); + double pressure = strtod(strtok_s(NULL, ":", &next_token), NULL); + double humidity = strtod(strtok_s(NULL, ":", &next_token), NULL); + double ballisticCoefficient = strtod(strtok_s(NULL, ":", &next_token), NULL); + int dragModel = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); + char* atmosphereModel = strtok_s(NULL, ":", &next_token); + + double zeroAngle = calculateZeroAngle(zeroRange, muzzleVelocity, boreHeight, temperature, pressure, humidity, ballisticCoefficient, dragModel, atmosphereModel); + + outputStr << DEGREES(zeroAngle); strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); EXTENSION_RETURN(); } From 7fa73744e9c51195ff3bbc0b8578521868e2df2a Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 12 Nov 2016 11:23:14 +0100 Subject: [PATCH 161/826] Cleanup - partly merged #4658 * Removed getVariable QGVAR(Adjustment) boilerplate * Less calls to setVariablePublic * Removed vanilla zeroing element hiding (fixes warning in log file) * Moved settings evaluation into ace_settingsInitialized event handler --- addons/scopes/XEH_postInit.sqf | 192 +++++++++--------- addons/scopes/functions/fnc_adjustScope.sqf | 5 +- addons/scopes/functions/fnc_adjustZero.sqf | 7 +- .../functions/fnc_applyScopeAdjustment.sqf | 8 +- addons/scopes/functions/fnc_canAdjustZero.sqf | 7 +- addons/scopes/functions/fnc_firedEH.sqf | 4 +- .../functions/fnc_initModuleSettings.sqf | 4 - .../scopes/functions/fnc_inventoryCheck.sqf | 19 +- addons/scopes/functions/fnc_showZeroing.sqf | 6 +- 9 files changed, 114 insertions(+), 138 deletions(-) diff --git a/addons/scopes/XEH_postInit.sqf b/addons/scopes/XEH_postInit.sqf index cf4df55b57..0145bfcb66 100644 --- a/addons/scopes/XEH_postInit.sqf +++ b/addons/scopes/XEH_postInit.sqf @@ -16,122 +16,132 @@ GVAR(canAdjustWindage) = [false, false, false]; GVAR(boreHeight) = [0, 0, 0]; GVAR(scopeAdjust) = [[[0,0],0,[0,0],0], [[0,0],0,[0,0],0], [[0,0],0,[0,0],0]]; -// Check inventory when it changes -["loadout", FUNC(inventoryCheck)] call CBA_fnc_addPlayerEventHandler; +["ace_settingsInitialized", { -// Instantly hide knobs when scoping in -["cameraView", { - params ["_player", "_newCameraView"]; - - if (_newCameraView == "GUNNER") then { - private _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; - _layer cutText ["", "PLAIN", 0]; - - if !(isNil QGVAR(fadePFH)) then { - [GVAR(fadePFH)] call CBA_fnc_removePerFrameHandler; - GVAR(fadePFH) = nil; - }; + if (!GVAR(enabled)) exitWith {}; + + if (GVAR(deduceBarometricPressureFromTerrainAltitude)) then { + GVAR(zeroReferenceBarometricPressure) = 1013.25 * (1 - (0.0065 * EGVAR(common,mapAltitude)) / 288.15) ^ 5.255754495; }; -}] call CBA_fnc_addPlayerEventHandler; -// Add keybinds -["ACE3 Scope Adjustment", QGVAR(AdjustUpMinor), localize LSTRING(AdjustUpMinor), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; + // Check inventory when it changes + ["loadout", FUNC(inventoryCheck), true] call CBA_fnc_addPlayerEventHandler; - [ACE_player] call FUNC(inventoryCheck); + // Instantly hide knobs when scoping in + ["cameraView", { + params ["_player", "_newCameraView"]; - // Statement - [ACE_player, ELEVATION_UP, MINOR_INCREMENT] call FUNC(adjustScope); -}, {false}, [201, [false, false, false]], true] call CBA_fnc_addKeybind; + if (_newCameraView == "GUNNER") then { + private _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; + _layer cutText ["", "PLAIN", 0]; -["ACE3 Scope Adjustment", QGVAR(AdjustDownMinor), localize LSTRING(AdjustDownMinor), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; + if !(isNil QGVAR(fadePFH)) then { + [GVAR(fadePFH)] call CBA_fnc_removePerFrameHandler; + GVAR(fadePFH) = nil; + }; + }; + }] call CBA_fnc_addPlayerEventHandler; - [ACE_player] call FUNC(inventoryCheck); + // Add keybinds + ["ACE3 Scope Adjustment", QGVAR(AdjustUpMinor), localize LSTRING(AdjustUpMinor), { + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; - // Statement - [ACE_player, ELEVATION_DOWN, MINOR_INCREMENT] call FUNC(adjustScope); -}, {false}, [209, [false, false, false]], true] call CBA_fnc_addKeybind; + [ACE_player] call FUNC(inventoryCheck); -["ACE3 Scope Adjustment", QGVAR(AdjustLeftMinor), localize LSTRING(AdjustLeftMinor), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; + // Statement + [ACE_player, ELEVATION_UP, MINOR_INCREMENT] call FUNC(adjustScope); + }, {false}, [201, [false, false, false]], true] call CBA_fnc_addKeybind; - [ACE_player] call FUNC(inventoryCheck); + ["ACE3 Scope Adjustment", QGVAR(AdjustDownMinor), localize LSTRING(AdjustDownMinor), { + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; - // Statement - [ACE_player, WINDAGE_LEFT, MINOR_INCREMENT] call FUNC(adjustScope); -}, {false}, [209, [false, true, false]], true] call CBA_fnc_addKeybind; + [ACE_player] call FUNC(inventoryCheck); -["ACE3 Scope Adjustment", QGVAR(AdjustRightMinor), localize LSTRING(AdjustRightMinor), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; + // Statement + [ACE_player, ELEVATION_DOWN, MINOR_INCREMENT] call FUNC(adjustScope); + }, {false}, [209, [false, false, false]], true] call CBA_fnc_addKeybind; - [ACE_player] call FUNC(inventoryCheck); + ["ACE3 Scope Adjustment", QGVAR(AdjustLeftMinor), localize LSTRING(AdjustLeftMinor), { + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; - // Statement - [ACE_player, WINDAGE_RIGHT, MINOR_INCREMENT] call FUNC(adjustScope); -}, {false}, [201, [false, true, false]], true] call CBA_fnc_addKeybind; + [ACE_player] call FUNC(inventoryCheck); -["ACE3 Scope Adjustment", QGVAR(AdjustUpMajor), localize LSTRING(AdjustUpMajor), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; + // Statement + [ACE_player, WINDAGE_LEFT, MINOR_INCREMENT] call FUNC(adjustScope); + }, {false}, [209, [false, true, false]], true] call CBA_fnc_addKeybind; - [ACE_player] call FUNC(inventoryCheck); + ["ACE3 Scope Adjustment", QGVAR(AdjustRightMinor), localize LSTRING(AdjustRightMinor), { + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; - // Statement - [ACE_player, ELEVATION_UP, MAJOR_INCREMENT] call FUNC(adjustScope); -}, {false}, [201, [true, false, false]], true] call CBA_fnc_addKeybind; + [ACE_player] call FUNC(inventoryCheck); -["ACE3 Scope Adjustment", QGVAR(AdjustDownMajor), localize LSTRING(AdjustDownMajor), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; + // Statement + [ACE_player, WINDAGE_RIGHT, MINOR_INCREMENT] call FUNC(adjustScope); + }, {false}, [201, [false, true, false]], true] call CBA_fnc_addKeybind; - [ACE_player] call FUNC(inventoryCheck); + ["ACE3 Scope Adjustment", QGVAR(AdjustUpMajor), localize LSTRING(AdjustUpMajor), { + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; - // Statement - [ACE_player, ELEVATION_DOWN, MAJOR_INCREMENT] call FUNC(adjustScope); -}, {false}, [209, [true, false, false]], true] call CBA_fnc_addKeybind; + [ACE_player] call FUNC(inventoryCheck); -["ACE3 Scope Adjustment", QGVAR(AdjustLeftMajor), localize LSTRING(AdjustLeftMajor), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; + // Statement + [ACE_player, ELEVATION_UP, MAJOR_INCREMENT] call FUNC(adjustScope); + }, {false}, [201, [true, false, false]], true] call CBA_fnc_addKeybind; - [ACE_player] call FUNC(inventoryCheck); + ["ACE3 Scope Adjustment", QGVAR(AdjustDownMajor), localize LSTRING(AdjustDownMajor), { + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; - // Statement - [ACE_player, WINDAGE_LEFT, MAJOR_INCREMENT] call FUNC(adjustScope); -}, {false}, [209, [true, true, false]], true] call CBA_fnc_addKeybind; + [ACE_player] call FUNC(inventoryCheck); -["ACE3 Scope Adjustment", QGVAR(AdjustRightMajor), localize LSTRING(AdjustRightMajor), { - // Conditions: canInteract - if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; - // Conditions: specific - if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; + // Statement + [ACE_player, ELEVATION_DOWN, MAJOR_INCREMENT] call FUNC(adjustScope); + }, {false}, [209, [true, false, false]], true] call CBA_fnc_addKeybind; - [ACE_player] call FUNC(inventoryCheck); + ["ACE3 Scope Adjustment", QGVAR(AdjustLeftMajor), localize LSTRING(AdjustLeftMajor), { + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; - // Statement - [ACE_player, WINDAGE_RIGHT, MAJOR_INCREMENT] call FUNC(adjustScope); -}, {false}, [201, [true, true, false]], true] call CBA_fnc_addKeybind; + [ACE_player] call FUNC(inventoryCheck); + + // Statement + [ACE_player, WINDAGE_LEFT, MAJOR_INCREMENT] call FUNC(adjustScope); + }, {false}, [209, [true, true, false]], true] call CBA_fnc_addKeybind; + + ["ACE3 Scope Adjustment", QGVAR(AdjustRightMajor), localize LSTRING(AdjustRightMajor), { + // Conditions: canInteract + if !([ACE_player, objNull, ["isNotInside"]] call EFUNC(common,canInteractWith)) exitWith {false}; + // Conditions: specific + if (!([ACE_player] call CBA_fnc_canUseWeapon)) exitWith {false}; + + [ACE_player] call FUNC(inventoryCheck); + + // Statement + [ACE_player, WINDAGE_RIGHT, MAJOR_INCREMENT] call FUNC(adjustScope); + }, {false}, [201, [true, true, false]], true] call CBA_fnc_addKeybind; -// Register fire event handler -["ace_firedPlayer", DFUNC(firedEH)] call CBA_fnc_addEventHandler; -["ace_firedPlayerNonLocal", DFUNC(firedEH)] call CBA_fnc_addEventHandler; + // Register fire event handler + ["ace_firedPlayer", DFUNC(firedEH)] call CBA_fnc_addEventHandler; + ["ace_firedPlayerNonLocal", DFUNC(firedEH)] call CBA_fnc_addEventHandler; + +}] call CBA_fnc_addEventHandler; diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index c0a9fb3fdc..a16568b0d9 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -28,10 +28,7 @@ if (!GVAR(enabled)) exitWith {false}; _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {false}; -_adjustment = _unit getVariable QGVAR(Adjustment); -if (isNil "_adjustment") then { - _adjustment = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; // [Windage, Elevation, Zero] -}; +_adjustment = _unit getVariable [QGVAR(Adjustment), [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]; if (!(GVAR(canAdjustElevation) select _weaponIndex) && (_turretAndDirection in [ELEVATION_UP, ELEVATION_DOWN])) exitWith {false}; if (!(GVAR(canAdjustWindage) select _weaponIndex) && (_turretAndDirection in [WINDAGE_UP, WINDAGE_DOWN])) exitWith {false}; diff --git a/addons/scopes/functions/fnc_adjustZero.sqf b/addons/scopes/functions/fnc_adjustZero.sqf index 9e953d0523..bc702a8c5f 100644 --- a/addons/scopes/functions/fnc_adjustZero.sqf +++ b/addons/scopes/functions/fnc_adjustZero.sqf @@ -24,12 +24,7 @@ if (vehicle _unit != _unit) exitWith {false}; _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {false}; -_adjustment = _unit getVariable QGVAR(Adjustment); -if (isNil "_adjustment") then { - // [Windage, Elevation, Zero] - _adjustment = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; -}; - +_adjustment = _unit getVariable [QGVAR(Adjustment), [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]; _zeroing = _adjustment select _weaponIndex; _zeroing params ["_elevation", "_windage", "_zero"]; diff --git a/addons/scopes/functions/fnc_applyScopeAdjustment.sqf b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf index 7067b0442c..2777df65b5 100644 --- a/addons/scopes/functions/fnc_applyScopeAdjustment.sqf +++ b/addons/scopes/functions/fnc_applyScopeAdjustment.sqf @@ -24,13 +24,7 @@ params ["_unit", "_elevation", "_windage", "_zero"]; _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); -_adjustment = _unit getVariable QGVAR(Adjustment); -if (isNil "_adjustment") then { - // [Windage, Elevation, Zero] - _adjustment = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; - _unit setVariable [QGVAR(Adjustment), _adjustment]; -}; - +_adjustment = _unit getVariable [QGVAR(Adjustment), [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]; _adjustmentDifference = (_adjustment select _weaponIndex) vectorDiff [_elevation, _windage, _zero]; if (_adjustmentDifference isEqualTo [0,0,0]) exitWith {false}; // Don't coninue if no adjustment is made diff --git a/addons/scopes/functions/fnc_canAdjustZero.sqf b/addons/scopes/functions/fnc_canAdjustZero.sqf index 477dc12635..30e2918805 100644 --- a/addons/scopes/functions/fnc_canAdjustZero.sqf +++ b/addons/scopes/functions/fnc_canAdjustZero.sqf @@ -26,12 +26,7 @@ if (!(missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {false}; -_adjustment = _unit getVariable QGVAR(Adjustment); -if (isNil "_adjustment") then { - // [Windage, Elevation, Zero] - _adjustment = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; -}; - +_adjustment = _unit getVariable [QGVAR(Adjustment), [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]; _elevation = (_adjustment select _weaponIndex) select 0; // You can only adjust your zero reference, if your relative elevation setting is not 0 diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index 47aefb6c26..cc105f70ca 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -15,12 +15,10 @@ //IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"]; TRACE_10("firedEH:",_unit, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile, _vehicle, _gunner, _turret); -private _adjustment = _unit getVariable [QGVAR(Adjustment), []]; -if (_adjustment isEqualTo []) exitWith {}; - private _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {}; +private _adjustment = ACE_player getVariable [QGVAR(Adjustment), [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]; private _zeroing = +(_adjustment select _weaponIndex); TRACE_1("Adjusting With",_zeroing); diff --git a/addons/scopes/functions/fnc_initModuleSettings.sqf b/addons/scopes/functions/fnc_initModuleSettings.sqf index 5435e1f0d2..255052ad6c 100644 --- a/addons/scopes/functions/fnc_initModuleSettings.sqf +++ b/addons/scopes/functions/fnc_initModuleSettings.sqf @@ -30,7 +30,3 @@ GVAR(defaultZeroRange) = 0 max GVAR(defaultZeroRange) min 1000; GVAR(zeroReferenceTemperature) = -55 max GVAR(zeroReferenceTemperature) max 55; GVAR(zeroReferenceBarometricPressure) = 0 max GVAR(zeroReferenceBarometricPressure) min 1013.25; GVAR(zeroReferenceHumidity) = 0 max GVAR(zeroReferenceHumidity) min 1.0; - -if (GVAR(deduceBarometricPressureFromTerrainAltitude)) then { - GVAR(zeroReferenceBarometricPressure) = 1013.25 * (1 - (0.0065 * EGVAR(common,mapAltitude)) / 288.15) ^ 5.255754495; -}; diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index d248b3923b..6f8d82b383 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -17,13 +17,8 @@ params ["_player"]; -private _adjustment = ACE_player getVariable QGVAR(Adjustment); -if (isNil "_adjustment") then { - // [Windage, Elevation, Zero] - _adjustment = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; - ACE_player setVariable [QGVAR(Adjustment), _adjustment]; - [ACE_player, QGVAR(Adjustment), _adjustment, 0.5] call EFUNC(common,setVariablePublic); -}; +private _adjustment = ACE_player getVariable [QGVAR(Adjustment), [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]; +private _updateAdjustment = false; private _newOptics = [_player] call FUNC(getOptics); private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapon _player]; @@ -33,7 +28,7 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo // The optic for this weapon changed, set adjustment to zero if (!((_adjustment select _forEachIndex) isEqualTo [0, 0, 0])) then { _adjustment set [_forEachIndex, [0, 0, 0]]; - [ACE_player, QGVAR(Adjustment), _adjustment, 0.5] call EFUNC(common,setVariablePublic); + _updateAdjustment; }; private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _forEachIndex); private _verticalIncrement = -1; @@ -69,8 +64,6 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo (GVAR(scopeAdjust) select _forEachIndex) set [3, _horizontalIncrement]; GVAR(canAdjustElevation) set [_forEachIndex, (_verticalIncrement > 0) && !(_maxVertical isEqualTo [0, 0])]; GVAR(canAdjustWindage) set [_forEachIndex, (_horizontalIncrement > 0) && !(_maxHorizontal isEqualTo [0, 0])]; - private _hideVanillaZeroing = (GVAR(enabled) && getNumber(_opticConfig >> "ItemInfo" >> "opticType") == 2 && {GVAR(canAdjustElevation) select _forEachIndex}) || {isNumber (_opticConfig >> "ACE_ScopeZeroRange")}; - ["ace_scopes", true, "zeroing", !_hideVanillaZeroing] call EFUNC(ui,setElementVisibility); }; } forEach GVAR(Optics); @@ -134,7 +127,9 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo } } forEach [0, 1, 2]; -_adjustment = ACE_player getVariable QGVAR(Adjustment); +if (_updateAdjustment) then { + [ACE_player, QGVAR(Adjustment), _adjustment, 0.5] call EFUNC(common,setVariablePublic); +}; + GVAR(Optics) = _newOptics; GVAR(Guns) = _newGuns; - diff --git a/addons/scopes/functions/fnc_showZeroing.sqf b/addons/scopes/functions/fnc_showZeroing.sqf index 530f5cb1d2..cf74e38842 100644 --- a/addons/scopes/functions/fnc_showZeroing.sqf +++ b/addons/scopes/functions/fnc_showZeroing.sqf @@ -20,11 +20,7 @@ disableSerialization; private _weaponIndex = [ACE_player, currentWeapon ACE_player] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {}; -private _adjustment = ACE_player getVariable QGVAR(Adjustment); -if (isNil "_adjustment") then { - // [Windage, Elevation, Zero] - _adjustment = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]; -}; +private _adjustment = ACE_player getVariable [QGVAR(Adjustment), [[0, 0, 0], [0, 0, 0], [0, 0, 0]]]; // Display the adjustment knobs private _layer = [QGVAR(Zeroing)] call BIS_fnc_rscLayer; From 2f23f1ca6cce62334b813ec50aecabbe11b52792 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 12 Nov 2016 12:04:19 +0100 Subject: [PATCH 162/826] Bugfix - Fixes ace_scopes affecting under-barrel grenade launchers --- addons/scopes/functions/fnc_firedEH.sqf | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index cc105f70ca..d23be3fbf0 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -15,6 +15,8 @@ //IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"]; TRACE_10("firedEH:",_unit, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile, _vehicle, _gunner, _turret); +if (!(_ammo isKindOf "BulletBase")) exitWith {}; + private _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponIndex); if (_weaponIndex < 0) exitWith {}; @@ -25,17 +27,15 @@ TRACE_1("Adjusting With",_zeroing); // Convert zeroing from mils to degrees _zeroing = _zeroing vectorMultiply 0.05625; -if (_ammo isKindOf "BulletBase") then { - private _advancedBallistics = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; - private _boreHeight = GVAR(boreHeight) select _weaponIndex; - private _oldZeroRange = currentZeroing _unit; - private _newZeroRange = [_unit] call FUNC(getCurrentZeroRange); - private _zeroCorrection = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics]; - if (isNil "_zeroCorrection") then { - _zeroCorrection = [_oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics] call FUNC(calculateZeroAngleCorrection); - }; - _zeroing = _zeroing vectorAdd [0, 0, _zeroCorrection]; +private _advancedBallistics = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; +private _boreHeight = GVAR(boreHeight) select _weaponIndex; +private _oldZeroRange = currentZeroing _unit; +private _newZeroRange = [_unit] call FUNC(getCurrentZeroRange); +private _zeroCorrection = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics]; +if (isNil "_zeroCorrection") then { + _zeroCorrection = [_oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics] call FUNC(calculateZeroAngleCorrection); }; +_zeroing = _zeroing vectorAdd [0, 0, _zeroCorrection]; if (_zeroing isEqualTo [0, 0, 0]) exitWith {}; From 8c49433b49eed8db91093d7506187b0cd563ac30 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 12 Nov 2016 12:06:17 +0100 Subject: [PATCH 163/826] Added new ace_scopes module setting 'correctZeroing' (default on) --- addons/scopes/ACE_Settings.hpp | 8 ++++++++ addons/scopes/CfgVehicles.hpp | 6 ++++++ addons/scopes/functions/fnc_firedEH.sqf | 18 ++++++++++-------- .../functions/fnc_initModuleSettings.sqf | 1 + addons/scopes/functions/fnc_inventoryCheck.sqf | 2 +- addons/scopes/stringtable.xml | 6 ++++++ 6 files changed, 32 insertions(+), 9 deletions(-) diff --git a/addons/scopes/ACE_Settings.hpp b/addons/scopes/ACE_Settings.hpp index faf3f25836..29d6635cf2 100644 --- a/addons/scopes/ACE_Settings.hpp +++ b/addons/scopes/ACE_Settings.hpp @@ -12,6 +12,14 @@ class ACE_Settings { displayName = CSTRING(forceUseOfAdjustmentTurrets_displayName); description = CSTRING(forceUseOfAdjustmentTurrets_description); }; + + // Auto corrects the zeroing in both vanilla- and advanced ballistics + class GVAR(correctZeroing) { + typeName = "BOOL"; + value = 1; + displayName = CSTRING(correctZeroing_displayName); + description = CSTRING(correctZeroing_description); + }; // Only affects scopes with elevation adjustment turrets (ACE_ScopeAdjust_Vertical != [0,0]) class GVAR(defaultZeroRange) { typeName = "SCALAR"; diff --git a/addons/scopes/CfgVehicles.hpp b/addons/scopes/CfgVehicles.hpp index 6cb40dd59e..4a23ea0baf 100644 --- a/addons/scopes/CfgVehicles.hpp +++ b/addons/scopes/CfgVehicles.hpp @@ -40,6 +40,12 @@ class CfgVehicles { typeName = "BOOL"; defaultValue = 0; }; + class correctZeroing { + displayName = CSTRING(correctZeroing_DisplayName); + description = CSTRING(correctZeroing_Description); + typeName = "BOOL"; + defaultValue = 1; + }; class defaultZeroRange { displayName = CSTRING(defaultZeroRange_DisplayName); description = CSTRING(defaultZeroRange_Description); diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index d23be3fbf0..ebadb2f715 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -27,15 +27,17 @@ TRACE_1("Adjusting With",_zeroing); // Convert zeroing from mils to degrees _zeroing = _zeroing vectorMultiply 0.05625; -private _advancedBallistics = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; -private _boreHeight = GVAR(boreHeight) select _weaponIndex; -private _oldZeroRange = currentZeroing _unit; -private _newZeroRange = [_unit] call FUNC(getCurrentZeroRange); -private _zeroCorrection = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics]; -if (isNil "_zeroCorrection") then { - _zeroCorrection = [_oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics] call FUNC(calculateZeroAngleCorrection); +if (GVAR(correctZeroing)) then { + private _advancedBallistics = missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]; + private _boreHeight = GVAR(boreHeight) select _weaponIndex; + private _oldZeroRange = currentZeroing _unit; + private _newZeroRange = [_unit] call FUNC(getCurrentZeroRange); + private _zeroCorrection = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4_%5_%6_%7), _oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics]; + if (isNil "_zeroCorrection") then { + _zeroCorrection = [_oldZeroRange, _newZeroRange, _boreHeight, _weapon, _ammo, _magazine, _advancedBallistics] call FUNC(calculateZeroAngleCorrection); + }; + _zeroing = _zeroing vectorAdd [0, 0, _zeroCorrection]; }; -_zeroing = _zeroing vectorAdd [0, 0, _zeroCorrection]; if (_zeroing isEqualTo [0, 0, 0]) exitWith {}; diff --git a/addons/scopes/functions/fnc_initModuleSettings.sqf b/addons/scopes/functions/fnc_initModuleSettings.sqf index 255052ad6c..91ab202db3 100644 --- a/addons/scopes/functions/fnc_initModuleSettings.sqf +++ b/addons/scopes/functions/fnc_initModuleSettings.sqf @@ -20,6 +20,7 @@ if !(_activated) exitWith {}; [_logic, QGVAR(enabled), "enabled"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(forceUseOfAdjustmentTurrets), "forceUseOfAdjustmentTurrets"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(correctZeroing), "correctZeroing"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(defaultZeroRange), "defaultZeroRange"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(zeroReferenceTemperature), "zeroReferenceTemperature"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(zeroReferenceBarometricPressure), "zeroReferenceBarometricPressure"] call EFUNC(common,readSettingFromModule); diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index 6f8d82b383..e65f904755 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -28,7 +28,7 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo // The optic for this weapon changed, set adjustment to zero if (!((_adjustment select _forEachIndex) isEqualTo [0, 0, 0])) then { _adjustment set [_forEachIndex, [0, 0, 0]]; - _updateAdjustment; + _updateAdjustment = true; }; private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _forEachIndex); private _verticalIncrement = -1; diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index 7da8c971a0..f74325ab62 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -16,6 +16,12 @@ Force usage of adjustmet turrets on high powered scopes + + Correct zeroing + + + Corrects the zeroing of all small arms sights + Default zero distance From 79d087e784b5afc98f16058e601d57476c7ad0ad Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 13 Nov 2016 11:27:12 +0100 Subject: [PATCH 164/826] Reset scope adjustments when either the weapon or the scope change. --- addons/scopes/functions/fnc_inventoryCheck.sqf | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index e65f904755..d5ff7eb3f6 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -21,15 +21,8 @@ private _adjustment = ACE_player getVariable [QGVAR(Adjustment), [[0, 0, 0], [0, private _updateAdjustment = false; private _newOptics = [_player] call FUNC(getOptics); -private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapon _player]; - { if (_newOptics select _forEachIndex != _x) then { - // The optic for this weapon changed, set adjustment to zero - if (!((_adjustment select _forEachIndex) isEqualTo [0, 0, 0])) then { - _adjustment set [_forEachIndex, [0, 0, 0]]; - _updateAdjustment = true; - }; private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _forEachIndex); private _verticalIncrement = -1; if (isNumber (_opticConfig >> "ACE_ScopeAdjust_VerticalIncrement")) then { @@ -67,8 +60,14 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo }; } forEach GVAR(Optics); +private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapon _player]; { if ((_newOptics select _x) != (GVAR(Optics) select _x) || (_newGuns select _x != GVAR(Guns) select _x)) then { + // The optic or the weapon changed, set adjustment to zero + if (!((_adjustment select _forEachIndex) isEqualTo [0, 0, 0])) then { + _adjustment set [_forEachIndex, [0, 0, 0]]; + _updateAdjustment = true; + }; // Determine rail height above bore private _railHeightAboveBore = 0; private _weaponConfig = configFile >> "CfgWeapons" >> (_newGuns select _x); From 69cd53de2a73856127f64340e2a8b878d1c5e596 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 13 Nov 2016 15:43:07 +0100 Subject: [PATCH 165/826] Optimized ATragMX solution calculations --- .../functions/fnc_calculate_range_card.sqf | 2 +- .../functions/fnc_calculate_solution.sqf | 42 +++++++++++-------- .../fnc_calculate_target_solution.sqf | 2 +- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index 0b6d0a177b..fa7793ebd5 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -71,5 +71,5 @@ if (GVAR(currentUnit) == 1) then { GVAR(rangeCardData) = []; -private _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, +private _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 100, [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude, _directionOfFire] call FUNC(calculate_solution); diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index 940b3dc2ec..f50f502cc4 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -51,7 +51,10 @@ params [ ]; _windSpeed params ["_windSpeed1", "_windSpeed2"]; -private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"]; +private ["_tx", "_tz", "_lastBulletPos", "_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT"]; +_tx = 0; +_tz = 0; +_lastBulletPos = [0, 0, 0]; _bulletPos = [0, 0, 0]; _bulletVelocity = [0, 0, 0]; _bulletAccel = [0, 0, 0]; @@ -74,9 +77,10 @@ _horizontalDeflection = 0; _spinDrift = 0; _spinDeflection = 0; -private ["_n", "_range", "_rangeFactor"]; +private ["_n", "_range", "_trueRange", "_rangeFactor"]; _n = 0; _range = 0; +_trueRange = 0; _rangeFactor = 1; if (_storeRangeCardData) then { if (GVAR(currentUnit) == 1) then { @@ -133,22 +137,25 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { _bulletAccel = _bulletAccel vectorAdd _gravity; + _lastBulletPos = _bulletPos; + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); _bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT); - _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply _deltaT); + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); _TOF = _TOF + _deltaT; if (_storeRangeCardData) then { _range = GVAR(rangeCardStartRange) + _n * GVAR(rangeCardIncrement); if ((_bulletPos select 1) * _rangeFactor >= _range && _range <= GVAR(rangeCardEndRange)) then { - if ((_bulletPos select 1) > 0) then { - _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); - _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); - _windDrift = (_wind2 select 0) * (_TOF - (_range / _rangeFactor) / _muzzleVelocity); - _windage2 = - atan(_windDrift / (_bulletPos select 1)); - }; - if (_range != 0) then { - _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _range); + _trueRange = _range / _rangeFactor; + if (_trueRange != 0) then { + _tx = (_lastBulletPos select 0) + (_trueRange - (_lastBulletPos select 1)) * ((_bulletPos select 0) - (_lastBulletPos select 0)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); + _tz = (_lastBulletPos select 2) + (_trueRange - (_lastBulletPos select 1)) * ((_bulletPos select 2) - (_lastBulletPos select 2)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); + _elevation = - atan(_tz / _trueRange); + _windage1 = - atan(_tx / _trueRange); + _windDrift = (_wind2 select 0) * (_TOF - _trueRange / _muzzleVelocity); + _windage2 = - atan(_windDrift / _trueRange); + _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _trueRange); }; _kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2)); _kineticEnergy = _kineticEnergy * 0.737562149; @@ -176,14 +183,13 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { }; }; -if ((_bulletPos select 1) > 0) then { - _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); - _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); - _windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity); - _windage2 = - atan(_windDrift / (_bulletPos select 1)); -}; - if (_targetRange != 0) then { + _tx = (_lastBulletPos select 0) + (_targetRange - (_lastBulletPos select 1)) * ((_bulletPos select 0) - (_lastBulletPos select 0)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); + _tz = (_lastBulletPos select 2) + (_targetRange - (_lastBulletPos select 1)) * ((_bulletPos select 2) - (_lastBulletPos select 2)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); + _elevation = - atan(_tz / _targetRange); + _windage1 = - atan(_tx / _targetRange); + _windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity); + _windage2 = - atan(_windDrift / _targetRange); _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _targetRange); }; diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index eb4f2817c8..bdc8f0ab11 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -70,7 +70,7 @@ _inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget); _targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget); _targetRange = GVAR(targetRange) select GVAR(currentTarget); -GVAR(targetSolutionInput) = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 1000, +GVAR(targetSolutionInput) = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 100, [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude, _directionOfFire]; private _result = GVAR(targetSolutionInput) call FUNC(calculate_solution); From 16f3f2ca3742896de4b4a0ccb69bea3b23c1238b Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 13 Nov 2016 15:43:30 +0100 Subject: [PATCH 166/826] Optimized range card calculations * Removed dead code --- addons/rangecard/XEH_PREP.hpp | 2 +- .../functions/fnc_calculateRangeCard.sqf | 151 ++++++++++++++ .../functions/fnc_calculateSolution.sqf | 195 ------------------ .../functions/fnc_updateRangeCard.sqf | 4 +- 4 files changed, 154 insertions(+), 198 deletions(-) create mode 100644 addons/rangecard/functions/fnc_calculateRangeCard.sqf delete mode 100644 addons/rangecard/functions/fnc_calculateSolution.sqf diff --git a/addons/rangecard/XEH_PREP.hpp b/addons/rangecard/XEH_PREP.hpp index 6b13dcc45a..abbeaa2803 100644 --- a/addons/rangecard/XEH_PREP.hpp +++ b/addons/rangecard/XEH_PREP.hpp @@ -1,5 +1,5 @@ -PREP(calculateSolution); +PREP(calculateRangeCard); PREP(canCopy); PREP(canShow); PREP(canShowCopy); diff --git a/addons/rangecard/functions/fnc_calculateRangeCard.sqf b/addons/rangecard/functions/fnc_calculateRangeCard.sqf new file mode 100644 index 0000000000..7edd865ddc --- /dev/null +++ b/addons/rangecard/functions/fnc_calculateRangeCard.sqf @@ -0,0 +1,151 @@ +/* + * Author: Ruthberg + * Calculates the range card data + * + * Arguments: + * 0: Scope base angle + * 1: Bore height + * 2: air friction + * 3: muzzle velocity + * 4: temperature + * 5: barometric pressure + * 6: relative humidity + * 7: simulation steps + * 8: wind speed + * 9: target speed + * 10: target range + * 11: ballistic coefficient + * 12: drag model + * 13: atmosphere model + * 14: Range Card Slot + * 15: Use advanced ballistics config? + * + * Return Value: + * Nothing + * + * Example: + * call ace_rangecard_fnc_calculateRangeCard + * + * Public: No + */ +#include "script_component.hpp" +params [ + "_scopeBaseAngle", "_boreHeight", "_airFriction", "_muzzleVelocity", + "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", + "_windSpeed", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", + "_rangeCardSlot", "_useABConfig" +]; + +GVAR(rangeCardDataMVs) set [_rangeCardSlot, format[" %1", round(_muzzleVelocity)]]; + +private ["_tx", "_tz", "_lastBulletPos", "_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT", "_speedOfSound"]; +_tx = 0; +_tz = 0; +_lastBulletPos = [0, 0, 0]; +_bulletPos = [0, 0, 0]; +_bulletVelocity = [0, 0, 0]; +_bulletAccel = [0, 0, 0]; +_bulletSpeed = 0; +_gravity = [0, sin(_scopeBaseAngle) * -9.80665, cos(_scopeBaseAngle) * -9.80665]; +_deltaT = 1 / _simSteps; +_speedOfSound = 0; +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { + _speedOfSound = _temperature call EFUNC(weather,calculateSpeedOfSound); +}; + +private ["_elevation", "_windage", "_lead", "_TOF", "_trueVelocity", "_trueSpeed"]; +_elevation = 0; +_windage = 0; +_lead = 0; +_TOF = 0; +_trueVelocity = [0, 0, 0]; +_trueSpeed = 0; + +private ["_n", "_range"]; +_n = 0; +_range = 0; + +if (_useABConfig) then { + _bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel])); +}; + +private ["_airFrictionCoef", "_airDensity"]; +_airFrictionCoef = 1; +if (!_useABConfig && (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])) then { + _airDensity = [_temperature, _barometricPressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity); + _airFrictionCoef = _airDensity / 1.22498; +}; + +private ["_speedTotal", "_stepsTotal", "_speedAverage"]; +_speedTotal = 0; +_stepsTotal = 0; +_speedAverage = 0; + +_bulletPos set [0, 0]; +_bulletPos set [1, 0]; +_bulletPos set [2, -(_boreHeight / 100)]; + +_bulletVelocity set [0, 0]; +_bulletVelocity set [1, Cos(_scopeBaseAngle) * _muzzleVelocity]; +_bulletVelocity set [2, Sin(_scopeBaseAngle) * _muzzleVelocity]; + +while {_TOF < 6 && (_bulletPos select 1) < _targetRange} do { + _bulletSpeed = vectorMagnitude _bulletVelocity; + + _speedTotal = _speedTotal + _bulletSpeed; + _stepsTotal = _stepsTotal + 1; + _speedAverage = (_speedTotal / _stepsTotal); + + if (_speedAverage > 450 && _bulletSpeed < _speedOfSound) exitWith {}; + if (atan((_bulletPos select 2) / (abs(_bulletPos select 1) + 1)) < -2.254) exitWith {}; + + _trueVelocity = _bulletVelocity vectorDiff [-_windSpeed, 0, 0]; + _trueSpeed = vectorMagnitude _trueVelocity; + + if (_useABConfig) then { + private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])); + _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); + } else { + _bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction * _airFrictionCoef); + }; + + _bulletAccel = _bulletAccel vectorAdd _gravity; + + _lastBulletPos = _bulletPos; + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); + _bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT); + _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); + + _TOF = _TOF + _deltaT; + + _range = GVAR(rangeCardStartRange) + _n * GVAR(rangeCardIncrement); + if ((_bulletPos select 1) >= _range && _range <= GVAR(rangeCardEndRange)) then { + if (_range != 0) then { + _tx = (_lastBulletPos select 0) + (_range - (_lastBulletPos select 1)) * ((_bulletPos select 0) - (_lastBulletPos select 0)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); + _tz = (_lastBulletPos select 2) + (_range - (_lastBulletPos select 1)) * ((_bulletPos select 2) - (_lastBulletPos select 2)) / ((_bulletPos select 1) - (_lastBulletPos select 1)); + _elevation = - atan(_tz / _range); + _windage = - atan(_tx / _range); + _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _range); + }; + private ["_elevationString", "_windageString", "_leadString"]; + _elevationString = Str(round(-_elevation * 60 / 3.38 * 10) / 10); + if (_elevationString == "0") then { + _elevationString = "-0.0"; + }; + if (_elevationString find "." == -1) then { + _elevationString = _elevationString + ".0"; + }; + _windageString = Str(round(_windage * 60 / 3.38 * 10) / 10); + if (_windageString find "." == -1) then { + _windageString = _windageString + ".0"; + }; + _leadString = Str(round(_lead * 10) / 10); + if (_leadString find "." == -1) then { + _leadString = _leadString + ".0"; + }; + (GVAR(rangeCardDataElevation) select _rangeCardSlot) set [_n, _elevationString]; + (GVAR(rangeCardDataWindage) select _rangeCardSlot) set [_n, _windageString]; + (GVAR(rangeCardDataLead) select _rangeCardSlot) set [_n, _leadString]; + _n = _n + 1; + }; +}; diff --git a/addons/rangecard/functions/fnc_calculateSolution.sqf b/addons/rangecard/functions/fnc_calculateSolution.sqf deleted file mode 100644 index 1e2cb38ba7..0000000000 --- a/addons/rangecard/functions/fnc_calculateSolution.sqf +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Author: Ruthberg - * Calculates the range card data - * - * Arguments: - * 0: Scope base angle - * 1: Bullet mass - * 2: Bore height - * 3: air friction - * 4: muzzle velocity - * 5: temperature - * 6: barometric pressure - * 7: relative humidity - * 8: simulation steps - * 9: wind speed - * 10: wind direction - * 11: inclination angle - * 12: target speed - * 13: target range - * 14: ballistic coefficient - * 15: drag model - * 16: atmosphere model - * 17: Store range card data? - * 18: Stability factor - * 19: Twist Direction - * 20: Latitude - * 21: Direction of Fire - * 22: Range Card Slot - * 23: Use advanced ballistics config? - * - * Return Value: - * 0: Elevation (MOA) - * 1: Windage (MOA) - * 2: Lead (MOA) - * 3: Time of fligth (SECONDS) - * 4: Remaining velocity (m/s) - * 5: Remaining kinetic energy (ft·lb) - * 6: Vertical coriolis drift (MOA) - * 7: Horizontal coriolis drift (MOA) - * 8: Spin drift (MOA) - * - * Example: - * call ace_rangecard_fnc_calculateSolution - * - * Public: No - */ -#include "script_component.hpp" -params [ - "_scopeBaseAngle", "_bulletMass", "_boreHeight", "_airFriction", "_muzzleVelocity", - "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed", - "_windDirection", "_inclinationAngle", "_targetSpeed", "_targetRange", "_bc", "_dragModel", - "_atmosphereModel", "_storeRangeCardData", "_stabilityFactor", "_twistDirection", "_latitude", - "_directionOfFire", "_rangeCardSlot", "_useABConfig" -]; -_windSpeed params ["_windSpeed1", "_windSpeed2"]; - -if (_storeRangeCardData) then { - GVAR(rangeCardDataMVs) set [_rangeCardSlot, format[" %1", round(_muzzleVelocity)]]; -}; - -private ["_bulletPos", "_bulletVelocity", "_bulletAccel", "_bulletSpeed", "_gravity", "_deltaT", "_speedOfSound"]; -_bulletPos = [0, 0, 0]; -_bulletVelocity = [0, 0, 0]; -_bulletAccel = [0, 0, 0]; -_bulletSpeed = 0; -_gravity = [0, sin(_scopeBaseAngle + _inclinationAngle) * -9.80665, cos(_scopeBaseAngle + _inclinationAngle) * -9.80665]; -_deltaT = 1 / _simSteps; -_speedOfSound = 0; -if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - _speedOfSound = _temperature call EFUNC(weather,calculateSpeedOfSound); -}; - -private ["_elevation", "_windage1", "_windage2", "_lead", "_TOF", "_trueVelocity", "_trueSpeed", "_kineticEnergy", "_verticalCoriolis", "_verticalDeflection", "_horizontalCoriolis", "_horizontalDeflection", "_spinDrift", "_spinDeflection"]; -_elevation = 0; -_windage1 = 0; -_windage2 = 0; -_lead = 0; -_TOF = 0; -_trueVelocity = [0, 0, 0]; -_trueSpeed = 0; -_verticalCoriolis = 0; -_verticalDeflection = 0; -_horizontalCoriolis = 0; -_horizontalDeflection = 0; -_spinDrift = 0; -_spinDeflection = 0; - -private ["_n", "_range"]; -_n = 0; -_range = 0; - -private ["_wind1", "_wind2", "_windDrift"]; -_wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windDirection * 30) * _windSpeed1, 0]; -_wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0]; -_windDrift = 0; -if (_useABConfig) then { - _bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel])); -}; - -private ["_airFrictionCoef", "_airDensity"]; -_airFrictionCoef = 1; -if (!_useABConfig && (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false])) then { - _airDensity = [_temperature, _barometricPressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity); - _airFrictionCoef = _airDensity / 1.22498; -}; - -private ["_speedTotal", "_stepsTotal", "_speedAverage"]; -_speedTotal = 0; -_stepsTotal = 0; -_speedAverage = 0; - -_bulletPos set [0, 0]; -_bulletPos set [1, 0]; -_bulletPos set [2, -(_boreHeight / 100)]; - -_bulletVelocity set [0, 0]; -_bulletVelocity set [1, Cos(_scopeBaseAngle) * _muzzleVelocity]; -_bulletVelocity set [2, Sin(_scopeBaseAngle) * _muzzleVelocity]; - -while {_TOF < 6 && (_bulletPos select 1) < _targetRange} do { - _bulletSpeed = vectorMagnitude _bulletVelocity; - - _speedTotal = _speedTotal + _bulletSpeed; - _stepsTotal = _stepsTotal + 1; - _speedAverage = (_speedTotal / _stepsTotal); - - if (_speedAverage > 450 && _bulletSpeed < _speedOfSound) exitWith {}; - if (atan((_bulletPos select 2) / (abs(_bulletPos select 1) + 1)) < -2.254) exitWith {}; - - _trueVelocity = _bulletVelocity vectorDiff _wind1; - _trueSpeed = vectorMagnitude _trueVelocity; - - if (_useABConfig) then { - private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])); - _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); - } else { - _bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction * _airFrictionCoef); - }; - - _bulletAccel = _bulletAccel vectorAdd _gravity; - - _bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT); - _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply _deltaT); - - _TOF = _TOF + _deltaT; - - if (_storeRangeCardData) then { - _range = GVAR(rangeCardStartRange) + _n * GVAR(rangeCardIncrement); - if ((_bulletPos select 1) >= _range && _range <= GVAR(rangeCardEndRange)) then { - if ((_bulletPos select 1) > 0) then { - _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); - _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); - }; - if (_range != 0) then { - _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _range); - }; - private ["_elevationString", "_windageString", "_leadString"]; - _elevationString = Str(round(-_elevation * 60 / 3.38 * 10) / 10); - if (_elevationString == "0") then { - _elevationString = "-0.0"; - }; - if (_elevationString find "." == -1) then { - _elevationString = _elevationString + ".0"; - }; - _windageString = Str(round(_windage1 * 60 / 3.38 * 10) / 10); - if (_windageString find "." == -1) then { - _windageString = _windageString + ".0"; - }; - _leadString = Str(round(_lead * 10) / 10); - if (_leadString find "." == -1) then { - _leadString = _leadString + ".0"; - }; - (GVAR(rangeCardDataElevation) select _rangeCardSlot) set [_n, _elevationString]; - (GVAR(rangeCardDataWindage) select _rangeCardSlot) set [_n, _windageString]; - (GVAR(rangeCardDataLead) select _rangeCardSlot) set [_n, _leadString]; - _n = _n + 1; - }; - }; -}; - -if ((_bulletPos select 1) > 0) then { - _elevation = - atan((_bulletPos select 2) / (_bulletPos select 1)); - _windage1 = - atan((_bulletPos select 0) / (_bulletPos select 1)); - _windDrift = (_wind2 select 0) * (_TOF - _targetRange / _muzzleVelocity); - _windage2 = - atan(_windDrift / (_bulletPos select 1)); -}; - -if (_targetRange != 0) then { - _lead = (_targetSpeed * _TOF) / (Tan(3.38 / 60) * _targetRange); -}; - -_kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2)); -_kineticEnergy = _kineticEnergy * 0.737562149; - -[_elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis * 60, _horizontalCoriolis * 60, _spinDrift * 60] diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf index 633df5e4c6..41234376fc 100644 --- a/addons/rangecard/functions/fnc_updateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf @@ -170,10 +170,10 @@ if (isNil {_cacheEntry}) then { private _mvShift = [_ammoConfig select 9, _x] call EFUNC(advanced_ballistics,calculateAmmoTemperatureVelocityShift); private _mv = _muzzleVelocity + _mvShift; - [_scopeBaseAngle,0,_boreHeight,_airFriction,_mv,_x,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,_forEachIndex,_useABConfig] call FUNC(calculateSolution); + [_scopeBaseAngle,_boreHeight,_airFriction,_mv,_x,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),100,4,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,_forEachIndex,_useABConfig] call FUNC(calculateRangeCard); } forEach [-15, -5, 5, 10, 15, 20, 25, 30, 35]; } else { - [_scopeBaseAngle,0,_boreHeight,_airFriction,_muzzleVelocity,15,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),1000,[4,0],3,0,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,true,1.5,1,46,23,4,_useABConfig] call FUNC(calculateSolution); + [_scopeBaseAngle,_boreHeight,_airFriction,_muzzleVelocity,15,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),100,4,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,4,_useABConfig] call FUNC(calculateRangeCard); }; for "_i" from 0 to 9 do { From 9fdf3ceb009f4a571830be2758975d56d34ee17f Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 13 Nov 2016 19:13:51 +0100 Subject: [PATCH 167/826] Refined the range card calculation abort conditions * Max. elevation now never exceeds 40 MRADs * Min. velocity now also depends bullet stability (e.g. lower for .408 CheyTac) --- .../rangecard/functions/fnc_calculateRangeCard.sqf | 12 +++++++----- addons/rangecard/functions/fnc_updateRangeCard.sqf | 7 ++++--- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/addons/rangecard/functions/fnc_calculateRangeCard.sqf b/addons/rangecard/functions/fnc_calculateRangeCard.sqf index 7edd865ddc..2cdcb391f5 100644 --- a/addons/rangecard/functions/fnc_calculateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_calculateRangeCard.sqf @@ -17,8 +17,9 @@ * 11: ballistic coefficient * 12: drag model * 13: atmosphere model - * 14: Range Card Slot - * 15: Use advanced ballistics config? + * 14: transonicStabilityCoef + * 15: Range Card Slot + * 16: Use advanced ballistics config? * * Return Value: * Nothing @@ -33,7 +34,7 @@ params [ "_scopeBaseAngle", "_boreHeight", "_airFriction", "_muzzleVelocity", "_temperature", "_barometricPressure", "_relativeHumidity", "_simSteps", "_windSpeed", "_targetSpeed", "_targetRange", "_bc", "_dragModel", "_atmosphereModel", - "_rangeCardSlot", "_useABConfig" + "_transonicStabilityCoef", "_rangeCardSlot", "_useABConfig" ]; GVAR(rangeCardDataMVs) set [_rangeCardSlot, format[" %1", round(_muzzleVelocity)]]; @@ -96,8 +97,7 @@ while {_TOF < 6 && (_bulletPos select 1) < _targetRange} do { _stepsTotal = _stepsTotal + 1; _speedAverage = (_speedTotal / _stepsTotal); - if (_speedAverage > 450 && _bulletSpeed < _speedOfSound) exitWith {}; - if (atan((_bulletPos select 2) / (abs(_bulletPos select 1) + 1)) < -2.254) exitWith {}; + if (_transonicStabilityCoef < 1.0 && _speedAverage > 450 && _bulletSpeed < _speedOfSound) exitWith {}; _trueVelocity = _bulletVelocity vectorDiff [-_windSpeed, 0, 0]; _trueSpeed = vectorMagnitude _trueVelocity; @@ -115,6 +115,8 @@ while {_TOF < 6 && (_bulletPos select 1) < _targetRange} do { _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); _bulletVelocity = _bulletVelocity vectorAdd (_bulletAccel vectorMultiply _deltaT); _bulletPos = _bulletPos vectorAdd (_bulletVelocity vectorMultiply (_deltaT * 0.5)); + + if (atan((_bulletPos select 2) / (abs(_bulletPos select 1) + 1)) < -2.254) exitWith {}; _TOF = _TOF + _deltaT; diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf index 41234376fc..23a63641c5 100644 --- a/addons/rangecard/functions/fnc_updateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf @@ -21,7 +21,7 @@ disableSerialization; #define __dsp (uiNamespace getVariable "RangleCard_Display") -private ["_airFriction", "_ammoConfig", "_atmosphereModel", "_barrelLength", "_barrelTwist", "_bc", "_boreHeight", "_cacheEntry", "_column", "_control", "_dragModel", "_i", "_muzzleVelocity", "_offset", "_row", "_weaponConfig", "_initSpeed", "_initSpeedCoef"]; +private ["_airFriction", "_ammoConfig", "_atmosphereModel", "_transonicStabilityCoef", "_barrelLength", "_barrelTwist", "_bc", "_boreHeight", "_cacheEntry", "_column", "_control", "_dragModel", "_i", "_muzzleVelocity", "_offset", "_row", "_weaponConfig", "_initSpeed", "_initSpeedCoef"]; params ["_zeroRange", "_ammoClass", "_magazineClass", "_weaponClass"]; @@ -103,6 +103,7 @@ _bc = 0; if (count (_ammoConfig select 6) > 0) then { _bc = (_ammoConfig select 6) select 0; }; +_transonicStabilityCoef = _ammoConfig select 4; _dragModel = _ammoConfig select 5; _atmosphereModel = _ammoConfig select 8; _boreHeight = 3.81; @@ -170,10 +171,10 @@ if (isNil {_cacheEntry}) then { private _mvShift = [_ammoConfig select 9, _x] call EFUNC(advanced_ballistics,calculateAmmoTemperatureVelocityShift); private _mv = _muzzleVelocity + _mvShift; - [_scopeBaseAngle,_boreHeight,_airFriction,_mv,_x,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),100,4,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,_forEachIndex,_useABConfig] call FUNC(calculateRangeCard); + [_scopeBaseAngle,_boreHeight,_airFriction,_mv,_x,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),100,4,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,_transonicStabilityCoef,_forEachIndex,_useABConfig] call FUNC(calculateRangeCard); } forEach [-15, -5, 5, 10, 15, 20, 25, 30, 35]; } else { - [_scopeBaseAngle,_boreHeight,_airFriction,_muzzleVelocity,15,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),100,4,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,4,_useABConfig] call FUNC(calculateRangeCard); + [_scopeBaseAngle,_boreHeight,_airFriction,_muzzleVelocity,15,EGVAR(scopes,zeroReferenceBarometricPressure),EGVAR(scopes,zeroReferenceHumidity),100,4,1,GVAR(rangeCardEndRange),_bc,_dragModel,_atmosphereModel,_transonicStabilityCoef,4,_useABConfig] call FUNC(calculateRangeCard); }; for "_i" from 0 to 9 do { From 4854b963db372716d6a23ea29b100846a9c10c6c Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Tue, 8 Mar 2016 00:17:46 -0300 Subject: [PATCH 168/826] Apply a correction to the FCS based on vanilla zeroing --- addons/fcs/functions/fnc_firedEH.sqf | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index 4c9b7d8b85..bf4c7a9e43 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -30,6 +30,27 @@ private _offset = 0; }; } forEach _FCSMagazines; +// Calculate the correction due to vanilla zeroing +private _zeroDistance = currentZeroing _gunner; +if (_zeroDistance > 0) then { + private _weaponCombo = [_weapon, _magazine, _ammo, _zeroDistance]; + if !(_weaponCombo isEqualTo (_gunner getVariable [QGVAR(lastWeaponCombo), []])) then { + // Hackish way of getting initSpeed. @todo: replace it by correct calculation and caching + private _initSpeed = vectorMagnitude velocity _projectile; + + private _airFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction"); + private _antiOffset = "ace_fcs" callExtension format ["%1,%2,%3,%4", _initSpeed, _airFriction, 0, _zeroDistance]; + _antiOffset = parseNumber _antiOffset; + + _gunner setVariable [QGVAR(lastWeaponCombo), _weaponCombo]; + _gunner setVariable [QGVAR(lastAntiOffset), _antiOffset]; + }; + private _antiOffset = _gunner getVariable QGVAR(lastAntiOffset); + + _offset = _offset - _antiOffset; + TRACE_4("fired",_gunner, currentZeroing _gunner, _antiOffset, _offset); +}; + [_projectile, (_vehicle getVariable format ["%1_%2", QGVAR(Azimuth), _turret]), _offset, 0] call EFUNC(common,changeProjectileDirection); // Remove the platform velocity From 9641d306e6917d2646f11225f8bba95e93ac1fbe Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 10 Nov 2016 16:43:01 +0100 Subject: [PATCH 169/826] Reused already calculated initSpeed --- addons/fcs/functions/fnc_calculateSolution.sqf | 3 +++ addons/fcs/functions/fnc_firedEH.sqf | 9 ++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/addons/fcs/functions/fnc_calculateSolution.sqf b/addons/fcs/functions/fnc_calculateSolution.sqf index 61bfbd8c58..41cbfa5069 100644 --- a/addons/fcs/functions/fnc_calculateSolution.sqf +++ b/addons/fcs/functions/fnc_calculateSolution.sqf @@ -17,6 +17,7 @@ params ["_vehicle","_turret","_distance","_angleTarget"]; TRACE_4("params",_vehicle,_turret,_distance,_angleTarget); +private _FCSInitSpeed = []; private _FCSMagazines = []; private _FCSElevation = []; private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret] call EFUNC(common,getTurretConfigPath); @@ -64,6 +65,7 @@ private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret private _offset = "ace_fcs" callExtension format ["%1,%2,%3,%4", _initSpeed, _airFriction, _angleTarget, _distance]; _offset = parseNumber _offset; + _FCSInitSpeed pushBack _initSpeed; _FCSMagazines pushBack _magazine; _FCSElevation pushBack _offset; }; @@ -71,5 +73,6 @@ private _turretConfig = [configFile >> "CfgVehicles" >> typeOf _vehicle, _turret } count (_vehicle magazinesTurret _turret); [_vehicle, format ["%1_%2", QGVAR(Distance), _turret], _distance] call EFUNC(common,setVariablePublic); +[_vehicle, format ["%1_%2", QGVAR(InitSpeed), _turret], _FCSInitSpeed] call EFUNC(common,setVariablePublic); [_vehicle, format ["%1_%2", QGVAR(Magazines), _turret], _FCSMagazines] call EFUNC(common,setVariablePublic); [_vehicle, format ["%1_%2", QGVAR(Elevation), _turret], _FCSElevation] call EFUNC(common,setVariablePublic); diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index bf4c7a9e43..1fbc16116e 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -19,14 +19,16 @@ private _FCSMagazines = _vehicle getVariable [format ["%1_%2", QGVAR(Magazines), if !(_magazine in _FCSMagazines) exitWith {}; +private _FCSInitSpeed = _vehicle getVariable format ["%1_%2", QGVAR(InitSpeed), _turret]; private _FCSElevation = _vehicle getVariable format ["%1_%2", QGVAR(Elevation), _turret]; -// GET ELEVATION OFFSET OF CURRENT MAGAZINE +// GET ELEVATION OFFSET AND INITSPEED OF CURRENT MAGAZINE private _offset = 0; - +private _initSpeed = 0; { if (_x == _magazine) exitWith { _offset = _FCSElevation select _forEachIndex; + _initSpeed = _FCSInitSpeed select _forEachIndex; }; } forEach _FCSMagazines; @@ -35,9 +37,6 @@ private _zeroDistance = currentZeroing _gunner; if (_zeroDistance > 0) then { private _weaponCombo = [_weapon, _magazine, _ammo, _zeroDistance]; if !(_weaponCombo isEqualTo (_gunner getVariable [QGVAR(lastWeaponCombo), []])) then { - // Hackish way of getting initSpeed. @todo: replace it by correct calculation and caching - private _initSpeed = vectorMagnitude velocity _projectile; - private _airFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction"); private _antiOffset = "ace_fcs" callExtension format ["%1,%2,%3,%4", _initSpeed, _airFriction, 0, _zeroDistance]; _antiOffset = parseNumber _antiOffset; From 4df561e13af85bacf2b55b1c04020b69946d8bb0 Mon Sep 17 00:00:00 2001 From: esteldunedain Date: Tue, 8 Mar 2016 00:28:44 -0300 Subject: [PATCH 170/826] Fix airburst ammo when the ACE_FCS is not enabled (the code is not reached anyway) --- addons/fcs/functions/fnc_firedEH.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/fcs/functions/fnc_firedEH.sqf b/addons/fcs/functions/fnc_firedEH.sqf index 1fbc16116e..dbfebae025 100644 --- a/addons/fcs/functions/fnc_firedEH.sqf +++ b/addons/fcs/functions/fnc_firedEH.sqf @@ -64,7 +64,7 @@ if (vectorMagnitude velocity _vehicle > 2) then { if (!local _gunner) exitWith {}; if (getNumber (configFile >> "CfgAmmo" >> _ammo >> QGVAR(Airburst)) == 1) then { - private _zeroing = _vehicle getVariable [format ["%1_%2", QGVAR(Distance), _turret], currentZeroing _vehicle]; + private _zeroing = _vehicle getVariable [format ["%1_%2", QGVAR(Distance), _turret], currentZeroing _gunner]; if (_zeroing < 50) exitWith {}; if (_zeroing > 1500) exitWith {}; From 73b940d3bf2f7a26894625d4650936ef2ddc629a Mon Sep 17 00:00:00 2001 From: ace3mod Date: Tue, 15 Nov 2016 23:12:22 +0100 Subject: [PATCH 171/826] [Docs] Update component dependencies Automatically committed through Travis CI. [ci skip] --- docs/_includes/dependencies_list.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_includes/dependencies_list.md b/docs/_includes/dependencies_list.md index 4a3a43fab5..5bedd8cd88 100644 --- a/docs/_includes/dependencies_list.md +++ b/docs/_includes/dependencies_list.md @@ -23,7 +23,7 @@ {% endif %} {% if include.component == "atragmx" %} -`ACE_common`, `ACE_weather` +`ACE_Advanced_Ballistics`, `ACE_common`, `ACE_weather` {% endif %} {% if include.component == "attach" %} @@ -291,7 +291,7 @@ {% endif %} {% if include.component == "rangecard" %} -`ACE_Advanced_Ballistics` +`ACE_Advanced_Ballistics`, `ace_scopes` {% endif %} {% if include.component == "realisticnames" %} From ba097e719fd8694ae2f992c1305da75351358ac6 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 16 Nov 2016 10:49:48 +0100 Subject: [PATCH 173/826] Ballistics - AmmoBox update (Apex magazines) (#4675) * Added 20Rnd 6.5mm Lapua Scenar / Creedmor magazines --- addons/ballistics/CfgVehicles.hpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index 7a4dd477d3..c6a40301f2 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -13,7 +13,9 @@ class CfgVehicles { class NATO_Box_Base; class Box_NATO_Wps_F: NATO_Box_Base { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); }; }; @@ -35,7 +37,9 @@ class CfgVehicles { class Box_NATO_Ammo_F: NATO_Box_Base { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4); @@ -79,7 +83,9 @@ class CfgVehicles { class ReammoBox_F; class B_supplyCrate_F: ReammoBox_F { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4); @@ -95,7 +101,9 @@ class CfgVehicles { class EAST_Box_Base; class Box_East_Wps_F: EAST_Box_Base { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; @@ -105,7 +113,9 @@ class CfgVehicles { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,1); MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; @@ -113,7 +123,9 @@ class CfgVehicles { class Box_East_Ammo_F: EAST_Box_Base { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; @@ -121,7 +133,9 @@ class CfgVehicles { class Box_East_Support_F: EAST_Box_Base { class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,6); + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; @@ -185,7 +199,9 @@ class CfgVehicles { class C_supplyCrate_F: ReammoBox_F { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); }; }; @@ -220,7 +236,9 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_100Rnd_65x39_caseless_mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_200Rnd_65x39_cased_Box_Tracer_Dim,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); From db3b5d924cc29efdfab6b0a37e79d2c55a940ff5 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 16 Nov 2016 11:20:07 +0100 Subject: [PATCH 174/826] Scopes - Updated wiki framework (#4680) * Update scopes-framework.md Documented the changes to the scopes framework in this pull request: https://github.com/acemod/ACE3/pull/4642 * Clarified the bore height component descriptions --- docs/wiki/framework/scopes-framework.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/wiki/framework/scopes-framework.md b/docs/wiki/framework/scopes-framework.md index b15fc70e58..067ebaa541 100644 --- a/docs/wiki/framework/scopes-framework.md +++ b/docs/wiki/framework/scopes-framework.md @@ -19,6 +19,8 @@ class CfgWeapons { class InventoryOpticsItem_Base_F; // ItemInfo base class class YourScope { + ace_scopeZeroRange = 100; // Overwrites the ace_setting default zero range + ace_scopeHeightAboveRail = 3.8; // Distance between center of scope and rail in centimeters ace_scopeAdjust_vertical[] = {-4, 30}; // Maxmimum vertical adjustment limits ace_scopeAdjust_horizontal[] = {-6, 6}; // Maximum horizontal adjustment limits ace_scopeAdjust_verticalIncrement = 0.1; // Vertical increment @@ -32,5 +34,11 @@ class CfgWeapons { }; }; }; + + class YourWeapon { + ace_railHeightAboveBore = 1.8; // Distance between center of bore and rail in centimeters + }; }; ``` + +All scope config entries can also be applied directly to the weapon class, in case the weapon comes with an integrated scope. From 6fd561f1f07084ddd7f3574ea2ac2d2a94072a0e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 16 Nov 2016 11:00:50 -0600 Subject: [PATCH 175/826] Change mortar to ammo handling weapon on init (#4678) Fix #4649 --- addons/mk6mortar/XEH_postInit.sqf | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/addons/mk6mortar/XEH_postInit.sqf b/addons/mk6mortar/XEH_postInit.sqf index aceb721d70..e3169b6dba 100644 --- a/addons/mk6mortar/XEH_postInit.sqf +++ b/addons/mk6mortar/XEH_postInit.sqf @@ -17,7 +17,25 @@ ["ace_initMortar", {_this call FUNC(mortarInit);}] call CBA_fnc_addEventHandler; -if (!hasInterface) exitWith {}; +if (hasInterface) then { + ["ace_infoDisplayChanged", FUNC(turretDisplayLoaded)] call CBA_fnc_addEventHandler; +}; -["vehicle", FUNC(handlePlayerVehicleChanged)] call CBA_fnc_addPlayerEventHandler; -["ace_infoDisplayChanged", FUNC(turretDisplayLoaded)] call CBA_fnc_addEventHandler; +["ace_settingsInitialized", { + TRACE_1("ace_settingsInitialized",GVAR(useAmmoHandling)); + + ["vehicle", FUNC(handlePlayerVehicleChanged), true] call CBA_fnc_addPlayerEventHandler; + + if (GVAR(useAmmoHandling)) then { + ["Mortar_01_base_F", "init", { + TRACE_2("mortar init",_this,(_this select 0) turretLocal [0]); + + //wait for proper turret locality change + [{ + TRACE_2("after delay",_this,(_this select 0) turretLocal [0]); + ["ace_initMortar", _this] call CBA_fnc_localEvent; + }, _this, 0.5] call CBA_fnc_waitAndExecute; + + }, true, [], true] call CBA_fnc_addClassEventHandler; + }; +}] call CBA_fnc_addEventHandler; From da85fc1be5f2d3b1222a77869b3d7c9daefd2e4b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 16 Nov 2016 17:42:11 -0600 Subject: [PATCH 176/826] Add RHS MELB fastrope, add 3d debuging of mem points Close #4683 Config from @Whigital --- addons/fastroping/XEH_postInit.sqf | 21 +++++++++++++++++++++ addons/fastroping/script_component.hpp | 1 + optionals/compat_rhs_usf3/CfgVehicles.hpp | 9 +++++++++ optionals/compat_rhs_usf3/config.cpp | 2 +- 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/addons/fastroping/XEH_postInit.sqf b/addons/fastroping/XEH_postInit.sqf index 2752e2dcde..1efb204247 100644 --- a/addons/fastroping/XEH_postInit.sqf +++ b/addons/fastroping/XEH_postInit.sqf @@ -16,3 +16,24 @@ false }; }, {false}] call CBA_fnc_addKeybind; + + + +#ifdef DRAW_FASTROPE_INFO +addMissionEventHandler ["Draw3D", { + if (!(cursorObject isKindOf "Helicopter")) exitWith {}; + private _config = configFile >> "CfgVehicles" >> (typeOf cursorObject); + private _enabled = getNumber (_config >> QGVAR(enabled)); + drawIcon3D ["", [.5,.5,1,1], (ASLtoAGL getPosASL cursorObject), 0.5, 0.5, 0, format ["%1 = %2", typeOf cursorObject, _enabled], 0.5, 0.025, "TahomaB"]; + if (_enabled > 0) then { + { + private _hookAttachment = cursorObject getVariable [QGVAR(FRIES), cursorObject]; + private _ropeOrigin = if (_x isEqualType []) then {_x} else {_hookAttachment selectionPosition _x}; + drawIcon3D ["", [1,.5,.5,1], (_hookAttachment modelToWorld _ropeOrigin), 0.5, 0.5, 0, format ["Rope: %1", _forEachIndex], 0.5, 0.025, "TahomaB"]; + } forEach (getArray (_config >> QGVAR(ropeOrigins))); + }; + if (_enabled == 2) then { + drawIcon3D ["", [.5,1,.5,1], (cursorObject modelToWorld getArray (_config >> QGVAR(friesAttachmentPoint))), 0.5, 0.5, 0, format ["Fries: %1", getText (_config >> QGVAR(friesType))], 0.5, 0.025, "TahomaB"]; + }; +}]; +#endif diff --git a/addons/fastroping/script_component.hpp b/addons/fastroping/script_component.hpp index 323d1c801c..19bdd1a109 100644 --- a/addons/fastroping/script_component.hpp +++ b/addons/fastroping/script_component.hpp @@ -2,6 +2,7 @@ #define COMPONENT_BEAUTIFIED Fastroping #include "\z\ace\addons\main\script_mod.hpp" +// #define DRAW_FASTROPE_INFO // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp index 9e9cc99c2a..18b5a77e3e 100644 --- a/optionals/compat_rhs_usf3/CfgVehicles.hpp +++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp @@ -196,6 +196,15 @@ class CfgVehicles { class Eventhandlers; }; class Heli_Transport_01_base_F: Helicopter_Base_H {}; + + class RHS_MELB_base: Helicopter_Base_H {}; + class RHS_MELB_MH6M: RHS_MELB_base { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {{1.166, 0.79, -0.01}, {-1.166, 0.79, -0.01}}; + }; + class RHS_UH60_Base: Heli_Transport_01_base_F { EGVAR(refuel,fuelCapacity) = 1360; }; diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp index baae11bc4a..5847a2ac40 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/optionals/compat_rhs_usf3/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_javelin", "ace_rearm", "ace_refuel", "ace_repair", "rhsusf_c_weapons", "rhsusf_c_troops", "rhsusf_c_m1a1", "rhsusf_c_m1a2", "RHS_US_A2_AirImport", "rhsusf_c_m109", "rhsusf_c_HEMTT_A4", "rhsusf_c_hmmwv", "rhsusf_c_rg33", "rhsusf_c_fmtv", "rhsusf_c_m113", "RHS_US_A2Port_Armor"}; + requiredAddons[] = {"ace_javelin", "ace_rearm", "ace_refuel", "ace_repair", "rhsusf_c_weapons", "rhsusf_c_troops", "rhsusf_c_m1a1", "rhsusf_c_m1a2", "RHS_US_A2_AirImport", "rhsusf_c_m109", "rhsusf_c_HEMTT_A4", "rhsusf_c_hmmwv", "rhsusf_c_rg33", "rhsusf_c_fmtv", "rhsusf_c_m113", "RHS_US_A2Port_Armor", "rhsusf_c_melb"}; author = ECSTRING(common,ACETeam); authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut"}; url = ECSTRING(main,URL); From e67c9512bab4686b646375d03b20ad2b15d17114 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 16 Nov 2016 17:53:04 -0600 Subject: [PATCH 177/826] Remove unneeded functions --- optionals/compat_rhs_usf3/CfgVehicles.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp index 18b5a77e3e..c6f683cb29 100644 --- a/optionals/compat_rhs_usf3/CfgVehicles.hpp +++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp @@ -200,8 +200,6 @@ class CfgVehicles { class RHS_MELB_base: Helicopter_Base_H {}; class RHS_MELB_MH6M: RHS_MELB_base { EGVAR(fastroping,enabled) = 1; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); EGVAR(fastroping,ropeOrigins)[] = {{1.166, 0.79, -0.01}, {-1.166, 0.79, -0.01}}; }; From 5f7f26ef181725a7daba5a40be43c9aa768868e1 Mon Sep 17 00:00:00 2001 From: ace3mod Date: Thu, 17 Nov 2016 08:12:16 +0100 Subject: [PATCH 178/826] [Docs] Update component dependencies Automatically committed through Travis CI. [ci skip] --- docs/_includes/dependencies_list.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_includes/dependencies_list.md b/docs/_includes/dependencies_list.md index 5bedd8cd88..6e985eea0a 100644 --- a/docs/_includes/dependencies_list.md +++ b/docs/_includes/dependencies_list.md @@ -451,7 +451,7 @@ {% endif %} {% if include.component == "compat_rhs_usf3" %} -`ace_javelin`, `ace_rearm`, `ace_refuel`, `ace_repair`, `rhsusf_c_weapons`, `rhsusf_c_troops`, `rhsusf_c_m1a1`, `rhsusf_c_m1a2`, `RHS_US_A2_AirImport`, `rhsusf_c_m109`, `rhsusf_c_HEMTT_A4`, `rhsusf_c_hmmwv`, `rhsusf_c_rg33`, `rhsusf_c_fmtv`, `rhsusf_c_m113`, `RHS_US_A2Port_Armor` +`ace_javelin`, `ace_rearm`, `ace_refuel`, `ace_repair`, `rhsusf_c_weapons`, `rhsusf_c_troops`, `rhsusf_c_m1a1`, `rhsusf_c_m1a2`, `RHS_US_A2_AirImport`, `rhsusf_c_m109`, `rhsusf_c_HEMTT_A4`, `rhsusf_c_hmmwv`, `rhsusf_c_rg33`, `rhsusf_c_fmtv`, `rhsusf_c_m113`, `RHS_US_A2Port_Armor`, `rhsusf_c_melb` {% endif %} {% if include.component == "compat_rksl_pm_ii" %} From c756537d3d21cc3622e82f7db19a2dd7e5af1b06 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 10 Nov 2016 18:35:57 +0100 Subject: [PATCH 179/826] ATragMX - Estimate bullet length instead of using a fixed value (#4651) --- addons/atragmx/functions/fnc_calculate_target_solution.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 8bd844938f..efb92ebaf1 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -52,7 +52,7 @@ if (!GVAR(atmosphereModeTBH)) then { }; private ["_bulletLength", "_stabilityFactor"]; -_bulletLength = 45.72; +_bulletLength = 50 * _bulletMass / ((_bulletDiameter/2)^2); _stabilityFactor = 1.5; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { if (_bulletDiameter > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { From 47e1444747d69574843c506f519b6f8ec0809d81 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 5 Nov 2016 14:20:48 +0000 Subject: [PATCH 180/826] Fix #4630 Not all explosives detonate on destruction, so their ammo config must be checked to see if they will. ACE_Explosives adds a property to define the associated ammo which *will* detonate on destruction, which is used if present. Otherwise a generic small explosion happens. --- .../functions/fnc_detonateAmmunition.sqf | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/addons/cookoff/functions/fnc_detonateAmmunition.sqf b/addons/cookoff/functions/fnc_detonateAmmunition.sqf index 211e359bb3..5a29bf4f8a 100644 --- a/addons/cookoff/functions/fnc_detonateAmmunition.sqf +++ b/addons/cookoff/functions/fnc_detonateAmmunition.sqf @@ -33,15 +33,16 @@ if (_amountOfMagazines > 0) exitWith { } else { _magazine set [1, _newMagCount]; // clear out the magazine }; - private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClassname >> "ammo"); - private _timeBetweenAmmoDetonation = (random 7) * (1 / random (_amountOfMagazines)) min MAX_TIME_BETWEEN_AMMO_DET; _timeBetweenAmmoDetonation = _timeBetweenAmmoDetonation max 0.1; + private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClassname >> "ammo"); + private _ammoCfg = (configFile >> "CfgAmmo" >> _ammo); + private _speedOfAmmo = getNumber (configFile >> "CfgMagazines" >> _magazineClassname >> "initSpeed"); - private _simulationTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "simulation"); - private _caliber = getNumber (configFile >> "CfgAmmo" >> _ammo >> "caliber"); - private _simType = getText (configFile >> "CfgAmmo" >> _ammo >> "simulation"); + private _simulationTime = getNumber (_ammoCfg >> "simulation"); + private _caliber = getNumber (_ammoCfg >> "caliber"); + private _simType = getText (_ammoCfg >> "simulation"); private _effect2pos = _vehicle selectionPosition "destructionEffect2"; @@ -91,7 +92,7 @@ if (_amountOfMagazines > 0) exitWith { }; [_vehicle, _ammo, _speed, random 1 < 0.5] call _spawnProjectile; }; - if (toLower _simType == "shotrocket" || {toLower _simType == "shotmissile"}) then { + if (toLower _simType in ["shotrocket", "shotmissile", "shotsubmunitions"]) then { if (random 1 < 0.1) then { private _sound = selectRandom [QUOTE(PATHTO_R(sounds\cannon_crack_close.wss)), QUOTE(PATHTO_R(sounds\cannon_crack_close_filtered.wss))]; playSound3D [_sound, objNull, false, (getPosASL _vehicle), 3, 1, 1600]; @@ -101,9 +102,25 @@ if (_amountOfMagazines > 0) exitWith { "ACE_ammoExplosionLarge" createvehicle (_vehicle modelToWorld _effect2pos); }; }; - if (toLower _simType in ["shotdirectionalbomb", "shotilluminating", "shotmine"]) then { + if (toLower _simType in ["shotdirectionalbomb", "shotmine"]) then { if (random 1 < 0.5) then { - [_vehicle, _ammo, 0, false] call _spawnProjectile; + // 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 { + "SmallSecondary" createvehicle (_vehicle modelToWorld _effect2pos); + }; + }; + }; + if (toLower _simType == "shotilluminating") then { + if (random 1 < 0.15) then { + [_vehicle, _ammo, _speed, random 1 < 0.3] call _spawnProjectile; }; }; From 5976415b0d4893798af02b15a8b77c5addc4a36d Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sat, 5 Nov 2016 14:48:48 +0000 Subject: [PATCH 181/826] Add cook off 3den setting to ammo boxes --- addons/cookoff/CfgEden.hpp | 2 +- addons/cookoff/XEH_postInit.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/cookoff/CfgEden.hpp b/addons/cookoff/CfgEden.hpp index 1cc406463f..55e9b6d8b8 100644 --- a/addons/cookoff/CfgEden.hpp +++ b/addons/cookoff/CfgEden.hpp @@ -11,7 +11,7 @@ class Cfg3DEN { tooltip = CSTRING(enable_tooltip); expression = QUOTE(if !(_value) then {_this setVariable [ARR_3('%s',_value,true)];};); typeName = "BOOL"; - condition = "objectVehicle"; + condition = "objectVehicle + objectHasInventoryCargo"; defaultValue = "(true)"; // fix pbo project preprocessing bug }; }; diff --git a/addons/cookoff/XEH_postInit.sqf b/addons/cookoff/XEH_postInit.sqf index fe98faa2be..4e65bf8886 100644 --- a/addons/cookoff/XEH_postInit.sqf +++ b/addons/cookoff/XEH_postInit.sqf @@ -71,7 +71,7 @@ GVAR(cacheTankDuplicates) = call CBA_fnc_createNamespace; ["ReammoBox_F", "init", { (_this select 0) addEventHandler ["HandleDamage", { - if (GVAR(enableAmmobox)) then { + if ((_this select 0) getVariable [QGVAR(enable), GVAR(enableAmmobox)]) then { ["box", _this] call FUNC(handleDamage); }; }]; From 27cc4ed7c0a136fc0b49b64993d11f0d8fcaa637 Mon Sep 17 00:00:00 2001 From: SilentSpike Date: Sun, 6 Nov 2016 12:24:00 +0000 Subject: [PATCH 182/826] Clean some cook off code - Use unary `createVehicle` syntax - Removed some parenthesis - Simpify 3den property condition --- addons/cookoff/CfgEden.hpp | 2 +- addons/cookoff/functions/fnc_detonateAmmunition.sqf | 10 +++++----- addons/cookoff/functions/fnc_secondaryExplosions.sqf | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/cookoff/CfgEden.hpp b/addons/cookoff/CfgEden.hpp index 55e9b6d8b8..aa550a9228 100644 --- a/addons/cookoff/CfgEden.hpp +++ b/addons/cookoff/CfgEden.hpp @@ -11,7 +11,7 @@ class Cfg3DEN { tooltip = CSTRING(enable_tooltip); expression = QUOTE(if !(_value) then {_this setVariable [ARR_3('%s',_value,true)];};); typeName = "BOOL"; - condition = "objectVehicle + objectHasInventoryCargo"; + condition = "objectHasInventoryCargo"; defaultValue = "(true)"; // fix pbo project preprocessing bug }; }; diff --git a/addons/cookoff/functions/fnc_detonateAmmunition.sqf b/addons/cookoff/functions/fnc_detonateAmmunition.sqf index 5a29bf4f8a..d7d7114e7d 100644 --- a/addons/cookoff/functions/fnc_detonateAmmunition.sqf +++ b/addons/cookoff/functions/fnc_detonateAmmunition.sqf @@ -37,7 +37,7 @@ if (_amountOfMagazines > 0) exitWith { _timeBetweenAmmoDetonation = _timeBetweenAmmoDetonation max 0.1; private _ammo = getText (configFile >> "CfgMagazines" >> _magazineClassname >> "ammo"); - private _ammoCfg = (configFile >> "CfgAmmo" >> _ammo); + private _ammoCfg = configFile >> "CfgAmmo" >> _ammo; private _speedOfAmmo = getNumber (configFile >> "CfgMagazines" >> _magazineClassname >> "initSpeed"); private _simulationTime = getNumber (_ammoCfg >> "simulation"); @@ -53,8 +53,8 @@ if (_amountOfMagazines > 0) exitWith { if (_spawnPos select 2 < 0) then { _spawnPos set [2, 0]; }; - private _projectile = _ammo createVehicle [0,0,0]; - _projectile setPos _spawnPos; + + 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; @@ -99,7 +99,7 @@ if (_amountOfMagazines > 0) exitWith { [_vehicle, _ammo, _speed, random 1 < 0.3] call _spawnProjectile; } else { - "ACE_ammoExplosionLarge" createvehicle (_vehicle modelToWorld _effect2pos); + createvehicle ["ACE_ammoExplosionLarge", (_vehicle modelToWorld _effect2pos), [], 0 , "CAN_COLLIDE"]; }; }; if (toLower _simType in ["shotdirectionalbomb", "shotmine"]) then { @@ -114,7 +114,7 @@ if (_amountOfMagazines > 0) exitWith { if (_ammo != "") then { [_vehicle, _ammo, 0, false] call _spawnProjectile; } else { - "SmallSecondary" createvehicle (_vehicle modelToWorld _effect2pos); + createvehicle ["SmallSecondary", (_vehicle modelToWorld _effect2pos), [], 0 , "CAN_COLLIDE"]; }; }; }; diff --git a/addons/cookoff/functions/fnc_secondaryExplosions.sqf b/addons/cookoff/functions/fnc_secondaryExplosions.sqf index 01a2fa3b3f..34a1d28ea8 100644 --- a/addons/cookoff/functions/fnc_secondaryExplosions.sqf +++ b/addons/cookoff/functions/fnc_secondaryExplosions.sqf @@ -44,7 +44,7 @@ private _fnc_secondaryExplosion = { private _position = _vehicle modelToWorld (_vehicle selectionPosition "destructionEffect2"); // these CfgAmmo objects are always global - "SmallSecondary" createVehicle _position; + createVehicle ["SmallSecondary", _position, [], 0, "CAN_COLLIDE"]; DEC(_amount); From 1f6ce7ff813ad771322840c65ffbe9ad65affaba Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 12 Nov 2016 15:46:29 -0600 Subject: [PATCH 183/826] Fix tagTestingThread error (#4662) Close #4659 --- addons/tagging/functions/fnc_tagTestingThread.sqf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/tagging/functions/fnc_tagTestingThread.sqf b/addons/tagging/functions/fnc_tagTestingThread.sqf index ead21f8d91..a21cf69f2b 100644 --- a/addons/tagging/functions/fnc_tagTestingThread.sqf +++ b/addons/tagging/functions/fnc_tagTestingThread.sqf @@ -27,12 +27,13 @@ GVAR(tagsToTest) = GVAR(tagsToTest) select { private _intersections = lineIntersectsSurfaces [_tagPosASL, _endPosASL, _tag, objNull, true, 1, "GEOM", "FIRE"]; // If there's no intersections - if (_intersections isEqualTo []) exitWith { + if (_intersections isEqualTo []) then { TRACE_1("No intersections, deleting:",_tag); deleteVehicle _tag; false + } else { + true }; - true }; // If there's no more tag From e73d20f3c3cf88726e1441fb6f814d0a2199a1eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brostr=C3=B6m=2EA=20=7C=20Evul?= Date: Sat, 12 Nov 2016 23:19:50 +0100 Subject: [PATCH 184/826] ACE_Chemlight_Shield not public (#4612) Changed `ACE_Chemlight_Shield` to `public` from `protected` --- addons/chemlights/CfgWeapons.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/chemlights/CfgWeapons.hpp b/addons/chemlights/CfgWeapons.hpp index de5fc8aea5..c182ded34b 100644 --- a/addons/chemlights/CfgWeapons.hpp +++ b/addons/chemlights/CfgWeapons.hpp @@ -44,7 +44,7 @@ class CfgWeapons { descriptionShort = CSTRING(Shield_Empty_DescriptionShort); model = "\A3\weapons_F\ammo\mag_univ.p3d"; picture = QPATHTOF(UI\ace_chemlight_shield_x_ca.paa); - scope = 1; + scope = 2; class ItemInfo: InventoryItem_Base_F { mass = 1; }; From c2e933355dbd7027f2f877f561571233e7fa5501 Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 2 Nov 2016 18:44:39 +0100 Subject: [PATCH 185/826] Prevent switching to weapon while carrying fuel nozzle - fix #4601 --- addons/refuel/XEH_PREP.hpp | 1 + addons/refuel/XEH_postInit.sqf | 1 + .../fnc_handlePlayerWeaponChanged.sqf | 29 +++++++++++++++++++ .../functions/fnc_maxDistanceDropNozzle.sqf | 4 +++ 4 files changed, 35 insertions(+) create mode 100644 addons/refuel/functions/fnc_handlePlayerWeaponChanged.sqf diff --git a/addons/refuel/XEH_PREP.hpp b/addons/refuel/XEH_PREP.hpp index 806d861a69..282b008fca 100644 --- a/addons/refuel/XEH_PREP.hpp +++ b/addons/refuel/XEH_PREP.hpp @@ -14,6 +14,7 @@ PREP(dropNozzle); PREP(getFuel); PREP(handleDisconnect); PREP(handleKilled); +PREP(handlePlayerWeaponChanged); PREP(handleUnconscious); PREP(makeJerryCan); PREP(maxDistanceDropNozzle); diff --git a/addons/refuel/XEH_postInit.sqf b/addons/refuel/XEH_postInit.sqf index 89a1f3dc45..f0fb928187 100644 --- a/addons/refuel/XEH_postInit.sqf +++ b/addons/refuel/XEH_postInit.sqf @@ -1,6 +1,7 @@ #include "script_component.hpp" ["ace_unconscious", {_this call FUNC(handleUnconscious)}] call CBA_fnc_addEventHandler; +["weapon", FUNC(handlePlayerWeaponChanged)] call CBA_fnc_addPlayerEventHandler; if (isServer) then { addMissionEventHandler ["HandleDisconnect", {_this call FUNC(handleDisconnect)}]; diff --git a/addons/refuel/functions/fnc_handlePlayerWeaponChanged.sqf b/addons/refuel/functions/fnc_handlePlayerWeaponChanged.sqf new file mode 100644 index 0000000000..57897aef89 --- /dev/null +++ b/addons/refuel/functions/fnc_handlePlayerWeaponChanged.sqf @@ -0,0 +1,29 @@ +/* + * Author: Jonpas + * Drops nozzle or jerry can when selecting a weapon. + * + * Arguments: + * 0: Unit + * 1: Weapon (unused) + * + * Return Value: + * None + * + * Example: + * [_unit, "gun"] call ace_refuel_fnc_handlePlayerWeaponChanged; + * + * Public: No +*/ +#include "script_component.hpp" + +params ["_unit"]; + +// Drop nozzle/jerry can when selecting a non-primary weapon +if (_unit getVariable [QGVAR(isRefueling), false]) then { + private _nozzle = _unit getVariable [QGVAR(nozzle), objNull]; + if !(isNull _nozzle) then { + [_unit, _nozzle] call FUNC(dropNozzle); + _unit setVariable [QGVAR(selectedWeaponOnRefuel), nil]; + [_unit, "forceWalk", "ACE_refuel", false] call EFUNC(common,statusEffect_set); + }; +}; diff --git a/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf index 90231a30f2..687af9e072 100644 --- a/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf +++ b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf @@ -33,6 +33,10 @@ if (_nozzle getVariable [QGVAR(jerryCan), false]) exitWith {}; ["_nozzle", (_args select 0) getVariable [QGVAR(nozzle), objNull], [objNull]] ]; + if (_unit getVariable [QGVAR(isRefueling), false]) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + }; + if (isNull _source || {_unit distance (_source modelToWorld _endPosOffset) > (REFUEL_HOSE_LENGTH - 2)} || {!alive _source}) exitWith { if !(isNull _nozzle) then { [_unit, _nozzle] call FUNC(dropNozzle); From ed061d66bad218b1d7b11d98a3e8ec6a9b3cfec7 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 12 Nov 2016 16:37:41 -0600 Subject: [PATCH 186/826] Invert logic for isRefueling --- addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf index 687af9e072..2a23b5eb99 100644 --- a/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf +++ b/addons/refuel/functions/fnc_maxDistanceDropNozzle.sqf @@ -33,7 +33,8 @@ if (_nozzle getVariable [QGVAR(jerryCan), false]) exitWith {}; ["_nozzle", (_args select 0) getVariable [QGVAR(nozzle), objNull], [objNull]] ]; - if (_unit getVariable [QGVAR(isRefueling), false]) exitWith { + if (!(_unit getVariable [QGVAR(isRefueling), false])) exitWith { + TRACE_1("player not isRefueling",_unit); [_pfID] call CBA_fnc_removePerFrameHandler; }; From fa36955ffbfd41b26c72b5661e6008e4a4fbedc9 Mon Sep 17 00:00:00 2001 From: Daniel Jupp Date: Sat, 12 Nov 2016 17:52:17 -0600 Subject: [PATCH 187/826] Fix cargo find nearest vehicle (#4592) * Inital Commit * read function call change added object to exclude to function call * Removed TODO comment --- addons/cargo/functions/fnc_canLoad.sqf | 2 +- addons/cargo/functions/fnc_canLoadItemIn.sqf | 5 +++ .../functions/fnc_findNearestVehicle.sqf | 32 +++++++++++-------- addons/cargo/functions/fnc_startLoadIn.sqf | 2 +- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/addons/cargo/functions/fnc_canLoad.sqf b/addons/cargo/functions/fnc_canLoad.sqf index f576ea3e79..e0fd172eef 100644 --- a/addons/cargo/functions/fnc_canLoad.sqf +++ b/addons/cargo/functions/fnc_canLoad.sqf @@ -21,7 +21,7 @@ TRACE_2("params",_player,_object); if (!([_player, _object, []] call EFUNC(common,canInteractWith))) exitWith {false}; -private _nearestVehicle = [_player] call FUNC(findNearestVehicle); +private _nearestVehicle = [_player, _object] call FUNC(findNearestVehicle); if (_nearestVehicle isKindOf "Cargo_Base_F" || isNull _nearestVehicle) then { { diff --git a/addons/cargo/functions/fnc_canLoadItemIn.sqf b/addons/cargo/functions/fnc_canLoadItemIn.sqf index e2bb1ecc4d..77a230108c 100644 --- a/addons/cargo/functions/fnc_canLoadItemIn.sqf +++ b/addons/cargo/functions/fnc_canLoadItemIn.sqf @@ -20,6 +20,11 @@ params [["_item", "", [objNull,""]], "_vehicle"]; if (speed _vehicle > 1 || {((getPos _vehicle) select 2) > 3}) exitWith {TRACE_1("vehicle not stable",_vehicle); false}; +if (_item isEqualType objNull && {{alive _x && {getText (configFile >> "CfgVehicles" >> typeOf _x >> "simulation") != "UAVPilot"}} count crew _item > 0}) exitWith { + TRACE_1("item is occupied",_item); + false +}; + private _itemSize = [_item] call FUNC(getSizeItem); private _validItem = false; if (_item isEqualType "") then { diff --git a/addons/cargo/functions/fnc_findNearestVehicle.sqf b/addons/cargo/functions/fnc_findNearestVehicle.sqf index 6d5b7ce1a8..7981782255 100644 --- a/addons/cargo/functions/fnc_findNearestVehicle.sqf +++ b/addons/cargo/functions/fnc_findNearestVehicle.sqf @@ -1,35 +1,41 @@ /* * Author: Glowbal - * Get nearest vehicle from unit, priority: Car-Air-Tank-Ship. + * Get nearest vehicle from unit that is not excluded, priority: Car-Air-Tank-Ship. * * Arguments: * 0: Unit + * 1: Object to exclude * * Return Value: * Vehicle in Distance * * Example: - * [unit] call ace_cargo_fnc_findNearestVehicle + * [unit, object] call ace_cargo_fnc_findNearestVehicle * * Public: No */ #include "script_component.hpp" -params ["_unit"]; +params ["_unit","_object"]; -private _loadCar = nearestObject [_unit, "car"]; -if (_unit distance _loadCar <= MAX_LOAD_DISTANCE) exitWith {_loadCar}; +private _loadCar = nearestObjects [_unit, ["car"], MAX_LOAD_DISTANCE]; +_loadCar deleteAt (_loadCar find _object); +if !(_loadCar isEqualTo []) exitWith {_loadCar select 0}; -private _loadHelicopter = nearestObject [_unit, "air"]; -if (_unit distance _loadHelicopter <= MAX_LOAD_DISTANCE) exitWith {_loadHelicopter}; +private _loadHelicopter = nearestObjects [_unit, ["air"], MAX_LOAD_DISTANCE]; +_loadHelicopter deleteAt (_loadHelicopter find _object); +if !(_loadHelicopter isEqualTo []) exitWith {_loadHelicopter select 0}; -private _loadTank = nearestObject [_unit, "tank"]; -if (_unit distance _loadTank <= MAX_LOAD_DISTANCE) exitWith {_loadTank}; +private _loadTank = nearestObjects [_unit, ["tank"], MAX_LOAD_DISTANCE]; +_loadTank deleteAt (_loadTank find _object); +if !(_loadTank isEqualTo []) exitWith {_loadTank select 0}; -private _loadShip = nearestObject [_unit, "ship"]; -if (_unit distance _loadShip <= MAX_LOAD_DISTANCE) exitWith {_loadShip}; +private _loadShip = nearestObjects [_unit, ["ship"], MAX_LOAD_DISTANCE]; +_loadShip deleteAt (_loadShip find _object);; +if !(_loadShip isEqualTo []) exitWith {_loadShip select 0}; -private _loadContainer = nearestObject [_unit,"Cargo_base_F"]; -if (_unit distance _loadContainer <= MAX_LOAD_DISTANCE) exitWith {_loadContainer}; +private _loadContainer = nearestObjects [_unit, ["Cargo_base_F"], MAX_LOAD_DISTANCE]; +_loadContainer deleteAt (_loadContainer find _object); +if !(_loadContainer isEqualTo []) exitWith {_loadContainer select 0}; objNull diff --git a/addons/cargo/functions/fnc_startLoadIn.sqf b/addons/cargo/functions/fnc_startLoadIn.sqf index 466471c375..8af411bddd 100644 --- a/addons/cargo/functions/fnc_startLoadIn.sqf +++ b/addons/cargo/functions/fnc_startLoadIn.sqf @@ -19,7 +19,7 @@ params ["_player", "_object"]; TRACE_2("params",_player,_object); -private _vehicle = [_player] call FUNC(findNearestVehicle); +private _vehicle = [_player, _object] call FUNC(findNearestVehicle); if ((isNull _vehicle) || {_vehicle isKindOf "Cargo_Base_F"}) then { { From 0909d5727e073542354c9666c146b1c48148a90e Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 12 Nov 2016 19:39:40 -0600 Subject: [PATCH 188/826] Don't compile action menu for playable logics (#4666) Fix #4664 --- addons/interact_menu/functions/fnc_compileMenu.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 78232af4e2..225ebc59b4 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -99,6 +99,11 @@ private _recurseFnc = { _actions }; +if ((getNumber (configFile >> "CfgVehicles" >> _objectType >> "isPlayableLogic")) == 1) exitWith { + TRACE_1("skipping playable logic",_objectType); + _namespace setVariable [_objectType, []]; +}; + private _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; TRACE_1("Building ACE_Actions",_objectType); From 8d9bd5005b3e6b4506b91db8a9305e43b5795ff8 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 10 Nov 2016 17:49:18 -0600 Subject: [PATCH 189/826] Hide advFatigue bar on map / spectator --- addons/advanced_fatigue/XEH_postInit.sqf | 9 +++++---- addons/advanced_fatigue/functions/fnc_mainLoop.sqf | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index d566e3b042..dd68a843c0 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -12,10 +12,11 @@ if (!hasInterface) exitWith {}; GVAR(ppeBlackout) ppEffectCommit 0.4; // - GVAR updating and initialization ----------------------------------------- - if !(isNull ACE_player) then { - [ACE_player, objNull] call FUNC(handlePlayerChanged); - }; - ["unit", FUNC(handlePlayerChanged)] call CBA_fnc_addPlayerEventHandler; + ["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; + ["visibleMap", { + private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; + _staminaBarContainer ctrlShow (!visibleMap); + }, true] call CBA_fnc_addPlayerEventHandler; // - Duty factors ------------------------------------------------------------- if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { diff --git a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf index f438d6ef08..ee8f33f5c7 100644 --- a/addons/advanced_fatigue/functions/fnc_mainLoop.sqf +++ b/addons/advanced_fatigue/functions/fnc_mainLoop.sqf @@ -11,6 +11,9 @@ #include "script_component.hpp" if (!alive ACE_player) exitWith { // Dead people don't breath, Will also handle null (Map intros) [FUNC(mainLoop), [], 1] call CBA_fnc_waitAndExecute; + private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; + _staminaBarContainer ctrlSetFade 1; + _staminaBarContainer ctrlCommit 1; }; private _currentWork = REE; From 948442fafb357e5a4601f79f45851e36c1d6ba1f Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 12 Nov 2016 15:51:44 -0600 Subject: [PATCH 190/826] Hide bar when mounted --- addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf index 2f865ac821..476fd23799 100644 --- a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf @@ -13,6 +13,11 @@ params ["_stamina"]; private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; +if ((vehicle ACE_player) != ACE_player) exitWith { // Hide when mounted + _staminaBarContainer ctrlSetFade 1; + _staminaBarContainer ctrlCommit 1; +}; + // - Size --------------------------------------------------------------------- // Shrink the container to cut off the image (other wise it would just get stretched) private _posAndSize = ctrlPosition _staminaBarContainer; From 054831f3705cfd42bd27d84a32cba7e66f5da827 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 13 Nov 2016 10:55:57 -0600 Subject: [PATCH 191/826] Use vehicle eh to hide bar --- addons/advanced_fatigue/XEH_postInit.sqf | 9 ++++++--- .../advanced_fatigue/functions/fnc_handleStaminaBar.sqf | 5 ----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index dd68a843c0..f64f0a5a81 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -13,10 +13,13 @@ if (!hasInterface) exitWith {}; // - GVAR updating and initialization ----------------------------------------- ["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; - ["visibleMap", { + + private _fnc_showStaminaBar = { private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; - _staminaBarContainer ctrlShow (!visibleMap); - }, true] call CBA_fnc_addPlayerEventHandler; + _staminaBarContainer ctrlShow ((!visibleMap) && {(vehicle ACE_player) == ACE_player}); + }; + ["visibleMap", _fnc_showStaminaBar, true] call CBA_fnc_addPlayerEventHandler; + ["vehicle", _fnc_showStaminaBar, true] call CBA_fnc_addPlayerEventHandler; // - Duty factors ------------------------------------------------------------- if (["ACE_Medical"] call EFUNC(common,isModLoaded)) then { diff --git a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf index 476fd23799..2f865ac821 100644 --- a/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleStaminaBar.sqf @@ -13,11 +13,6 @@ params ["_stamina"]; private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; -if ((vehicle ACE_player) != ACE_player) exitWith { // Hide when mounted - _staminaBarContainer ctrlSetFade 1; - _staminaBarContainer ctrlCommit 1; -}; - // - Size --------------------------------------------------------------------- // Shrink the container to cut off the image (other wise it would just get stretched) private _posAndSize = ctrlPosition _staminaBarContainer; From 0669dd6568ead9ce11bf92dba95c6f7f9b7b47e6 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 13 Nov 2016 10:56:45 -0600 Subject: [PATCH 192/826] spaces --- addons/advanced_fatigue/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_fatigue/XEH_postInit.sqf b/addons/advanced_fatigue/XEH_postInit.sqf index f64f0a5a81..57be761607 100644 --- a/addons/advanced_fatigue/XEH_postInit.sqf +++ b/addons/advanced_fatigue/XEH_postInit.sqf @@ -13,7 +13,7 @@ if (!hasInterface) exitWith {}; // - GVAR updating and initialization ----------------------------------------- ["unit", FUNC(handlePlayerChanged), true] call CBA_fnc_addPlayerEventHandler; - + private _fnc_showStaminaBar = { private _staminaBarContainer = uiNamespace getVariable [QGVAR(staminaBarContainer), controlNull]; _staminaBarContainer ctrlShow ((!visibleMap) && {(vehicle ACE_player) == ACE_player}); From d14127ba4fb0af8d660ff5c65a2bfce67ec584ab Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Mon, 14 Nov 2016 12:13:41 -0600 Subject: [PATCH 193/826] Use head direction for drawing microdag wp --- addons/microdagr/functions/fnc_mapOnDrawEH.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf index 92d647f348..b3b28775d9 100644 --- a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf +++ b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf @@ -42,7 +42,7 @@ if (GVAR(currentApplicationPage) == 1) then { }; }; if ((count _targetPos) == 3) then { - _relBearing = [ACE_player, _targetPos] call BIS_fnc_relativeDirTo; + _relBearing = (ACE_player getDir _targetPos) - (([ACE_player] call CBA_fnc_headDir) select 0); _theMap drawIcon [QUOTE(PATHTO_R(images\compass_needle.paa)), [1,0.564,0.564,1], DUMMY_POS, _size, _size, _relBearing, '', 0 ]; }; }; From f679b1d6bb75534b568b84b5f3c7e07eaad2b4f1 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 16 Nov 2016 10:49:48 +0100 Subject: [PATCH 194/826] Ballistics - AmmoBox update (Apex magazines) (#4675) * Added 20Rnd 6.5mm Lapua Scenar / Creedmor magazines --- addons/ballistics/CfgVehicles.hpp | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index bb50dcdc2e..5982647778 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -13,7 +13,9 @@ class CfgVehicles { class NATO_Box_Base; class Box_NATO_Wps_F: NATO_Box_Base { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); }; }; @@ -34,7 +36,9 @@ class CfgVehicles { class Box_NATO_Ammo_F: NATO_Box_Base { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4); @@ -76,7 +80,9 @@ class CfgVehicles { class ReammoBox_F; class B_supplyCrate_F: ReammoBox_F { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4); @@ -92,7 +98,9 @@ class CfgVehicles { class EAST_Box_Base; class Box_East_Wps_F: EAST_Box_Base { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; @@ -102,7 +110,9 @@ class CfgVehicles { class TransportMagazines { MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,1); MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; @@ -110,7 +120,9 @@ class CfgVehicles { class Box_East_Ammo_F: EAST_Box_Base { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; @@ -118,7 +130,9 @@ class CfgVehicles { class Box_East_Support_F: EAST_Box_Base { class TransportMagazines { - MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,6); + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4); }; @@ -182,7 +196,9 @@ class CfgVehicles { class C_supplyCrate_F: ReammoBox_F { class TransportMagazines { + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); }; }; @@ -217,7 +233,9 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_30Rnd_65x39_caseless_green_mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_100Rnd_65x39_caseless_mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_200Rnd_65x39_cased_Box_Tracer_Dim,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65x47_Scenar_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); From 264fddd1c4f28dcd808f4c6d4e3176802a77a557 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Mon, 14 Nov 2016 19:24:21 +0100 Subject: [PATCH 195/826] Fix AF for adjusted stances, fixes #4591 --- addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf index b91e8a09bf..106ae0c16e 100644 --- a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf +++ b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf @@ -22,7 +22,7 @@ private _animType = _animName select [1, 3]; GVAR(isSwimming) = false; -if (_animType in ["idl", "mov"]) then { +if (_animType in ["idl", "mov", "adj"]) then { switch (_animName select [5, 3]) do { case ("knl"): { _duty = 1.5; From 60651fcb1e1f7493dd8364428c982d62f2ccbb81 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Mon, 14 Nov 2016 21:54:51 +0100 Subject: [PATCH 196/826] Tweaked prone animation duty --- addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf index 106ae0c16e..21eec5a88b 100644 --- a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf +++ b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf @@ -28,7 +28,7 @@ if (_animType in ["idl", "mov", "adj"]) then { _duty = 1.5; }; case ("pne"): { - _duty = 12; + _duty = 10; }; default { _duty = 1; From b08270742d0629b86bef4b70e5b3d601af2cf636 Mon Sep 17 00:00:00 2001 From: BaerMitUmlaut Date: Mon, 14 Nov 2016 21:55:26 +0100 Subject: [PATCH 197/826] Tweaked fatigue in water --- .../advanced_fatigue/functions/fnc_getAnimDuty.sqf | 12 +++++++++--- .../advanced_fatigue/functions/fnc_handleEffects.sqf | 10 +++++++++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf index 21eec5a88b..3698ff9113 100644 --- a/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf +++ b/addons/advanced_fatigue/functions/fnc_getAnimDuty.sqf @@ -47,9 +47,15 @@ if (_animType in ["idl", "mov", "adj"]) then { }; } else { // swimming and diving - if (_animType in ["swm", "ssw", "bsw", "dve", "sdv", "bdv"]) then { - _duty = 5; - GVAR(isSwimming) = true; + switch (true) do { + case (_animType in ["swm", "ssw", "bsw"]): { + _duty = 6.5; + GVAR(isSwimming) = true; + }; + case (_animType in ["dve", "sdv", "bdv"]): { + _duty = 2.5; + GVAR(isSwimming) = true; + }; }; }; diff --git a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf index 1ecfb34a88..111727c826 100644 --- a/addons/advanced_fatigue/functions/fnc_handleEffects.sqf +++ b/addons/advanced_fatigue/functions/fnc_handleEffects.sqf @@ -58,7 +58,15 @@ if (GVAR(ppeBlackoutLast) == 1) then { // - Physical effects --------------------------------------------------------- if (GVAR(isSwimming)) exitWith { - _unit setAnimSpeedCoef (1 - _fatigue / 3); + _unit setAnimSpeedCoef linearConversion [0.7, 0.9, _fatigue, 1, 0.5, true]; + + if ((isSprintAllowed _unit) && {_fatigue > 0.7}) then { + [_unit, "blockSprint", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set); + } else { + if ((!isSprintAllowed _unit) && {_fatigue < 0.7}) then { + [_unit, "blockSprint", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set); + }; + }; }; if ((getAnimSpeedCoef _unit) != 1) then { _unit setAnimSpeedCoef 1; From 3fc8774d49662b7c750ceeeaed864435d0a0a6cb Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 16 Nov 2016 11:00:50 -0600 Subject: [PATCH 198/826] Change mortar to ammo handling weapon on init (#4678) Fix #4649 --- addons/mk6mortar/XEH_postInit.sqf | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/addons/mk6mortar/XEH_postInit.sqf b/addons/mk6mortar/XEH_postInit.sqf index aceb721d70..e3169b6dba 100644 --- a/addons/mk6mortar/XEH_postInit.sqf +++ b/addons/mk6mortar/XEH_postInit.sqf @@ -17,7 +17,25 @@ ["ace_initMortar", {_this call FUNC(mortarInit);}] call CBA_fnc_addEventHandler; -if (!hasInterface) exitWith {}; +if (hasInterface) then { + ["ace_infoDisplayChanged", FUNC(turretDisplayLoaded)] call CBA_fnc_addEventHandler; +}; -["vehicle", FUNC(handlePlayerVehicleChanged)] call CBA_fnc_addPlayerEventHandler; -["ace_infoDisplayChanged", FUNC(turretDisplayLoaded)] call CBA_fnc_addEventHandler; +["ace_settingsInitialized", { + TRACE_1("ace_settingsInitialized",GVAR(useAmmoHandling)); + + ["vehicle", FUNC(handlePlayerVehicleChanged), true] call CBA_fnc_addPlayerEventHandler; + + if (GVAR(useAmmoHandling)) then { + ["Mortar_01_base_F", "init", { + TRACE_2("mortar init",_this,(_this select 0) turretLocal [0]); + + //wait for proper turret locality change + [{ + TRACE_2("after delay",_this,(_this select 0) turretLocal [0]); + ["ace_initMortar", _this] call CBA_fnc_localEvent; + }, _this, 0.5] call CBA_fnc_waitAndExecute; + + }, true, [], true] call CBA_fnc_addClassEventHandler; + }; +}] call CBA_fnc_addEventHandler; From 0137009060ac4b27293c123827cb38fda2ab240a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 16 Nov 2016 17:42:11 -0600 Subject: [PATCH 199/826] Add RHS MELB fastrope, add 3d debuging of mem points Close #4683 Config from @Whigital --- addons/fastroping/XEH_postInit.sqf | 21 +++++++++++++++++++++ addons/fastroping/script_component.hpp | 1 + optionals/compat_rhs_usf3/CfgVehicles.hpp | 9 +++++++++ optionals/compat_rhs_usf3/config.cpp | 2 +- 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/addons/fastroping/XEH_postInit.sqf b/addons/fastroping/XEH_postInit.sqf index 2752e2dcde..1efb204247 100644 --- a/addons/fastroping/XEH_postInit.sqf +++ b/addons/fastroping/XEH_postInit.sqf @@ -16,3 +16,24 @@ false }; }, {false}] call CBA_fnc_addKeybind; + + + +#ifdef DRAW_FASTROPE_INFO +addMissionEventHandler ["Draw3D", { + if (!(cursorObject isKindOf "Helicopter")) exitWith {}; + private _config = configFile >> "CfgVehicles" >> (typeOf cursorObject); + private _enabled = getNumber (_config >> QGVAR(enabled)); + drawIcon3D ["", [.5,.5,1,1], (ASLtoAGL getPosASL cursorObject), 0.5, 0.5, 0, format ["%1 = %2", typeOf cursorObject, _enabled], 0.5, 0.025, "TahomaB"]; + if (_enabled > 0) then { + { + private _hookAttachment = cursorObject getVariable [QGVAR(FRIES), cursorObject]; + private _ropeOrigin = if (_x isEqualType []) then {_x} else {_hookAttachment selectionPosition _x}; + drawIcon3D ["", [1,.5,.5,1], (_hookAttachment modelToWorld _ropeOrigin), 0.5, 0.5, 0, format ["Rope: %1", _forEachIndex], 0.5, 0.025, "TahomaB"]; + } forEach (getArray (_config >> QGVAR(ropeOrigins))); + }; + if (_enabled == 2) then { + drawIcon3D ["", [.5,1,.5,1], (cursorObject modelToWorld getArray (_config >> QGVAR(friesAttachmentPoint))), 0.5, 0.5, 0, format ["Fries: %1", getText (_config >> QGVAR(friesType))], 0.5, 0.025, "TahomaB"]; + }; +}]; +#endif diff --git a/addons/fastroping/script_component.hpp b/addons/fastroping/script_component.hpp index 323d1c801c..19bdd1a109 100644 --- a/addons/fastroping/script_component.hpp +++ b/addons/fastroping/script_component.hpp @@ -2,6 +2,7 @@ #define COMPONENT_BEAUTIFIED Fastroping #include "\z\ace\addons\main\script_mod.hpp" +// #define DRAW_FASTROPE_INFO // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE // #define ENABLE_PERFORMANCE_COUNTERS diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp index b2460e5824..767557bece 100644 --- a/optionals/compat_rhs_usf3/CfgVehicles.hpp +++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp @@ -196,6 +196,15 @@ class CfgVehicles { class Eventhandlers; }; class Heli_Transport_01_base_F: Helicopter_Base_H {}; + + class RHS_MELB_base: Helicopter_Base_H {}; + class RHS_MELB_MH6M: RHS_MELB_base { + EGVAR(fastroping,enabled) = 1; + EGVAR(fastroping,onCut) = QFUNC(onCut); + EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); + EGVAR(fastroping,ropeOrigins)[] = {{1.166, 0.79, -0.01}, {-1.166, 0.79, -0.01}}; + }; + class RHS_UH60_Base: Heli_Transport_01_base_F { EGVAR(refuel,fuelCapacity) = 1360; }; diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp index baae11bc4a..5847a2ac40 100644 --- a/optionals/compat_rhs_usf3/config.cpp +++ b/optionals/compat_rhs_usf3/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_javelin", "ace_rearm", "ace_refuel", "ace_repair", "rhsusf_c_weapons", "rhsusf_c_troops", "rhsusf_c_m1a1", "rhsusf_c_m1a2", "RHS_US_A2_AirImport", "rhsusf_c_m109", "rhsusf_c_HEMTT_A4", "rhsusf_c_hmmwv", "rhsusf_c_rg33", "rhsusf_c_fmtv", "rhsusf_c_m113", "RHS_US_A2Port_Armor"}; + requiredAddons[] = {"ace_javelin", "ace_rearm", "ace_refuel", "ace_repair", "rhsusf_c_weapons", "rhsusf_c_troops", "rhsusf_c_m1a1", "rhsusf_c_m1a2", "RHS_US_A2_AirImport", "rhsusf_c_m109", "rhsusf_c_HEMTT_A4", "rhsusf_c_hmmwv", "rhsusf_c_rg33", "rhsusf_c_fmtv", "rhsusf_c_m113", "RHS_US_A2Port_Armor", "rhsusf_c_melb"}; author = ECSTRING(common,ACETeam); authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut"}; url = ECSTRING(main,URL); From 28479c719050248e149425118f943cc3d21f3d42 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 16 Nov 2016 17:53:04 -0600 Subject: [PATCH 200/826] Remove unneeded functions --- optionals/compat_rhs_usf3/CfgVehicles.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/optionals/compat_rhs_usf3/CfgVehicles.hpp b/optionals/compat_rhs_usf3/CfgVehicles.hpp index 767557bece..77091052ba 100644 --- a/optionals/compat_rhs_usf3/CfgVehicles.hpp +++ b/optionals/compat_rhs_usf3/CfgVehicles.hpp @@ -200,8 +200,6 @@ class CfgVehicles { class RHS_MELB_base: Helicopter_Base_H {}; class RHS_MELB_MH6M: RHS_MELB_base { EGVAR(fastroping,enabled) = 1; - EGVAR(fastroping,onCut) = QFUNC(onCut); - EGVAR(fastroping,onPrepare) = QFUNC(onPrepare); EGVAR(fastroping,ropeOrigins)[] = {{1.166, 0.79, -0.01}, {-1.166, 0.79, -0.01}}; }; From 491aaa89cbafb4078ad02c59e13cc5243dee7d46 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 17 Nov 2016 13:28:25 -0600 Subject: [PATCH 201/826] Update laser code if laser is already on (#4677) --- addons/laser/XEH_postInit.sqf | 10 ++++++++++ addons/laser/functions/fnc_addLaserTarget.sqf | 2 +- addons/laser/functions/fnc_laserTargetPFH.sqf | 8 +++++++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/addons/laser/XEH_postInit.sqf b/addons/laser/XEH_postInit.sqf index 14ec456461..b439fd1f06 100644 --- a/addons/laser/XEH_postInit.sqf +++ b/addons/laser/XEH_postInit.sqf @@ -17,6 +17,16 @@ }; }] call CBA_fnc_addEventHandler; +[QGVAR(updateCode), { + params ["_uuid", "_newCode"]; + TRACE_2("ace_laser_updateCode eh",_uuid,_newCode); + if ([GVAR(laserEmitters), _uuid] call CBA_fnc_hashHasKey) then { + private _laserArray = [GVAR(laserEmitters), _uuid] call CBA_fnc_hashGet; + TRACE_2("updating",_newCode,_laserArray select 4); + _laserArray set [4, _newCode]; + }; +}] call CBA_fnc_addEventHandler; + // Shows detector and mine posistions in 3d when debug is on #ifdef DRAW_LASER_INFO addMissionEventHandler ["Draw3D", {_this call FUNC(dev_drawVisibleLaserTargets)}]; diff --git a/addons/laser/functions/fnc_addLaserTarget.sqf b/addons/laser/functions/fnc_addLaserTarget.sqf index 8f173772a5..1635b4e37f 100644 --- a/addons/laser/functions/fnc_addLaserTarget.sqf +++ b/addons/laser/functions/fnc_addLaserTarget.sqf @@ -50,7 +50,7 @@ private _methodArgs = [_vehicleSourceSelection]; TRACE_6("Laser on:",_vehicle,_laserMethod,_waveLength,_laserCode,_beamSpread,_methodArgs); private _laserUuid = [_vehicle, _vehicle, _laserMethod, _waveLength, _laserCode, _beamSpread, _methodArgs] call FUNC(laserOn); -GVAR(trackedLaserTargets) pushBack [_targetObject, _vehicle, _laserUuid]; +GVAR(trackedLaserTargets) pushBack [_targetObject, _vehicle, _laserUuid, _laserCode]; TRACE_1("",GVAR(trackedLaserTargets)); if (GVAR(pfehID) == -1) then { diff --git a/addons/laser/functions/fnc_laserTargetPFH.sqf b/addons/laser/functions/fnc_laserTargetPFH.sqf index ac7d71917f..fb81d9da60 100644 --- a/addons/laser/functions/fnc_laserTargetPFH.sqf +++ b/addons/laser/functions/fnc_laserTargetPFH.sqf @@ -18,7 +18,7 @@ params ["", "_pfhuid"]; GVAR(trackedLaserTargets) = GVAR(trackedLaserTargets) select { - _x params ["_targetObject", "_owner", "_laserUuid"]; + _x params ["_targetObject", "_owner", "_laserUuid", "_laserCode"]; if ((isNull _targetObject) || {!(alive _targetObject)} || {isNull _owner} || @@ -29,6 +29,12 @@ GVAR(trackedLaserTargets) = GVAR(trackedLaserTargets) select { TRACE_1("Laser off:", _laserUuid); false } else { + private _newCode = _owner getVariable [QEGVAR(laser,code), ACE_DEFAULT_LASER_CODE]; + if (_laserCode != _newCode) then { + TRACE_2("code change",_newCode,_laserCode); + [QGVAR(updateCode), [_laserUuid, _newCode]] call CBA_fnc_globalEvent; + _x set [3, _newCode]; + }; true }; }; From f94b1a7a10b0120c75e55d048f8696bfcf5dd003 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sat, 19 Nov 2016 18:05:26 +0100 Subject: [PATCH 202/826] ATragMX - Improved gun list readability (#4674) * Reduced the gun list font size * Redesigned the listbox scrollbars (new colors, smaller width) * Added a negative offset for the horizontal text position in the gun list * Limited the max. allowed length of custom gun names to 14 characters --- addons/atragmx/RscTitles.hpp | 31 ++++++++++++------- addons/atragmx/XEH_PREP.hpp | 1 + addons/atragmx/functions/fnc_add_new_gun.sqf | 5 ++- .../fnc_read_gun_list_entries_from_config.sqf | 4 +++ .../atragmx/functions/fnc_trim_gun_name.sqf | 18 +++++++++++ 5 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 addons/atragmx/functions/fnc_trim_gun_name.sqf diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index eb2de958d6..ba03785427 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -4,6 +4,8 @@ #define ST_WITH_RECT 160 +#define LB_TEXTURES 0x10 + class ATragMX_RscText { idc=-1; type=0; @@ -95,7 +97,7 @@ class ATragMX_RscToolbox { class ATragMX_RscListBox { idc=-1; type=5; - style=0; + style=LB_TEXTURES; font="TahomaB"; sizeEx=0.028; rowHeight=0.03; @@ -115,13 +117,14 @@ class ATragMX_RscListBox { soundSelect[]={"",0.09,1}; class ScrollBar { - color[]={1,1,1,0.6}; - colorActive[]={1,1,1,1}; - colorDisabled[]={1,1,1,0.3}; - //thumb="\ca\ui\data\igui_scrollbar_thumb_ca.paa"; - //arrowFull="\ca\ui\data\igui_arrow_top_active_ca.paa"; - //arrowEmpty="\ca\ui\data\igui_arrow_top_ca.paa"; - //border="\ca\ui\data\igui_border_scroll_ca.paa"; + width=0.05; + color[]={0.15,0.21,0.23,0.3}; + colorActive[]={0.15,0.21,0.23,0.3}; + colorDisabled[]={0.15,0.21,0.23,0.3}; + arrowEmpty="\A3\ui_f\data\gui\cfg\scrollbar\arrowEmpty_ca.paa"; + arrowFull="\A3\ui_f\data\gui\cfg\scrollbar\arrowFull_ca.paa"; + border="\A3\ui_f\data\gui\cfg\scrollbar\border_ca.paa"; + thumb="\A3\ui_f\data\gui\cfg\scrollbar\thumb_ca.paa"; }; class ListScrollBar : ScrollBar { @@ -130,7 +133,6 @@ class ATragMX_RscListBox { class ATragMX_RscListNBox: ATragMX_RscListBox { idc=-1; type=102; - columns[]={0.0, 0.225, 0.475, 0.7}; drawSideArrows=0; idcLeft=-1; idcRight=-1; @@ -636,6 +638,7 @@ class ATragMX_Display { }; class TEXT_OPTIONS_LIST_OUTPUT: ATragMX_RscListBox { idc=3002; + style=0; w=0.17; h=0.28; x=0.550*safezoneW+safezoneX+0.225; @@ -691,6 +694,7 @@ class ATragMX_Display { }; class TEXT_RANGE_CARD_OUTPUT: ATragMX_RscListNBox { idc=5007; + columns[]={0.0, 0.225, 0.475, 0.7}; idcLeft=50061; idcRight=50062; w=0.285; @@ -699,16 +703,17 @@ class ATragMX_Display { y=0.265*safezoneH+safezoneY+0.27; }; - class TEXT_GUN_LIST_OUTPUT: ATragMX_RscListBox { + class TEXT_GUN_LIST_OUTPUT: ATragMX_RscListNBox { idc=6000; + columns[]={-0.05}; w=0.16; h=0.45; x=0.550*safezoneW+safezoneX+0.11; y=0.265*safezoneH+safezoneY+0.24; - sizeEx=0.025; + sizeEx=0.018; colorSelectBackground[]={0.15,0.21,0.23,0.3}; colorSelectBackground2[]={0.15,0.21,0.23,0.3}; - onMouseButtonDblClick=QUOTE(true call FUNC(toggle_gun_list)); + onLBDblClick=QUOTE(true call FUNC(toggle_gun_list)); }; class TEXT_GUN_LIST_COLUMN_CAPTION: TEXT_GUN_PROFILE { idc=6001; @@ -1066,6 +1071,8 @@ class ATragMX_Display { x=0.550*safezoneW+safezoneX+0.12; y=0.265*safezoneH+safezoneY+0.28; text=""; + onKeyDown=QUOTE(call FUNC(trim_gun_name)); + onKeyUp=QUOTE(call FUNC(trim_gun_name)); }; class TEXT_ADD_NEW_GUN_OK: ATragMX_RscButton { idc=11002; diff --git a/addons/atragmx/XEH_PREP.hpp b/addons/atragmx/XEH_PREP.hpp index fc4c5a0224..6121619a58 100644 --- a/addons/atragmx/XEH_PREP.hpp +++ b/addons/atragmx/XEH_PREP.hpp @@ -70,6 +70,7 @@ PREP(toggle_target_data); PREP(toggle_target_range_assist); PREP(toggle_target_speed_assist); PREP(toggle_truing_drop); +PREP(trim_gun_name); PREP(true_c1_ballistic_coefficient); PREP(true_muzzle_velocity); PREP(update_atmosphere); diff --git a/addons/atragmx/functions/fnc_add_new_gun.sqf b/addons/atragmx/functions/fnc_add_new_gun.sqf index 75d0ddd5f1..3be23920bc 100644 --- a/addons/atragmx/functions/fnc_add_new_gun.sqf +++ b/addons/atragmx/functions/fnc_add_new_gun.sqf @@ -15,13 +15,16 @@ */ #include "script_component.hpp" +call FUNC(trim_gun_name); + private _gunName = ctrlText 11001; + if (_gunName != "") then { private _gunProfileEntry = [_gunName, 810, 100, 0.0679, -0.0010350, 3.81, 0, 2, 10, 120, 0, 0, 9.525, 7.82, 25.40, 0.393, 1, "ICAO", [[-15,0],[0,0],[10,0],[15,0],[25,0],[30,0],[35,0]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true]; GVAR(gunList) = GVAR(gunList) + [_gunProfileEntry]; - lbAdd [6000, _gunProfileEntry select 0]; + lbAdd [6000, _gunName]; call FUNC(store_gun_list); }; diff --git a/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf b/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf index d9c38c328e..0408b0e497 100644 --- a/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf +++ b/addons/atragmx/functions/fnc_read_gun_list_entries_from_config.sqf @@ -26,6 +26,9 @@ private _validate_preset = { ERROR("Invalid gun profile name"); _valid = false; }; + if (count (_this select 0) > 14) then { + WARNING("Gun profile name too long (max. allowed 14 characters)"); + }; if (_this select 1 < 0 || _this select 1 > 1400) then { private _errorMsg = format ["Invalid muzzle velocity: %1", _this select 1]; ERROR(_errorMsg); @@ -112,6 +115,7 @@ private _validate_preset = { private _gun = getArray _preset; if (_gun call _validate_preset) then { + _gun set [0, (_gun select 0) select [0, 14]]; _gun set [20, false]; GVAR(gunList) = GVAR(gunList) + [_gun]; }; diff --git a/addons/atragmx/functions/fnc_trim_gun_name.sqf b/addons/atragmx/functions/fnc_trim_gun_name.sqf new file mode 100644 index 0000000000..2ab603c804 --- /dev/null +++ b/addons/atragmx/functions/fnc_trim_gun_name.sqf @@ -0,0 +1,18 @@ +/* + * Author: Ruthberg + * Trims the gun name input field + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * call ace_atragmx_fnc_trim_gun_name + * + * Public: No + */ +#include "script_component.hpp" + +ctrlSetText [11001, (ctrlText 11001) select [0, 14]]; From 1f364da0dfea88e682680c50237d88fd414163eb Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 16 Nov 2016 12:23:46 +0100 Subject: [PATCH 203/826] Fix 'forceUseOfAdjustmentTurrets` affecting all scopes including iron sights --- addons/scopes/functions/fnc_inventoryCheck.sqf | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index d5ff7eb3f6..bb68b6ee17 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -23,7 +23,8 @@ private _updateAdjustment = false; private _newOptics = [_player] call FUNC(getOptics); { if (_newOptics select _forEachIndex != _x) then { - private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _forEachIndex); + private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _forEachIndex); + private _opticType = getNumber(_opticConfig >> "ItemInfo" >> "opticType"); private _verticalIncrement = -1; if (isNumber (_opticConfig >> "ACE_ScopeAdjust_VerticalIncrement")) then { _verticalIncrement = getNumber (_opticConfig >> "ACE_ScopeAdjust_VerticalIncrement"); @@ -40,7 +41,7 @@ private _newOptics = [_player] call FUNC(getOptics); if (isArray (_opticConfig >> "ACE_ScopeAdjust_Horizontal")) then { _maxHorizontal = getArray (_opticConfig >> "ACE_ScopeAdjust_Horizontal"); }; - if (GVAR(forceUseOfAdjustmentTurrets)) then { + if (GVAR(forceUseOfAdjustmentTurrets) && _opticType == 2) then { if (_maxVertical isEqualTo []) then { _maxVertical = [-4, 30]; }; if (_maxHorizontal isEqualTo []) then { _maxHorizontal = [-6, 6]; }; if (_verticalIncrement == -1) then { _verticalIncrement = 0.1; }; From 273e603caddd56840c727252357f10aef8808040 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 16 Nov 2016 12:25:21 +0100 Subject: [PATCH 204/826] Fix 'ACE_ScopeZeroRange' setting being ignored when placed in weapon classes * Only relevant for weapons with integrated scopes --- addons/scopes/functions/fnc_getCurrentZeroRange.sqf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf index f225ba0e21..0f7fe746eb 100644 --- a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf +++ b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf @@ -23,11 +23,14 @@ private _weaponIndex = [_unit, currentWeapon _unit] call EFUNC(common,getWeaponI if (_weaponIndex < 0) exitWith { currentZeroing _unit }; private _optic = GVAR(Optics) select _weaponIndex; -private _opticConfig = configFile >> "CfgWeapons" >> _optic; -private _opticType = getNumber(_opticConfig >> "ItemInfo" >> "opticType"); +private _opticConfig = if (_optic != "") then { + (configFile >> "CfgWeapons" >> _optic) +} else { + (configFile >> "CfgWeapons" >> (GVAR(Guns) select _weaponIndex)) +}; private _zeroRange = currentZeroing _unit; -if (_opticType == 2 && {(GVAR(canAdjustElevation) select _weaponIndex) || GVAR(forceUseOfAdjustmentTurrets)}) then { +if (GVAR(canAdjustElevation) select _weaponIndex) then { _zeroRange = GVAR(defaultZeroRange); }; if (isNumber (_opticConfig >> "ACE_ScopeZeroRange")) then { From bb71885b42668f5b766de929ed2d1acb02edb28b Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 16 Nov 2016 12:46:51 +0100 Subject: [PATCH 205/826] Added config settings to optic_Nightstalker, optic_NVS and optic_TWS --- addons/scopes/CfgWeapons.hpp | 38 ++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index 72ce987f4c..43a4b24639 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -52,16 +52,50 @@ class CfgWeapons { class optic_Nightstalker : ItemCore { ACE_ScopeHeightAboveRail = 4.2; + ACE_ScopeAdjust_Vertical[] = {-4, 30}; + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class NCTALKEP { + discreteDistance[] = {200}; + discreteDistanceInitIndex = 0; + }; + }; + }; }; class optic_NVS : ItemCore { ACE_ScopeHeightAboveRail = 4.2; - ACE_ScopeAdjust_Vertical[] = {0, 0}; - ACE_ScopeAdjust_Horizontal[] = {0, 0}; + ACE_ScopeAdjust_Vertical[] = {-4, 30}; + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class NVS { + discreteDistance[] = {300}; + discreteDistanceInitIndex = 0; + }; + }; + }; }; class optic_TWS : ItemCore { ACE_ScopeHeightAboveRail = 4.2; + ACE_ScopeAdjust_Vertical[] = {-4, 30}; + ACE_ScopeAdjust_Horizontal[] = {-6, 6}; + ACE_ScopeAdjust_VerticalIncrement = 0.1; + ACE_ScopeAdjust_HorizontalIncrement = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class TWS { + discreteDistance[] = {300}; + discreteDistanceInitIndex = 0; + }; + }; + }; }; class optic_LRPS : ItemCore { From dbb59c8fd106c10153f5847f6d90a5576615887b Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 16 Nov 2016 12:55:43 +0100 Subject: [PATCH 206/826] New 'overwriteZeroRange' setting --- addons/scopes/ACE_Settings.hpp | 7 +++++++ addons/scopes/CfgVehicles.hpp | 6 ++++++ addons/scopes/functions/fnc_getCurrentZeroRange.sqf | 2 +- addons/scopes/functions/fnc_initModuleSettings.sqf | 1 + addons/scopes/stringtable.xml | 6 ++++++ 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/addons/scopes/ACE_Settings.hpp b/addons/scopes/ACE_Settings.hpp index 29d6635cf2..6ff483cb50 100644 --- a/addons/scopes/ACE_Settings.hpp +++ b/addons/scopes/ACE_Settings.hpp @@ -20,6 +20,13 @@ class ACE_Settings { displayName = CSTRING(correctZeroing_displayName); description = CSTRING(correctZeroing_description); }; + // Enables the use of the 'defaultZeroRange' setting to overwrite the discreteDistance[] config + class GVAR(overwriteZeroRange) { + typeName = "BOOL"; + value = 0; + displayName = CSTRING(overwriteZeroRange_displayName); + description = CSTRING(overwriteZeroRange_description); + }; // Only affects scopes with elevation adjustment turrets (ACE_ScopeAdjust_Vertical != [0,0]) class GVAR(defaultZeroRange) { typeName = "SCALAR"; diff --git a/addons/scopes/CfgVehicles.hpp b/addons/scopes/CfgVehicles.hpp index 4a23ea0baf..fd2a7d01c6 100644 --- a/addons/scopes/CfgVehicles.hpp +++ b/addons/scopes/CfgVehicles.hpp @@ -46,6 +46,12 @@ class CfgVehicles { typeName = "BOOL"; defaultValue = 1; }; + class overwriteZeroRange { + displayName = CSTRING(overwriteZeroRange_DisplayName); + description = CSTRING(overwriteZeroRange_Description); + typeName = "BOOL"; + defaultValue = 0; + }; class defaultZeroRange { displayName = CSTRING(defaultZeroRange_DisplayName); description = CSTRING(defaultZeroRange_Description); diff --git a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf index 0f7fe746eb..a82bd0714e 100644 --- a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf +++ b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf @@ -30,7 +30,7 @@ private _opticConfig = if (_optic != "") then { }; private _zeroRange = currentZeroing _unit; -if (GVAR(canAdjustElevation) select _weaponIndex) then { +if (GVAR(overwriteZeroRange) && {GVAR(canAdjustElevation) select _weaponIndex}) then { _zeroRange = GVAR(defaultZeroRange); }; if (isNumber (_opticConfig >> "ACE_ScopeZeroRange")) then { diff --git a/addons/scopes/functions/fnc_initModuleSettings.sqf b/addons/scopes/functions/fnc_initModuleSettings.sqf index 91ab202db3..a04433f11e 100644 --- a/addons/scopes/functions/fnc_initModuleSettings.sqf +++ b/addons/scopes/functions/fnc_initModuleSettings.sqf @@ -21,6 +21,7 @@ if !(_activated) exitWith {}; [_logic, QGVAR(enabled), "enabled"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(forceUseOfAdjustmentTurrets), "forceUseOfAdjustmentTurrets"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(correctZeroing), "correctZeroing"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(overwriteZeroRange), "overwriteZeroRange"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(defaultZeroRange), "defaultZeroRange"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(zeroReferenceTemperature), "zeroReferenceTemperature"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(zeroReferenceBarometricPressure), "zeroReferenceBarometricPressure"] call EFUNC(common,readSettingFromModule); diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index f74325ab62..bffaeb0301 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -22,6 +22,12 @@ Corrects the zeroing of all small arms sights + + Overwrite zero distance + + + Uses the 'defaultZeroRange' setting to overwrite the zero range of high power scopes + Default zero distance From cb3693f6648df798c53c481b3e561ecfdbc2838e Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 16 Nov 2016 14:20:44 +0100 Subject: [PATCH 207/826] ATragMX - Fixes possible divison through zero --- .../fnc_recalculate_c1_ballistic_coefficient.sqf | 12 ++++++++---- .../functions/fnc_recalculate_muzzle_velocity.sqf | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf b/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf index 3ad4f26845..028a06fa4a 100644 --- a/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf +++ b/addons/atragmx/functions/fnc_recalculate_c1_ballistic_coefficient.sqf @@ -37,16 +37,20 @@ private ["_lowerIndex", "_upperIndex"]; for "_index" from 1 to (_lookupTableSize - 1) do { _upperIndex = _index; _lowerIndex = _upperIndex - 1; - if (((_lookupTable select _index) select 0) >= (GVAR(targetRange) select GVAR(currentTarget))) exitWith {} + if (((_lookupTable select _index) select 0) >= (GVAR(targetRange) select GVAR(currentTarget))) exitWith {}; }; -private ["_lowerDistance", "_upperDistance", "_lowerC1", "_upperC1", "_slope", "_c1"]; +private ["_lowerDistance", "_upperDistance", "_lowerC1", "_upperC1", "_c1"]; _lowerDistance = (_lookupTable select _lowerIndex) select 0; _upperDistance = (_lookupTable select _upperIndex) select 0; _lowerC1 = (_lookupTable select _lowerIndex) select 1; _upperC1 = (_lookupTable select _upperIndex) select 1; -_slope = (_upperC1 - _lowerC1) / (_upperDistance - _lowerDistance); -_c1 = 0.1 max (_lowerC1 + ((GVAR(targetRange) select GVAR(currentTarget)) - _lowerDistance) * _slope) min 2.0; +_c1 = _lowerC1; +if (_lowerDistance != _upperDistance) then { + private _slope = (_upperC1 - _lowerC1) / (_upperDistance - _lowerDistance); + _c1 = _lowerC1 + ((GVAR(targetRange) select GVAR(currentTarget)) - _lowerDistance) * _slope; +}; +_c1 = 0.1 max _c1 min 2.0; if (_c1 != GVAR(workingMemory) select 15) then { GVAR(workingMemory) set [15, _c1]; diff --git a/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf b/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf index 430e8ecc68..5830ba7683 100644 --- a/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf +++ b/addons/atragmx/functions/fnc_recalculate_muzzle_velocity.sqf @@ -37,16 +37,20 @@ private ["_lowerIndex", "_upperIndex"]; for "_index" from 1 to (_lookupTableSize - 1) do { _upperIndex = _index; _lowerIndex = _upperIndex - 1; - if (((_lookupTable select _index) select 0) >= GVAR(temperature)) exitWith {} + if (((_lookupTable select _index) select 0) >= GVAR(temperature)) exitWith {}; }; -private ["_lowerTemperature", "_upperTemperature", "_lowerMuzzleVelocity", "_upperMuzzleVelocity", "_slope", "_muzzleVelocity"]; +private ["_lowerTemperature", "_upperTemperature", "_lowerMuzzleVelocity", "_upperMuzzleVelocity", "_muzzleVelocity"]; _lowerTemperature = (_lookupTable select _lowerIndex) select 0; _upperTemperature = (_lookupTable select _upperIndex) select 0; _lowerMuzzleVelocity = (_lookupTable select _lowerIndex) select 1; _upperMuzzleVelocity = (_lookupTable select _upperIndex) select 1; -_slope = (_upperMuzzleVelocity - _lowerMuzzleVelocity) / (_upperTemperature - _lowerTemperature); -_muzzleVelocity = _lowerMuzzleVelocity + (GVAR(temperature) - _lowerTemperature) * _slope; +_muzzleVelocity = _lowerMuzzleVelocity; +if (_lowerTemperature != _upperTemperature) then { + private _slope = (_upperMuzzleVelocity - _lowerMuzzleVelocity) / (_upperTemperature - _lowerTemperature); + _muzzleVelocity = _lowerMuzzleVelocity + (GVAR(temperature) - _lowerTemperature) * _slope; +}; +_muzzleVelocity = 100 max _muzzleVelocity min 1400; if (_muzzleVelocity != GVAR(workingMemory) select 1) then { GVAR(workingMemory) set [1, _muzzleVelocity]; From dcd4137491cbb03aa88689108c759f1383908545 Mon Sep 17 00:00:00 2001 From: ulteq Date: Wed, 16 Nov 2016 16:27:56 +0100 Subject: [PATCH 208/826] Fixed several bugs in the unit conversion code * Proper min, max capping for both metric and imperial units * Fixed unit conversion issues on the interpolation table input fields --- addons/atragmx/functions/fnc_parse_input.sqf | 121 ++++++++++++------ ...fnc_show_c1_ballistic_coefficient_data.sqf | 5 + ...c_update_c1_ballistic_coefficient_data.sqf | 2 +- .../functions/fnc_update_gun_ammo_data.sqf | 2 +- .../functions/fnc_update_unit_selection.sqf | 2 + .../functions/fnc_update_zero_range.sqf | 4 - 6 files changed, 92 insertions(+), 44 deletions(-) diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index 2f73ecebba..38310edfae 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -17,49 +17,96 @@ // Muzzle velocity vs. temperature interpolation data { - private _temperature = -50 max parseNumber(ctrlText _x) min 160; - if (GVAR(currentUnit) == 1) then { + private _temperature = parseNumber(ctrlText _x); + if (GVAR(currentUnit) != 2) then { + _temperature = -50 max _temperature min 160; _temperature = (_temperature - 32) / 1.8; + } else { + _temperature = -50 max _temperature min 71; }; ((GVAR(workingMemory) select 18) select _forEachIndex) set [0, _temperature]; } forEach [160021, 160022, 160023, 160024, 160025, 160026, 160027]; { - private _muzzleVelocity = parseNumber(ctrlText _x); - if (GVAR(currentUnit) == 1) then { - _muzzleVelocity = _muzzleVelocity / 3.2808399; + private _muzzleVelocity = abs(parseNumber(ctrlText _x)); + if (_muzzleVelocity > 0) then { + if (GVAR(currentUnit) != 2) then { + _muzzleVelocity = 300 max _muzzleVelocity min 4500; + _muzzleVelocity = _muzzleVelocity * 0.3048; + } else { + _muzzleVelocity = 100 max _muzzleVelocity min 1400; + }; }; - ((GVAR(workingMemory) select 18) select _forEachIndex) set [1, 0 max _muzzleVelocity min 1400]; + ((GVAR(workingMemory) select 18) select _forEachIndex) set [1, _muzzleVelocity]; } forEach [160031, 160032, 160033, 160034, 160035, 160036, 160037]; // C1 coefficient vs. distance interpolation data { - private _distance = 0 max parseNumber(ctrlText _x) min 4000; - if (GVAR(currentUnit) != 2) then { - _distance = _distance * 0.9144; + private _distance = abs(parseNumber(ctrlText _x)); + if (_distance > 0) then { + if (GVAR(currentUnit) == 1) then { + _distance = 25 max _distance min 4000; + _distance = _distance * 0.9144; + } else { + _distance = 25 max _distance min 3700; + }; }; ((GVAR(workingMemory) select 19) select _forEachIndex) set [0, _distance]; } forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027]; { - private _c1 = 0 max parseNumber(ctrlText _x) min 2.0; + private _c1 = abs(parseNumber(ctrlText _x)); + if (_c1 > 0) then { + _c1 = 0.1 max _c1 min 2.0; + }; ((GVAR(workingMemory) select 19) select _forEachIndex) set [1, _c1]; } forEach [170031, 170032, 170033, 170034, 170035, 170036, 170037]; -GVAR(altitude) = -1000 max parseNumber(ctrlText 130030) min 20000; -GVAR(temperature) = -50 max parseNumber(ctrlText 130040) min 160; -GVAR(barometricPressure) = 10 max parseNumber(ctrlText 130050) min 1350; -GVAR(relativeHumidity) = (0 max parseNumber(ctrlText 130060) min 100) / 100; +GVAR(altitude) = parseNumber(ctrlText 130030); +GVAR(temperature) = parseNumber(ctrlText 130040); +GVAR(barometricPressure) = parseNumber(ctrlText 130050); +GVAR(relativeHumidity) = parseNumber(ctrlText 130060) / 100; if (GVAR(currentUnit) != 2) then { + GVAR(altitude) = -1000 max GVAR(altitude) min 20000; + GVAR(temperature) = -50 max GVAR(temperature) min 160; + GVAR(barometricPressure) = 10 max GVAR(barometricPressure) min 40; GVAR(altitude) = GVAR(altitude) * 0.3048; GVAR(temperature) = (GVAR(temperature) - 32) / 1.8; GVAR(barometricPressure) = GVAR(barometricPressure) * 33.86389; +} else { + GVAR(altitude) = -300 max GVAR(altitude) min 6100; + GVAR(temperature) = -50 max GVAR(temperature) min 71; + GVAR(barometricPressure) = 340 max GVAR(barometricPressure) min 1350; }; -private ["_inclinationAngleCosine", "_inclinationAngleDegree"]; +private ["_windSpeed1", "_windSpeed2", "_targetSpeed", "_targetRange", "_inclinationAngleCosine", "_inclinationAngleDegree"]; +_windSpeed1 = parseNumber(ctrlText 140020); +_windSpeed2 = parseNumber(ctrlText 140021); +_targetSpeed = parseNumber(ctrlText 140050); +_targetRange = parseNumber(ctrlText 140060); +if (GVAR(currentUnit) != 2) then { + _windSpeed1 = 0 max _windSpeed1 min 50; + _windSpeed2 = 0 max _windSpeed2 min 50; + _targetSpeed = 0 max _targetSpeed min 50; + _windSpeed1 = _windSpeed1 * 0.44704; + _windSpeed2 = _windSpeed2 * 0.44704; + _targetSpeed = _targetSpeed * 0.44704; +} else { + _windSpeed1 = 0 max _windSpeed1 min 25; + _windSpeed2 = 0 max _windSpeed2 min 25; + _targetSpeed = 0 max _targetSpeed min 25; +}; +if (GVAR(currentUnit) == 1) then { + _targetRange = 25 max _targetRange min 4000; + _targetRange = _targetRange * 0.9144; +} else { + _targetRange = 25 max _targetRange min 3700; +}; GVAR(latitude) set [GVAR(currentTarget), -90 max Round(parseNumber(ctrlText 140000)) min 90]; GVAR(directionOfFire) set [GVAR(currentTarget), 0 max abs(Round(parseNumber(ctrlText 140010))) min 359]; -GVAR(windSpeed1) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140020)) min 50]; -GVAR(windSpeed2) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140021)) min 50]; +GVAR(windSpeed1) set [GVAR(currentTarget), _windSpeed1]; +GVAR(windSpeed2) set [GVAR(currentTarget), _windSpeed2]; GVAR(windDirection) set [GVAR(currentTarget), 1 max Round(parseNumber(ctrlText 140030)) min 12]; +GVAR(targetSpeed) set [GVAR(currentTarget), _targetSpeed]; +GVAR(targetRange) set [GVAR(currentTarget), _targetRange]; _inclinationAngleCosine = 0.5 max parseNumber(ctrlText 140041) min 1; _inclinationAngleDegree = -60 max round(parseNumber(ctrlText 140040)) min 60; if (_inclinationAngleDegree != GVAR(inclinationAngle) select GVAR(currentTarget)) then { @@ -69,52 +116,50 @@ if (_inclinationAngleDegree != GVAR(inclinationAngle) select GVAR(currentTarget) GVAR(inclinationAngle) set [GVAR(currentTarget), round(acos(_inclinationAngleCosine))]; }; }; -GVAR(targetSpeed) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140050)) min 50]; if ((ctrlText 140051) == ">") then { GVAR(targetSpeedDirection) set [GVAR(currentTarget), +1]; } else { GVAR(targetSpeedDirection) set [GVAR(currentTarget), -1]; }; -GVAR(targetRange) set [GVAR(currentTarget), 0 max abs(parseNumber(ctrlText 140060)) min 4000]; -if (GVAR(currentUnit) != 2) then { - GVAR(windSpeed1) set [GVAR(currentTarget), (GVAR(windSpeed1) select GVAR(currentTarget)) * 0.44704]; - GVAR(windSpeed2) set [GVAR(currentTarget), (GVAR(windSpeed2) select GVAR(currentTarget)) * 0.44704]; - GVAR(targetSpeed) set [GVAR(currentTarget), (GVAR(targetSpeed) select GVAR(currentTarget)) * 0.44704]; -}; -if (GVAR(currentUnit) == 1) then { - GVAR(targetRange) set [GVAR(currentTarget), (GVAR(targetRange) select GVAR(currentTarget)) * 0.9144]; -}; private ["_boreHeight", "_bulletMass", "_bulletDiameter", "_airFriction", "_rifleTwist", "_muzzleVelocity", "_zeroRange"]; _boreHeight = parseNumber(ctrlText 120000); _bulletMass = parseNumber(ctrlText 120010); -_bulletDiameter = parseNumber(ctrlText 120020) * 10; +_bulletDiameter = parseNumber(ctrlText 120020); +_airFriction = parseNumber(ctrlText 120030); if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - _airFriction = 0.1 max parseNumber(ctrlText 120030) min 2; + _airFriction = 0.1 max _airFriction min 2; } else { - _airFriction = parseNumber(ctrlText 120030) / -1000; + _airFriction = _airFriction / -1000; }; _rifleTwist = parseNumber(ctrlText 120040); _muzzleVelocity = parseNumber(ctrlText 120050); _zeroRange = parseNumber(ctrlText 120060); if (GVAR(currentUnit) != 2) then { + _boreHeight = 0.1 max _boreHeight min 5; + _bulletMass = 1 max _bulletMass min 1500; + _bulletDiameter = 0.1 max _bulletDiameter min 1.0; + _rifleTwist = 1 max _rifleTwist min 36; + _muzzleVelocity = 300 max _muzzleVelocity min 4500; _boreHeight = _boreHeight * 2.54; _bulletMass = _bulletMass * 0.06479891; _bulletDiameter = _bulletDiameter * 2.54; _rifleTwist = _rifleTwist * 2.54; - _muzzleVelocity = _muzzleVelocity / 3.2808399; + _muzzleVelocity = _muzzleVelocity * 0.3048; +} else { + _boreHeight = 0.1 max _boreHeight min 10; + _bulletMass = 1 max _bulletMass min 100; + _bulletDiameter = 0.1 max _bulletDiameter min 2.5; + _rifleTwist = 1 max _rifleTwist min 75; + _muzzleVelocity = 100 max _muzzleVelocity min 1400; }; +_zeroRange = 25 max _zeroRange min 1000; if (GVAR(currentUnit) == 1) then { - _zeroRange = _zeroRange / 1.0936133; + _zeroRange = _zeroRange * 0.9144; }; -_boreHeight = 0.1 max _boreHeight min 10; -_bulletMass = 1 max _bulletMass min 100; -_bulletDiameter = 1 max _bulletDiameter min 25; -_muzzleVelocity = 100 max _muzzleVelocity min 1400; -_zeroRange = 0 max _zeroRange min 1000; GVAR(workingMemory) set [5, _boreHeight]; GVAR(workingMemory) set [12, _bulletMass]; -GVAR(workingMemory) set [13, _bulletDiameter]; +GVAR(workingMemory) set [13, _bulletDiameter * 10]; GVAR(workingMemory) set [14, _rifleTwist]; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { if (_airFriction != GVAR(workingMemory) select 15) then { diff --git a/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf index b96902f5fa..9ac13aef86 100644 --- a/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf +++ b/addons/atragmx/functions/fnc_show_c1_ballistic_coefficient_data.sqf @@ -20,6 +20,11 @@ GVAR(showC1BallisticCoefficientData) = _this; {ctrlShow [_x, _this]} forEach [17000, 17001, 170021, 170022, 170023, 170024, 170025, 170026, 170027, 170031, 170032, 170033, 170034, 170035, 170036, 170037, 17004, 17005, 17006, 17007, 17008, 17009]; if (_this) then { + if (GVAR(currentUnit) != 1) then { + ctrlSetText [17000, "Meters"]; + } else { + ctrlSetText [17000, "Yards"]; + }; ctrlSetFocus ((uiNamespace getVariable "ATragMX_Display") displayCtrl 170031); [] call FUNC(update_c1_ballistic_coefficient_data); }; diff --git a/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf b/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf index 09148fd156..d63d9768da 100644 --- a/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf +++ b/addons/atragmx/functions/fnc_update_c1_ballistic_coefficient_data.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" // Distances -if (GVAR(currentUnit) == 2) then { +if (GVAR(currentUnit) != 1) then { {ctrlSetText [_x, Str(Round(((GVAR(workingMemory) select 19) select _forEachIndex) select 0))]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027]; } else { {ctrlSetText [_x, Str(Round((((GVAR(workingMemory) select 19) select _forEachIndex) select 0) * 1.0936133))]} forEach [170021, 170022, 170023, 170024, 170025, 170026, 170027]; diff --git a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf index 6332506006..abdb401454 100644 --- a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf +++ b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf @@ -68,7 +68,7 @@ if (GVAR(currentUnit) == 2) then { ctrlSetText [12000, "Bore (inches)"]; ctrlSetText [12001, "Bullet Weight (grains)"]; ctrlSetText [12002, "Bullet Diam (inches)"]; - ctrlSetText [12004, "Rifle Twist (inches/trn)"]; + ctrlSetText [12004, "Rifle Twist (in/trn)"]; ctrlSetText [12005, "Muzzle Velocity (feet/sec)"]; }; diff --git a/addons/atragmx/functions/fnc_update_unit_selection.sqf b/addons/atragmx/functions/fnc_update_unit_selection.sqf index 77d96bfdd6..f054857078 100644 --- a/addons/atragmx/functions/fnc_update_unit_selection.sqf +++ b/addons/atragmx/functions/fnc_update_unit_selection.sqf @@ -27,5 +27,7 @@ [] call FUNC(update_atmo_env_data); [] call FUNC(update_target); [] call FUNC(update_target_data); +[] call FUNC(update_muzzle_velocity_data); +[] call FUNC(update_c1_ballistic_coefficient_data); [] call FUNC(update_result); diff --git a/addons/atragmx/functions/fnc_update_zero_range.sqf b/addons/atragmx/functions/fnc_update_zero_range.sqf index 5cf175faf7..e4b3d0da8c 100644 --- a/addons/atragmx/functions/fnc_update_zero_range.sqf +++ b/addons/atragmx/functions/fnc_update_zero_range.sqf @@ -28,10 +28,6 @@ _atmosphereModel = GVAR(workingMemory) select 17; private ["_zeroRange"]; _zeroRange = GVAR(workingMemory) select 2; -if (_zeroRange < 10) exitWith { - GVAR(workingMemory) set [2, _zeroRange]; - GVAR(workingMemory) set [3, 0]; -}; private ["_altitude", "_temperature", "_barometricPressure", "_relativeHumidity"]; _altitude = GVAR(altitude); From e70a23d93a09001b97b2017b7a4a1050daf51d8c Mon Sep 17 00:00:00 2001 From: ulteq Date: Tue, 22 Nov 2016 10:20:02 +0100 Subject: [PATCH 209/826] Greatly improves the plausibility of the transonic flight simulation (#4652) * Transonic flight now induces yawing and pitching of the nose of the bullet instead of modifying the bullet velocity directly * The ballistic coefficient now starts to decreases once the bullet goes transonic --- .../AdvancedBallistics.cpp | 34 ++++++++++++------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp index 89a0d0b060..c2875bb448 100644 --- a/extensions/advanced_ballistics/AdvancedBallistics.cpp +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -48,6 +48,7 @@ struct Bullet { double lastFrame; double hDeflection; double spinDrift; + double bcDegradation; unsigned randSeed; std::default_random_engine randGenerator; }; @@ -68,7 +69,6 @@ Map* map = &mapDatabase[""]; double calculateRoughnessLength(double posX, double posY) { // Source: http://es.ucsc.edu/~jnoble/wind/extrap/index.html double roughness_lengths[10] = {0.0002, 0.0005, 0.0024, 0.03, 0.055, 0.1, 0.2, 0.4, 0.8, 1.6}; - double roughnessLength = 0.0024; int gridX = (int)floor(posX / 50); int gridY = (int)floor(posY / 50); @@ -482,6 +482,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) bulletDatabase[index].lastFrame = tickTime; bulletDatabase[index].hDeflection = 0.0; bulletDatabase[index].spinDrift = 0.0; + bulletDatabase[index].bcDegradation = 1.0; bulletDatabase[index].speed = 0.0; bulletDatabase[index].frames = 0.0; bulletDatabase[index].randSeed = 0; @@ -617,6 +618,24 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) trueVelocity[2] = velocity[2] - wind[2]; trueSpeed = sqrt(pow(trueVelocity[0], 2) + pow(trueVelocity[1], 2) + pow(trueVelocity[2], 2)); + double speedOfSound = 331.3 + (0.6 * temperature); + double transonicSpeed = 394 + (0.6 * temperature); + if (bulletDatabase[index].transonicStabilityCoef < 1.0f && bulletSpeed < transonicSpeed && bulletSpeed > speedOfSound) { + std::uniform_real_distribution distribution(-10.0, 10.0); + double coef = 1.0f - bulletDatabase[index].transonicStabilityCoef; + + trueVelocity[0] += distribution(bulletDatabase[index].randGenerator) * coef; + trueVelocity[1] += distribution(bulletDatabase[index].randGenerator) * coef; + trueVelocity[2] += distribution(bulletDatabase[index].randGenerator) * coef; + double speed = sqrt(pow(trueVelocity[0], 2) + pow(trueVelocity[1], 2) + pow(trueVelocity[2], 2)); + + trueVelocity[0] *= trueSpeed / speed; + trueVelocity[1] *= trueSpeed / speed; + trueVelocity[2] *= trueSpeed / speed; + + bulletDatabase[index].bcDegradation *= pow(0.993, coef); + }; + temperature = bulletDatabase[index].temperature - 0.0065 * position[2]; pressure = (1013.25 - 10 * bulletDatabase[index].overcast) * pow(1 - (0.0065 * (bulletDatabase[index].altitude + position[2])) / (273.15 + temperature + 0.0065 * bulletDatabase[index].altitude), 5.255754495); @@ -640,6 +659,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) } ballisticCoefficient = calculateAtmosphericCorrection(ballisticCoefficient, temperature, pressure, bulletDatabase[index].humidity, bulletDatabase[index].atmosphereModel); + ballisticCoefficient *= bulletDatabase[index].bcDegradation; drag = deltaT * calculateRetard(bulletDatabase[index].dragModel, ballisticCoefficient, trueSpeed); accel[0] = (trueVelocity[0] / trueSpeed) * drag; accel[1] = (trueVelocity[1] / trueSpeed) * drag; @@ -694,16 +714,6 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) positionOffset[0] += sin(bulletDir + M_PI / 2) * spinDriftPartial; positionOffset[1] += cos(bulletDir + M_PI / 2) * spinDriftPartial; - double speedOfSound = 331.3 + (0.6 * temperature); - if (bulletSpeed < (speedOfSound + 5) && bulletSpeedAvg > speedOfSound && bulletSpeed > (speedOfSound - 5)) { - std::uniform_real_distribution distribution(0.0, 1.0); - double coef = 1.0f - bulletDatabase[index].transonicStabilityCoef; - - velocityOffset[0] += (distribution(bulletDatabase[index].randGenerator) * 0.8 - 0.4) * coef; - velocityOffset[1] += (distribution(bulletDatabase[index].randGenerator) * 0.8 - 0.4) * coef; - velocityOffset[2] += (distribution(bulletDatabase[index].randGenerator) * 0.8 - 0.4) * coef; - }; - outputStr << "_bullet setVelocity (_bulletVelocity vectorAdd [" << velocityOffset[0] << "," << velocityOffset[1] << "," << velocityOffset[2] << "]); _bullet setPosASL (_bulletPosition vectorAdd [" << positionOffset[0] << "," << positionOffset[1] << "," << positionOffset[2] << "]);"; strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); EXTENSION_RETURN(); @@ -725,7 +735,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) } else if (!strcmp(mode, "init")) { int mapSize = 0; int mapGrids = 0; - int gridCells = 0; + unsigned int gridCells = 0; worldName = strtok_s(NULL, ":", &next_token); mapSize = strtol(strtok_s(NULL, ":", &next_token), NULL, 10); From 9d08ad8238aeff2fed3ecc320903c3d28848e415 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 22 Nov 2016 18:38:58 +0100 Subject: [PATCH 210/826] Prep 3.8.2 release --- addons/main/script_version.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 2104cda997..35f889f47b 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 8 #define PATCHLVL 2 -#define BUILD 12 +#define BUILD 13 From 2adb7c0d8b26b3d5ff6a53583e00937c908273fb Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 22 Nov 2016 22:54:09 +0100 Subject: [PATCH 211/826] Update versions for 3.8.2 - #4692 --- README.md | 2 +- docs/README_DE.md | 2 +- docs/README_PL.md | 2 +- docs/_config.yml | 10 +++++----- docs/_config_dev.yml | 10 +++++----- mod.cpp | 4 ++-- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 7a170d1e15..c8682b339c 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Issues diff --git a/docs/README_DE.md b/docs/README_DE.md index 90d5eb578e..bad1fc06c1 100644 --- a/docs/README_DE.md +++ b/docs/README_DE.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Fehlermeldungen diff --git a/docs/README_PL.md b/docs/README_PL.md index a224f84277..edad01d3aa 100644 --- a/docs/README_PL.md +++ b/docs/README_PL.md @@ -3,7 +3,7 @@

- ACE3 Wersja + ACE3 Wersja ACE3 Zagadnienia diff --git a/docs/_config.yml b/docs/_config.yml index 9dd11e9a3b..37b5dd9f9f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -10,16 +10,16 @@ ace: githubUrl: https://github.com/acemod/ACE3 version: major: 3 - minor: 7 - patch: 0 - build: 6 + minor: 8 + patch: 2 + build: 13 acex: githubUrl: https://github.com/acemod/ACEX version: major: 3 - minor: 0 - patch: 0 + minor: 1 + patch: 1 build: 0 diff --git a/docs/_config_dev.yml b/docs/_config_dev.yml index 31d20e5439..1742300313 100644 --- a/docs/_config_dev.yml +++ b/docs/_config_dev.yml @@ -10,16 +10,16 @@ ace: githubUrl: https://github.com/acemod/ACE3 version: major: 3 - minor: 7 - patch: 0 - build: 6 + minor: 8 + patch: 2 + build: 13 acex: githubUrl: https://github.com/acemod/ACEX version: major: 3 - minor: 0 - patch: 0 + minor: 1 + patch: 1 build: 0 diff --git a/mod.cpp b/mod.cpp index 45ec7fbbcf..3ff10b8aeb 100644 --- a/mod.cpp +++ b/mod.cpp @@ -1,8 +1,8 @@ -name = "Advanced Combat Environment 3.8.1"; +name = "Advanced Combat Environment 3.8.2"; picture = "logo_ace3_ca.paa"; actionName = "GitHub"; action = "https://github.com/acemod/ACE3"; -description = "ACE3 - Version 3.8.1"; +description = "ACE3 - Version 3.8.2"; logo = "logo_ace3_ca.paa"; logoOver = "logo_ace3_ca.paa"; tooltip = "ACE3"; From fbcdd8ad35bc617b729f13b1a99b6e7e93d67c6c Mon Sep 17 00:00:00 2001 From: jonpas Date: Wed, 23 Nov 2016 16:35:47 +0100 Subject: [PATCH 212/826] Fix missing word in gibot comment (#4695) --- .gibot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gibot.yml b/.gibot.yml index 4b8dffb6f7..1fdf83063e 100644 --- a/.gibot.yml +++ b/.gibot.yml @@ -11,7 +11,7 @@ stages: - marked for cleanup comment: - 'Hello @{author}! There has been no activity on this ticket for over a period of {days} days. I am automatically replying to let you know we will close this ticket within 1 week due to inactivity and consider this resolved.' - - 'If you believe this in error, please reply with the requested information.' + - 'If you believe this is in error, please reply with the requested information.' - 'Thank you. :robot:' action: close: false From a3c50a6c761c7e1f48ea07a57c9c5168e3f4bb93 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 23 Nov 2016 13:35:25 -0600 Subject: [PATCH 213/826] Add dev macro to quickly recompile functions (#4699) --- addons/advanced_ballistics/XEH_preInit.sqf | 2 ++ addons/advanced_fatigue/XEH_preInit.sqf | 2 ++ addons/advanced_throwing/XEH_preInit.sqf | 2 ++ addons/atragmx/XEH_preInit.sqf | 2 ++ addons/attach/XEH_preInit.sqf | 2 ++ addons/backpacks/XEH_preInit.sqf | 2 ++ addons/captives/XEH_preInit.sqf | 2 ++ addons/cargo/XEH_preInit.sqf | 2 ++ addons/chemlights/XEH_preInit.sqf | 2 ++ addons/common/XEH_preInit.sqf | 2 ++ addons/concertina_wire/XEH_preInit.sqf | 2 ++ addons/cookoff/XEH_preInit.sqf | 2 ++ addons/dagr/XEH_preInit.sqf | 2 ++ addons/disarming/XEH_preInit.sqf | 2 ++ addons/disposable/XEH_preInit.sqf | 2 ++ addons/dogtags/XEH_preInit.sqf | 2 ++ addons/dragging/XEH_preInit.sqf | 2 ++ addons/explosives/XEH_preInit.sqf | 2 ++ addons/fastroping/XEH_preInit.sqf | 2 ++ addons/fcs/XEH_preInit.sqf | 2 ++ addons/finger/XEH_preInit.sqf | 2 ++ addons/frag/XEH_preInit.sqf | 2 ++ addons/gestures/XEH_preInit.sqf | 2 ++ addons/gforces/XEH_preInit.sqf | 2 ++ addons/goggles/XEH_preInit.sqf | 2 ++ addons/grenades/XEH_preInit.sqf | 2 ++ addons/gunbag/XEH_preInit.sqf | 2 ++ addons/hearing/XEH_preInit.sqf | 2 ++ addons/hitreactions/XEH_preInit.sqf | 2 ++ addons/huntir/XEH_preInit.sqf | 2 ++ addons/interact_menu/XEH_preInit.sqf | 2 ++ addons/interaction/XEH_preInit.sqf | 2 ++ addons/inventory/XEH_preInit.sqf | 2 ++ addons/javelin/XEH_preInit.sqf | 2 ++ addons/kestrel4500/XEH_preInit.sqf | 2 ++ addons/laser/XEH_preInit.sqf | 2 ++ addons/laserpointer/XEH_preInit.sqf | 2 ++ addons/logistics_uavbattery/XEH_preInit.sqf | 2 ++ addons/logistics_wirecutter/XEH_preInit.sqf | 2 ++ addons/magazinerepack/XEH_preInit.sqf | 2 ++ addons/main/script_debug.hpp | 18 ++++++++++++++++++ addons/map/XEH_preInit.sqf | 2 ++ addons/map_gestures/XEH_preInit.sqf | 2 ++ addons/maptools/XEH_preInit.sqf | 2 ++ addons/markers/XEH_preInit.sqf | 2 ++ addons/medical/XEH_preInit.sqf | 2 ++ addons/medical_ai/XEH_preInit.sqf | 2 ++ addons/medical_blood/XEH_preInit.sqf | 2 ++ addons/medical_menu/XEH_preInit.sqf | 2 ++ addons/microdagr/XEH_preInit.sqf | 2 ++ addons/minedetector/XEH_preInit.sqf | 2 ++ addons/missionmodules/XEH_preInit.sqf | 2 ++ addons/mk6mortar/XEH_preInit.sqf | 2 ++ addons/modules/XEH_preInit.sqf | 2 ++ addons/movement/XEH_preInit.sqf | 2 ++ addons/nametags/XEH_preInit.sqf | 2 ++ addons/nightvision/XEH_preInit.sqf | 2 ++ addons/optics/XEH_preInit.sqf | 2 ++ addons/optionsmenu/XEH_preInit.sqf | 2 ++ addons/overheating/XEH_preInit.sqf | 2 ++ addons/overpressure/XEH_preInit.sqf | 2 ++ addons/parachute/XEH_preInit.sqf | 2 ++ addons/rangecard/XEH_preInit.sqf | 2 ++ addons/rearm/XEH_preInit.sqf | 2 ++ addons/recoil/XEH_preInit.sqf | 2 ++ addons/refuel/XEH_preInit.sqf | 2 ++ addons/reload/XEH_preInit.sqf | 2 ++ addons/reloadlaunchers/XEH_preInit.sqf | 2 ++ addons/repair/XEH_preInit.sqf | 2 ++ addons/respawn/XEH_preInit.sqf | 2 ++ addons/safemode/XEH_preInit.sqf | 2 ++ addons/sandbag/XEH_preInit.sqf | 2 ++ addons/scopes/XEH_preInit.sqf | 2 ++ addons/slideshow/XEH_preInit.sqf | 2 ++ addons/spectator/XEH_preInit.sqf | 2 ++ addons/spottingscope/XEH_preInit.sqf | 2 ++ addons/switchunits/XEH_preInit.sqf | 2 ++ addons/tacticalladder/XEH_preInit.sqf | 2 ++ addons/tagging/XEH_preInit.sqf | 2 ++ addons/trenches/XEH_preInit.sqf | 2 ++ addons/tripod/XEH_preInit.sqf | 2 ++ addons/ui/XEH_preInit.sqf | 2 ++ addons/vector/XEH_preInit.sqf | 2 ++ addons/vehiclelock/XEH_preInit.sqf | 2 ++ addons/vehicles/XEH_preInit.sqf | 2 ++ addons/viewdistance/XEH_preInit.sqf | 2 ++ addons/weaponselect/XEH_preInit.sqf | 2 ++ addons/weather/XEH_preInit.sqf | 2 ++ addons/winddeflection/XEH_preInit.sqf | 2 ++ addons/yardage450/XEH_preInit.sqf | 2 ++ addons/zeus/XEH_preInit.sqf | 2 ++ 91 files changed, 198 insertions(+) diff --git a/addons/advanced_ballistics/XEH_preInit.sqf b/addons/advanced_ballistics/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/advanced_ballistics/XEH_preInit.sqf +++ b/addons/advanced_ballistics/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/advanced_fatigue/XEH_preInit.sqf b/addons/advanced_fatigue/XEH_preInit.sqf index 9b799a0816..7d682e7db6 100644 --- a/addons/advanced_fatigue/XEH_preInit.sqf +++ b/addons/advanced_fatigue/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; //#include "initSettings.sqf" GVAR(staminaBarWidth) = 10 * (((safezoneW / safezoneH) min 1.2) / 40); diff --git a/addons/advanced_throwing/XEH_preInit.sqf b/addons/advanced_throwing/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/advanced_throwing/XEH_preInit.sqf +++ b/addons/advanced_throwing/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/atragmx/XEH_preInit.sqf b/addons/atragmx/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/atragmx/XEH_preInit.sqf +++ b/addons/atragmx/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/attach/XEH_preInit.sqf b/addons/attach/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/attach/XEH_preInit.sqf +++ b/addons/attach/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/backpacks/XEH_preInit.sqf b/addons/backpacks/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/backpacks/XEH_preInit.sqf +++ b/addons/backpacks/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 81657a8960..641da1f5c8 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(captivityEnabled) = false; diff --git a/addons/cargo/XEH_preInit.sqf b/addons/cargo/XEH_preInit.sqf index a24ce048b5..7784968d3f 100644 --- a/addons/cargo/XEH_preInit.sqf +++ b/addons/cargo/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(initializedItemClasses) = []; GVAR(initializedVehicleClasses) = []; diff --git a/addons/chemlights/XEH_preInit.sqf b/addons/chemlights/XEH_preInit.sqf index 7d00e938cf..7fe826a174 100644 --- a/addons/chemlights/XEH_preInit.sqf +++ b/addons/chemlights/XEH_preInit.sqf @@ -3,6 +3,8 @@ ADDON = false; LOG(MSG_INIT); +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index eca1aebf36..355ffb2a7d 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -3,7 +3,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(syncedEvents) = [] call CBA_fnc_hashCreate; GVAR(showHudHash) = [] call CBA_fnc_hashCreate; diff --git a/addons/concertina_wire/XEH_preInit.sqf b/addons/concertina_wire/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/concertina_wire/XEH_preInit.sqf +++ b/addons/concertina_wire/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/cookoff/XEH_preInit.sqf b/addons/cookoff/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/cookoff/XEH_preInit.sqf +++ b/addons/cookoff/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/dagr/XEH_preInit.sqf b/addons/dagr/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/dagr/XEH_preInit.sqf +++ b/addons/dagr/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/disarming/XEH_preInit.sqf b/addons/disarming/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/disarming/XEH_preInit.sqf +++ b/addons/disarming/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/disposable/XEH_preInit.sqf b/addons/disposable/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/disposable/XEH_preInit.sqf +++ b/addons/disposable/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/dogtags/XEH_preInit.sqf b/addons/dogtags/XEH_preInit.sqf index 434496058f..a7a080b91e 100644 --- a/addons/dogtags/XEH_preInit.sqf +++ b/addons/dogtags/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(disabledFactions) = [] call CBA_fnc_createNamespace; diff --git a/addons/dragging/XEH_preInit.sqf b/addons/dragging/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/dragging/XEH_preInit.sqf +++ b/addons/dragging/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index 16a9a4124b..65bebfd321 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -17,7 +17,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; if (isServer) then { GVAR(explosivesOrientations) = [] diff --git a/addons/fastroping/XEH_preInit.sqf b/addons/fastroping/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/fastroping/XEH_preInit.sqf +++ b/addons/fastroping/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/fcs/XEH_preInit.sqf b/addons/fcs/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/fcs/XEH_preInit.sqf +++ b/addons/fcs/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/finger/XEH_preInit.sqf b/addons/finger/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/finger/XEH_preInit.sqf +++ b/addons/finger/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/frag/XEH_preInit.sqf b/addons/frag/XEH_preInit.sqf index b07f1df773..da87d01194 100644 --- a/addons/frag/XEH_preInit.sqf +++ b/addons/frag/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(replacedBisArtyWrapper) = true; GVAR(blackList) = []; diff --git a/addons/gestures/XEH_preInit.sqf b/addons/gestures/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/gestures/XEH_preInit.sqf +++ b/addons/gestures/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/gforces/XEH_preInit.sqf b/addons/gforces/XEH_preInit.sqf index 99e6461c54..7530cabc45 100644 --- a/addons/gforces/XEH_preInit.sqf +++ b/addons/gforces/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(GForces) = []; GVAR(GForces_Index) = 0; diff --git a/addons/goggles/XEH_preInit.sqf b/addons/goggles/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/goggles/XEH_preInit.sqf +++ b/addons/goggles/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/grenades/XEH_preInit.sqf b/addons/grenades/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/grenades/XEH_preInit.sqf +++ b/addons/grenades/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/gunbag/XEH_preInit.sqf b/addons/gunbag/XEH_preInit.sqf index 73b1a7ea75..cac548d134 100644 --- a/addons/gunbag/XEH_preInit.sqf +++ b/addons/gunbag/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; // restore gunbag info after respawn ["CAManBase", "respawn", { diff --git a/addons/hearing/XEH_preInit.sqf b/addons/hearing/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/hearing/XEH_preInit.sqf +++ b/addons/hearing/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/hitreactions/XEH_preInit.sqf b/addons/hitreactions/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/hitreactions/XEH_preInit.sqf +++ b/addons/hitreactions/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/huntir/XEH_preInit.sqf b/addons/huntir/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/huntir/XEH_preInit.sqf +++ b/addons/huntir/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index 8711f8c180..817693c93c 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(ActNamespace) = [] call CBA_fnc_createNamespace; GVAR(ActSelfNamespace) = [] call CBA_fnc_createNamespace; diff --git a/addons/interaction/XEH_preInit.sqf b/addons/interaction/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/interaction/XEH_preInit.sqf +++ b/addons/interaction/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/inventory/XEH_preInit.sqf b/addons/inventory/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/inventory/XEH_preInit.sqf +++ b/addons/inventory/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/javelin/XEH_preInit.sqf b/addons/javelin/XEH_preInit.sqf index 8c892c87cd..b404d35889 100644 --- a/addons/javelin/XEH_preInit.sqf +++ b/addons/javelin/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(isLockKeyDown) = false; GVAR(pfehID) = -1; diff --git a/addons/kestrel4500/XEH_preInit.sqf b/addons/kestrel4500/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/kestrel4500/XEH_preInit.sqf +++ b/addons/kestrel4500/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/laser/XEH_preInit.sqf b/addons/laser/XEH_preInit.sqf index 2a68b0b3c3..2c4e7c7f4f 100644 --- a/addons/laser/XEH_preInit.sqf +++ b/addons/laser/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; // Laser default variables ACE_DEFAULT_LASER_CODE = 1111; diff --git a/addons/laserpointer/XEH_preInit.sqf b/addons/laserpointer/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/laserpointer/XEH_preInit.sqf +++ b/addons/laserpointer/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/logistics_uavbattery/XEH_preInit.sqf b/addons/logistics_uavbattery/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/logistics_uavbattery/XEH_preInit.sqf +++ b/addons/logistics_uavbattery/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/logistics_wirecutter/XEH_preInit.sqf b/addons/logistics_wirecutter/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/logistics_wirecutter/XEH_preInit.sqf +++ b/addons/logistics_wirecutter/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/magazinerepack/XEH_preInit.sqf b/addons/magazinerepack/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/magazinerepack/XEH_preInit.sqf +++ b/addons/magazinerepack/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/main/script_debug.hpp b/addons/main/script_debug.hpp index 92f58e1f96..d0574bcd32 100644 --- a/addons/main/script_debug.hpp +++ b/addons/main/script_debug.hpp @@ -1,3 +1,20 @@ +/** +Fast Recompiling via function +**/ +// #define DISABLE_COMPILE_CACHE +// To Use: [] call ACE_PREP_RECOMPILE; + +#ifdef DISABLE_COMPILE_CACHE + #define LINKFUNC(x) {_this call FUNC(x)} + #define PREP_RECOMPILE_START if (isNil "ACE_PREP_RECOMPILE") then {ACE_RECOMPILES = []; ACE_PREP_RECOMPILE = {{call _x} forEach ACE_RECOMPILES;}}; private _recomp = { + #define PREP_RECOMPILE_END }; call _recomp; ACE_RECOMPILES pushBack _recomp; +#else + #define LINKFUNC(x) FUNC(x) + #define PREP_RECOMPILE_START /* */ + #define PREP_RECOMPILE_END /* */ +#endif + + /** STACK TRACING **/ @@ -23,6 +40,7 @@ STACK TRACING PERFORMANCE COUNTERS SECTION **/ //#define ENABLE_PERFORMANCE_COUNTERS +// To Use: [] call ace_common_fnc_dumpPerformanceCounters; #ifdef ENABLE_PERFORMANCE_COUNTERS #define CBA_fnc_addPerFrameHandler { _ret = [(_this select 0), (_this select 1), (_this select 2), #function] call CBA_fnc_addPerFrameHandler; if(isNil "ACE_PFH_COUNTER" ) then { ACE_PFH_COUNTER=[]; }; ACE_PFH_COUNTER pushBack [[_ret, __FILE__, __LINE__], [(_this select 0), (_this select 1), (_this select 2)]]; _ret } diff --git a/addons/map/XEH_preInit.sqf b/addons/map/XEH_preInit.sqf index 7d00e938cf..7fe826a174 100644 --- a/addons/map/XEH_preInit.sqf +++ b/addons/map/XEH_preInit.sqf @@ -3,6 +3,8 @@ ADDON = false; LOG(MSG_INIT); +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/map_gestures/XEH_preInit.sqf b/addons/map_gestures/XEH_preInit.sqf index 198d66e02d..92387036e4 100644 --- a/addons/map_gestures/XEH_preInit.sqf +++ b/addons/map_gestures/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(GroupColorCfgMappingNew) = call CBA_fnc_createNamespace; diff --git a/addons/maptools/XEH_preInit.sqf b/addons/maptools/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/maptools/XEH_preInit.sqf +++ b/addons/maptools/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/markers/XEH_preInit.sqf b/addons/markers/XEH_preInit.sqf index da62205b51..7ee91d67e5 100644 --- a/addons/markers/XEH_preInit.sqf +++ b/addons/markers/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; // init marker types if (isNil QGVAR(MarkersCache)) then { diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index ff161ef2ab..45a2d2b6b7 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(injuredUnitCollection) = []; diff --git a/addons/medical_ai/XEH_preInit.sqf b/addons/medical_ai/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/medical_ai/XEH_preInit.sqf +++ b/addons/medical_ai/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/medical_blood/XEH_preInit.sqf b/addons/medical_blood/XEH_preInit.sqf index fd97dfda93..9cf50a1b60 100644 --- a/addons/medical_blood/XEH_preInit.sqf +++ b/addons/medical_blood/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; // blood object model namespace GVAR(models) = [] call CBA_fnc_createNamespace; diff --git a/addons/medical_menu/XEH_preInit.sqf b/addons/medical_menu/XEH_preInit.sqf index 009a9ed1a6..16e448fc38 100644 --- a/addons/medical_menu/XEH_preInit.sqf +++ b/addons/medical_menu/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(INTERACTION_TARGET) = objNull; GVAR(actionsOther) = []; diff --git a/addons/microdagr/XEH_preInit.sqf b/addons/microdagr/XEH_preInit.sqf index ba262ec8c5..c6cdd0bbef 100644 --- a/addons/microdagr/XEH_preInit.sqf +++ b/addons/microdagr/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; //Functions that are called for each draw of the map: GVAR(miniMapDrawHandlers) = []; diff --git a/addons/minedetector/XEH_preInit.sqf b/addons/minedetector/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/minedetector/XEH_preInit.sqf +++ b/addons/minedetector/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/missionmodules/XEH_preInit.sqf b/addons/missionmodules/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/missionmodules/XEH_preInit.sqf +++ b/addons/missionmodules/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/mk6mortar/XEH_preInit.sqf +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/modules/XEH_preInit.sqf b/addons/modules/XEH_preInit.sqf index 419cd902b5..cb884af1f5 100644 --- a/addons/modules/XEH_preInit.sqf +++ b/addons/modules/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(moduleInitCollection) = []; diff --git a/addons/movement/XEH_preInit.sqf b/addons/movement/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/movement/XEH_preInit.sqf +++ b/addons/movement/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/nametags/XEH_preInit.sqf +++ b/addons/nametags/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/nightvision/XEH_preInit.sqf b/addons/nightvision/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/nightvision/XEH_preInit.sqf +++ b/addons/nightvision/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/optics/XEH_preInit.sqf b/addons/optics/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/optics/XEH_preInit.sqf +++ b/addons/optics/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/optionsmenu/XEH_preInit.sqf b/addons/optionsmenu/XEH_preInit.sqf index 8b6f55a0ca..57e017e054 100644 --- a/addons/optionsmenu/XEH_preInit.sqf +++ b/addons/optionsmenu/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(clientSideOptions) = []; GVAR(clientSideColors) = []; diff --git a/addons/overheating/XEH_preInit.sqf b/addons/overheating/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/overheating/XEH_preInit.sqf +++ b/addons/overheating/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/overpressure/XEH_preInit.sqf b/addons/overpressure/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/overpressure/XEH_preInit.sqf +++ b/addons/overpressure/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/parachute/XEH_preInit.sqf b/addons/parachute/XEH_preInit.sqf index bffa5623b8..227fa9e38c 100644 --- a/addons/parachute/XEH_preInit.sqf +++ b/addons/parachute/XEH_preInit.sqf @@ -17,6 +17,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/rangecard/XEH_preInit.sqf b/addons/rangecard/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/rangecard/XEH_preInit.sqf +++ b/addons/rangecard/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/rearm/XEH_preInit.sqf b/addons/rearm/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/rearm/XEH_preInit.sqf +++ b/addons/rearm/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/recoil/XEH_preInit.sqf b/addons/recoil/XEH_preInit.sqf index c503c2edbc..ffd1bfc414 100644 --- a/addons/recoil/XEH_preInit.sqf +++ b/addons/recoil/XEH_preInit.sqf @@ -3,6 +3,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/refuel/XEH_preInit.sqf b/addons/refuel/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/refuel/XEH_preInit.sqf +++ b/addons/refuel/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/reload/XEH_preInit.sqf b/addons/reload/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/reload/XEH_preInit.sqf +++ b/addons/reload/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/reloadlaunchers/XEH_preInit.sqf b/addons/reloadlaunchers/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/reloadlaunchers/XEH_preInit.sqf +++ b/addons/reloadlaunchers/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/repair/XEH_preInit.sqf b/addons/repair/XEH_preInit.sqf index 7d9578b8ec..8e6a606f0f 100644 --- a/addons/repair/XEH_preInit.sqf +++ b/addons/repair/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ["ACE_RepairItem_Base", "killed", { params ["_object"]; diff --git a/addons/respawn/XEH_preInit.sqf b/addons/respawn/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/respawn/XEH_preInit.sqf +++ b/addons/respawn/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/safemode/XEH_preInit.sqf b/addons/safemode/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/safemode/XEH_preInit.sqf +++ b/addons/safemode/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/sandbag/XEH_preInit.sqf b/addons/sandbag/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/sandbag/XEH_preInit.sqf +++ b/addons/sandbag/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/scopes/XEH_preInit.sqf b/addons/scopes/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/scopes/XEH_preInit.sqf +++ b/addons/scopes/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/slideshow/XEH_preInit.sqf b/addons/slideshow/XEH_preInit.sqf index 8943a367f8..fdd70d447b 100644 --- a/addons/slideshow/XEH_preInit.sqf +++ b/addons/slideshow/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(slideshows) = 0; diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf index bdf0c72bd4..4bdf07b3a1 100644 --- a/addons/spectator/XEH_preInit.sqf +++ b/addons/spectator/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; // Reset the stored display SETUVAR(GVAR(interface),displayNull); diff --git a/addons/spottingscope/XEH_preInit.sqf b/addons/spottingscope/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/spottingscope/XEH_preInit.sqf +++ b/addons/spottingscope/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/switchunits/XEH_preInit.sqf b/addons/switchunits/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/switchunits/XEH_preInit.sqf +++ b/addons/switchunits/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/tacticalladder/XEH_preInit.sqf b/addons/tacticalladder/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/tacticalladder/XEH_preInit.sqf +++ b/addons/tacticalladder/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/tagging/XEH_preInit.sqf b/addons/tagging/XEH_preInit.sqf index 66458c6995..e1487c671f 100644 --- a/addons/tagging/XEH_preInit.sqf +++ b/addons/tagging/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(cachedTags) = []; GVAR(cachedRequiredItems) = []; diff --git a/addons/trenches/XEH_preInit.sqf b/addons/trenches/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/trenches/XEH_preInit.sqf +++ b/addons/trenches/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/tripod/XEH_preInit.sqf b/addons/tripod/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/tripod/XEH_preInit.sqf +++ b/addons/tripod/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/ui/XEH_preInit.sqf b/addons/ui/XEH_preInit.sqf index 3dee364f02..b937d5d81c 100644 --- a/addons/ui/XEH_preInit.sqf +++ b/addons/ui/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; GVAR(interfaceInitialized) = false; diff --git a/addons/vector/XEH_preInit.sqf b/addons/vector/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/vector/XEH_preInit.sqf +++ b/addons/vector/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/vehiclelock/XEH_preInit.sqf b/addons/vehiclelock/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/vehiclelock/XEH_preInit.sqf +++ b/addons/vehiclelock/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/vehicles/XEH_preInit.sqf b/addons/vehicles/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/vehicles/XEH_preInit.sqf +++ b/addons/vehicles/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/viewdistance/XEH_preInit.sqf b/addons/viewdistance/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/viewdistance/XEH_preInit.sqf +++ b/addons/viewdistance/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/weaponselect/XEH_preInit.sqf b/addons/weaponselect/XEH_preInit.sqf index 4166247505..0335ee5fda 100644 --- a/addons/weaponselect/XEH_preInit.sqf +++ b/addons/weaponselect/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; // collect frag and other grenades separately GVAR(GrenadesAll) = []; diff --git a/addons/weather/XEH_preInit.sqf b/addons/weather/XEH_preInit.sqf index f0161c7173..1b551f133e 100644 --- a/addons/weather/XEH_preInit.sqf +++ b/addons/weather/XEH_preInit.sqf @@ -3,7 +3,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; // Make sure this data is read before client/server postInit call FUNC(getMapData); diff --git a/addons/winddeflection/XEH_preInit.sqf b/addons/winddeflection/XEH_preInit.sqf index 9104abccdb..ad1c47f67c 100644 --- a/addons/winddeflection/XEH_preInit.sqf +++ b/addons/winddeflection/XEH_preInit.sqf @@ -12,6 +12,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/yardage450/XEH_preInit.sqf b/addons/yardage450/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/addons/yardage450/XEH_preInit.sqf +++ b/addons/yardage450/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/addons/zeus/XEH_preInit.sqf b/addons/zeus/XEH_preInit.sqf index 47a1adefa3..a55f9c304e 100644 --- a/addons/zeus/XEH_preInit.sqf +++ b/addons/zeus/XEH_preInit.sqf @@ -2,7 +2,9 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; if (isServer) then { [QGVAR(zeusUnitAssigned), FUNC(handleZeusUnitAssigned)] call CBA_fnc_addEventHandler; From 87b96717570c2ac9fea92967bbc10f2d314dc53b Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 24 Nov 2016 00:11:25 +0100 Subject: [PATCH 214/826] AdvancedBallistics - Abort after adjusting the muzzle velocity (#4700) * Always adjust the muzzle velocity when advanced ballistics is enabled --- .../functions/fnc_handleFired.sqf | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index 7085224771..28fe9c5680 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -42,12 +42,6 @@ if (!GVAR(simulateForEveryone) && !(local _unit)) then { //if (!GVAR(vehicleGunnerEnabled) && !(_unit isKindOf "Man")) then { _abort = true; }; // We currently do not have firedEHs on vehicles if (GVAR(disabledInFullAutoMode) && getNumber(configFile >> "CfgWeapons" >> _weapon >> _mode >> "autoFire") == 1) then { _abort = true; }; -if (_abort || !(GVAR(extensionAvailable))) exitWith { - if (missionNamespace getVariable [QEGVAR(windDeflection,enabled), false]) then { - EGVAR(windDeflection,trackedBullets) pushBack [_projectile, getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction")]; - }; -}; - // Get Weapon and Ammo Configurations _AmmoCacheEntry = uiNamespace getVariable format[QGVAR(%1), _ammo]; if (isNil "_AmmoCacheEntry") then { @@ -86,6 +80,12 @@ if (GVAR(ammoTemperatureEnabled) || GVAR(barrelLengthInfluenceEnabled)) then { }; }; +if (_abort || !(GVAR(extensionAvailable))) exitWith { + if (missionNamespace getVariable [QEGVAR(windDeflection,enabled), false]) then { + EGVAR(windDeflection,trackedBullets) pushBack [_projectile, getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction")]; + }; +}; + _bulletTraceVisible = false; if (GVAR(bulletTraceEnabled) && cameraView == "GUNNER") then { if (currentWeapon ACE_player == binocular ACE_player) then { From a89bcd65d73d69698cc32f7b6d6f273d7f7a8fbe Mon Sep 17 00:00:00 2001 From: jonpas Date: Thu, 24 Nov 2016 11:07:29 +0100 Subject: [PATCH 215/826] Remove build number from release archive --- tools/make.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/make.py b/tools/make.py index e7d5adbd68..053af8297c 100644 --- a/tools/make.py +++ b/tools/make.py @@ -1431,7 +1431,7 @@ See the make.cfg file for additional build options. # Make release if make_release_zip: - release_name = "{}_{}".format(zipPrefix, project_version) + release_name = "{}_{}".format(zipPrefix, project_version.rsplit(".", 1)[0]) try: # Delete all log files From f9e273237fa57e623150d915d32db907eb46f45e Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 24 Nov 2016 19:40:34 +0100 Subject: [PATCH 216/826] Advanced Ballistics - extension rebuilt (#4706) --- ace_advanced_ballistics.dll | Bin 265216 -> 265728 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/ace_advanced_ballistics.dll b/ace_advanced_ballistics.dll index f5f5c19c26759564efda46b6e7710d63622e2d46..8b538191eb088ec4fb41f4371cac48ed845d8910 100644 GIT binary patch delta 59526 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 delta 59263 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 z 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 Date: Fri, 25 Nov 2016 00:11:27 +0100 Subject: [PATCH 217/826] Add module documentation (#4297) --- docs/wiki/feature/modules.md | 8 ++++- docs/wiki/framework/modules-framework.md | 43 ++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 docs/wiki/framework/modules-framework.md diff --git a/docs/wiki/feature/modules.md b/docs/wiki/feature/modules.md index 771ea1365f..85a809896e 100644 --- a/docs/wiki/feature/modules.md +++ b/docs/wiki/feature/modules.md @@ -14,8 +14,14 @@ version: ## 1. Overview -This is taking care of module initialization **DO NOT REMOVE**. +This is taking care of module initialization. It lets us ensure that modules placed in the editor run when they are supposed to. ## 2. Dependencies {% include dependencies_list.md component="modules" %} + +> Note: The Modules module is required by nearly all other modules. Do NOT remove it! + +## 3. Usage + +For technical usage and instructions, please refer to our [framework documentation about the module component] ({{site.baseUrl}}/wiki/framework/modules-framework.html). diff --git a/docs/wiki/framework/modules-framework.md b/docs/wiki/framework/modules-framework.md new file mode 100644 index 0000000000..e65337c771 --- /dev/null +++ b/docs/wiki/framework/modules-framework.md @@ -0,0 +1,43 @@ +--- +layout: wiki +title: Modules Framework +description: The ACE3 Modules framework provides a module base class that lets you initialize modules in unscheduled execution space. +group: framework +order: 5 +parent: wiki +--- + +## 1. Overview + +The ACE3 Modules framework provides a module base class that lets you initialize modules in unscheduled execution space. This lets us ensure that modules placed in the editor run when they are supposed to. + +## 2. How it Works + +It provides a nearly identical interface too the [Arma 3 modules framework](https://community.bistudio.com/wiki/Arma_3_Module_Framework){:target="_blank"}. The biggest issue with the Arma 3 modules is that they run in scheduled space. This means that there is no guarantee when a module initializes. + +To solve this, we have build a framework on top of the Arma 3 modules framework. For the Arma 3 framework, your modules inherit from `Module_F`. To make use of the ACE3 Module framework, you will need to inherit from `ACE_Module`. + +## 3. Limitations + +Because we at the moment do not need all the functionality from the Arma 3 Modules framework within ACE, we officially only support modules that execute once (on mission start). Our prime use case are settings modules. + +Other use cases may work, however are not supported by us. Use at your own risk. + +## 4. Examples + +```cpp +class CfgVehicles { + class ACE_Module; + class ACE_bananaModule: ACE_Module { + scope = 2; + displayName = "Spawn Banana"; + category = "ACE"; + function = "ace_fnc_bananaModuleInit"; + functionPriority = 10; + isGlobal = 0; + isTriggerActivated = 0; + isDisposable = 0; + author = "Monkey123"; + }; +}; +``` From a6fa317d93d067bda380a131a3ed8de67afb8a4c Mon Sep 17 00:00:00 2001 From: jonpas Date: Fri, 25 Nov 2016 00:14:28 +0100 Subject: [PATCH 218/826] Add GitHub Changelog Generator configuration file (#4705) --- .github_changelog_generator | 22 ++++++++++++++++++++++ .gitignore | 1 + 2 files changed, 23 insertions(+) create mode 100644 .github_changelog_generator diff --git a/.github_changelog_generator b/.github_changelog_generator new file mode 100644 index 0000000000..7cc05cbb0d --- /dev/null +++ b/.github_changelog_generator @@ -0,0 +1,22 @@ +# No issues and PRs without labels +issues=false +pr-wo-labels=false + +# Issues are disabled, don't fetch them +max-issues=0 + +# Label filters +exclude-labels=by design,can't reproduce,duplicate,question,invalid,wontfix,translation,ignore changelog +bug-labels=conflict,bug,critical bug +enhancement-labels=enhancement,feature request,Focus Feature + +# Tag is created before generating changelog for release candidates +unreleased=false + +# No section labels, we only want a list of merged PRs (label separation only works for Issues) +simple-list=true + +# Misc +author=false +compare-link=false +header-label=## Change Log Summary diff --git a/.gitignore b/.gitignore index 5aebbbd408..1d60d27088 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ texHeaders.bin *.swo *.biprivatekey Thumbs.db +CHANGELOG.md From b2ba95913ad4738af66de85f741f24f14990c5c9 Mon Sep 17 00:00:00 2001 From: ulteq Date: Fri, 25 Nov 2016 00:15:04 +0100 Subject: [PATCH 219/826] ATragMX - Truing Drop fix (#4704) * Fixes a bug in the truing drop feature that occurs when the zero range is greater than the truing range --- addons/atragmx/functions/fnc_calculate_truing_drop.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/atragmx/functions/fnc_calculate_truing_drop.sqf b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf index ddc57bdb96..38d19456da 100644 --- a/addons/atragmx/functions/fnc_calculate_truing_drop.sqf +++ b/addons/atragmx/functions/fnc_calculate_truing_drop.sqf @@ -34,8 +34,8 @@ if (_parseInput) then { _subsonicRange = _transonicRange max _subsonicRange; - _transonicDrop = 0 max abs(parseNumber(ctrlText 18013)) min 1000; - _subsonicDrop = 0 max abs(parseNumber(ctrlText 18014)) min 1000; + _transonicDrop = -100 max parseNumber(ctrlText 18013) min 100; + _subsonicDrop = -100 max parseNumber(ctrlText 18014) min 100; private _dropUnit = GVAR(currentScopeUnit); if (_dropUnit == 3) then { switch (GVAR(currentScopeClickUnit)) do { From 7d22fce8da3f244bbf4ee82b15d6c73d68ee39e3 Mon Sep 17 00:00:00 2001 From: ulteq Date: Fri, 25 Nov 2016 00:15:41 +0100 Subject: [PATCH 220/826] Advanced Ballistics - New default simulation interval (#4707) --- addons/advanced_ballistics/ACE_Settings.hpp | 2 +- addons/advanced_ballistics/CfgVehicles.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/advanced_ballistics/ACE_Settings.hpp b/addons/advanced_ballistics/ACE_Settings.hpp index 9815cc8491..0c2265619a 100644 --- a/addons/advanced_ballistics/ACE_Settings.hpp +++ b/addons/advanced_ballistics/ACE_Settings.hpp @@ -69,7 +69,7 @@ class ACE_Settings { displayName = CSTRING(simulationInterval_DisplayName); description = CSTRING(simulationInterval_Description); typeName = "SCALAR"; - value = 0.0; + value = 0.05; }; class GVAR(simulationRadius) { category = CSTRING(DisplayName); diff --git a/addons/advanced_ballistics/CfgVehicles.hpp b/addons/advanced_ballistics/CfgVehicles.hpp index 804a6e9236..151972ea02 100644 --- a/addons/advanced_ballistics/CfgVehicles.hpp +++ b/addons/advanced_ballistics/CfgVehicles.hpp @@ -71,7 +71,7 @@ class CfgVehicles { displayName = CSTRING(simulationInterval_DisplayName); description = CSTRING(simulationInterval_Description); typeName = "NUMBER"; - defaultValue = 0.0; + defaultValue = 0.05; }; class simulationRadius { displayName = CSTRING(simulationRadius_DisplayName); From aaebdc37526445e33789a48c65e9c43ee919d02f Mon Sep 17 00:00:00 2001 From: ulteq Date: Fri, 25 Nov 2016 10:29:49 +0100 Subject: [PATCH 221/826] ATragMX - Minimize the integration error (#4703) * The goal is to keep the error below 0.1 MRAD --- addons/atragmx/functions/fnc_calculate_target_solution.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index bdc8f0ab11..46eeea520a 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -70,7 +70,7 @@ _inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget); _targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget); _targetRange = GVAR(targetRange) select GVAR(currentTarget); -GVAR(targetSolutionInput) = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 100, +GVAR(targetSolutionInput) = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 200, [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude, _directionOfFire]; private _result = GVAR(targetSolutionInput) call FUNC(calculate_solution); From 05ddca5b90a6fc3341185a1bc25342e013920055 Mon Sep 17 00:00:00 2001 From: classic Date: Sat, 26 Nov 2016 02:50:07 +0900 Subject: [PATCH 222/826] Jpn translation v382 (#4710) * jpn scopes translation this is Japanese translation for scope * fix jpn weather translation Fix for Weather japanese translation * fix jpn Repair translation fix jpn Repair translation * jpn zeus translation Japanese localization for zeus --- addons/repair/stringtable.xml | 2 +- addons/scopes/stringtable.xml | 22 +++++++++++++++++++++- addons/weather/stringtable.xml | 4 ++-- addons/zeus/stringtable.xml | 5 +++++ 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index caff823745..dbeb4db9b3 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -845,7 +845,7 @@ Nastavení oprav Impostazioni Riparazioni Réglages de réparation - 車両の全種類に修理システムを適用しますか? + 修理設定 Provides a repair system for all types of vehicles. diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index bffaeb0301..433e7cfcfc 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -3,60 +3,79 @@ Scopes + スコープ Enable ACE Scope adjustment + ACE スコープ調節を有効化 Enable adjustmet turrets on high powered scopes + 高倍率スコープでACE スコープ調節を有効化 Force adjustment turrets + ACE スコープ調節を有効化 Force usage of adjustmet turrets on high powered scopes + 高倍率スコープで調整の使用を強制させます Correct zeroing + ゼロイン調節 Corrects the zeroing of all small arms sights + 全ての小口径用照準器のゼロインを調節します Overwrite zero distance + ゼロイン距離を上書き Uses the 'defaultZeroRange' setting to overwrite the zero range of high power scopes + 'defaultZeroRange'設定を使う高倍率スコープのゼロイン距離を上書きします Default zero distance + 標準のゼロイン距離 High power scopes will be zeroed at this distance + 高倍率スコープのゼロイン距離はこの設定になります Reference temperature + 温度の参照 Temperature at which the scope was zeroed + スコープがゼロインされる温度 Reference barometric pressure + 気圧の参照 Barometric pressure at which the scope was zeroed + 気圧の参照 Reference humidity + 湿度の参照 Humidity at which the scope was zeroed + スコープがゼロインされる湿度 Deduce pressure from altitude + 高度により圧が減少 Deduce the barometric pressure from the terrain altitude + 標高により気圧が減少されます Minor adjustment up @@ -177,6 +196,7 @@ This module adds windage and elevation adjustment turrets on high power rifle scopes. + モジュールは高倍率ライフル スコープにおいて横風と仰角の調節ができます。 - \ No newline at end of file + diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 0a241488b9..879e77f808 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -38,7 +38,7 @@ Időjárás Погода Meteo - ACE 天候モジュールではマルチプレイで同期します。 + 天候 Multiplayer synchronized ACE weather module @@ -210,4 +210,4 @@ 天候を更新する間隔を定義します。(秒) - \ No newline at end of file + diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index a120c27c08..1526e3a2bb 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -207,18 +207,23 @@ Update Editable Objects + 編集可能なオブジェクトを更新 All Curators + 全キュレーター Apply changes to all curators + 全キュレーターへ変更を適用 Remove Objects + オブジェクトの削除 Remove existing instead of adding new + 新しく追加するために削除します Global AI Skill From ed0fd5f6f65b4cbe59b785f7b6607572cece21eb Mon Sep 17 00:00:00 2001 From: magicsh0tz Date: Sat, 26 Nov 2016 02:18:04 +0800 Subject: [PATCH 223/826] Switched to CBA_fnc_waitAndExecute (#4709) * Switched to CBA_fnc_waitAndExecute * Switched to CBA_fnc_waitAndExecute --- optionals/compat_rhs_usf3/functions/fnc_onCut.sqf | 2 +- optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf b/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf index 3663a10bd5..1201d3ee18 100644 --- a/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf +++ b/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf @@ -26,7 +26,7 @@ if !(isNull _fries) then { [{ _this animateDoor ["doorRB", 0]; _this animateDoor ["doorLB", 0]; - }, _vehicle, 2] call EFUNC(common,waitAndExecute); + }, _vehicle, 2] call CBA_fnc_waitAndExecute; 4 } else { diff --git a/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf b/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf index d842a6c174..4bc7c03524 100644 --- a/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf +++ b/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf @@ -30,7 +30,7 @@ if !(isNull _fries) then { [{ _this animate ["extendHookRight", 1]; _this animate ["extendHookLeft", 1]; - }, _fries, 2] call EFUNC(common,waitAndExecute); + }, _fries, 2] call CBA_fnc_waitAndExecute; _waitTime = 4; }; From 8f16702e641aa085886290cf7d0b2874377ea7d9 Mon Sep 17 00:00:00 2001 From: ulteq Date: Fri, 25 Nov 2016 19:25:03 +0100 Subject: [PATCH 224/826] Advanced Ballistics - Performance improvement (#4708) * Up to 16% faster frame times with 200 simultaneously flying projectiles --- ace_advanced_ballistics.dll | Bin 265728 -> 265216 bytes .../AdvancedBallistics.cpp | 47 ++++++------------ 2 files changed, 14 insertions(+), 33 deletions(-) diff --git a/ace_advanced_ballistics.dll b/ace_advanced_ballistics.dll index 8b538191eb088ec4fb41f4371cac48ed845d8910..1af3d8ca3ce545c9e92cb5f4f722b76cabe0c4f7 100644 GIT binary patch delta 59452 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 H*C+lz1O4HL delta 60231 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%0Db^c~ojJ0`}IrA0TuHoef5ATl9 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 Vvuohw%ZkQ8U)0R)7JFyR{{hy>pX>kt diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp index c2875bb448..7e4a537678 100644 --- a/extensions/advanced_ballistics/AdvancedBallistics.cpp +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -14,6 +14,7 @@ #define ABSOLUTE_ZERO_IN_CELSIUS -273.15f #define KELVIN(t) (t - ABSOLUTE_ZERO_IN_CELSIUS) #define CELSIUS(t) (t + ABSOLUTE_ZERO_IN_CELSIUS) +#define EARTH_ANGULAR_SPEED 0.00007292f #define UNIVERSAL_GAS_CONSTANT 8.314f #define WATER_VAPOR_MOLAR_MASS 0.018016f #define DRY_AIR_MOLAR_MASS 0.028964f @@ -43,11 +44,7 @@ struct Bullet { double humidity; double overcast; double startTime; - double speed; - double frames; double lastFrame; - double hDeflection; - double spinDrift; double bcDegradation; unsigned randSeed; std::default_random_engine randGenerator; @@ -480,11 +477,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) bulletDatabase[index].overcast = overcast; bulletDatabase[index].startTime = tickTime; bulletDatabase[index].lastFrame = tickTime; - bulletDatabase[index].hDeflection = 0.0; - bulletDatabase[index].spinDrift = 0.0; bulletDatabase[index].bcDegradation = 1.0; - bulletDatabase[index].speed = 0.0; - bulletDatabase[index].frames = 0.0; bulletDatabase[index].randSeed = 0; strncpy_s(output, outputSize, "", _TRUNCATE); @@ -548,8 +541,6 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) double TOF = 0.0; double deltaT = 0.0; double bulletSpeed; - double bulletDir; - double bulletSpeedAvg = 0.0; double trueVelocity[3] = { 0.0, 0.0, 0.0 }; double trueSpeed = 0.0; double temperature = 0.0; @@ -557,7 +548,6 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) double windSpeed = 0.0; double windAttenuation = 1.0; double velocityOffset[3] = { 0.0, 0.0, 0.0 }; - double positionOffset[3] = { 0.0, 0.0, 0.0 }; TOF = tickTime - bulletDatabase[index].startTime; @@ -565,11 +555,6 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) bulletDatabase[index].lastFrame = tickTime; bulletSpeed = sqrt(pow(velocity[0], 2) + pow(velocity[1], 2) + pow(velocity[2], 2)); - bulletDir = atan2(velocity[0], velocity[1]); - - bulletDatabase[index].speed += bulletSpeed; - bulletDatabase[index].frames += 1; - bulletSpeedAvg = (bulletDatabase[index].speed / bulletDatabase[index].frames); windSpeed = sqrt(pow(wind[0], 2) + pow(wind[1], 2) + pow(wind[2], 2)); if (windSpeed > 0.1) { @@ -694,27 +679,23 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) } } - if (bulletSpeedAvg > 0) { - double distanceSqr = pow(bulletDatabase[index].origin[0] - position[0], 2) + pow(bulletDatabase[index].origin[1] - position[1], 2) + pow(bulletDatabase[index].origin[2] - position[2], 2); - double horizontalDeflection = 0.0000729 * distanceSqr * sin(bulletDatabase[index].latitude) / bulletSpeedAvg; - double horizontalDeflectionPartial = horizontalDeflection - bulletDatabase[index].hDeflection; - bulletDatabase[index].hDeflection = horizontalDeflection; - - positionOffset[0] += sin(bulletDir + M_PI / 2) * horizontalDeflectionPartial; - positionOffset[1] += cos(bulletDir + M_PI / 2) * horizontalDeflectionPartial; + if (TOF > 0) { + double bulletDir = atan2(velocity[0], velocity[1]); + double spinAccel = bulletDatabase[index].twistDirection * (0.0482251 * (bulletDatabase[index].stabilityFactor + 1.2)) / pow(TOF, 0.17); + velocityOffset[0] += sin(bulletDir + M_PI / 2) * spinAccel * deltaT; + velocityOffset[1] += cos(bulletDir + M_PI / 2) * spinAccel * deltaT; } - double centripetalAccel = 2 * 0.0000729 * (bulletDatabase[index].muzzleVelocity) * cos(bulletDatabase[index].latitude) * sin(bulletDir); - velocityOffset[2] += centripetalAccel * deltaT; + double lat = bulletDatabase[index].latitude; + accel[0] = 2 * EARTH_ANGULAR_SPEED * +(velocity[1] * sin(lat) - velocity[2] * cos(lat)); + accel[1] = 2 * EARTH_ANGULAR_SPEED * -(velocity[0] * sin(lat)); + accel[2] = 2 * EARTH_ANGULAR_SPEED * +(velocity[0] * cos(lat)); - double spinDrift = bulletDatabase[index].twistDirection * 0.0254 * 1.25 * (bulletDatabase[index].stabilityFactor + 1.2) * pow(TOF, 1.83); - double spinDriftPartial = spinDrift - bulletDatabase[index].spinDrift; - bulletDatabase[index].spinDrift = spinDrift; + velocityOffset[0] += accel[0] * deltaT; + velocityOffset[1] += accel[1] * deltaT; + velocityOffset[2] += accel[2] * deltaT; - positionOffset[0] += sin(bulletDir + M_PI / 2) * spinDriftPartial; - positionOffset[1] += cos(bulletDir + M_PI / 2) * spinDriftPartial; - - outputStr << "_bullet setVelocity (_bulletVelocity vectorAdd [" << velocityOffset[0] << "," << velocityOffset[1] << "," << velocityOffset[2] << "]); _bullet setPosASL (_bulletPosition vectorAdd [" << positionOffset[0] << "," << positionOffset[1] << "," << positionOffset[2] << "]);"; + outputStr << "_bullet setVelocity (_bulletVelocity vectorAdd [" << velocityOffset[0] << "," << velocityOffset[1] << "," << velocityOffset[2] << "]);"; strncpy_s(output, outputSize, outputStr.str().c_str(), _TRUNCATE); EXTENSION_RETURN(); } else if (!strcmp(mode, "set")) { From 23ff6252cf8af0320dd2d1e119d48c5edc61088f Mon Sep 17 00:00:00 2001 From: jonpas Date: Sat, 26 Nov 2016 00:38:06 +0100 Subject: [PATCH 225/826] Update blank component (#4711) --- extras/blank/README.md | 11 +++++++++++ extras/blank/XEH_preInit.sqf | 2 ++ extras/blank/functions/fnc_empty.sqf | 2 +- extras/blank/script_component.hpp | 1 - 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 extras/blank/README.md diff --git a/extras/blank/README.md b/extras/blank/README.md new file mode 100644 index 0000000000..abea8b9f37 --- /dev/null +++ b/extras/blank/README.md @@ -0,0 +1,11 @@ +ace_blank +=================== + +Adds blank feature. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Name](https://github.com/name) diff --git a/extras/blank/XEH_preInit.sqf b/extras/blank/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/extras/blank/XEH_preInit.sqf +++ b/extras/blank/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/extras/blank/functions/fnc_empty.sqf b/extras/blank/functions/fnc_empty.sqf index c60a82b2d8..9e8263e928 100644 --- a/extras/blank/functions/fnc_empty.sqf +++ b/extras/blank/functions/fnc_empty.sqf @@ -1,3 +1,3 @@ #include "script_component.hpp" -diag_log text format["This is here as an example!!!"]; +diag_log text format ["This is here as an example!!!"]; diff --git a/extras/blank/script_component.hpp b/extras/blank/script_component.hpp index 581cd319bb..d605d015ac 100644 --- a/extras/blank/script_component.hpp +++ b/extras/blank/script_component.hpp @@ -4,7 +4,6 @@ // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE -// #define CBA_DEBUG_SYNCHRONOUS // #define ENABLE_PERFORMANCE_COUNTERS #ifdef DEBUG_ENABLED_BLANK From dff577d5d119e6145eb56721d656a2914e313ae0 Mon Sep 17 00:00:00 2001 From: ulteq Date: Sun, 27 Nov 2016 09:56:23 +0100 Subject: [PATCH 226/826] ATragMX - Simplified Coriolis calculation (#4716) --- .../atragmx/functions/fnc_calculate_solution.sqf | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index f50f502cc4..836d785242 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -97,19 +97,12 @@ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) t _bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel])); }; -private ["_speedTotal", "_stepsTotal", "_speedAverage"]; -_speedTotal = 0; -_stepsTotal = 0; -_speedAverage = 0; - private ["_eoetvoesMultiplier"]; _eoetvoesMultiplier = 0; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _eoetvoesMultiplier = 2 * (0.0000729 * _muzzleVelocity / -9.80665) * cos(_latitude) * sin(_directionOfFire); }; -_TOF = 0; - _bulletPos set [0, 0]; _bulletPos set [1, 0]; _bulletPos set [2, -(_boreHeight / 100)]; @@ -121,10 +114,6 @@ _bulletVelocity set [2, Sin(_scopeBaseAngle) * _muzzleVelocity]; while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { _bulletSpeed = vectorMagnitude _bulletVelocity; - _speedTotal = _speedTotal + _bulletSpeed; - _stepsTotal = _stepsTotal + 1; - _speedAverage = (_speedTotal / _stepsTotal); - _trueVelocity = _bulletVelocity vectorDiff _wind1; _trueSpeed = vectorMagnitude _trueVelocity; @@ -162,7 +151,7 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then { // Coriolis - _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalDeflection = 0.0000729 * (_bulletPos select 1) * _TOF * sin(_latitude); _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); _windage1 = _windage1 + _horizontalCoriolis; _windage2 = _windage2 + _horizontalCoriolis; @@ -198,7 +187,7 @@ _kineticEnergy = _kineticEnergy * 0.737562149; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then { // Coriolis - _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalDeflection = 0.0000729 * (_bulletPos select 1) * _TOF * sin(_latitude); _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); _windage1 = _windage1 + _horizontalCoriolis; _windage2 = _windage2 + _horizontalCoriolis; From bc89a260ff7f2eb47a36cb7b776acd63ec85837b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 27 Nov 2016 16:38:33 -0600 Subject: [PATCH 227/826] AF - Remove setVar when removing eh --- addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf b/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf index c275b91cc8..9d33df10be 100644 --- a/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf +++ b/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf @@ -11,10 +11,13 @@ */ #include "script_component.hpp" params ["_newUnit", "_oldUnit"]; +TRACE_2("unit changed",_newUnit,_oldUnit); if !(isNull _oldUnit) then { _oldUnit enableStamina true; _oldUnit removeEventHandler ["AnimChanged", _oldUnit getVariable [QGVAR(animHandler), -1]]; + _oldUnit setVariable [QGVAR(animHandler), nil]; + TRACE_1("remove old",_oldUnit getVariable QGVAR(animHandler)); _oldUnit setVariable [QGVAR(ae1Reserve), GVAR(ae1Reserve)]; _oldUnit setVariable [QGVAR(ae2Reserve), GVAR(ae2Reserve)]; @@ -30,6 +33,7 @@ if (_newUnit getVariable [QGVAR(animHandler), -1] == -1) then { private _animHandler = _newUnit addEventHandler ["AnimChanged", { GVAR(animDuty) = _this call FUNC(getAnimDuty); }]; + TRACE_1("add new",_animHandler); _newUnit setVariable [QGVAR(animHandler), _animHandler]; }; From 3d1820e3fda956076779f388e4cffc16c5e8b89c Mon Sep 17 00:00:00 2001 From: jonpas Date: Tue, 29 Nov 2016 20:06:44 +0100 Subject: [PATCH 228/826] Add PboProject .hpp exclusion note --- docs/wiki/development/setting-up-the-development-environment.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/wiki/development/setting-up-the-development-environment.md b/docs/wiki/development/setting-up-the-development-environment.md index 5efb993dbe..5c70365645 100644 --- a/docs/wiki/development/setting-up-the-development-environment.md +++ b/docs/wiki/development/setting-up-the-development-environment.md @@ -18,6 +18,7 @@ This page describes how you can setup your development environment for ACE3, all - Run Arma 3 and Arma 3 Tools directly from steam once to install registry entries (and again after every update) - [Python 3.x](https://www.python.org/) - [Mikero Tools](https://dev.withsix.com/projects/mikero-pbodll/files): DePbo, DeRap, DeOgg, Rapify, MakePbo, PboProject +- `*.hpp` removed from PboProject's "Exclude From Pbo" list - Python, Mikero Tools and Git in PATH environment variable - [CBA](https://github.com/CBATeam/CBA_A3/releases/latest) mod (release or development version) From b9fbd2723a92910494c63ce2bf6e98e6e8aed4ba Mon Sep 17 00:00:00 2001 From: William Giokas <1007380@gmail.com> Date: Thu, 1 Dec 2016 01:27:02 -0600 Subject: [PATCH 229/826] Realisticweights: Updated cyrus weight Cyrus was set to weigh 300 units (~30lb?). The NATO equivalent, the Noreen Bad News (or MAR-10) weighed 130, or 13lbs, equivalent to it's real life counterpart. This just changes the weight to 140, similar to that of the SVDK, a possible real-life counterpart for this rifle. --- addons/realisticweights/CfgWeapons.hpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/addons/realisticweights/CfgWeapons.hpp b/addons/realisticweights/CfgWeapons.hpp index d84b13ab72..41c0241c36 100644 --- a/addons/realisticweights/CfgWeapons.hpp +++ b/addons/realisticweights/CfgWeapons.hpp @@ -289,6 +289,16 @@ class CfgWeapons { }; }; + // - Cyrus ------------------------------------------------------ + class DMR_05_base_F: Rifle_Long_Base_F { + class WeaponSlotsInfo; + }; + class srifle_DMR_05_blk_F: DMR_05_base_F { + class WeaponSlotsInfo: WeaponSlotsInfo { + mass = 140; + }; + }; + // - SIG 556 -------------------------------------------------------------- class DMR_03_base_F: Rifle_Long_Base_F { class WeaponSlotsInfo; From 50e144672f7911dd706a71d130150a7f366f2c44 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 1 Dec 2016 10:21:59 +0100 Subject: [PATCH 230/826] Ballistics - Cleanup (#4721) * Ballistics - Removed 'caliber', 'hit' and 'typicalSpeed' entries * from all vanilla ammo types * Removed all unused ammo types * Ballistics - Removed more unnecessary config entries --- addons/ballistics/CfgAmmo.hpp | 242 +--------------------------------- 1 file changed, 1 insertion(+), 241 deletions(-) diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index 04bfb45643..795a84087d 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -8,8 +8,6 @@ class CfgAmmo { class B_556x45_Ball : BulletBase { airFriction=-0.00126466; - hit=8; - typicalSpeed=750; tracerScale = 1; tracerStartTime=0.073; // M856 tracer burns out to 800m tracerEndTime=1.57123; // Time in seconds calculated with ballistics calculator @@ -26,10 +24,6 @@ class CfgAmmo { }; class ACE_556x45_Ball_Mk262 : B_556x45_Ball { airFriction=-0.00109563; - caliber=0.8; - deflecting=18; - hit=11; - typicalSpeed=836; ACE_caliber=5.69; ACE_bulletLength=23.012; ACE_bulletMass=4.9896; @@ -43,10 +37,6 @@ class CfgAmmo { }; class ACE_556x45_Ball_Mk318 : B_556x45_Ball { airFriction=-0.00123318; - caliber=0.8; - deflecting=18; - hit=9; - typicalSpeed=886; ACE_caliber=5.69; ACE_bulletLength=23.012; ACE_bulletMass=4.0176; @@ -61,9 +51,6 @@ class CfgAmmo { class ACE_556x45_Ball_M995_AP : B_556x45_Ball { airFriction=-0.00123272; caliber=1.6; - deflecting=18; - hit=6; - typicalSpeed=869; ACE_caliber=5.69; ACE_bulletLength=23.012; ACE_bulletMass=4.5359237; @@ -81,10 +68,6 @@ class CfgAmmo { }; class B_545x39_Ball_F : BulletBase { airFriction=-0.00116278; - caliber=0.6; - deflecting=18; - hit=7; - typicalSpeed=880; ACE_caliber=5.588; ACE_bulletLength=21.59; ACE_bulletMass=3.42792; @@ -96,34 +79,11 @@ class CfgAmmo { ACE_muzzleVelocities[]={735, 883, 892}; ACE_barrelLengths[]={206.5, 414.02, 508.0}; }; - class ACE_545x39_Ball_7N6M : B_545x39_Ball_F { - }; - class B_556x45_Ball_Tracer_Green; - class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Green { - airFriction=-0.00116278; - caliber=0.6; - deflecting=18; - hit=7; - typicalSpeed=883; - tracerStartTime=0.073; // 7T3M tracer burns out to 850m - tracerEndTime=1.70236; // Time in seconds calculated with ballistics calculator - ACE_caliber=5.588; - ACE_bulletLength=21.59; - ACE_bulletMass=3.22704; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.168}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={740, 886, 897}; - ACE_barrelLengths[]={206.5, 414.02, 508.0}; - }; class B_56x15_dual: BulletBase { tracerScale = 0.5; }; class B_580x42_Ball_F: BulletBase { airFriction=-0.00117956; - typicalSpeed=930; ACE_caliber=5.9944; ACE_bulletLength=24.2; ACE_bulletMass=4.15; @@ -137,7 +97,6 @@ class CfgAmmo { }; class B_65x39_Caseless : BulletBase { airFriction=-0.00075308; - typicalSpeed=800; tracerScale = 1.1; //1.0; ACE_caliber=6.706; ACE_bulletLength=32.893; @@ -160,7 +119,6 @@ class CfgAmmo { }; class ACE_65x47_Ball_Scenar: B_65x39_Caseless { airFriction=-0.00067037; - typicalSpeed=820 ; caliber=0.9; ACE_caliber=6.706; ACE_bulletLength=34.646; @@ -175,7 +133,6 @@ class CfgAmmo { }; class ACE_65_Creedmor_Ball: B_65x39_Caseless { airFriction=-0.00060887; - typicalSpeed=860 ; caliber=1.1; ACE_caliber=6.706; ACE_bulletLength=36.22; @@ -194,8 +151,6 @@ class CfgAmmo { }; class B_762x51_Ball : BulletBase { airFriction=-0.00100957; - typicalSpeed=833; - hit=9; tracerScale = 1.2; //0.6; tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m tracerEndTime=2.15957; // Time in seconds calculated with ballistics calculator @@ -294,54 +249,6 @@ class CfgAmmo { ACE_muzzleVelocities[]={305, 325, 335, 340}; ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; - class ACE_30_06_M1_Ball : B_762x51_Ball { - airFriction=-0.00080900; - typicalSpeed=800; - caliber=2.0; - hit=10; - ACE_caliber=7.823; - ACE_bulletLength=30.734; - ACE_bulletMass=11.2752; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.494}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={700, 785, 800, 830, 840}; - ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; - class ACE_7_Remington_Magnum_Ball : B_762x51_Ball { - airFriction=-0.00056738; - typicalSpeed=820; - caliber=2.1; - hit=8; - ACE_caliber=7.214; - ACE_bulletLength=38.837; - ACE_bulletMass=11.664; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.345}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={720, 780, 812, 822, 830}; - ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; - class ACE_243_Winchester_Ball : B_762x51_Ball { - airFriction=-0.00067875; - typicalSpeed=915; - caliber=2.3; - hit=6; - ACE_caliber=6.172; - ACE_bulletLength=32.563; - ACE_bulletMass=11.664; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.278}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={830, 875, 900, 915, 920}; - ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; class ACE_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball { airFriction=-0.00070530; caliber=1.8; @@ -392,23 +299,6 @@ class CfgAmmo { }; class B_762x54_Ball: B_762x51_Ball { airFriction=-0.00100023; - typicalSpeed=820; - ACE_caliber=7.925; - ACE_bulletLength=28.956; - ACE_bulletMass=9.8496; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.4}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={700, 800, 820, 833}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class ACE_762x54_Ball_7N14 : B_762x51_Ball { - airFriction=-0.00100023; - caliber=1.5; - hit=15; - typicalSpeed=820; ACE_caliber=7.925; ACE_bulletLength=28.956; ACE_bulletMass=9.8496; @@ -423,8 +313,6 @@ class CfgAmmo { class B_762x54_Tracer_Green; class ACE_762x54_Ball_7T2 : B_762x54_Tracer_Green { airFriction=-0.00103989; - caliber=1.5; - hit=15; typicalSpeed=800; tracerStartTime=0.073; // Based on the 7T2 which burns three seconds tracerEndTime=3; @@ -439,27 +327,8 @@ class CfgAmmo { ACE_muzzleVelocities[]={680, 750, 798, 800}; ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; }; - class ACE_762x35_Ball : B_762x51_Ball { - airFriction=-0.00128942; - caliber=1.5; - hit=11; - typicalSpeed=790; - ACE_caliber=7.823; - ACE_bulletLength=29.286; - ACE_bulletMass=8.1; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.349, 0.338, 0.330, 0.310}; - ACE_velocityBoundaries[]={792, 610, 488}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={620, 655, 675}; - ACE_barrelLengths[]={228.6, 406.4, 508.0}; - }; class B_762x39_Ball_F : BulletBase { airFriction=-0.00151621; - hit=12; - caliber=1.5; - typicalSpeed=716; ACE_caliber=7.823; ACE_bulletLength=28.956; ACE_bulletMass=7.9704; @@ -471,31 +340,9 @@ class CfgAmmo { ACE_muzzleVelocities[]={650, 716, 750}; ACE_barrelLengths[]={254.0, 414.02, 508.0}; }; - class ACE_762x39_Ball : B_762x39_Ball_F { - }; - class ACE_762x39_Ball_57N231P : B_762x54_Tracer_Green { - airFriction=-0.00151621; - hit=12; - caliber=1.5; - typicalSpeed=716; - tracerStartTime = 0.073; //57N231P tracer burns out to 800m - tracerEndTime = 2.082; //Time in seconds calculated with ballistics calculator - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=7.5816; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.275}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={650, 716, 750}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; class B_9x21_Ball : BulletBase { airFriction=-0.00208292; - typicalSpeed=390; tracerScale = 0.5; - hit=6; ACE_caliber=9.042; ACE_bulletLength=15.494; ACE_bulletMass=7.452; @@ -510,25 +357,8 @@ class CfgAmmo { class B_9x21_Ball_Tracer_Green: B_9x21_Ball { tracerScale = 0.5; }; - class ACE_9x18_Ball_57N181S : B_9x21_Ball { - hit=5; - airFriction=-0.00190333; - typicalSpeed=298; - ACE_caliber=9.271; - ACE_bulletLength=15.494; - ACE_bulletMass=6.00048; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.125}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={298, 330, 350}; - ACE_barrelLengths[]={96.52, 127.0, 228.6}; - }; class ACE_9x19_Ball : B_9x21_Ball { airFriction=-0.0019835; - typicalSpeed=370; - hit=6; ACE_caliber=9.017; ACE_bulletLength=15.494; ACE_bulletMass=8.0352; @@ -540,54 +370,8 @@ class CfgAmmo { ACE_muzzleVelocities[]={340, 370, 400}; ACE_barrelLengths[]={101.6, 127.0, 228.6}; }; - class ACE_10x25_Ball : B_9x21_Ball { - airFriction=-0.00181928; - typicalSpeed=425; - hit=7; - ACE_caliber=12.7; - ACE_bulletLength=19.406; - ACE_bulletMass=10.692; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.189}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={360, 400, 430}; - ACE_barrelLengths[]={101.6, 117.094, 228.6}; - }; - class ACE_765x17_Ball: B_9x21_Ball { - airFriction=-0.00163356; - typicalSpeed=282; - hit=7; - ACE_caliber=7.938; - ACE_bulletLength=15.494; - ACE_bulletMass=4.212; - ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; - ACE_ballisticCoefficients[]={0.118}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={282, 300, 320}; - ACE_barrelLengths[]={101.6, 127.0, 228.6}; - }; - class ACE_303_Ball : ACE_762x51_Ball_M118LR { - airFriction=-0.0008349; - typicalSpeed=761; - caliber=2.0; - ACE_caliber=7.899; - ACE_bulletLength=31.166; - ACE_bulletMass=11.2752; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.499, 0.493, 0.48}; - ACE_velocityBoundaries[]={671, 549}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={748, 761, 765}; - ACE_barrelLengths[]={508.0, 609.6, 660.4}; - }; class B_93x64_Ball : BulletBase { airFriction=-0.00108571; - typicalSpeed=880; ACE_caliber=9.296; ACE_bulletLength=34.29; ACE_bulletMass=14.904; @@ -602,7 +386,6 @@ class CfgAmmo { class B_408_Ball : BulletBase { timeToLive=10; airFriction=-0.00044958; - typicalSpeed=867; tracerScale = 1.3; ACE_caliber=10.363; ACE_bulletLength=55.1942; @@ -633,24 +416,9 @@ class CfgAmmo { ACE_muzzleVelocities[]={1067}; ACE_barrelLengths[]={736.6}; }; - class ACE_106x83mm_Ball : B_408_Ball { - timeToLive=10; - airFriction=-0.00052047; - ACE_caliber=10.566; - ACE_bulletLength=53.061; - ACE_bulletMass=25.7904; - ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; - ACE_ballisticCoefficients[]={0.72}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={960}; - ACE_barrelLengths[]={736.6}; - }; class B_338_Ball : BulletBase { timeToLive=10; airFriction=-0.00059133; - typicalSpeed=915; ACE_caliber=8.585; ACE_bulletLength=39.573; ACE_bulletMass=16.2; @@ -664,7 +432,6 @@ class CfgAmmo { }; class B_338_NM_Ball : BulletBase { airFriction=-0.00052201; - typicalSpeed=820; ACE_caliber=8.585; ACE_bulletLength=43.18; ACE_bulletMass=19.44; @@ -712,7 +479,6 @@ class CfgAmmo { }; class B_127x54_Ball : BulletBase { airFriction=-0.00019268; - typicalSpeed=300; tracerScale = 1.3;// ACE_caliber=12.954; ACE_bulletLength=64.516; @@ -728,7 +494,6 @@ class CfgAmmo { class B_127x99_Ball : BulletBase { timeToLive=10; airFriction=-0.00057503; - typicalSpeed=900; tracerScale = 1.3; //1.2; ACE_caliber=12.954; ACE_bulletLength=58.674; @@ -741,10 +506,9 @@ class CfgAmmo { ACE_muzzleVelocities[]={900}; ACE_barrelLengths[]={736.6}; }; - class ACE_127x99_API : BulletBase { + class ACE_127x99_API : B_127x99_Ball { timeToLive=10; airFriction=-0.00057503; - typicalSpeed=900; tracerScale = 1.3;// hit=25; caliber=4.0; @@ -762,7 +526,6 @@ class CfgAmmo { class ACE_127x99_Ball_AMAX : B_127x99_Ball { timeToLive=10; airFriction=-0.00036645; - typicalSpeed=860; caliber=3.0; ACE_caliber=12.954; ACE_bulletLength=64.516; @@ -778,7 +541,6 @@ class CfgAmmo { class B_127x108_Ball : BulletBase { timeToLive=10; airFriction=-0.00063800; - typicalSpeed=820; tracerScale = 1.3; //1.5; ACE_caliber=12.979; ACE_bulletLength=64.008; @@ -793,7 +555,6 @@ class CfgAmmo { }; class B_45ACP_Ball : BulletBase { airFriction=-0.00081221; - typicalSpeed=250; tracerScale = 0.6; ACE_caliber=11.481; ACE_bulletLength=17.272; @@ -808,7 +569,6 @@ class CfgAmmo { }; class B_50BW_Ball_F : BulletBase { airFriction=-0.00202645; - typicalSpeed=550; ACE_caliber=12.7; ACE_bulletLength=24.13; ACE_bulletMass=21.7076; From 448dcddc556ea9773789009ce9d4e40e4773a047 Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 1 Dec 2016 10:23:03 +0100 Subject: [PATCH 231/826] ATragMX - cleanup and some fixes (#4714) * ATragMX - Improved the default gun profiles * Recalculated all muzzle velocities (based on 15 degrees Celsius) * Recalculated all scope base angle (based on the new muzzle velocities) * ATragMX - Removed lots of duplicate code * Introduced dynamic simulation interval (based on muzzle velocity) * ATragMX - Fixed simulation interval for the truing drop feature --- addons/atragmx/XEH_postInit.sqf | 62 +++++++++---------- .../functions/fnc_calculate_range_card.sqf | 57 ++--------------- .../fnc_calculate_target_solution.sqf | 2 +- .../fnc_true_c1_ballistic_coefficient.sqf | 1 + .../functions/fnc_true_muzzle_velocity.sqf | 1 + addons/atragmx/script_component.hpp | 2 +- 6 files changed, 41 insertions(+), 84 deletions(-) diff --git a/addons/atragmx/XEH_postInit.sqf b/addons/atragmx/XEH_postInit.sqf index a0b4f18424..4fe5bc86f3 100644 --- a/addons/atragmx/XEH_postInit.sqf +++ b/addons/atragmx/XEH_postInit.sqf @@ -6,51 +6,51 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) == GVAR(gunList) = profileNamespace getVariable "ACE_ATragMX_gunList"; } else { // Profile Name, Muzzle Velocity, Zero Range, Scope Base Angle, AirFriction, Bore Height, Scope Unit, Scope Click Unit, Scope Click Number, Maximum Elevation, Dialed Elevation, Dialed Windage, Mass, Bullet Diameter, Rifle Twist, BC, Drag Model, Atmosphere Model, Muzzle Velocity vs. Temperature Interpolation, C1 Ballistic Coefficient vs. Distance Interpolation, Persistent - GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657485, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + GVAR(gunList) = [["12.7x108mm" , 812, 100, 0.0666557, -0.00063800, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["12.7x99mm AMAX" , 860, 100, 0.0611565, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" , [[-15,833],[0,840],[10,847],[15,852],[25,866],[30,875],[35,886]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["12.7x99mm" , 900, 100, 0.0582418, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" , [[-15,873],[0,880],[10,887],[15,892],[25,906],[30,915],[35,926]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["12.7x99mm AMAX" , 852, 100, 0.0615965, -0.00036645, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" , [[-15,833],[0,840],[10,847],[15,852],[25,866],[30,875],[35,886]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["12.7x99mm" , 892, 100, 0.0588284, -0.00057503, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" , [[-15,873],[0,880],[10,887],[15,892],[25,906],[30,915],[35,926]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["12.7x54mm" , 300, 100, 0.3394630, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" , [[-15,297],[0,298],[10,299],[15,299],[25,301],[30,302],[35,303]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["12.7x54mm" , 299, 100, 0.3406920, -0.00019268, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" , [[-15,297],[0,298],[10,299],[15,299],[25,301],[30,302],[35,303]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".50 Beowulf" , 563, 100, 0.0657485, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" , [[-15,560],[0,561],[10,562],[15,562],[25,564],[30,565],[35,566]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".50 Beowulf" , 562, 100, 0.1262000, -0.00202645, 3.81, 0, 2, 10, 120, 0, 0, 21.71, 12.7, 50.80, 0.210, 1, "ASM" , [[-15,560],[0,561],[10,562],[15,562],[25,564],[30,565],[35,566]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".408 CheyTac 305gr", 1067, 100, 0.0482451, -0.00063655, 3.81, 0, 2, 10, 120, 0, 0, 19.76, 10.4, 33.02, 0.569, 1, "ICAO", [[-15,1040],[0,1047],[10,1054],[15,1059],[25,1073],[30,1082],[35,1093]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".408 CheyTac 419gr", 867, 100, 0.0613501, -0.00044958, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.866, 1, "ICAO", [[-15,840],[0,847],[10,854],[15,859],[25,873],[30,882],[35,893]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".408 CheyTac 305gr", 1059, 100, 0.0482146, -0.00063655, 3.81, 0, 2, 10, 120, 0, 0, 19.76, 10.4, 33.02, 0.569, 1, "ICAO", [[-15,1040],[0,1047],[10,1054],[15,1059],[25,1073],[30,1082],[35,1093]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".408 CheyTac 419gr", 859, 100, 0.0611842, -0.00044958, 3.81, 0, 2, 10, 120, 0, 0, 27.15, 10.4, 33.02, 0.866, 1, "ICAO", [[-15,840],[0,847],[10,854],[15,859],[25,873],[30,882],[35,893]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["9.3×64mm" , 870, 100, 0.0619295, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" , [[-15,843],[0,850],[10,857],[15,862],[25,876],[30,885],[35,896]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["9.3×64mm" , 862, 100, 0.0627652, -0.00108571, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 9.30, 35.56, 0.368, 1, "ASM" , [[-15,843],[0,850],[10,857],[15,862],[25,876],[30,885],[35,896]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".338LM 250gr" , 880, 100, 0.0598469, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.645, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".338LM 300gr" , 800, 100, 0.0677343, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.759, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".338LM API526" , 880, 100, 0.0588865, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.760, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".338LM 250gr" , 872, 100, 0.0604821, -0.00059133, 3.81, 0, 2, 10, 120, 0, 0, 16.20, 8.58, 25.40, 0.645, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".338LM 300gr" , 792, 100, 0.0685883, -0.00052190, 3.81, 0, 2, 10, 120, 0, 0, 19.44, 8.58, 25.40, 0.759, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".338LM API526" , 872, 100, 0.0602535, -0.00069611, 3.81, 0, 2, 10, 120, 0, 0, 16.39, 8.58, 25.40, 0.760, 1, "ICAO", [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".300WM Mk248 Mod0" , 900, 100, 0.0584442, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.537, 1, "ICAO", [[-15,838],[0,845],[10,852],[15,857],[25,871],[30,880],[35,891]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".300WM Mk248 Mod1" , 867, 100, 0.0610738, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.619, 1, "ICAO", [[-15,820],[0,827],[10,834],[15,839],[25,853],[30,862],[35,873]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - [".300WM Berger OTM" , 853, 100, 0.0622179, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.715, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".300WM Mk248 Mod0" , 857, 100, 0.0621425, -0.00070530, 3.81, 0, 2, 10, 120, 0, 0, 12.31, 7.80, 25.40, 0.537, 1, "ICAO", [[-15,838],[0,845],[10,852],[15,857],[25,871],[30,880],[35,891]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".300WM Mk248 Mod1" , 839, 100, 0.0637038, -0.00061188, 3.81, 0, 2, 10, 120, 0, 0, 14.26, 7.80, 25.40, 0.619, 1, "ICAO", [[-15,820],[0,827],[10,834],[15,839],[25,853],[30,862],[35,873]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + [".300WM Berger OTM" , 792, 100, 0.0686968, -0.00053733, 3.81, 0, 2, 10, 120, 0, 0, 14.90, 7.80, 25.40, 0.715, 1, "ICAO", [[-15,773],[0,780],[10,787],[15,792],[25,806],[30,815],[35,826]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x54mmR" , 820, 100, 0.0691878, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO", [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x54mmR" , 812, 100, 0.0678441, -0.00100023, 3.81, 0, 2, 10, 120, 0, 0, 9.849, 7.92, 24.13, 0.400, 1, "ICAO", [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm M80" , 810, 100, 0.0679374, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 25.40, 0.398, 1, "ICAO", [[-15,783],[0,790],[10,797],[15,802],[25,816],[30,825],[35,836]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm M118LR" , 765, 100, 0.0710319, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.482, 1, "ICAO", [[-15,738],[0,745],[10,752],[15,757],[25,771],[30,780],[35,791]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm Mk316" , 782, 100, 0.0710319, -0.00082029, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.483, 1, "ICAO", [[-15,777],[0,778],[10,779],[15,781],[25,783],[30,785],[35,787]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm Mk319" , 901, 100, 0.0584524, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO", [[-15,898],[0,899],[10,900],[15,900],[25,902],[30,903],[35,904]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm M993" , 920, 100, 0.0570316, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO", [[-15,893],[0,900],[10,907],[15,912],[25,926],[30,935],[35,946]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x51mm Subsonic", 315, 100, 0.3059680, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.502, 1, "ICAO", [[-15,312],[0,313],[10,314],[15,314],[25,316],[30,317],[35,318]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm M80" , 802, 100, 0.0690229, -0.00100957, 3.81, 0, 2, 10, 120, 0, 0, 9.461, 7.82, 25.40, 0.398, 1, "ICAO", [[-15,783],[0,790],[10,797],[15,802],[25,816],[30,825],[35,836]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm M118LR" , 757, 100, 0.0739989, -0.00082828, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.482, 1, "ICAO", [[-15,738],[0,745],[10,752],[15,757],[25,771],[30,780],[35,791]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm Mk316" , 781, 100, 0.0709422, -0.00082029, 3.81, 0, 2, 10, 120, 0, 0, 11.34, 7.82, 25.40, 0.483, 1, "ICAO", [[-15,777],[0,778],[10,779],[15,781],[25,783],[30,785],[35,787]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm Mk319" , 900, 100, 0.0593025, -0.00102338, 3.81, 0, 2, 10, 120, 0, 0, 8.424, 7.82, 25.40, 0.377, 1, "ICAO", [[-15,898],[0,899],[10,900],[15,900],[25,902],[30,903],[35,904]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm M993" , 912, 100, 0.0585007, -0.00107148, 3.81, 0, 2, 10, 120, 0, 0, 8.230, 7.82, 25.40, 0.359, 1, "ICAO", [[-15,893],[0,900],[10,907],[15,912],[25,926],[30,935],[35,946]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x51mm Subsonic", 314, 100, 0.3168140, -0.00049899, 3.81, 0, 2, 10, 120, 0, 0, 12.96, 7.82, 25.40, 0.502, 1, "ICAO", [[-15,312],[0,313],[10,314],[15,314],[25,316],[30,317],[35,318]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["7.62x39mm" , 716, 100, 0.0829603, -0.00151621, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 7.82, 25.40, 0.275, 1, "ICAO", [[-15,689],[0,696],[10,703],[15,708],[25,722],[30,731],[35,742]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["7.62x39mm" , 708, 100, 0.0846559, -0.00151621, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 7.82, 25.40, 0.275, 1, "ICAO", [[-15,689],[0,696],[10,703],[15,708],[25,722],[30,731],[35,742]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["6.5x39mm" , 774, 100, 0.0683482, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.524, 1, "ICAO", [[-15,747],[0,754],[10,761],[15,766],[25,780],[30,789],[35,800]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["6.5x47mm Lapua" , 775, 100, 0.0682221, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.577, 1, "ICAO", [[-15,748],[0,755],[10,762],[15,767],[25,781],[30,790],[35,801]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["6.5mm Creedmor" , 830, 100, 0.0636501, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.632, 1, "ICAO", [[-15,803],[0,810],[10,817],[15,822],[25,836],[30,845],[35,856]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["6.5x39mm" , 766, 100, 0.0725986, -0.00075308, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.524, 1, "ICAO", [[-15,747],[0,754],[10,761],[15,766],[25,780],[30,789],[35,800]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["6.5x47mm Lapua" , 767, 100, 0.0722256, -0.00067037, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.577, 1, "ICAO", [[-15,748],[0,755],[10,762],[15,767],[25,781],[30,790],[35,801]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["6.5mm Creedmor" , 822, 100, 0.0655022, -0.00060887, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.632, 1, "ICAO", [[-15,803],[0,810],[10,817],[15,822],[25,836],[30,845],[35,856]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.8x42mm DBP87" , 950, 100, 0.0572574, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.313, 1, "ICAO", [[-15,923],[0,930],[10,937],[15,942],[25,956],[30,965],[35,976]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.8x42mm DBP87" , 942, 100, 0.0566639, -0.00117956, 3.81, 0, 2, 10, 120, 0, 0, 4.150, 5.99, 24.40, 0.313, 1, "ICAO", [[-15,923],[0,930],[10,937],[15,942],[25,956],[30,965],[35,976]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.56x45mm M855" , 870, 100, 0.0626386, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.302, 1, "ASM" , [[-15,843],[0,849],[10,857],[15,862],[25,876],[30,885],[35,898]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.56x45mm Mk262" , 820, 100, 0.0671481, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.56x45mm Mk318" , 880, 100, 0.0615937, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" , [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.56x45mm M995" , 869, 100, 0.0626713, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" , [[-15,842],[0,849],[10,856],[15,861],[25,875],[30,884],[35,895]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm M855" , 862, 100, 0.0635456, -0.00126466, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.302, 1, "ASM" , [[-15,843],[0,849],[10,857],[15,862],[25,876],[30,885],[35,898]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm Mk262" , 812, 100, 0.0682606, -0.00109563, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" , [[-15,793],[0,800],[10,807],[15,812],[25,826],[30,835],[35,846]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm Mk318" , 872, 100, 0.0624569, -0.00123318, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.307, 1, "ASM" , [[-15,853],[0,860],[10,867],[15,872],[25,886],[30,895],[35,906]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], + ["5.56x45mm M995" , 861, 100, 0.0635355, -0.00123272, 3.81, 0, 2, 10, 120, 0, 0, 4.536, 5.70, 17.78, 0.310, 1, "ASM" , [[-15,842],[0,849],[10,856],[15,861],[25,875],[30,884],[35,895]] , [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true], - ["5.45x39mm 7N6M" , 735, 100, 0.0787205, -0.00116278, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.336, 1, "ICAO", [[-15,708],[0,715],[10,722],[15,727],[25,741],[30,750],[35,761]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true]]; + ["5.45x39mm 7N6M" , 727, 100, 0.0801269, -0.00116278, 3.81, 0, 2, 10, 120, 0, 0, 3.428, 5.59, 16.00, 0.336, 1, "ICAO", [[-15,708],[0,715],[10,722],[15,727],[25,741],[30,750],[35,761]], [[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], true]]; [] call FUNC(clear_user_data); profileNamespace setVariable ["ACE_ATragMX_gunList", GVAR(gunList)]; diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index fa7793ebd5..b72c38e756 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -15,61 +15,16 @@ */ #include "script_component.hpp" -[] call FUNC(parse_input); +GVAR(rangeCardData) = []; -GVAR(workingMemory) params ["", - "_muzzleVelocity", "", - "_scopeBaseAngle", - "_airFriction", - "_boreHeight", "", "", "", "", "", "", - "_bulletMass", - "_bulletDiameter", - "_barrelTwist", - "_bc", - "_dragModel", - "_atmosphereModel" -]; - -private _twistDirection = 0; -if (_barrelTwist > 0) then { - _twistDirection = 1; -} else { - if (_barrelTwist < 0) then { - _twistDirection = -1; - }; -}; -_barrelTwist = abs _barrelTwist; - -private _altitude = GVAR(altitude); -private _temperature = GVAR(temperature); -private _barometricPressure = GVAR(barometricPressure); -private _relativeHumidity = GVAR(relativeHumidity); -if (!GVAR(atmosphereModeTBH)) then { - _barometricPressure = 1013.25 * (1 - (0.0065 * _altitude) / (273.15 + _temperature + 0.0065 * _altitude)) ^ 5.255754495; - _relativeHumidity = 50; -}; - -private _bulletLength = 45.72; -private _stabilityFactor = 1.5; -if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - if (_bulletDiameter > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { - _stabilityFactor = [_bulletDiameter, _bulletLength, _bulletMass, _barrelTwist * 10, _muzzleVelocity, _temperature, _barometricPressure] call EFUNC(advanced_ballistics,calculateStabilityFactor); - }; -}; - -private _latitude = GVAR(latitude) select GVAR(currentTarget); -private _directionOfFire = GVAR(directionOfFire) select GVAR(currentTarget); -private _windSpeed1 = (GVAR(windSpeed1) select GVAR(currentTarget)); -private _windSpeed2 = (GVAR(windSpeed2) select GVAR(currentTarget)); -private _windDirection = (GVAR(windDirection) select GVAR(currentTarget)); -private _inclinationAngle = (GVAR(inclinationAngle) select GVAR(currentTarget)); -private _targetSpeed = (GVAR(targetSpeed) select GVAR(currentTarget)); private _targetRange = GVAR(rangeCardEndRange); if (GVAR(currentUnit) == 1) then { _targetRange = _targetRange / 1.0936133; }; -GVAR(rangeCardData) = []; +private _solutionInput = +GVAR(targetSolutionInput); +_solutionInput set [ 8, round(_solutionInput select 4)]; +_solutionInput set [13, _targetRange]; +_solutionInput set [17, true]; -private _result = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 100, - [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, true, _stabilityFactor, _twistDirection, _latitude, _directionOfFire] call FUNC(calculate_solution); +private _result = _solutionInput call FUNC(calculate_solution); diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 46eeea520a..2cc3973c47 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -70,7 +70,7 @@ _inclinationAngle = GVAR(inclinationAngle) select GVAR(currentTarget); _targetSpeed = GVAR(targetSpeed) select GVAR(currentTarget); _targetRange = GVAR(targetRange) select GVAR(currentTarget); -GVAR(targetSolutionInput) = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, 200, +GVAR(targetSolutionInput) = [_scopeBaseAngle, _bulletMass, _boreHeight, _airFriction, _muzzleVelocity, _temperature, _barometricPressure, _relativeHumidity, round(_muzzleVelocity), [_windSpeed1, _windSpeed2], _windDirection, _inclinationAngle, _targetSpeed, _targetRange, _bc, _dragModel, _atmosphereModel, false, _stabilityFactor, _twistDirection, _latitude, _directionOfFire]; private _result = GVAR(targetSolutionInput) call FUNC(calculate_solution); diff --git a/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf b/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf index 42bb18b875..6af3e179ac 100644 --- a/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf +++ b/addons/atragmx/functions/fnc_true_c1_ballistic_coefficient.sqf @@ -26,6 +26,7 @@ if (_actualDrop > _referenceDrop) then { }; private _solutionInput = +GVAR(targetSolutionInput); +_solutionInput set [ 8, 200]; _solutionInput set [13, GVAR(truingDropRangeData) select 1]; private _c1 = _solutionInput select 14; diff --git a/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf b/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf index 26ee2a18ce..d8aa478412 100644 --- a/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf +++ b/addons/atragmx/functions/fnc_true_muzzle_velocity.sqf @@ -26,6 +26,7 @@ if (_actualDrop > _referenceDrop) then { }; private _solutionInput = +GVAR(targetSolutionInput); +_solutionInput set [ 8, 200]; _solutionInput set [13, GVAR(truingDropRangeData) select 0]; private _muzzleVelocity = _solutionInput select 4; diff --git a/addons/atragmx/script_component.hpp b/addons/atragmx/script_component.hpp index 054d95b9fe..8ebc8b445f 100644 --- a/addons/atragmx/script_component.hpp +++ b/addons/atragmx/script_component.hpp @@ -16,4 +16,4 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.9 +#define ATRAGMX_PROFILE_NAMESPACE_VERSION 2.0 From 962903f20169fc995aa2f647533828df09247633 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 1 Dec 2016 11:01:24 -0600 Subject: [PATCH 232/826] Unify javelin guidance for RHS ammo (#4737) --- optionals/compat_rhs_usf3/CfgAmmo.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/optionals/compat_rhs_usf3/CfgAmmo.hpp b/optionals/compat_rhs_usf3/CfgAmmo.hpp index 030d01d0f8..93939879ef 100644 --- a/optionals/compat_rhs_usf3/CfgAmmo.hpp +++ b/optionals/compat_rhs_usf3/CfgAmmo.hpp @@ -221,6 +221,8 @@ class CfgAmmo { seekerMinRange = 0; seekerMaxRange = 2500; // Range from the missile which the seeker can visually search + seekLastTargetPos = 1; // seek last target position [if seeker loses LOS of target, continue to last known pos] + // Attack profile type selection defaultAttackProfile = "JAV_TOP"; attackProfiles[] = { "JAV_TOP", "JAV_DIR" }; From 321bb0bc57519e03a30afdb9d6f6786adcded784 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 1 Dec 2016 11:01:55 -0600 Subject: [PATCH 233/826] Add frag definitions for remaining ammo (#4736) Remove rpt warning Close #342 --- addons/frag/CfgAmmo.hpp | 356 +++++++------------- addons/frag/XEH_postInit.sqf | 18 +- addons/frag/functions/fnc_dev_debugAmmo.sqf | 4 +- addons/frag/functions/fnc_frago.sqf | 2 +- 4 files changed, 128 insertions(+), 252 deletions(-) diff --git a/addons/frag/CfgAmmo.hpp b/addons/frag/CfgAmmo.hpp index 501ce8880b..bff5a49ffa 100644 --- a/addons/frag/CfgAmmo.hpp +++ b/addons/frag/CfgAmmo.hpp @@ -3,14 +3,29 @@ #define BASE_DRAG_HD (BASE_DRAG * HD_MULT) class CfgAmmo { - //class ace_arty_105mm_m1_m782_time; - //class ace_arty_105mm_m1_m782_prox: ace_arty_105mm_m1_m782_time {}; - //class ace_arty_105mm_m1_m782_delay: ace_arty_105mm_m1_m782_prox { - // GVAR(skip) = 1; - //}; - class Bo_GBU12_LGB; - class ACE_GBU12 : Bo_GBU12_LGB { + // ~~~~ Bombs: + class LaserBombCore; + class Bo_GBU12_LGB: LaserBombCore { + GVAR(enabled) = 1; + + GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)}; + GVAR(metal) = 140000; + GVAR(charge) = 87000; + GVAR(gurney_c) = 2320; + GVAR(gurney_k) = 1/2; + }; + class Bomb_04_F: LaserBombCore { + GVAR(enabled) = 1; + + GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)}; + GVAR(metal) = 140000; + GVAR(charge) = 87000; + GVAR(gurney_c) = 2320; + GVAR(gurney_k) = 1/2; + }; + class BombCore; + class Bo_Mk82: BombCore { GVAR(enabled) = 1; GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)}; @@ -18,11 +33,9 @@ class CfgAmmo { GVAR(charge) = 87000; GVAR(gurney_c) = 2320; GVAR(gurney_k) = 1/2; - sideAirFriction = 0.04; - airFriction = 0.04; - laserLock = 0; }; + // ~~~~ Grenades: class GrenadeBase; class Grenade; class GrenadeHand: Grenade { @@ -47,41 +60,6 @@ class CfgAmmo { class SmokeShell: GrenadeHand { GVAR(skip) = 1; }; - - class RocketBase; - class R_Hydra_HE: RocketBase { - // Source: http://fas.org/man/dod-101/sys/missile/hydra-70.htm - GVAR(enabled) = 1; - - GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; - GVAR(metal) = 3850; - GVAR(charge) = 1040; - GVAR(gurney_c) = 2700; - GVAR(gurney_k) = 1/2; - }; - //class R_57mm_HE: RocketBase { - // GVAR(skip) = 1; - //}; - - class R_80mm_HE: RocketBase { - GVAR(skip) = 1; - }; - - //class R_S8T_AT: RocketBase { - // GVAR(skip) = 1; - //}; - - class BombCore; - class Bo_Mk82: BombCore { - GVAR(enabled) = 1; - - GVAR(classes)[] = {QGVAR(large), QGVAR(large), QGVAR(large_HD), QGVAR(large), QGVAR(huge), QGVAR(huge_HD), QGVAR(huge)}; - GVAR(metal) = 140000; - GVAR(charge) = 87000; - GVAR(gurney_c) = 2320; - GVAR(gurney_k) = 1/2; - }; - class G_40mm_HE: GrenadeBase { // Source: http://www.inetres.com/gp/military/infantry/grenade/40mm_ammo.html#M441 GVAR(enabled) = 1; @@ -115,6 +93,94 @@ class CfgAmmo { GVAR(force) = 1; }; + + // ~~~~ RPGs: + class MissileBase; + class R_PG32V_F; + class R_TBG32V_F: R_PG32V_F { // HE + GVAR(enabled) = 1; + GVAR(metal) = 400; + GVAR(charge) = 210; + GVAR(gurney_c) = 2800; + GVAR(gurney_k) = "3/5"; + GVAR(classes)[] = {"ACE_frag_medium_HD"}; + }; + class M_Titan_AA: MissileBase { + GVAR(skip) = 1; + }; + class M_Titan_AT: MissileBase { + GVAR(skip) = 1; + }; + class M_Titan_AP: M_Titan_AT { // "anti personnel" + GVAR(skip) = 0; + GVAR(enabled) = 1; + GVAR(metal) = 400; + GVAR(charge) = 210; + GVAR(gurney_c) = 2800; + GVAR(gurney_k) = "3/5"; + GVAR(classes)[] = {"ACE_frag_medium_HD"}; + }; + + + // ~~~~ Missiles: + class M_PG_AT; + class M_AT: M_PG_AT { // DAR (Hydra 70) + // Source: http://fas.org/man/dod-101/sys/missile/hydra-70.htm + GVAR(enabled) = 1; + + GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; + GVAR(metal) = 3850; + GVAR(charge) = 1040; + GVAR(gurney_c) = 2700; + GVAR(gurney_k) = 1/2; + }; + class ACE_Hellfire_AGM114K: M_PG_AT { + // Source: http://www.designation-systems.net/dusrm/m-114.html + GVAR(enabled) = 1; + + GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; + GVAR(metal) = 8000; + GVAR(charge) = 2400; + GVAR(gurney_c) = 2700; + GVAR(gurney_k) = 1/2; + }; + class RocketBase; + class R_80mm_HE: RocketBase { + GVAR(skip) = 1; + }; + class Missile_AGM_02_F: MissileBase { + // Source: http://fas.org/man/dod-101/sys/smart/agm-65.htm + GVAR(enabled) = 1; + + GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; + GVAR(metal) = 56250; + GVAR(charge) = 39000; + GVAR(gurney_c) = 2700; + GVAR(gurney_k) = 1/2; + }; + class Rocket_04_HE_F: MissileBase { // Shrieker (Hydra 70) + GVAR(enabled) = 1; + GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; + GVAR(metal) = 3850; + GVAR(charge) = 1040; + GVAR(gurney_c) = 2700; + GVAR(gurney_k) = 1/2; + }; + class M_Scalpel_AT: MissileBase { // 9K121 Vikhr + GVAR(enabled) = 1; + GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; + GVAR(metal) = 10000; + GVAR(charge) = 3000; + GVAR(gurney_c) = 2700; + GVAR(gurney_k) = 1/2; + }; + class M_Air_AA: MissileBase { + GVAR(skip) = 1; + }; + class Missile_AA_04_F: MissileBase { + GVAR(skip) = 1; + }; + // curator ammo entries class ShellBase; class Sh_125mm_HEAT; @@ -128,7 +194,7 @@ class CfgAmmo { GVAR(gurney_c) = 2440; GVAR(gurney_k) = 1/2; }; - class Sh_82mm_AMOS : Sh_155mm_AMOS { + class Sh_82mm_AMOS: Sh_155mm_AMOS { // Source: http://www.arsenal-bg.com/defense_police/mortar_bombs_82mm.htm GVAR(enabled) = 1; @@ -147,7 +213,7 @@ class CfgAmmo { GVAR(gurney_c) = 2320; GVAR(gurney_k) = 1/2; }; - class Sh_105mm_HEAT_MP : Sh_125mm_HEAT { + class Sh_105mm_HEAT_MP: Sh_125mm_HEAT { GVAR(enabled) = 1; GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; @@ -156,7 +222,7 @@ class CfgAmmo { GVAR(gurney_c) = 2800; GVAR(gurney_k) = 1/2; }; - class Sh_120mm_HE : ShellBase { + class Sh_120mm_HE: ShellBase { GVAR(enabled) = 1; GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; @@ -184,200 +250,6 @@ class CfgAmmo { GVAR(gurney_k) = 1/2; }; - //class R_230mm_HE; - //class ModuleOrdnanceRocket_F_ammo: R_230mm_HE { - //}; - - //class R_230mm_fly; - //class ModuleOrdnanceRocket_F_subammo: R_230mm_fly { - //}; - // end of curator ammo entries - - //class R_SMAW_HEDP; - //class R_MEEWS_HEDP : R_SMAW_HEDP { - // GVAR(force) = 1; - // GVAR(multiplier) = 1.2; - //}; - - class MissileBase; - class Missile_AGM_02_F : MissileBase { - // Source: http://fas.org/man/dod-101/sys/smart/agm-65.htm - GVAR(enabled) = 1; - - GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; - GVAR(metal) = 56250; - GVAR(charge) = 39000; - GVAR(gurney_c) = 2700; - GVAR(gurney_k) = 1/2; - }; - class M_Hellfire_AT: MissileBase { - // Source: http://www.designation-systems.net/dusrm/m-114.html - GVAR(enabled) = 1; - - GVAR(classes)[] = {QGVAR(medium), QGVAR(medium_HD)}; - GVAR(metal) = 8000; - GVAR(charge) = 2400; - GVAR(gurney_c) = 2700; - GVAR(gurney_k) = 1/2; - }; - - /* - class B_762x51_Ball; - class GVAR(base): B_762x51_Ball { ////TODO: B_762x45_Ball no longer exists, is this a valid replacement? - model = "\A3\Weapons_f\ammo\shell"; - timeToLive = 12; - typicalSpeed = 800; - // Fix sounds - effectFly = "AmmoClassic"; - soundDefault1[] = {"A3\sounds_f\weapons\hits\concrete_1.wav",0.158114,1,30}; - soundDefault2[] = {"A3\sounds_f\weapons\hits\concrete_2.wav",0.158114,1,30}; - soundDefault3[] = {"A3\sounds_f\weapons\hits\concrete_3.wav",0.158114,1,30}; - soundDefault4[] = {"A3\sounds_f\weapons\hits\concrete_4.wav",0.158114,1,30}; - soundDefault5[] = {"A3\sounds_f\weapons\hits\concrete_5.wav",0.158114,1,30}; - soundDefault6[] = {"A3\sounds_f\weapons\hits\concrete_6.wav",0.158114,1,30}; - soundDefault7[] = {"A3\sounds_f\weapons\hits\concrete_7.wav",0.158114,1,30}; - soundDefault8[] = {"A3\sounds_f\weapons\hits\concrete_8.wav",0.158114,1,30}; - soundGroundSoft1[] = {"A3\sounds_f\weapons\hits\soft_ground_1.wav",0.02811705,1,30}; - soundGroundSoft2[] = {"A3\sounds_f\weapons\hits\soft_ground_2.wav",0.02811705,1,30}; - soundGroundSoft3[] = {"A3\sounds_f\weapons\hits\soft_ground_3.wav",0.02811705,1,30}; - soundGroundSoft4[] = {"A3\sounds_f\weapons\hits\soft_ground_4.wav",0.02811705,1,30}; - soundGroundSoft5[] = {"A3\sounds_f\weapons\hits\soft_ground_5.wav",0.02811705,1,30}; - soundGroundSoft6[] = {"A3\sounds_f\weapons\hits\soft_ground_6.wav",0.02811705,1,30}; - soundGroundSoft7[] = {"A3\sounds_f\weapons\hits\soft_ground_7.wav",0.02811705,1,30}; - soundGroundSoft8[] = {"A3\sounds_f\weapons\hits\soft_ground_8.wav",0.02811705,1,30}; - soundGroundHard1[] = {"A3\sounds_f\weapons\hits\hard_ground_1.wav",0.62946,1,40}; - soundGroundHard2[] = {"A3\sounds_f\weapons\hits\hard_ground_2.wav",0.62946,1,40}; - soundGroundHard3[] = {"A3\sounds_f\weapons\hits\hard_ground_3.wav",0.62946,1,40}; - soundGroundHard4[] = {"A3\sounds_f\weapons\hits\hard_ground_4.wav",0.62946,1,40}; - soundGroundHard5[] = {"A3\sounds_f\weapons\hits\hard_ground_5.wav",0.62946,1,40}; - soundGroundHard6[] = {"A3\sounds_f\weapons\hits\hard_ground_6.wav",0.62946,1,40}; - soundGroundHard7[] = {"A3\sounds_f\weapons\hits\hard_ground_7.wav",0.62946,1,40}; - soundGroundHard8[] = {"A3\sounds_f\weapons\hits\hard_ground_8.wav",0.62946,1,40}; - soundMetal1[] = {"A3\sounds_f\weapons\hits\metal_1.wav",0.158114,1,45}; - soundMetal2[] = {"A3\sounds_f\weapons\hits\metal_2.wav",0.158114,1,45}; - soundMetal3[] = {"A3\sounds_f\weapons\hits\metal_3.wav",0.158114,1,45}; - soundMetal4[] = {"A3\sounds_f\weapons\hits\metal_4.wav",0.158114,1,45}; - soundMetal5[] = {"A3\sounds_f\weapons\hits\metal_5.wav",0.158114,1,45}; - soundMetal6[] = {"A3\sounds_f\weapons\hits\metal_6.wav",0.158114,1,45}; - soundMetal7[] = {"A3\sounds_f\weapons\hits\metal_7.wav",0.158114,1,45}; - soundMetal8[] = {"A3\sounds_f\weapons\hits\metal_8.wav",0.158114,1,45}; - soundGlass1[] = {"A3\sounds_f\weapons\hits\glass_1.wav",0.177828,1,25}; - soundGlass2[] = {"A3\sounds_f\weapons\hits\glass_2.wav",0.177828,1,25}; - soundGlass3[] = {"A3\sounds_f\weapons\hits\glass_3.wav",0.177828,1,25}; - soundGlass4[] = {"A3\sounds_f\weapons\hits\glass_4.wav",0.177828,1,25}; - soundGlass5[] = {"A3\sounds_f\weapons\hits\glass_5.wav",0.177828,1,25}; - soundGlass6[] = {"A3\sounds_f\weapons\hits\glass_6.wav",0.177828,1,25}; - soundGlass7[] = {"A3\sounds_f\weapons\hits\glass_7.wav",0.177828,1,25}; - soundGlass8[] = {"A3\sounds_f\weapons\hits\glass_8.wav",0.177828,1,25}; - soundGlassArmored1[] = {"A3\sounds_f\weapons\hits\glass_arm_1.wav",0.177828,1,30}; - soundGlassArmored2[] = {"A3\sounds_f\weapons\hits\glass_arm_2.wav",0.177828,1,30}; - soundGlassArmored3[] = {"A3\sounds_f\weapons\hits\glass_arm_3.wav",0.177828,1,30}; - soundGlassArmored4[] = {"A3\sounds_f\weapons\hits\glass_arm_4.wav",0.177828,1,30}; - soundGlassArmored5[] = {"A3\sounds_f\weapons\hits\glass_arm_5.wav",0.177828,1,30}; - soundGlassArmored6[] = {"A3\sounds_f\weapons\hits\glass_arm_6.wav",0.177828,1,30}; - soundGlassArmored7[] = {"A3\sounds_f\weapons\hits\glass_arm_7.wav",0.177828,1,30}; - soundGlassArmored8[] = {"A3\sounds_f\weapons\hits\glass_arm_8.wav",0.177828,1,30}; - soundVehiclePlate1[] = {"A3\sounds_f\weapons\hits\metal_plate_1.wav",0.281170,1,40}; - soundVehiclePlate2[] = {"A3\sounds_f\weapons\hits\metal_plate_2.wav",0.281170,1,40}; - soundVehiclePlate3[] = {"A3\sounds_f\weapons\hits\metal_plate_3.wav",0.281170,1,40}; - soundVehiclePlate4[] = {"A3\sounds_f\weapons\hits\metal_plate_4.wav",0.281170,1,40}; - soundVehiclePlate5[] = {"A3\sounds_f\weapons\hits\metal_plate_5.wav",0.281170,1,40}; - soundVehiclePlate6[] = {"A3\sounds_f\weapons\hits\metal_plate_6.wav",0.281170,1,40}; - soundVehiclePlate7[] = {"A3\sounds_f\weapons\hits\metal_plate_7.wav",0.281170,1,40}; - soundVehiclePlate8[] = {"A3\sounds_f\weapons\hits\metal_plate_8.wav",0.281170,1,40}; - soundWood1[] = {"A3\sounds_f\weapons\hits\wood_1.wav",0.158114,1,30}; - soundWood2[] = {"A3\sounds_f\weapons\hits\wood_2.wav",0.158114,1,30}; - soundWood3[] = {"A3\sounds_f\weapons\hits\wood_3.wav",0.158114,1,30}; - soundWood4[] = {"A3\sounds_f\weapons\hits\wood_4.wav",0.158114,1,30}; - soundWood5[] = {"A3\sounds_f\weapons\hits\wood_5.wav",0.158114,1,30}; - soundWood6[] = {"A3\sounds_f\weapons\hits\wood_6.wav",0.158114,1,30}; - soundWood7[] = {"A3\sounds_f\weapons\hits\wood_7.wav",0.158114,1,30}; - soundWood8[] = {"A3\sounds_f\weapons\hits\wood_8.wav",0.158114,1,30}; - soundHitBody1[] = {"A3\sounds_f\weapons\hits\body_1.wav",0.0177828,1,25}; - soundHitBody2[] = {"A3\sounds_f\weapons\hits\body_2.wav",0.0177828,1,25}; - soundHitBody3[] = {"A3\sounds_f\weapons\hits\body_3.wav",0.0177828,1,25}; - soundHitBody4[] = {"A3\sounds_f\weapons\hits\body_4.wav",0.0177828,1,25}; - soundHitBody5[] = {"A3\sounds_f\weapons\hits\body_5.wav",0.0177828,1,25}; - soundHitBody6[] = {"A3\sounds_f\weapons\hits\body_6.wav",0.0177828,1,25}; - soundHitBody7[] = {"A3\sounds_f\weapons\hits\body_7.wav",0.0177828,1,25}; - soundHitBody8[] = {"A3\sounds_f\weapons\hits\body_8.wav",0.0177828,1,25}; - soundHitBuilding1[] = {"A3\sounds_f\weapons\hits\building_1.wav",0.251189,1,30}; - soundHitBuilding2[] = {"A3\sounds_f\weapons\hits\building_2.wav",0.251189,1,30}; - soundHitBuilding3[] = {"A3\sounds_f\weapons\hits\building_3.wav",0.251189,1,30}; - soundHitBuilding4[] = {"A3\sounds_f\weapons\hits\building_4.wav",0.251189,1,30}; - soundHitBuilding5[] = {"A3\sounds_f\weapons\hits\building_5.wav",0.251189,1,30}; - soundHitBuilding6[] = {"A3\sounds_f\weapons\hits\building_6.wav",0.251189,1,30}; - soundHitBuilding7[] = {"A3\sounds_f\weapons\hits\building_7.wav",0.251189,1,30}; - soundHitBuilding8[] = {"A3\sounds_f\weapons\hits\building_8.wav",0.251189,1,30}; - soundHitFoliage1[] = {"A3\sounds_f\weapons\hits\foliage_1.wav",0.177828,1,25}; - soundHitFoliage2[] = {"A3\sounds_f\weapons\hits\foliage_2.wav",0.177828,1,25}; - soundHitFoliage3[] = {"A3\sounds_f\weapons\hits\foliage_3.wav",0.177828,1,25}; - soundHitFoliage4[] = {"A3\sounds_f\weapons\hits\foliage_4.wav",0.177828,1,25}; - soundHitFoliage5[] = {"A3\sounds_f\weapons\hits\foliage_5.wav",0.177828,1,25}; - soundHitFoliage6[] = {"A3\sounds_f\weapons\hits\foliage_6.wav",0.177828,1,25}; - soundHitFoliage7[] = {"A3\sounds_f\weapons\hits\foliage_7.wav",0.177828,1,25}; - soundHitFoliage8[] = {"A3\sounds_f\weapons\hits\foliage_8.wav",0.177828,1,25}; - soundPlastic1[] = {"A3\sounds_f\weapons\hits\plastic_1.wav",0.177828,1,25}; - soundPlastic2[] = {"A3\sounds_f\weapons\hits\plastic_2.wav",0.177828,1,25}; - soundPlastic3[] = {"A3\sounds_f\weapons\hits\plastic_3.wav",0.177828,1,25}; - soundPlastic4[] = {"A3\sounds_f\weapons\hits\plastic_4.wav",0.177828,1,25}; - soundPlastic5[] = {"A3\sounds_f\weapons\hits\plastic_5.wav",0.177828,1,25}; - soundPlastic6[] = {"A3\sounds_f\weapons\hits\plastic_6.wav",0.177828,1,25}; - soundPlastic7[] = {"A3\sounds_f\weapons\hits\plastic_7.wav",0.177828,1,25}; - soundPlastic8[] = {"A3\sounds_f\weapons\hits\plastic_8.wav",0.177828,1,25}; - soundConcrete1[] = {"A3\sounds_f\weapons\hits\concrete_1.wav",0.177828,1,35}; - soundConcrete2[] = {"A3\sounds_f\weapons\hits\concrete_2.wav",0.177828,1,35}; - soundConcrete3[] = {"A3\sounds_f\weapons\hits\concrete_3.wav",0.177828,1,35}; - soundConcrete4[] = {"A3\sounds_f\weapons\hits\concrete_4.wav",0.177828,1,35}; - soundConcrete5[] = {"A3\sounds_f\weapons\hits\concrete_5.wav",0.177828,1,35}; - soundConcrete6[] = {"A3\sounds_f\weapons\hits\concrete_6.wav",0.177828,1,35}; - soundConcrete7[] = {"A3\sounds_f\weapons\hits\concrete_7.wav",0.177828,1,35}; - soundConcrete8[] = {"A3\sounds_f\weapons\hits\concrete_8.wav",0.177828,1,35}; - soundRubber1[] = {"A3\sounds_f\weapons\hits\tyre_1.wav",0.158114,1,25}; - soundRubber2[] = {"A3\sounds_f\weapons\hits\tyre_2.wav",0.158114,1,25}; - soundRubber3[] = {"A3\sounds_f\weapons\hits\tyre_3.wav",0.158114,1,25}; - soundRubber4[] = {"A3\sounds_f\weapons\hits\tyre_4.wav",0.158114,1,25}; - soundRubber5[] = {"A3\sounds_f\weapons\hits\tyre_5.wav",0.158114,1,25}; - soundRubber6[] = {"A3\sounds_f\weapons\hits\tyre_6.wav",0.158114,1,25}; - soundRubber7[] = {"A3\sounds_f\weapons\hits\tyre_7.wav",0.158114,1,25}; - soundRubber8[] = {"A3\sounds_f\weapons\hits\tyre_8.wav",0.158114,1,25}; - soundWater1[] = {"A3\sounds_f\weapons\hits\water_01.wav",0.158114,1,25}; - soundWater2[] = {"A3\sounds_f\weapons\hits\water_02.wav",0.158114,1,25}; - soundWater3[] = {"A3\sounds_f\weapons\hits\water_03.wav",0.158114,1,25}; - soundWater4[] = {"A3\sounds_f\weapons\hits\water_04.wav",0.158114,1,25}; - soundWater5[] = {"A3\sounds_f\weapons\hits\water_05.wav",0.158114,1,25}; - soundWater6[] = {"A3\sounds_f\weapons\hits\water_06.wav",0.158114,1,25}; - soundWater7[] = {"A3\sounds_f\weapons\hits\water_07.wav",0.158114,1,25}; - soundWater8[] = {"A3\sounds_f\weapons\hits\water_08.wav",0.158114,1,25}; - hitGroundSoft[] = {"soundGroundSoft1",0.2,"soundGroundSoft2",0.2,"soundGroundSoft3",0.1,"soundGroundSoft4",0.1,"soundGroundSoft5",0.1,"soundGroundSoft6",0.1,"soundGroundSoft7",0.1,"soundGroundSoft8",0.1}; - hitGroundHard[] = {"soundGroundHard1",0.2,"soundGroundHard2",0.2,"soundGroundHard3",0.1,"soundGroundHard4",0.1,"soundGroundHard5",0.1,"soundGroundHard6",0.1,"soundGroundHard7",0.1,"soundGroundHard8",0.1}; - hitMan[] = {"soundHitBody1",0.125,"soundHitBody2",0.125,"soundHitBody3",0.125,"soundHitBody4",0.125,"soundHitBody5",0.125,"soundHitBody6",0.125,"soundHitBody7",0.125,"soundHitBody8",0.125}; - hitArmor[] = {"soundVehiclePlate1",0.125,"soundVehiclePlate2",0.125,"soundVehiclePlate3",0.125,"soundVehiclePlate4",0.125,"soundVehiclePlate5",0.125,"soundVehiclePlate6",0.125,"soundVehiclePlate7",0.125,"soundVehiclePlate8",0.125}; - hitBuilding[] = {"soundHitBuilding1",0.2,"soundHitBuilding2",0.2,"soundHitBuilding3",0.1,"soundHitBuilding4",0.1,"soundHitBuilding5",0.1,"soundHitBuilding6",0.1,"soundHitBuilding7",0.1,"soundHitBuilding8",0.1}; - hitFoliage[] = {"soundHitFoliage1",0.125,"soundHitFoliage2",0.125,"soundHitFoliage3",0.125,"soundHitFoliage4",0.125,"soundHitFoliage5",0.125,"soundHitFoliage6",0.125,"soundHitFoliage7",0.125,"soundHitFoliage8",0.125}; - hitWood[] = {"soundWood1",0.125,"soundWood2",0.125,"soundWood3",0.125,"soundWood4",0.125,"soundWood5",0.125,"soundWood6",0.125,"soundWood7",0.125,"soundWood8",0.125}; - hitGlass[] = {"soundGlass1",0.125,"soundGlass2",0.125,"soundGlass3",0.125,"soundGlass4",0.125,"soundGlass5",0.125,"soundGlass6",0.125,"soundGlass7",0.125,"soundGlass8",0.125}; - hitGlassArmored[] = {"soundGlassArmored1",0.125,"soundGlassArmored2",0.125,"soundGlassArmored3",0.125,"soundGlassArmored4",0.125,"soundGlassArmored5",0.125,"soundGlassArmored6",0.125,"soundGlassArmored7",0.125,"soundGlassArmored8",0.125}; - hitConcrete[] = {"soundConcrete1",0.125,"soundConcrete2",0.125,"soundConcrete3",0.125,"soundConcrete4",0.125,"soundConcrete5",0.125,"soundConcrete6",0.125,"soundConcrete7",0.125,"soundConcrete8",0.125}; - hitRubber[] = {"soundRubber1",0.125,"soundRubber2",0.125,"soundRubber3",0.125,"soundRubber4",0.125,"soundRubber5",0.125,"soundRubber6",0.125,"soundRubber7",0.125,"soundRubber8",0.125}; - hitPlastic[] = {"soundPlastic1",0.125,"soundPlastic2",0.125,"soundPlastic3",0.125,"soundPlastic4",0.125,"soundPlastic5",0.125,"soundPlastic6",0.125,"soundPlastic7",0.125,"soundPlastic8",0.125}; - hitDefault[] = {"soundDefault1",0.2,"soundDefault2",0.2,"soundDefault3",0.1,"soundDefault4",0.1,"soundDefault5",0.1,"soundDefault6",0.1,"soundDefault7",0.1,"soundDefault8",0.1}; - hitMetal[] = {"soundMetal1",0.125,"soundMetal2",0.125,"soundMetal3",0.125,"soundMetal4",0.125,"soundMetal5",0.125,"soundMetal6",0.125,"soundMetal7",0.125,"soundMetal8",0.125}; - hitMetalplate[] = {"soundVehiclePlate1",0.125,"soundVehiclePlate2",0.125,"soundVehiclePlate3",0.125,"soundVehiclePlate4",0.125,"soundVehiclePlate5",0.125,"soundVehiclePlate6",0.125,"soundVehiclePlate7",0.125,"soundVehiclePlate8",0.125}; - hitWater[] = {"soundWater1",0.125,"soundWater2",0.125,"soundWater3",0.125,"soundWater4",0.125,"soundWater5",0.125,"soundWater6",0.125,"soundWater7",0.125,"soundWater8",0.125}; - bulletFly1[] = {"A3\sounds_f\weapons\hits\bullet_by_1.wav",1,1,35}; - bulletFly2[] = {"A3\sounds_f\weapons\hits\bullet_by_2.wav",1,1,35}; - bulletFly3[] = {"A3\sounds_f\weapons\hits\bullet_by_3.wav",1,1,35}; - bulletFly4[] = {"A3\sounds_f\weapons\hits\bullet_by_4.wav",1,1,35}; - bulletFly5[] = {"A3\sounds_f\weapons\hits\bullet_by_5.wav",1,1,35}; - bulletFly6[] = {"A3\sounds_f\weapons\hits\bullet_by_6.wav",1,1,35}; - bulletFly7[] = {"A3\sounds_f\weapons\hits\bullet_by_7.wav",1,1,35}; - bulletFly8[] = {"A3\sounds_f\weapons\hits\bullet_by_8.wav",1,1,35}; - bulletFly[] = {"bulletFly1",0.166,"bulletFly2",0.166,"bulletFly3",0.166,"bulletFly4",0.166,"bulletFly5",0.166,"bulletFly6",0.167,"bulletFly7",0.166,"bulletFly8",0.167}; - supersonicCrackNear[] = {"A3\sounds_f\weapons\hits\sscrack1.wav",1,1,35}; - supersonicCrackFar[] = {"A3\sounds_f\weapons\hits\sscrack2.wav",1,1,135}; - }; - */ class B_65x39_Caseless; class GVAR(base): B_65x39_Caseless { diff --git a/addons/frag/XEH_postInit.sqf b/addons/frag/XEH_postInit.sqf index 17c0c14035..20a6a1ca70 100644 --- a/addons/frag/XEH_postInit.sqf +++ b/addons/frag/XEH_postInit.sqf @@ -13,14 +13,18 @@ if (isServer) then { if (!GVAR(enabled)) exitWith {}; // Register fire event handler - ["ace_firedPlayer", DFUNC(fired)] call CBA_fnc_addEventHandler; - ["ace_firedNonPlayer", DFUNC(fired)] call CBA_fnc_addEventHandler; - ["ace_firedPlayerVehicle", DFUNC(fired)] call CBA_fnc_addEventHandler; - ["ace_firedNonPlayerVehicle", DFUNC(fired)] call CBA_fnc_addEventHandler; + ["ace_firedPlayer", LINKFUNC(fired)] call CBA_fnc_addEventHandler; + ["ace_firedNonPlayer", LINKFUNC(fired)] call CBA_fnc_addEventHandler; + ["ace_firedPlayerVehicle", LINKFUNC(fired)] call CBA_fnc_addEventHandler; + ["ace_firedNonPlayerVehicle", LINKFUNC(fired)] call CBA_fnc_addEventHandler; - [FUNC(masterPFH), 0, []] call CBA_fnc_addPerFrameHandler; + [LINKFUNC(masterPFH), 0, []] call CBA_fnc_addPerFrameHandler; }] call CBA_fnc_addEventHandler; // Cache for ammo type configs -GVAR(cacheRoundsTypesToTrack) = createLocation ["ACE_HashLocation", [-10000, -10000, -10000], 0, 0]; -GVAR(cacheRoundsTypesToTrack) setText QGVAR(cacheRoundsTypesToTrack); +GVAR(cacheRoundsTypesToTrack) = [false] call CBA_fnc_createNamespace; + +#ifdef DEBUG_ENABLED_FRAG +[true, true, 30] call FUNC(dev_debugAmmo); +#endif + diff --git a/addons/frag/functions/fnc_dev_debugAmmo.sqf b/addons/frag/functions/fnc_dev_debugAmmo.sqf index 14b190c8c3..894c532728 100644 --- a/addons/frag/functions/fnc_dev_debugAmmo.sqf +++ b/addons/frag/functions/fnc_dev_debugAmmo.sqf @@ -4,7 +4,7 @@ params [ ["_debugMissing", true, [false]], ["_debugForce", false, [false]], - ["_debugNonFrag", false, [false]] + ["_debugSkippedFragPower", 30, [0]] ]; diag_log text format ["~~~~~~~~~~~~~Start [%1]~~~~~~~~~~~~~", _this]; @@ -55,7 +55,7 @@ private _processedCfgAmmos = []; diag_log text format [" - _c=%1,_m=%2,_k=%3,_gC=%4,_fragTypes=%5", _c, _m, _k, _gC, _fragTypes]; }; } else { - if (_debugNonFrag && {isArray (_ammoConfig >> QGVAR(CLASSES))}) then { + if ((_fragPower > _debugSkippedFragPower) && {isArray (_ammoConfig >> QGVAR(CLASSES))}) then { diag_log text format ["Ammo [%1] from Mag [%2] has frag configs but will NOT frag:", _ammo, configName _x]; diag_log text format ["- skip=%1,explosive=%2,indirectHitRange=%3,force=%4,fragPower=%5", _skip, _explosive, _indirectRange, _force, _fragPower]; }; diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf index 389ab73842..51ed23cfea 100644 --- a/addons/frag/functions/fnc_frago.sqf +++ b/addons/frag/functions/fnc_frago.sqf @@ -56,7 +56,7 @@ private _gC = getNumber (configFile >> "CfgAmmo" >> _shellType >> QGVAR(GURNEY_C if (_gC == 0) then {_gC = 2440; _warn = true;}; if (_warn) then { - WARNING_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_shellType); //TODO: turn this off when we get closer to release + INFO_1("Ammo class %1 lacks proper explosive properties definitions for frag!",_shellType); }; private _fragPower = (((_m / _c) + _k) ^ - (1 / 2)) * _gC; From 3566e6e7f54cb7133a60279bc2ce3f871fc21345 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 1 Dec 2016 12:05:28 -0600 Subject: [PATCH 234/826] Update SMG_02 base class for 1.66 (#4718) --- addons/ai/CfgWeapons.hpp | 2 +- addons/ballistics/CfgWeapons.hpp | 2 +- addons/realisticweights/CfgWeapons.hpp | 2 +- addons/smallarms/CfgWeapons.hpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/ai/CfgWeapons.hpp b/addons/ai/CfgWeapons.hpp index 74df685fb0..01d8d5f9c2 100644 --- a/addons/ai/CfgWeapons.hpp +++ b/addons/ai/CfgWeapons.hpp @@ -467,7 +467,7 @@ class CfgWeapons { }; // Scorpion EVO - class SMG_02_base_F: Rifle_Base_F { + class SMG_02_base_F: Rifle_Short_Base_F { class Single: Mode_SemiAuto { minRange = 50; //2; diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 07ab255365..326e7a46db 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -386,7 +386,7 @@ class CfgWeapons { ACE_barrelTwist=285.75; ACE_barrelLength=457.2; }; - class SMG_02_base_F: Rifle_Base_F { + class SMG_02_base_F: Rifle_Short_Base_F { initSpeed = -1.10288; ACE_barrelTwist=254.0; ACE_barrelLength=195.58; diff --git a/addons/realisticweights/CfgWeapons.hpp b/addons/realisticweights/CfgWeapons.hpp index 41c0241c36..25b83815b4 100644 --- a/addons/realisticweights/CfgWeapons.hpp +++ b/addons/realisticweights/CfgWeapons.hpp @@ -199,7 +199,7 @@ class CfgWeapons { }; // - CZ Scorpion ---------------------------------------------------------- - class SMG_02_base_F: Rifle_Base_F { + class SMG_02_base_F: Rifle_Short_Base_F { class WeaponSlotsInfo; }; class SMG_02_F: SMG_02_base_F { diff --git a/addons/smallarms/CfgWeapons.hpp b/addons/smallarms/CfgWeapons.hpp index d998ceb1da..cc7e3cbf2e 100644 --- a/addons/smallarms/CfgWeapons.hpp +++ b/addons/smallarms/CfgWeapons.hpp @@ -111,7 +111,7 @@ class CfgWeapons { // SMG Scorpion //////////////////////////////////////////////////// - class SMG_02_base_F: Rifle_Base_F { + class SMG_02_base_F: Rifle_Short_Base_F { //http://www.czub.cz/zbrojovka/cz-manual/Instruction-Manual-Scorpion-EVO-3-A1_en.pdf // 1150 rpm From 3e0f85b4f1c78597b660ccb9b9fc55bb9113963b Mon Sep 17 00:00:00 2001 From: ulteq Date: Thu, 1 Dec 2016 21:20:51 +0100 Subject: [PATCH 235/826] RangeCard - Take bore height into account (#4715) --- addons/rangecard/CfgVehicles.hpp | 2 +- addons/rangecard/XEH_postInit.sqf | 2 + .../rangecard/functions/fnc_openRangeCard.sqf | 4 +- .../functions/fnc_updateClassNames.sqf | 2 + .../functions/fnc_updateRangeCard.sqf | 18 +++--- addons/scopes/XEH_PREP.hpp | 1 + addons/scopes/functions/fnc_getBoreHeight.sqf | 57 +++++++++++++++++++ .../functions/fnc_getCurrentZeroRange.sqf | 4 +- .../scopes/functions/fnc_inventoryCheck.sqf | 31 +--------- 9 files changed, 78 insertions(+), 43 deletions(-) create mode 100644 addons/scopes/functions/fnc_getBoreHeight.sqf diff --git a/addons/rangecard/CfgVehicles.hpp b/addons/rangecard/CfgVehicles.hpp index e7df701409..7abc8d979b 100644 --- a/addons/rangecard/CfgVehicles.hpp +++ b/addons/rangecard/CfgVehicles.hpp @@ -34,7 +34,7 @@ class CfgVehicles { class GVAR(makeCopy) { displayName = CSTRING(CopyRangeCard); condition = QUOTE(call FUNC(canShow) && !GVAR(RangeCardOpened)); - statement = QUOTE(GVAR(ammoClassCopy) = GVAR(ammoClass); GVAR(magazineClassCopy) = GVAR(magazineClass); GVAR(weaponClassCopy) = GVAR(ammoClass);); + statement = QUOTE(GVAR(zeroRangeCopy)=GVAR(zeroRange); GVAR(boreHeightCopy)=GVAR(boreHeight); GVAR(ammoClassCopy)=GVAR(ammoClass); GVAR(magazineClassCopy)=GVAR(magazineClass); GVAR(weaponClassCopy)=GVAR(weaponClass);); showDisabled = 0; priority = 0.1; icon = QPATHTOF(UI\RangeCard_Icon.paa); diff --git a/addons/rangecard/XEH_postInit.sqf b/addons/rangecard/XEH_postInit.sqf index 55005fd0a8..9e60821fc1 100644 --- a/addons/rangecard/XEH_postInit.sqf +++ b/addons/rangecard/XEH_postInit.sqf @@ -7,11 +7,13 @@ GVAR(RangeCardOpened) = false; GVAR(controls) = []; GVAR(zeroRange) = 100; +GVAR(boreHeight) = 3.81; GVAR(ammoClass) = "B_65x39_Caseless"; GVAR(magazineClass) = "30Rnd_65x39_caseless_mag"; GVAR(weaponClass) = "arifle_MXM_F"; GVAR(zeroRangeCopy) = 100; +GVAR(boreHeightCopy) = 3.81; GVAR(ammoClassCopy) = "";//"ACE_762x51_Ball_M118LR"; GVAR(magazineClassCopy) = "";//"ACE_20Rnd_762x51_M118LR_Mag"; GVAR(weaponClassCopy) = "";//srifle_DMR_06_olive_F"; diff --git a/addons/rangecard/functions/fnc_openRangeCard.sqf b/addons/rangecard/functions/fnc_openRangeCard.sqf index e73cdebd2a..4a9945e513 100644 --- a/addons/rangecard/functions/fnc_openRangeCard.sqf +++ b/addons/rangecard/functions/fnc_openRangeCard.sqf @@ -23,7 +23,7 @@ if (_this) then { createDialog "ACE_RangeCard_Dialog"; - [GVAR(zeroRangeCopy), GVAR(ammoClassCopy), GVAR(magazineClassCopy), GVAR(weaponClassCopy)] call FUNC(updateRangeCard); + [GVAR(zeroRangeCopy), GVAR(boreHeightCopy), GVAR(ammoClassCopy), GVAR(magazineClassCopy), GVAR(weaponClassCopy)] call FUNC(updateRangeCard); }; } else { if (ACE_player call FUNC(updateClassNames)) then { @@ -31,6 +31,6 @@ if (_this) then { createDialog "ACE_RangeCard_Dialog"; - [GVAR(zeroRange), GVAR(ammoClass), GVAR(magazineClass), GVAR(weaponClass)] call FUNC(updateRangeCard); + [GVAR(zeroRange), GVAR(boreHeight), GVAR(ammoClass), GVAR(magazineClass), GVAR(weaponClass)] call FUNC(updateRangeCard); }; }; diff --git a/addons/rangecard/functions/fnc_updateClassNames.sqf b/addons/rangecard/functions/fnc_updateClassNames.sqf index be9256650a..12f9c5c2e8 100644 --- a/addons/rangecard/functions/fnc_updateClassNames.sqf +++ b/addons/rangecard/functions/fnc_updateClassNames.sqf @@ -38,11 +38,13 @@ if (_ammoClass == "") exitWith { (GVAR(ammoClass) != "" && GVAR(magazineClass) ! if (_unit == ACE_player) then { GVAR(zeroRange) = [_unit] call EFUNC(scopes,getCurrentZeroRange); + GVAR(boreHeight) = [_unit, 0] call EFUNC(scopes,getBoreHeight); GVAR(ammoClass) = _ammoClass; GVAR(magazineClass) = _magazineClass; GVAR(weaponClass) = _weaponClass; } else { GVAR(zeroRangeCopy) = [_unit] call EFUNC(scopes,getCurrentZeroRange); + GVAR(boreHeightCopy) = [_unit, 0] call EFUNC(scopes,getBoreHeight); GVAR(ammoClassCopy) = _ammoClass; GVAR(magazineClassCopy) = _magazineClass; GVAR(weaponClassCopy) = _weaponClass; diff --git a/addons/rangecard/functions/fnc_updateRangeCard.sqf b/addons/rangecard/functions/fnc_updateRangeCard.sqf index 23a63641c5..e62a5ee418 100644 --- a/addons/rangecard/functions/fnc_updateRangeCard.sqf +++ b/addons/rangecard/functions/fnc_updateRangeCard.sqf @@ -4,9 +4,10 @@ * * Arguments: * 0: zero range - * 1: ammo class - * 2: magazine class - * 3: weapon class + * 1: bore height + * 2: ammo class + * 3: magazine class + * 4: weapon class * * Return Value: * Nothing @@ -21,9 +22,9 @@ disableSerialization; #define __dsp (uiNamespace getVariable "RangleCard_Display") -private ["_airFriction", "_ammoConfig", "_atmosphereModel", "_transonicStabilityCoef", "_barrelLength", "_barrelTwist", "_bc", "_boreHeight", "_cacheEntry", "_column", "_control", "_dragModel", "_i", "_muzzleVelocity", "_offset", "_row", "_weaponConfig", "_initSpeed", "_initSpeedCoef"]; +private ["_airFriction", "_ammoConfig", "_atmosphereModel", "_transonicStabilityCoef", "_barrelLength", "_barrelTwist", "_bc", "_cacheEntry", "_column", "_control", "_dragModel", "_i", "_muzzleVelocity", "_offset", "_row", "_weaponConfig", "_initSpeed", "_initSpeedCoef"]; -params ["_zeroRange", "_ammoClass", "_magazineClass", "_weaponClass"]; +params ["_zeroRange", "_boreHeight", "_ammoClass", "_magazineClass", "_weaponClass"]; if (_ammoClass == "" || _magazineClass == "" || _weaponClass == "") exitWith {}; @@ -106,7 +107,6 @@ if (count (_ammoConfig select 6) > 0) then { _transonicStabilityCoef = _ammoConfig select 4; _dragModel = _ammoConfig select 5; _atmosphereModel = _ammoConfig select 8; -_boreHeight = 3.81; private _useABConfig = (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]); if (_bc == 0) then { @@ -157,7 +157,7 @@ if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) t ctrlSetText [77004 , ""]; }; -_cacheEntry = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4), _zeroRange, _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]]; +_cacheEntry = missionNamespace getVariable format[QGVAR(%1_%2_%3_%4_%5), _zeroRange, _boreHeight, _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]]; if (isNil {_cacheEntry}) then { private _scopeBaseAngle = if (!_useABConfig) then { private _zeroAngle = "ace_advanced_ballistics" callExtension format ["zeroAngleVanilla:%1:%2:%3:%4", _zeroRange, _muzzleVelocity, _airFriction, _boreHeight]; @@ -192,7 +192,7 @@ if (isNil {_cacheEntry}) then { }; }; - missionNamespace setVariable [format[QGVAR(%1_%2_%3_%4), _zeroRange, _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]], [GVAR(rangeCardDataElevation), GVAR(rangeCardDataWindage), GVAR(rangeCardDataLead), GVAR(rangeCardDataMVs), GVAR(lastValidRow)]]; + missionNamespace setVariable [format[QGVAR(%1_%2_%3_%4_%5), _zeroRange, _boreHeight, _ammoClass, _weaponClass, missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]], [GVAR(rangeCardDataElevation), GVAR(rangeCardDataWindage), GVAR(rangeCardDataLead), GVAR(rangeCardDataMVs), GVAR(lastValidRow)]]; } else { GVAR(rangeCardDataElevation) = _cacheEntry select 0; GVAR(rangeCardDataWindage) = _cacheEntry select 1; @@ -243,7 +243,7 @@ for "_column" from 0 to 8 do { if (_useABConfig) then { ctrlSetText [770020, "For best results keep ammunition at ambient air temperature. Tables calculated for the above listed barrel"]; - ctrlSetText [770021, "and load with optic mounted 1.5'' above line of bore."]; + ctrlSetText [770021, format["and load with optic mounted %1'' above line of bore.", round((_boreHeight / 2.54) * 10) / 10]]; } else { ctrlSetText [770020, ""]; ctrlSetText [770021, ""]; diff --git a/addons/scopes/XEH_PREP.hpp b/addons/scopes/XEH_PREP.hpp index 8d79196650..a8489fe585 100644 --- a/addons/scopes/XEH_PREP.hpp +++ b/addons/scopes/XEH_PREP.hpp @@ -5,6 +5,7 @@ PREP(applyScopeAdjustment); PREP(calculateZeroAngleCorrection); PREP(canAdjustZero); PREP(firedEH); +PREP(getBoreHeight); PREP(getCurrentZeroRange); PREP(getOptics); PREP(initModuleSettings); diff --git a/addons/scopes/functions/fnc_getBoreHeight.sqf b/addons/scopes/functions/fnc_getBoreHeight.sqf new file mode 100644 index 0000000000..fb061e5d46 --- /dev/null +++ b/addons/scopes/functions/fnc_getBoreHeight.sqf @@ -0,0 +1,57 @@ +/* + * Author: Ruthberg + * Gets the bore height of the weapon & optic combination with the given weapon index + * + * Arguments: + * 0: Unit + * 1: Weapon index + * + * Return Value: + * bore height + * + * Example: + * [player] call ace_scopes_fnc_getBoreHeight + * + * Public: Yes + */ +#include "script_component.hpp" + +params ["_player", "_weaponIndex"]; + +if (_weaponIndex < 0 || {_weaponIndex > 2}) exitWith { 0 }; + +private _weaponClass = [primaryWeapon _player, secondaryWeapon _player, handgunWeapon _player] select _weaponIndex; +private _opticsClass = ([_player] call FUNC(getOptics)) select _weaponIndex; + +if (_opticsClass == "") then { _opticsClass = _weaponClass; }; + +// Determine rail height above bore +private _railHeightAboveBore = 0; +private _weaponConfig = configFile >> "CfgWeapons" >> _weaponClass; +if (isNumber (_weaponConfig >> "ACE_RailHeightAboveBore")) then { + _railHeightAboveBore = getNumber(_weaponConfig >> "ACE_RailHeightAboveBore"); +} else { + switch (_weaponIndex) do { + case 0: { _railHeightAboveBore = 2.0; }; // Rifle + case 2: { _railHeightAboveBore = 0.7; }; // Pistol + }; +}; +// Determine scope height above rail +private _scopeHeightAboveRail = 0; +private _opticConfig = configFile >> "CfgWeapons" >> _opticsClass; +if (isNumber (_opticConfig >> "ACE_ScopeHeightAboveRail")) then { + _scopeHeightAboveRail = getNumber(_opticConfig >> "ACE_ScopeHeightAboveRail"); +} else { + switch (getNumber(_opticConfig >> "ItemInfo" >> "opticType")) do { + case 1: { _scopeHeightAboveRail = 3.0; }; // RCO or similar + case 2: { _scopeHeightAboveRail = 4.0; }; // High power scope + default { + switch (_weaponIndex) do { + case 0: { _scopeHeightAboveRail = 0.5; }; // Rifle iron sights + case 2: { _scopeHeightAboveRail = 0.3; }; // Pistol iron sights + }; + }; + }; +}; + +(_railHeightAboveBore + _scopeHeightAboveRail) diff --git a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf index a82bd0714e..7af8d2e3e9 100644 --- a/addons/scopes/functions/fnc_getCurrentZeroRange.sqf +++ b/addons/scopes/functions/fnc_getCurrentZeroRange.sqf @@ -6,10 +6,10 @@ * 0: Unit * * Return Value: - * current zero range + * current zero range * * Example: - * _unit call ace_scopes_fnc_getCurrentZeroRange + * [player] call ace_scopes_fnc_getCurrentZeroRange * * Public: No */ diff --git a/addons/scopes/functions/fnc_inventoryCheck.sqf b/addons/scopes/functions/fnc_inventoryCheck.sqf index bb68b6ee17..2af9c56ec0 100644 --- a/addons/scopes/functions/fnc_inventoryCheck.sqf +++ b/addons/scopes/functions/fnc_inventoryCheck.sqf @@ -69,35 +69,8 @@ private _newGuns = [primaryWeapon _player, secondaryWeapon _player, handgunWeapo _adjustment set [_forEachIndex, [0, 0, 0]]; _updateAdjustment = true; }; - // Determine rail height above bore - private _railHeightAboveBore = 0; - private _weaponConfig = configFile >> "CfgWeapons" >> (_newGuns select _x); - if (isNumber (_weaponConfig >> "ACE_RailHeightAboveBore")) then { - _railHeightAboveBore = getNumber(_weaponConfig >> "ACE_RailHeightAboveBore"); - } else { - switch (_x) do { - case 0: { _railHeightAboveBore = 2.0; }; // Rifle - case 2: { _railHeightAboveBore = 0.7; }; // Pistol - }; - }; - // Determine scope height above rail - private _scopeHeightAboveRail = 0; - private _opticConfig = configFile >> "CfgWeapons" >> (_newOptics select _x); - if (isNumber (_opticConfig >> "ACE_ScopeHeightAboveRail")) then { - _scopeHeightAboveRail = getNumber(_opticConfig >> "ACE_ScopeHeightAboveRail"); - } else { - switch (getNumber(_opticConfig >> "ItemInfo" >> "opticType")) do { - case 1: { _scopeHeightAboveRail = 3.0; }; // RCO or similar - case 2: { _scopeHeightAboveRail = 4.0; }; // High power scope - default { - switch (_x) do { - case 0: { _scopeHeightAboveRail = 0.5; }; // Rifle iron sights - case 2: { _scopeHeightAboveRail = 0.3; }; // Pistol iron sights - }; - }; - }; - }; - GVAR(boreHeight) set [_x, _railHeightAboveBore + _scopeHeightAboveRail]; + + GVAR(boreHeight) set [_x, [_player, _x] call FUNC(getBoreHeight)]; if ((_newOptics select _x) == "") then { // Check if the weapon comes with an integrated optic From 4eba77f3283ba81b57f85436dae9bf2bbd0b850c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 1 Dec 2016 20:36:10 -0600 Subject: [PATCH 236/826] Fix blood drop selection if blood loss is high close #4739 --- addons/medical_blood/functions/fnc_onBleeding.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_blood/functions/fnc_onBleeding.sqf b/addons/medical_blood/functions/fnc_onBleeding.sqf index 204483ce43..4357bc382a 100644 --- a/addons/medical_blood/functions/fnc_onBleeding.sqf +++ b/addons/medical_blood/functions/fnc_onBleeding.sqf @@ -33,6 +33,6 @@ if ((CBA_missionTime - _lastTime) + _bloodLoss >= 8 + random 2) then { ]; _position set [2, 0]; - private _bloodDrop = ["blooddrop_1", "blooddrop_2", "blooddrop_3", "blooddrop_4"] select floor (_bloodLoss max 3); + private _bloodDrop = ["blooddrop_1", "blooddrop_2", "blooddrop_3", "blooddrop_4"] select floor (_bloodLoss min 3); [_bloodDrop, _position, getDir _unit] call FUNC(createBlood); }; From d75eeac1e4b2cf92e67f00038bdd7334e547040f Mon Sep 17 00:00:00 2001 From: commy2 Date: Fri, 2 Dec 2016 17:09:48 +0100 Subject: [PATCH 237/826] fix usage of reserved variable "" in FUNC(getDetectorConfig), fix #4741 (#4742) --- addons/minedetector/functions/fnc_getDetectorConfig.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/minedetector/functions/fnc_getDetectorConfig.sqf b/addons/minedetector/functions/fnc_getDetectorConfig.sqf index ccafa83edd..8b78a0b9ee 100644 --- a/addons/minedetector/functions/fnc_getDetectorConfig.sqf +++ b/addons/minedetector/functions/fnc_getDetectorConfig.sqf @@ -18,6 +18,8 @@ params ["_detectorType"]; +if (_detectorType isEqualTo "") exitWith {[]}; + private _detectorConfig = GVAR(detectorConfigs) getVariable _detectorType; if (isNil "_detectorConfig") then { private _cfgEntry = (configFile >> "ACE_detector" >> "detectors" >> _detectorType); From 8d1f988f5d501fb0ee1f7f96945120f58ccd2db7 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 2 Dec 2016 12:44:39 -0600 Subject: [PATCH 238/826] AdvThrow - Make sure ammo setVar is not empty (#4743) --- addons/advanced_throwing/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_throwing/XEH_postInit.sqf b/addons/advanced_throwing/XEH_postInit.sqf index 4cb4f320e2..f3c0d4b9f6 100644 --- a/addons/advanced_throwing/XEH_postInit.sqf +++ b/addons/advanced_throwing/XEH_postInit.sqf @@ -11,7 +11,7 @@ GVAR(ammoMagLookup) = call CBA_fnc_createNamespace; { { private _ammo = getText (configFile >> "CfgMagazines" >> _x >> "ammo"); - GVAR(ammoMagLookup) setVariable [_ammo, _x]; + if (_ammo != "") then { GVAR(ammoMagLookup) setVariable [_ammo, _x]; }; } count (getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines")); nil } count getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles"); From 0b854a6077651e946bbaa1c6bead1690957228d5 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 4 Dec 2016 14:30:00 +0100 Subject: [PATCH 239/826] Increase days inactive issues reminders --- .gibot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gibot.yml b/.gibot.yml index 1fdf83063e..194d376713 100644 --- a/.gibot.yml +++ b/.gibot.yml @@ -35,7 +35,7 @@ stages: remove_label: - marked for cleanup remind_about_old_ticket: - days: 130 + days: 160 labels: - bug - critical bug From 8afc4083d055c98a486b3f60765adde731221cf3 Mon Sep 17 00:00:00 2001 From: ulteq Date: Fri, 9 Dec 2016 20:22:53 +0100 Subject: [PATCH 240/826] Advanced Ballistics - Improved spin drift calculation (#4755) --- ace_advanced_ballistics.dll | Bin 265216 -> 265216 bytes .../AdvancedBallistics.cpp | 4 +++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ace_advanced_ballistics.dll b/ace_advanced_ballistics.dll index 1af3d8ca3ce545c9e92cb5f4f722b76cabe0c4f7..09b93a543fd59b69a41b80e632c3da4958b7a496 100644 GIT binary patch delta 22246 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 vRM1oFuZ_^w*UFK)-srW4U-P7eZodBy$ZfMG delta 22231 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

2y 0) { double bulletDir = atan2(velocity[0], velocity[1]); - double spinAccel = bulletDatabase[index].twistDirection * (0.0482251 * (bulletDatabase[index].stabilityFactor + 1.2)) / pow(TOF, 0.17); + double r1 = pow(TOF - deltaT, 0.17); + double r2 = pow(TOF, 0.17); + double spinAccel = bulletDatabase[index].twistDirection * (0.0482251 * (bulletDatabase[index].stabilityFactor + 1.2)) / ((r1 + r2) / 2.0f); velocityOffset[0] += sin(bulletDir + M_PI / 2) * spinAccel * deltaT; velocityOffset[1] += cos(bulletDir + M_PI / 2) * spinAccel * deltaT; } From b72541df23429f83484b0dff54187e429bbff1fb Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 12 Dec 2016 19:29:58 +0100 Subject: [PATCH 241/826] Jpn translation v382 (#4710) * jpn scopes translation this is Japanese translation for scope * fix jpn weather translation Fix for Weather japanese translation * fix jpn Repair translation fix jpn Repair translation * jpn zeus translation Japanese localization for zeus --- addons/repair/stringtable.xml | 2 +- addons/scopes/stringtable.xml | 82 +++++++++++++++++++++++++++++++++- addons/weather/stringtable.xml | 4 +- addons/zeus/stringtable.xml | 20 +++++++++ 4 files changed, 104 insertions(+), 4 deletions(-) diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index caff823745..dbeb4db9b3 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -845,7 +845,7 @@ Nastavení oprav Impostazioni Riparazioni Réglages de réparation - 車両の全種類に修理システムを適用しますか? + 修理設定 Provides a repair system for all types of vehicles. diff --git a/addons/scopes/stringtable.xml b/addons/scopes/stringtable.xml index 33a9e8beef..433e7cfcfc 100644 --- a/addons/scopes/stringtable.xml +++ b/addons/scopes/stringtable.xml @@ -1,6 +1,82 @@  + + Scopes + スコープ + + + Enable ACE Scope adjustment + ACE スコープ調節を有効化 + + + Enable adjustmet turrets on high powered scopes + 高倍率スコープでACE スコープ調節を有効化 + + + Force adjustment turrets + ACE スコープ調節を有効化 + + + Force usage of adjustmet turrets on high powered scopes + 高倍率スコープで調整の使用を強制させます + + + Correct zeroing + ゼロイン調節 + + + Corrects the zeroing of all small arms sights + 全ての小口径用照準器のゼロインを調節します + + + Overwrite zero distance + ゼロイン距離を上書き + + + Uses the 'defaultZeroRange' setting to overwrite the zero range of high power scopes + 'defaultZeroRange'設定を使う高倍率スコープのゼロイン距離を上書きします + + + Default zero distance + 標準のゼロイン距離 + + + High power scopes will be zeroed at this distance + 高倍率スコープのゼロイン距離はこの設定になります + + + Reference temperature + 温度の参照 + + + Temperature at which the scope was zeroed + スコープがゼロインされる温度 + + + Reference barometric pressure + 気圧の参照 + + + Barometric pressure at which the scope was zeroed + 気圧の参照 + + + Reference humidity + 湿度の参照 + + + Humidity at which the scope was zeroed + スコープがゼロインされる湿度 + + + Deduce pressure from altitude + 高度により圧が減少 + + + Deduce the barometric pressure from the terrain altitude + 標高により気圧が減少されます + Minor adjustment up Zerowanie powoli w górę @@ -118,5 +194,9 @@ Vynulovat korekci ゼロインを調節 + + This module adds windage and elevation adjustment turrets on high power rifle scopes. + モジュールは高倍率ライフル スコープにおいて横風と仰角の調節ができます。 + - \ No newline at end of file + diff --git a/addons/weather/stringtable.xml b/addons/weather/stringtable.xml index 0a241488b9..879e77f808 100644 --- a/addons/weather/stringtable.xml +++ b/addons/weather/stringtable.xml @@ -38,7 +38,7 @@ Időjárás Погода Meteo - ACE 天候モジュールではマルチプレイで同期します。 + 天候 Multiplayer synchronized ACE weather module @@ -210,4 +210,4 @@ 天候を更新する間隔を定義します。(秒) - \ No newline at end of file + diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 6a6f75a450..ef4b4404fd 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -204,6 +204,26 @@ 防衛範囲 Osłaniaj obszar + + Update Editable Objects + 編集可能なオブジェクトを更新 + + + All Curators + 全キュレーター + + + Apply changes to all curators + 全キュレーターへ変更を適用 + + + Remove Objects + オブジェクトの削除 + + + Remove existing instead of adding new + 新しく追加するために削除します + Global AI Skill Compétence global de l'IA From d1287a471d8e5ed77813e64fb4a6a44362b1d12f Mon Sep 17 00:00:00 2001 From: magicsh0tz Date: Sat, 26 Nov 2016 02:18:04 +0800 Subject: [PATCH 242/826] Switched to CBA_fnc_waitAndExecute (#4709) * Switched to CBA_fnc_waitAndExecute * Switched to CBA_fnc_waitAndExecute --- optionals/compat_rhs_usf3/functions/fnc_onCut.sqf | 2 +- optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf b/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf index 3663a10bd5..1201d3ee18 100644 --- a/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf +++ b/optionals/compat_rhs_usf3/functions/fnc_onCut.sqf @@ -26,7 +26,7 @@ if !(isNull _fries) then { [{ _this animateDoor ["doorRB", 0]; _this animateDoor ["doorLB", 0]; - }, _vehicle, 2] call EFUNC(common,waitAndExecute); + }, _vehicle, 2] call CBA_fnc_waitAndExecute; 4 } else { diff --git a/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf b/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf index d842a6c174..4bc7c03524 100644 --- a/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf +++ b/optionals/compat_rhs_usf3/functions/fnc_onPrepare.sqf @@ -30,7 +30,7 @@ if !(isNull _fries) then { [{ _this animate ["extendHookRight", 1]; _this animate ["extendHookLeft", 1]; - }, _fries, 2] call EFUNC(common,waitAndExecute); + }, _fries, 2] call CBA_fnc_waitAndExecute; _waitTime = 4; }; From 14c7e9af17ec5a38c371b295046964c61ef00b06 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sun, 27 Nov 2016 16:38:33 -0600 Subject: [PATCH 243/826] AF - Remove setVar when removing eh --- addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf b/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf index c275b91cc8..9d33df10be 100644 --- a/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf +++ b/addons/advanced_fatigue/functions/fnc_handlePlayerChanged.sqf @@ -11,10 +11,13 @@ */ #include "script_component.hpp" params ["_newUnit", "_oldUnit"]; +TRACE_2("unit changed",_newUnit,_oldUnit); if !(isNull _oldUnit) then { _oldUnit enableStamina true; _oldUnit removeEventHandler ["AnimChanged", _oldUnit getVariable [QGVAR(animHandler), -1]]; + _oldUnit setVariable [QGVAR(animHandler), nil]; + TRACE_1("remove old",_oldUnit getVariable QGVAR(animHandler)); _oldUnit setVariable [QGVAR(ae1Reserve), GVAR(ae1Reserve)]; _oldUnit setVariable [QGVAR(ae2Reserve), GVAR(ae2Reserve)]; @@ -30,6 +33,7 @@ if (_newUnit getVariable [QGVAR(animHandler), -1] == -1) then { private _animHandler = _newUnit addEventHandler ["AnimChanged", { GVAR(animDuty) = _this call FUNC(getAnimDuty); }]; + TRACE_1("add new",_animHandler); _newUnit setVariable [QGVAR(animHandler), _animHandler]; }; From de34d57d5bd3766f52b78e6ad6718a9f146d3107 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 1 Dec 2016 12:05:28 -0600 Subject: [PATCH 244/826] Update SMG_02 base class for 1.66 (#4718) --- addons/ai/CfgWeapons.hpp | 2 +- addons/ballistics/CfgWeapons.hpp | 2 +- addons/realisticweights/CfgWeapons.hpp | 2 +- addons/smallarms/CfgWeapons.hpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/ai/CfgWeapons.hpp b/addons/ai/CfgWeapons.hpp index 74df685fb0..01d8d5f9c2 100644 --- a/addons/ai/CfgWeapons.hpp +++ b/addons/ai/CfgWeapons.hpp @@ -467,7 +467,7 @@ class CfgWeapons { }; // Scorpion EVO - class SMG_02_base_F: Rifle_Base_F { + class SMG_02_base_F: Rifle_Short_Base_F { class Single: Mode_SemiAuto { minRange = 50; //2; diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 3cbf8de544..8022386511 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -386,7 +386,7 @@ class CfgWeapons { ACE_barrelTwist=285.75; ACE_barrelLength=457.2; }; - class SMG_02_base_F: Rifle_Base_F { + class SMG_02_base_F: Rifle_Short_Base_F { initSpeed = -1.10288; ACE_barrelTwist=254.0; ACE_barrelLength=195.58; diff --git a/addons/realisticweights/CfgWeapons.hpp b/addons/realisticweights/CfgWeapons.hpp index d84b13ab72..dc4d79f43d 100644 --- a/addons/realisticweights/CfgWeapons.hpp +++ b/addons/realisticweights/CfgWeapons.hpp @@ -199,7 +199,7 @@ class CfgWeapons { }; // - CZ Scorpion ---------------------------------------------------------- - class SMG_02_base_F: Rifle_Base_F { + class SMG_02_base_F: Rifle_Short_Base_F { class WeaponSlotsInfo; }; class SMG_02_F: SMG_02_base_F { diff --git a/addons/smallarms/CfgWeapons.hpp b/addons/smallarms/CfgWeapons.hpp index d998ceb1da..cc7e3cbf2e 100644 --- a/addons/smallarms/CfgWeapons.hpp +++ b/addons/smallarms/CfgWeapons.hpp @@ -111,7 +111,7 @@ class CfgWeapons { // SMG Scorpion //////////////////////////////////////////////////// - class SMG_02_base_F: Rifle_Base_F { + class SMG_02_base_F: Rifle_Short_Base_F { //http://www.czub.cz/zbrojovka/cz-manual/Instruction-Manual-Scorpion-EVO-3-A1_en.pdf // 1150 rpm From 11b464b585c007f926208226ab44371bc34e0167 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 1 Dec 2016 20:36:10 -0600 Subject: [PATCH 245/826] Fix blood drop selection if blood loss is high close #4739 --- addons/medical_blood/functions/fnc_onBleeding.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/medical_blood/functions/fnc_onBleeding.sqf b/addons/medical_blood/functions/fnc_onBleeding.sqf index 204483ce43..4357bc382a 100644 --- a/addons/medical_blood/functions/fnc_onBleeding.sqf +++ b/addons/medical_blood/functions/fnc_onBleeding.sqf @@ -33,6 +33,6 @@ if ((CBA_missionTime - _lastTime) + _bloodLoss >= 8 + random 2) then { ]; _position set [2, 0]; - private _bloodDrop = ["blooddrop_1", "blooddrop_2", "blooddrop_3", "blooddrop_4"] select floor (_bloodLoss max 3); + private _bloodDrop = ["blooddrop_1", "blooddrop_2", "blooddrop_3", "blooddrop_4"] select floor (_bloodLoss min 3); [_bloodDrop, _position, getDir _unit] call FUNC(createBlood); }; From 757ab78191425c307ebfbfd571297c1f0c1d3b04 Mon Sep 17 00:00:00 2001 From: commy2 Date: Fri, 2 Dec 2016 17:09:48 +0100 Subject: [PATCH 246/826] fix usage of reserved variable "" in FUNC(getDetectorConfig), fix #4741 (#4742) --- addons/minedetector/functions/fnc_getDetectorConfig.sqf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/minedetector/functions/fnc_getDetectorConfig.sqf b/addons/minedetector/functions/fnc_getDetectorConfig.sqf index ccafa83edd..8b78a0b9ee 100644 --- a/addons/minedetector/functions/fnc_getDetectorConfig.sqf +++ b/addons/minedetector/functions/fnc_getDetectorConfig.sqf @@ -18,6 +18,8 @@ params ["_detectorType"]; +if (_detectorType isEqualTo "") exitWith {[]}; + private _detectorConfig = GVAR(detectorConfigs) getVariable _detectorType; if (isNil "_detectorConfig") then { private _cfgEntry = (configFile >> "ACE_detector" >> "detectors" >> _detectorType); From 06caea825b80249c9dd118734a7892e364450822 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 2 Dec 2016 12:44:39 -0600 Subject: [PATCH 247/826] AdvThrow - Make sure ammo setVar is not empty (#4743) --- addons/advanced_throwing/XEH_postInit.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/advanced_throwing/XEH_postInit.sqf b/addons/advanced_throwing/XEH_postInit.sqf index 4cb4f320e2..f3c0d4b9f6 100644 --- a/addons/advanced_throwing/XEH_postInit.sqf +++ b/addons/advanced_throwing/XEH_postInit.sqf @@ -11,7 +11,7 @@ GVAR(ammoMagLookup) = call CBA_fnc_createNamespace; { { private _ammo = getText (configFile >> "CfgMagazines" >> _x >> "ammo"); - GVAR(ammoMagLookup) setVariable [_ammo, _x]; + if (_ammo != "") then { GVAR(ammoMagLookup) setVariable [_ammo, _x]; }; } count (getArray (configFile >> "CfgWeapons" >> "Throw" >> _x >> "magazines")); nil } count getArray (configFile >> "CfgWeapons" >> "Throw" >> "muzzles"); From 1ecd674ac66f04d18022e4df24be95edfb8036bb Mon Sep 17 00:00:00 2001 From: jonpas Date: Mon, 12 Dec 2016 19:36:53 +0100 Subject: [PATCH 248/826] Exclude uniforms with inherited modelSides (#4720) --- optionals/compat_rhs_afrf3/XEH_preInit.sqf | 2 + optionals/compat_rhs_usf3/XEH_preInit.sqf | 2 + optionals/nocrosshair/script_component.hpp | 1 - .../nouniformrestrictions/CfgVehicles.hpp | 1438 +---------------- .../nouniformrestrictions/XEH_preInit.sqf | 2 + .../functions/fnc_exportConfig.sqf | 22 +- .../script_component.hpp | 7 +- 7 files changed, 40 insertions(+), 1434 deletions(-) diff --git a/optionals/compat_rhs_afrf3/XEH_preInit.sqf b/optionals/compat_rhs_afrf3/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/optionals/compat_rhs_afrf3/XEH_preInit.sqf +++ b/optionals/compat_rhs_afrf3/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/optionals/compat_rhs_usf3/XEH_preInit.sqf b/optionals/compat_rhs_usf3/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/optionals/compat_rhs_usf3/XEH_preInit.sqf +++ b/optionals/compat_rhs_usf3/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/optionals/nocrosshair/script_component.hpp b/optionals/nocrosshair/script_component.hpp index 5f3bea04c6..9510eadef0 100644 --- a/optionals/nocrosshair/script_component.hpp +++ b/optionals/nocrosshair/script_component.hpp @@ -4,7 +4,6 @@ // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE -// #define CBA_DEBUG_SYNCHRONOUS // #define ENABLE_PERFORMANCE_COUNTERS #ifdef DEBUG_ENABLED_NOCROSSHAIR diff --git a/optionals/nouniformrestrictions/CfgVehicles.hpp b/optionals/nouniformrestrictions/CfgVehicles.hpp index b4a2a0465a..5b02892462 100644 --- a/optionals/nouniformrestrictions/CfgVehicles.hpp +++ b/optionals/nouniformrestrictions/CfgVehicles.hpp @@ -1,13 +1,29 @@ class CfgVehicles { class Civilian; class CAManBase; + class B_Soldier_diver_base_F; + class C_man_1; + class I_G_Soldier_F; + class I_G_Soldier_lite_F; + class I_G_Soldier_SL_F; + class I_G_Soldier_TL_F; + class I_G_Soldier_AR_F; + class I_G_medic_F; + class I_G_engineer_F; + class I_G_Soldier_exp_F; + class I_G_Soldier_GL_F; + class I_G_Soldier_M_F; + class I_G_Soldier_LAT_F; + class I_G_Soldier_A_F; + class I_G_officer_F; + class I_Soldier_diver_base_F; + class O_Soldier_diver_base_F; + class I_G_Sharpshooter_F; + class B_Soldier_F; class Civilian_F: Civilian { modelSides[] = {6}; }; - class C_man_1: Civilian_F { - modelSides[] = {6}; - }; class SoldierWB: CAManBase { modelSides[] = {6}; }; @@ -17,12 +33,6 @@ class CfgVehicles { class SoldierGB: CAManBase { modelSides[] = {6}; }; - class VirtualMan_F: Civilian_F { - modelSides[] = {6}; - }; - class HeadlessClient_F: VirtualMan_F { - modelSides[] = {6}; - }; class B_Soldier_base_F: SoldierWB { modelSides[] = {6}; }; @@ -38,291 +48,39 @@ class CfgVehicles { class B_Soldier_05_f: B_Soldier_base_F { modelSides[] = {6}; }; - class B_Soldier_F: B_Soldier_base_F { - modelSides[] = {6}; - }; class B_RangeMaster_F: B_Soldier_base_F { modelSides[] = {6}; }; - class B_Soldier_lite_F: B_Soldier_03_f { - modelSides[] = {6}; - }; - class B_Soldier_GL_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_soldier_AR_F: B_Soldier_02_f { - modelSides[] = {6}; - }; - class B_Soldier_SL_F: B_Soldier_03_f { - modelSides[] = {6}; - }; - class B_Soldier_TL_F: B_Soldier_03_f { - modelSides[] = {6}; - }; - class B_soldier_M_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_soldier_LAT_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_medic_F: B_Soldier_02_f { - modelSides[] = {6}; - }; - class B_soldier_repair_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_soldier_exp_F: B_Soldier_base_F { - modelSides[] = {6}; - }; class B_Helipilot_F: B_Soldier_04_f { modelSides[] = {6}; }; - class B_Soldier_A_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_soldier_AT_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_soldier_AA_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_engineer_F: B_Soldier_03_f { - modelSides[] = {6}; - }; - class B_crew_F: B_Soldier_03_f { - modelSides[] = {6}; - }; - class B_officer_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_Competitor_F: B_RangeMaster_F { - modelSides[] = {6}; - }; class B_Pilot_F: B_Soldier_05_f { modelSides[] = {6}; }; class B_helicrew_F: B_Helipilot_F { modelSides[] = {6}; }; - class B_soldier_PG_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_soldier_UAV_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_Soldier_unarmed_F: B_Soldier_F { - modelSides[] = {6}; - }; - class B_Soldier_diver_base_F: B_Soldier_base_F { - modelSides[] = {6}; - }; class B_diver_F: B_Soldier_diver_base_F { modelSides[] = {6}; }; - class B_diver_TL_F: B_Soldier_diver_base_F { - modelSides[] = {6}; - }; - class B_diver_exp_F: B_Soldier_diver_base_F { - modelSides[] = {6}; - }; - class B_Soldier_recon_base: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_recon_F: B_Soldier_recon_base { - modelSides[] = {6}; - }; - class B_recon_LAT_F: B_Soldier_recon_base { - modelSides[] = {6}; - }; - class B_recon_exp_F: B_Soldier_recon_base { - modelSides[] = {6}; - }; - class B_recon_medic_F: B_Soldier_recon_base { - modelSides[] = {6}; - }; - class B_recon_TL_F: B_Soldier_recon_base { - modelSides[] = {6}; - }; - class B_recon_M_F: B_Soldier_recon_base { - modelSides[] = {6}; - }; - class B_recon_JTAC_F: B_Soldier_recon_base { - modelSides[] = {6}; - }; - class B_Soldier_sniper_base_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_spotter_F: B_Soldier_sniper_base_F { - modelSides[] = {6}; - }; - class B_sniper_F: B_Soldier_sniper_base_F { - modelSides[] = {6}; - }; class B_Story_SF_Captain_F: B_Soldier_02_f { modelSides[] = {6}; }; class B_Story_Protagonist_F: B_Soldier_02_f { modelSides[] = {6}; }; - class B_Story_Engineer_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_Story_Colonel_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_Story_Pilot_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_Story_Tank_Commander_F: B_Soldier_base_F { - modelSides[] = {6}; - }; class b_soldier_survival_F: B_Soldier_base_F { modelSides[] = {6}; }; - class B_CTRG_soldier_GL_LAT_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_CTRG_soldier_engineer_exp_F: B_Soldier_02_f { - modelSides[] = {6}; - }; - class B_CTRG_soldier_M_medic_F: B_Soldier_03_f { - modelSides[] = {6}; - }; - class B_CTRG_soldier_AR_A_F: B_Soldier_03_f { - modelSides[] = {6}; - }; - class B_Soldier_support_base_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_soldier_AAR_F: B_Soldier_support_base_F { - modelSides[] = {6}; - }; - class B_soldier_AAT_F: B_Soldier_support_base_F { - modelSides[] = {6}; - }; - class B_soldier_AAA_F: B_soldier_AAT_F { - modelSides[] = {6}; - }; - class B_support_MG_F: B_Soldier_support_base_F { - modelSides[] = {6}; - }; - class B_support_GMG_F: B_Soldier_support_base_F { - modelSides[] = {6}; - }; - class B_support_Mort_F: B_Soldier_support_base_F { - modelSides[] = {6}; - }; - class B_support_AMG_F: B_Soldier_support_base_F { - modelSides[] = {6}; - }; - class B_support_AMort_F: B_Soldier_support_base_F { - modelSides[] = {6}; - }; class C_man_1_1_F: C_man_1 { modelSides[] = {6}; }; - class C_man_1_2_F: C_man_1_1_F { - modelSides[] = {6}; - }; - class C_man_1_3_F: C_man_1_1_F { - modelSides[] = {6}; - }; - class C_man_polo_1_F: C_man_1 { - modelSides[] = {6}; - }; - class C_man_polo_1_F_afro: C_man_polo_1_F { - modelSides[] = {6}; - }; - class C_man_polo_1_F_euro: C_man_polo_1_F { - modelSides[] = {6}; - }; - class C_man_polo_1_F_asia: C_man_polo_1_F { - modelSides[] = {6}; - }; - class C_man_polo_2_F: C_man_polo_1_F { - modelSides[] = {6}; - }; - class C_man_polo_2_F_afro: C_man_polo_2_F { - modelSides[] = {6}; - }; - class C_man_polo_2_F_euro: C_man_polo_2_F { - modelSides[] = {6}; - }; - class C_man_polo_2_F_asia: C_man_polo_2_F { - modelSides[] = {6}; - }; - class C_man_polo_3_F: C_man_polo_1_F { - modelSides[] = {6}; - }; - class C_man_polo_3_F_afro: C_man_polo_3_F { - modelSides[] = {6}; - }; - class C_man_polo_3_F_euro: C_man_polo_3_F { - modelSides[] = {6}; - }; - class C_man_polo_3_F_asia: C_man_polo_3_F { - modelSides[] = {6}; - }; - class C_man_polo_4_F: C_man_polo_1_F { - modelSides[] = {6}; - }; - class C_man_polo_4_F_afro: C_man_polo_4_F { - modelSides[] = {6}; - }; - class C_man_polo_4_F_euro: C_man_polo_4_F { - modelSides[] = {6}; - }; - class C_man_polo_4_F_asia: C_man_polo_4_F { - modelSides[] = {6}; - }; - class C_man_polo_5_F: C_man_polo_1_F { - modelSides[] = {6}; - }; - class C_man_polo_5_F_afro: C_man_polo_5_F { - modelSides[] = {6}; - }; - class C_man_polo_5_F_euro: C_man_polo_5_F { - modelSides[] = {6}; - }; - class C_man_polo_5_F_asia: C_man_polo_5_F { - modelSides[] = {6}; - }; - class C_man_polo_6_F: C_man_polo_1_F { - modelSides[] = {6}; - }; - class C_man_polo_6_F_afro: C_man_polo_6_F { - modelSides[] = {6}; - }; - class C_man_polo_6_F_euro: C_man_polo_6_F { - modelSides[] = {6}; - }; - class C_man_polo_6_F_asia: C_man_polo_6_F { - modelSides[] = {6}; - }; class C_man_p_fugitive_F: C_man_1 { modelSides[] = {6}; }; - class C_man_p_fugitive_F_afro: C_man_p_fugitive_F { - modelSides[] = {6}; - }; - class C_man_p_fugitive_F_euro: C_man_p_fugitive_F { - modelSides[] = {6}; - }; - class C_man_p_fugitive_F_asia: C_man_p_fugitive_F { - modelSides[] = {6}; - }; class C_man_p_beggar_F: C_man_p_fugitive_F { modelSides[] = {6}; }; - class C_man_p_beggar_F_afro: C_man_p_beggar_F { - modelSides[] = {6}; - }; - class C_man_p_beggar_F_euro: C_man_p_beggar_F { - modelSides[] = {6}; - }; - class C_man_p_beggar_F_asia: C_man_p_beggar_F { - modelSides[] = {6}; - }; class C_man_w_worker_F: C_man_1 { modelSides[] = {6}; }; @@ -332,123 +90,15 @@ class CfgVehicles { class C_man_hunter_1_F: C_man_1 { modelSides[] = {6}; }; - class C_man_p_shorts_1_F: C_man_1 { - modelSides[] = {6}; - }; - class C_man_p_shorts_1_F_afro: C_man_p_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_p_shorts_1_F_euro: C_man_p_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_p_shorts_1_F_asia: C_man_p_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_shorts_1_F: C_man_p_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_shorts_1_F_afro: C_man_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_shorts_1_F_euro: C_man_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_shorts_1_F_asia: C_man_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_shorts_2_F: C_man_p_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_shorts_2_F_afro: C_man_shorts_2_F { - modelSides[] = {6}; - }; - class C_man_shorts_2_F_euro: C_man_shorts_2_F { - modelSides[] = {6}; - }; - class C_man_shorts_2_F_asia: C_man_shorts_2_F { - modelSides[] = {6}; - }; - class C_man_shorts_3_F: C_man_p_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_shorts_3_F_afro: C_man_shorts_3_F { - modelSides[] = {6}; - }; - class C_man_shorts_3_F_euro: C_man_shorts_3_F { - modelSides[] = {6}; - }; - class C_man_shorts_3_F_asia: C_man_shorts_3_F { - modelSides[] = {6}; - }; - class C_man_shorts_4_F: C_man_p_shorts_1_F { - modelSides[] = {6}; - }; - class C_man_shorts_4_F_afro: C_man_shorts_4_F { - modelSides[] = {6}; - }; - class C_man_shorts_4_F_euro: C_man_shorts_4_F { - modelSides[] = {6}; - }; - class C_man_shorts_4_F_asia: C_man_shorts_4_F { - modelSides[] = {6}; - }; class C_man_pilot_F: C_man_1 { modelSides[] = {6}; }; class C_journalist_F: C_man_1 { modelSides[] = {6}; }; - class C_Orestes: C_man_1 { - modelSides[] = {6}; - }; - class C_Nikos: C_Orestes { - modelSides[] = {6}; - }; - class C_Nikos_aged: C_Nikos { - modelSides[] = {6}; - }; class I_G_Soldier_base_F: SoldierGB { modelSides[] = {6}; }; - class I_G_Soldier_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_Soldier_lite_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_Soldier_SL_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_Soldier_TL_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_Soldier_AR_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_medic_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_engineer_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_Soldier_exp_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_Soldier_GL_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_Soldier_M_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_Soldier_LAT_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_Soldier_A_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_G_officer_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; class B_G_Soldier_F: I_G_Soldier_F { modelSides[] = {6}; }; @@ -527,408 +177,39 @@ class CfgVehicles { class O_G_officer_F: I_G_officer_F { modelSides[] = {6}; }; - class I_G_Soldier_unarmed_F: I_G_Soldier_F { - modelSides[] = {6}; - }; - class B_G_Soldier_unarmed_F: B_G_Soldier_F { - modelSides[] = {6}; - }; - class O_G_Soldier_unarmed_F: O_G_Soldier_F { - modelSides[] = {6}; - }; - class I_G_Survivor_F: I_G_Soldier_F { - modelSides[] = {6}; - }; - class B_G_Survivor_F: B_G_Soldier_F { - modelSides[] = {6}; - }; - class O_G_Survivor_F: O_G_Soldier_F { - modelSides[] = {6}; - }; - class I_G_Story_Protagonist_F: B_G_Soldier_F { - modelSides[] = {6}; - }; class I_G_Story_SF_Captain_F: B_G_Soldier_F { modelSides[] = {6}; }; - class I_G_resistanceLeader_F: I_G_Story_Protagonist_F { - modelSides[] = {6}; - }; - class I_G_resistanceCommander_F: I_G_Story_Protagonist_F { - modelSides[] = {6}; - }; class I_Soldier_base_F: SoldierGB { modelSides[] = {6}; }; - class I_Soldier_02_F: I_Soldier_base_F { - modelSides[] = {6}; - }; class I_Soldier_03_F: I_Soldier_base_F { modelSides[] = {6}; }; class I_Soldier_04_F: I_Soldier_base_F { modelSides[] = {6}; }; - class I_soldier_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_Soldier_lite_F: I_Soldier_02_F { - modelSides[] = {6}; - }; - class I_Soldier_A_F: I_Soldier_02_F { - modelSides[] = {6}; - }; - class I_Soldier_GL_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_Soldier_AR_F: I_Soldier_02_F { - modelSides[] = {6}; - }; - class I_Soldier_SL_F: I_Soldier_02_F { - modelSides[] = {6}; - }; - class I_Soldier_TL_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_Soldier_M_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_Soldier_LAT_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_Soldier_AT_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_Soldier_AA_F: I_Soldier_02_F { - modelSides[] = {6}; - }; - class I_medic_F: I_Soldier_02_F { - modelSides[] = {6}; - }; - class I_Soldier_repair_F: I_Soldier_02_F { - modelSides[] = {6}; - }; - class I_Soldier_exp_F: I_Soldier_02_F { - modelSides[] = {6}; - }; - class I_engineer_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_crew_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_helipilot_F: I_Soldier_03_F { - modelSides[] = {6}; - }; - class I_pilot_F: I_Soldier_04_F { - modelSides[] = {6}; - }; - class I_helicrew_F: I_helipilot_F { - modelSides[] = {6}; - }; class I_officer_F: I_Soldier_base_F { modelSides[] = {6}; }; - class I_Story_Colonel_F: I_officer_F { - modelSides[] = {6}; - }; - class I_soldier_UAV_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_Soldier_unarmed_F: I_soldier_F { - modelSides[] = {6}; - }; - class I_Soldier_diver_base_F: I_Soldier_base_F { - modelSides[] = {6}; - }; class I_diver_F: I_Soldier_diver_base_F { modelSides[] = {6}; }; - class I_diver_exp_F: I_Soldier_diver_base_F { - modelSides[] = {6}; - }; - class I_diver_TL_F: I_Soldier_diver_base_F { - modelSides[] = {6}; - }; - class I_Soldier_sniper_base_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_Spotter_F: I_Soldier_sniper_base_F { - modelSides[] = {6}; - }; - class I_Sniper_F: I_Soldier_sniper_base_F { - modelSides[] = {6}; - }; - class I_Soldier_support_base_F: I_Soldier_base_F { - modelSides[] = {6}; - }; - class I_Soldier_AAR_F: I_Soldier_support_base_F { - modelSides[] = {6}; - }; - class I_Soldier_AAT_F: I_Soldier_support_base_F { - modelSides[] = {6}; - }; - class I_Soldier_AAA_F: I_Soldier_AAT_F { - modelSides[] = {6}; - }; - class I_support_MG_F: I_Soldier_support_base_F { - modelSides[] = {6}; - }; - class I_support_GMG_F: I_Soldier_support_base_F { - modelSides[] = {6}; - }; - class I_support_Mort_F: I_Soldier_support_base_F { - modelSides[] = {6}; - }; - class I_support_AMG_F: I_Soldier_support_base_F { - modelSides[] = {6}; - }; - class I_support_AMort_F: I_Soldier_support_base_F { - modelSides[] = {6}; - }; class O_Soldier_base_F: SoldierEB { modelSides[] = {6}; }; class O_Soldier_02_F: O_Soldier_base_F { modelSides[] = {6}; }; - class O_Soldier_F: O_Soldier_base_F { - modelSides[] = {6}; - }; class O_officer_F: O_Soldier_base_F { modelSides[] = {6}; }; - class O_Soldier_lite_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Soldier_GL_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Soldier_AR_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Soldier_SL_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Soldier_TL_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_soldier_M_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Soldier_LAT_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_medic_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_soldier_repair_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_soldier_exp_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_helipilot_F: O_Soldier_02_F { - modelSides[] = {6}; - }; - class O_Soldier_A_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Soldier_AT_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Soldier_AA_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_engineer_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_crew_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Pilot_F: O_helipilot_F { - modelSides[] = {6}; - }; - class O_helicrew_F: O_helipilot_F { - modelSides[] = {6}; - }; - class O_soldier_PG_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Story_Colonel_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Story_CEO_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_soldier_UAV_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Soldier_unarmed_F: O_Soldier_F { - modelSides[] = {6}; - }; - class O_Soldier_diver_base_F: O_Soldier_base_F { - modelSides[] = {6}; - }; class O_diver_F: O_Soldier_diver_base_F { modelSides[] = {6}; }; - class O_diver_TL_F: O_Soldier_diver_base_F { - modelSides[] = {6}; - }; - class O_diver_exp_F: O_Soldier_diver_base_F { - modelSides[] = {6}; - }; - class O_Soldier_sniper_base_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_spotter_F: O_Soldier_sniper_base_F { - modelSides[] = {6}; - }; - class O_sniper_F: O_Soldier_sniper_base_F { - modelSides[] = {6}; - }; - class O_Soldier_recon_base: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_recon_F: O_Soldier_recon_base { - modelSides[] = {6}; - }; - class O_recon_M_F: O_Soldier_recon_base { - modelSides[] = {6}; - }; - class O_recon_LAT_F: O_Soldier_recon_base { - modelSides[] = {6}; - }; - class O_recon_medic_F: O_Soldier_recon_base { - modelSides[] = {6}; - }; - class O_recon_exp_F: O_Soldier_recon_base { - modelSides[] = {6}; - }; - class O_recon_JTAC_F: O_Soldier_recon_base { - modelSides[] = {6}; - }; - class O_recon_TL_F: O_Soldier_recon_base { - modelSides[] = {6}; - }; - class O_Soldier_support_base_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Soldier_AAR_F: O_Soldier_support_base_F { - modelSides[] = {6}; - }; - class O_Soldier_AAT_F: O_Soldier_support_base_F { - modelSides[] = {6}; - }; - class O_Soldier_AAA_F: O_Soldier_AAT_F { - modelSides[] = {6}; - }; - class O_support_MG_F: O_Soldier_support_base_F { - modelSides[] = {6}; - }; - class O_support_GMG_F: O_Soldier_support_base_F { - modelSides[] = {6}; - }; - class O_support_Mort_F: O_Soldier_support_base_F { - modelSides[] = {6}; - }; - class O_support_AMG_F: O_Soldier_support_base_F { - modelSides[] = {6}; - }; - class O_support_AMort_F: O_Soldier_support_base_F { - modelSides[] = {6}; - }; - class O_Soldier_Urban_base: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_soldierU_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_AR_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_AAR_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_LAT_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_AT_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_AAT_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_AA_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_AAA_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_TL_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_SoldierU_SL_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_medic_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_repair_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_exp_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_engineer_U_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_M_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_soldierU_A_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_SoldierU_GL_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; class C_Driver_1_F: C_man_1 { modelSides[] = {6}; }; - class C_Driver_2_F: C_Driver_1_F { - modelSides[] = {6}; - }; - class C_Driver_3_F: C_Driver_1_F { - modelSides[] = {6}; - }; - class C_Driver_4_F: C_Driver_1_F { - modelSides[] = {6}; - }; - class C_Driver_1_random_base_F: C_Driver_1_F { - modelSides[] = {6}; - }; - class C_Driver_1_black_F: C_Driver_1_random_base_F { - modelSides[] = {6}; - }; - class C_Driver_1_blue_F: C_Driver_1_random_base_F { - modelSides[] = {6}; - }; - class C_Driver_1_green_F: C_Driver_1_random_base_F { - modelSides[] = {6}; - }; - class C_Driver_1_red_F: C_Driver_1_random_base_F { - modelSides[] = {6}; - }; - class C_Driver_1_white_F: C_Driver_1_random_base_F { - modelSides[] = {6}; - }; - class C_Driver_1_yellow_F: C_Driver_1_random_base_F { - modelSides[] = {6}; - }; - class C_Driver_1_orange_F: C_Driver_1_random_base_F { - modelSides[] = {6}; - }; class C_Marshal_F: B_RangeMaster_F { modelSides[] = {6}; }; @@ -953,706 +234,25 @@ class CfgVehicles { class I_Protagonist_VR_F: I_Soldier_base_F { modelSides[] = {6}; }; - class B_ghillie_base_F: B_Soldier_sniper_base_F { - modelSides[] = {6}; - }; - class B_ghillie_lsh_F: B_ghillie_base_F { - modelSides[] = {6}; - }; - class B_ghillie_sard_F: B_ghillie_base_F { - modelSides[] = {6}; - }; - class B_ghillie_ard_F: B_ghillie_base_F { - modelSides[] = {6}; - }; - class O_ghillie_base_F: O_Soldier_sniper_base_F { - modelSides[] = {6}; - }; - class O_ghillie_lsh_F: O_ghillie_base_F { - modelSides[] = {6}; - }; - class O_ghillie_sard_F: O_ghillie_base_F { - modelSides[] = {6}; - }; - class O_ghillie_ard_F: O_ghillie_base_F { - modelSides[] = {6}; - }; - class I_ghillie_base_F: I_Soldier_sniper_base_F { - modelSides[] = {6}; - }; - class I_ghillie_lsh_F: I_ghillie_base_F { - modelSides[] = {6}; - }; - class I_ghillie_sard_F: I_ghillie_base_F { - modelSides[] = {6}; - }; - class I_ghillie_ard_F: I_ghillie_base_F { - modelSides[] = {6}; - }; - class B_Sharpshooter_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_Recon_Sharpshooter_F: B_Soldier_recon_base { - modelSides[] = {6}; - }; - class B_CTRG_Sharphooter_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_HeavyGunner_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Sharpshooter_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Urban_Sharpshooter_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class O_Pathfinder_F: O_Soldier_recon_base { - modelSides[] = {6}; - }; - class O_HeavyGunner_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_Urban_HeavyGunner_F: O_Soldier_Urban_base { - modelSides[] = {6}; - }; - class I_G_Sharpshooter_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; class B_G_Sharpshooter_F: I_G_Sharpshooter_F { modelSides[] = {6}; }; class O_G_Sharpshooter_F: I_G_Sharpshooter_F { modelSides[] = {6}; }; - class B_UAV_AI: B_Helipilot_F { - modelSides[] = {6}; - }; - class O_UAV_AI: O_helipilot_F { - modelSides[] = {6}; - }; - class I_UAV_AI: O_UAV_AI { - modelSides[] = {6}; - }; class Underwear_F: B_Soldier_F { modelSides[] = {6}; }; - class VirtualCurator_F: VirtualMan_F { - modelSides[] = {6}; - }; - class B_VirtualCurator_F: VirtualCurator_F { - modelSides[] = {6}; - }; - class O_VirtualCurator_F: VirtualCurator_F { - modelSides[] = {6}; - }; - class I_VirtualCurator_F: VirtualCurator_F { - modelSides[] = {6}; - }; - class C_VirtualCurator_F: VirtualCurator_F { - modelSides[] = {6}; - }; - class VirtualSpectator_F: VirtualMan_F { - modelSides[] = {6}; - }; - class I_C_Soldier_base_F: I_G_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Para_1_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Para_2_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Para_3_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Para_4_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Para_5_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Para_6_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Para_7_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Para_8_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Bandit_1_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Bandit_2_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Bandit_3_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Bandit_4_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Bandit_5_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Bandit_6_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Bandit_7_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Bandit_8_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Soldier_Camo_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Pilot_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class I_C_Helipilot_F: I_C_Soldier_base_F { - modelSides[] = {6}; - }; - class B_T_Soldier_A_F: B_Soldier_A_F { - modelSides[] = {6}; - }; - class B_T_Soldier_AAR_F: B_soldier_AAR_F { - modelSides[] = {6}; - }; - class B_T_Support_AMG_F: B_support_AMG_F { - modelSides[] = {6}; - }; - class B_T_Support_AMort_F: B_support_AMort_F { - modelSides[] = {6}; - }; - class B_T_Soldier_AAA_F: B_soldier_AAA_F { - modelSides[] = {6}; - }; - class B_T_Soldier_AAT_F: B_soldier_AAT_F { - modelSides[] = {6}; - }; - class B_T_Soldier_AR_F: B_soldier_AR_F { - modelSides[] = {6}; - }; - class B_T_Medic_F: B_medic_F { - modelSides[] = {6}; - }; - class B_T_Crew_F: B_crew_F { - modelSides[] = {6}; - }; - class B_T_Engineer_F: B_engineer_F { - modelSides[] = {6}; - }; - class B_T_Soldier_Exp_F: B_soldier_exp_F { - modelSides[] = {6}; - }; - class B_T_Soldier_GL_F: B_Soldier_GL_F { - modelSides[] = {6}; - }; - class B_T_Support_GMG_F: B_support_GMG_F { - modelSides[] = {6}; - }; - class B_T_Support_MG_F: B_support_MG_F { - modelSides[] = {6}; - }; - class B_T_Support_Mort_F: B_support_Mort_F { - modelSides[] = {6}; - }; - class B_T_Helicrew_F: B_helicrew_F { - modelSides[] = {6}; - }; - class B_T_Helipilot_F: B_Helipilot_F { - modelSides[] = {6}; - }; - class B_T_soldier_M_F: B_soldier_M_F { - modelSides[] = {6}; - }; - class B_T_Soldier_AA_F: B_soldier_AA_F { - modelSides[] = {6}; - }; - class B_T_Soldier_AT_F: B_soldier_AT_F { - modelSides[] = {6}; - }; - class B_T_Officer_F: B_officer_F { - modelSides[] = {6}; - }; - class B_T_Soldier_PG_F: B_soldier_PG_F { - modelSides[] = {6}; - }; - class B_T_Pilot_F: B_Pilot_F { - modelSides[] = {6}; - }; - class B_T_Soldier_Repair_F: B_soldier_repair_F { - modelSides[] = {6}; - }; - class B_T_Soldier_F: B_Soldier_F { - modelSides[] = {6}; - }; - class B_T_Soldier_LAT_F: B_soldier_LAT_F { - modelSides[] = {6}; - }; - class B_T_Soldier_SL_F: B_Soldier_SL_F { - modelSides[] = {6}; - }; - class B_T_Soldier_TL_F: B_Soldier_TL_F { - modelSides[] = {6}; - }; - class B_T_Soldier_UAV_F: B_soldier_UAV_F { - modelSides[] = {6}; - }; - class B_T_Diver_F: B_diver_F { - modelSides[] = {6}; - }; - class B_T_Diver_Exp_F: B_diver_exp_F { - modelSides[] = {6}; - }; - class B_T_Diver_TL_F: B_diver_TL_F { - modelSides[] = {6}; - }; - class B_T_Recon_Exp_F: B_recon_exp_F { - modelSides[] = {6}; - }; - class B_T_Recon_JTAC_F: B_recon_JTAC_F { - modelSides[] = {6}; - }; - class B_T_Recon_M_F: B_recon_M_F { - modelSides[] = {6}; - }; - class B_T_Recon_Medic_F: B_recon_medic_F { - modelSides[] = {6}; - }; - class B_T_Recon_F: B_recon_F { - modelSides[] = {6}; - }; - class B_T_Recon_LAT_F: B_recon_LAT_F { - modelSides[] = {6}; - }; - class B_T_Recon_TL_F: B_recon_TL_F { - modelSides[] = {6}; - }; - class B_T_Sniper_F: B_sniper_F { - modelSides[] = {6}; - }; - class B_T_Spotter_F: B_spotter_F { - modelSides[] = {6}; - }; - class B_T_ghillie_tna_F: B_ghillie_base_F { - modelSides[] = {6}; - }; - class O_T_Soldier_A_F: O_Soldier_A_F { - modelSides[] = {6}; - }; - class O_T_Soldier_AAR_F: O_Soldier_AAR_F { - modelSides[] = {6}; - }; - class O_T_Support_AMG_F: O_support_AMG_F { - modelSides[] = {6}; - }; - class O_T_Support_AMort_F: O_support_AMort_F { - modelSides[] = {6}; - }; - class O_T_Soldier_AAA_F: O_Soldier_AAA_F { - modelSides[] = {6}; - }; - class O_T_Soldier_AAT_F: O_Soldier_AAT_F { - modelSides[] = {6}; - }; - class O_T_Soldier_AR_F: O_Soldier_AR_F { - modelSides[] = {6}; - }; - class O_T_Medic_F: O_medic_F { - modelSides[] = {6}; - }; - class O_T_Crew_F: O_crew_F { - modelSides[] = {6}; - }; - class O_T_Engineer_F: O_engineer_F { - modelSides[] = {6}; - }; - class O_T_Soldier_Exp_F: O_soldier_exp_F { - modelSides[] = {6}; - }; - class O_T_Soldier_GL_F: O_Soldier_GL_F { - modelSides[] = {6}; - }; - class O_T_Support_GMG_F: O_support_GMG_F { - modelSides[] = {6}; - }; - class O_T_Support_MG_F: O_support_MG_F { - modelSides[] = {6}; - }; - class O_T_Support_Mort_F: O_support_Mort_F { - modelSides[] = {6}; - }; - class O_T_Helicrew_F: O_helicrew_F { - modelSides[] = {6}; - }; - class O_T_Helipilot_F: O_helipilot_F { - modelSides[] = {6}; - }; - class O_T_Soldier_M_F: O_soldier_M_F { - modelSides[] = {6}; - }; - class O_T_Soldier_AA_F: O_Soldier_AA_F { - modelSides[] = {6}; - }; - class O_T_Soldier_AT_F: O_Soldier_AT_F { - modelSides[] = {6}; - }; - class O_T_Officer_F: O_officer_F { - modelSides[] = {6}; - }; - class O_T_Soldier_PG_F: O_soldier_PG_F { - modelSides[] = {6}; - }; - class O_T_Pilot_F: O_Pilot_F { - modelSides[] = {6}; - }; - class O_T_Soldier_Repair_F: O_soldier_repair_F { - modelSides[] = {6}; - }; - class O_T_Soldier_F: O_Soldier_F { - modelSides[] = {6}; - }; - class O_T_Soldier_LAT_F: O_Soldier_LAT_F { - modelSides[] = {6}; - }; - class O_T_Soldier_SL_F: O_Soldier_SL_F { - modelSides[] = {6}; - }; - class O_T_Soldier_TL_F: O_Soldier_TL_F { - modelSides[] = {6}; - }; - class O_T_Soldier_UAV_F: O_soldier_UAV_F { - modelSides[] = {6}; - }; - class O_T_Diver_F: O_diver_F { - modelSides[] = {6}; - }; - class O_T_Diver_Exp_F: O_diver_exp_F { - modelSides[] = {6}; - }; - class O_T_Diver_TL_F: O_diver_TL_F { - modelSides[] = {6}; - }; - class O_T_Recon_Exp_F: O_recon_exp_F { - modelSides[] = {6}; - }; - class O_T_Recon_JTAC_F: O_recon_JTAC_F { - modelSides[] = {6}; - }; - class O_T_Recon_M_F: O_recon_M_F { - modelSides[] = {6}; - }; - class O_T_Recon_Medic_F: O_recon_medic_F { - modelSides[] = {6}; - }; - class O_T_Recon_F: O_recon_F { - modelSides[] = {6}; - }; - class O_T_Recon_LAT_F: O_recon_LAT_F { - modelSides[] = {6}; - }; - class O_T_Recon_TL_F: O_recon_TL_F { - modelSides[] = {6}; - }; - class O_T_Sniper_F: O_sniper_F { - modelSides[] = {6}; - }; - class O_T_Spotter_F: O_spotter_F { - modelSides[] = {6}; - }; - class O_T_ghillie_tna_F: O_ghillie_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_Viper_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_Viper_hex_F: O_V_Soldier_Viper_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_base_F: B_Soldier_base_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_F: B_CTRG_Soldier_base_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_2_F: B_CTRG_Soldier_base_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_3_F: B_CTRG_Soldier_base_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_TL_tna_F: B_CTRG_Soldier_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_Exp_tna_F: B_CTRG_Soldier_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_Medic_tna_F: B_CTRG_Soldier_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_M_tna_F: B_CTRG_Soldier_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_tna_F: B_CTRG_Soldier_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_LAT_tna_F: B_CTRG_Soldier_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_AR_tna_F: B_CTRG_Soldier_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_JTAC_tna_F: B_CTRG_Soldier_F { - modelSides[] = {6}; - }; - class B_CTRG_Miller_F: B_CTRG_Soldier_3_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_urb_1_F: B_CTRG_Soldier_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_urb_2_F: B_CTRG_Soldier_2_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_urb_3_F: B_CTRG_Soldier_3_F { - modelSides[] = {6}; - }; - class O_V_Soldier_base_F: O_Soldier_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_hex_F: O_V_Soldier_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_TL_hex_F: O_V_Soldier_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_Exp_hex_F: O_V_Soldier_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_Medic_hex_F: O_V_Soldier_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_M_hex_F: O_V_Soldier_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_LAT_hex_F: O_V_Soldier_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_JTAC_hex_F: O_V_Soldier_base_F { - modelSides[] = {6}; - }; - class O_V_Soldier_ghex_F: O_V_Soldier_hex_F { - modelSides[] = {6}; - }; - class O_V_Soldier_TL_ghex_F: O_V_Soldier_TL_hex_F { - modelSides[] = {6}; - }; - class O_V_Soldier_Exp_ghex_F: O_V_Soldier_Exp_hex_F { - modelSides[] = {6}; - }; - class O_V_Soldier_Medic_ghex_F: O_V_Soldier_Medic_hex_F { - modelSides[] = {6}; - }; - class O_V_Soldier_M_ghex_F: O_V_Soldier_M_hex_F { - modelSides[] = {6}; - }; - class O_V_Soldier_LAT_ghex_F: O_V_Soldier_LAT_hex_F { - modelSides[] = {6}; - }; - class O_V_Soldier_JTAC_ghex_F: O_V_Soldier_JTAC_hex_F { - modelSides[] = {6}; - }; - class B_GEN_Soldier_base_F: B_Soldier_F { - modelSides[] = {6}; - }; - class B_GEN_Soldier_F: B_GEN_Soldier_base_F { - modelSides[] = {6}; - }; - class B_GEN_Commander_F: B_GEN_Soldier_base_F { - modelSides[] = {6}; - }; class C_man_sport_1_F: C_man_1 { modelSides[] = {6}; }; - class C_man_sport_1_F_afro: C_man_sport_1_F { - modelSides[] = {6}; - }; - class C_man_sport_1_F_euro: C_man_sport_1_F { - modelSides[] = {6}; - }; - class C_man_sport_1_F_asia: C_man_sport_1_F { - modelSides[] = {6}; - }; - class C_man_sport_1_F_tanoan: C_man_sport_1_F { - modelSides[] = {6}; - }; class C_man_sport_2_F: C_man_1 { modelSides[] = {6}; }; - class C_man_sport_2_F_afro: C_man_sport_2_F { - modelSides[] = {6}; - }; - class C_man_sport_2_F_euro: C_man_sport_2_F { - modelSides[] = {6}; - }; - class C_man_sport_2_F_asia: C_man_sport_2_F { - modelSides[] = {6}; - }; - class C_man_sport_2_F_tanoan: C_man_sport_2_F { - modelSides[] = {6}; - }; class C_man_sport_3_F: C_man_1 { modelSides[] = {6}; }; - class C_man_sport_3_F_afro: C_man_sport_3_F { - modelSides[] = {6}; - }; - class C_man_sport_3_F_euro: C_man_sport_3_F { - modelSides[] = {6}; - }; - class C_man_sport_3_F_asia: C_man_sport_3_F { - modelSides[] = {6}; - }; - class C_man_sport_3_F_tanoan: C_man_sport_3_F { - modelSides[] = {6}; - }; class C_Man_casual_1_F: C_man_1 { modelSides[] = {6}; }; - class C_Man_casual_1_F_afro: C_Man_casual_1_F { - modelSides[] = {6}; - }; - class C_Man_casual_1_F_euro: C_Man_casual_1_F { - modelSides[] = {6}; - }; - class C_Man_casual_1_F_asia: C_Man_casual_1_F { - modelSides[] = {6}; - }; - class C_Man_casual_1_F_tanoan: C_Man_casual_1_F { - modelSides[] = {6}; - }; - class C_Man_casual_2_F: C_Man_casual_1_F { - modelSides[] = {6}; - }; - class C_Man_casual_2_F_afro: C_Man_casual_2_F { - modelSides[] = {6}; - }; - class C_Man_casual_2_F_euro: C_Man_casual_2_F { - modelSides[] = {6}; - }; - class C_Man_casual_2_F_asia: C_Man_casual_2_F { - modelSides[] = {6}; - }; - class C_Man_casual_2_F_tanoan: C_Man_casual_2_F { - modelSides[] = {6}; - }; - class C_Man_casual_3_F: C_Man_casual_1_F { - modelSides[] = {6}; - }; - class C_Man_casual_3_F_afro: C_Man_casual_3_F { - modelSides[] = {6}; - }; - class C_Man_casual_3_F_euro: C_Man_casual_3_F { - modelSides[] = {6}; - }; - class C_Man_casual_3_F_asia: C_Man_casual_3_F { - modelSides[] = {6}; - }; - class C_Man_casual_3_F_tanoan: C_Man_casual_3_F { - modelSides[] = {6}; - }; - class C_Man_casual_4_F: C_Man_casual_1_F { - modelSides[] = {6}; - }; - class C_Man_casual_4_F_afro: C_Man_casual_4_F { - modelSides[] = {6}; - }; - class C_Man_casual_4_F_euro: C_Man_casual_4_F { - modelSides[] = {6}; - }; - class C_Man_casual_4_F_asia: C_Man_casual_4_F { - modelSides[] = {6}; - }; - class C_Man_casual_4_F_tanoan: C_Man_casual_4_F { - modelSides[] = {6}; - }; - class C_Man_casual_5_F: C_Man_casual_4_F { - modelSides[] = {6}; - }; - class C_Man_casual_5_F_afro: C_Man_casual_5_F { - modelSides[] = {6}; - }; - class C_Man_casual_5_F_euro: C_Man_casual_5_F { - modelSides[] = {6}; - }; - class C_Man_casual_5_F_asia: C_Man_casual_5_F { - modelSides[] = {6}; - }; - class C_Man_casual_5_F_tanoan: C_Man_casual_5_F { - modelSides[] = {6}; - }; - class C_Man_casual_6_F: C_Man_casual_4_F { - modelSides[] = {6}; - }; - class C_Man_casual_6_F_afro: C_Man_casual_6_F { - modelSides[] = {6}; - }; - class C_Man_casual_6_F_euro: C_Man_casual_6_F { - modelSides[] = {6}; - }; - class C_Man_casual_6_F_asia: C_Man_casual_6_F { - modelSides[] = {6}; - }; - class C_Man_casual_6_F_tanoan: C_Man_casual_6_F { - modelSides[] = {6}; - }; - class B_Survivor_F: B_Soldier_F { - modelSides[] = {6}; - }; - class O_Survivor_F: O_Soldier_F { - modelSides[] = {6}; - }; - class I_Survivor_F: I_soldier_F { - modelSides[] = {6}; - }; - class B_Soldier_universal_F: B_Soldier_F { - modelSides[] = {6}; - }; - class B_G_Soldier_universal_F: B_G_Soldier_F { - modelSides[] = {6}; - }; - class O_Soldier_universal_F: O_Soldier_F { - modelSides[] = {6}; - }; - class O_G_Soldier_universal_F: O_G_Soldier_F { - modelSides[] = {6}; - }; - class I_Soldier_universal_F: I_soldier_F { - modelSides[] = {6}; - }; - class I_G_Soldier_universal_F: I_G_Soldier_F { - modelSides[] = {6}; - }; - class B_T_Soldier_universal_F: B_T_Soldier_F { - modelSides[] = {6}; - }; - class O_T_Soldier_universal_F: O_T_Soldier_F { - modelSides[] = {6}; - }; - class I_C_Soldier_universal_F: I_C_Soldier_Para_1_F { - modelSides[] = {6}; - }; - class C_Man_French_universal_F: C_Man_casual_1_F { - modelSides[] = {6}; - }; - class B_CTRG_Soldier_universal_F: B_CTRG_Soldier_tna_F { - modelSides[] = {6}; - }; - class B_GEN_Soldier_universal_F: B_GEN_Soldier_F { - modelSides[] = {6}; - }; }; diff --git a/optionals/nouniformrestrictions/XEH_preInit.sqf b/optionals/nouniformrestrictions/XEH_preInit.sqf index a7feade1c3..b47cf6628d 100644 --- a/optionals/nouniformrestrictions/XEH_preInit.sqf +++ b/optionals/nouniformrestrictions/XEH_preInit.sqf @@ -2,6 +2,8 @@ ADDON = false; +PREP_RECOMPILE_START; #include "XEH_PREP.hpp" +PREP_RECOMPILE_END; ADDON = true; diff --git a/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf b/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf index 60ac98cf98..81d4b0b438 100644 --- a/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf +++ b/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf @@ -1,30 +1,32 @@ /* * Author: BaerMitUmlaut, 654wak654 - * Generates the CfgVehicles.hpp to unlock all uniforms. + * Generates the CfgVehicles config to allow uniform usage on all sides. * * Arguments: * None * * Return Value: - * CfgVehicles.hpp content + * CfgVehicles Content * * Example: * [] call ace_nouniformrestrictions_fnc_exportConfig * - * Public: [Yes] + * Public: Yes */ #include "script_component.hpp" private _modifyClasses = []; private _baseClasses = []; { - private _modifyClass = { - if (!isNull (_x >> "modelSides")) exitWith {_x}; - } forEach (configHierarchy _x); - private _baseClass = inheritsFrom _modifyClass; - _modifyClasses pushBackUnique [_modifyClass, _baseClass]; - if !(_baseClass in (_modifyClasses apply {_x select 0})) then { - _baseClasses pushBackUnique _baseClass; + if ((_x >> "modelSides") in (configProperties [_x, "true", false])) then { + private _modifyClass = { + if (!isNull (_x >> "modelSides")) exitWith {_x}; + } forEach (configHierarchy _x); + private _baseClass = inheritsFrom _modifyClass; + _modifyClasses pushBackUnique [_modifyClass, _baseClass]; + if !(_baseClass in (_modifyClasses apply {_x select 0})) then { + _baseClasses pushBackUnique _baseClass; + }; }; false } count ( diff --git a/optionals/nouniformrestrictions/script_component.hpp b/optionals/nouniformrestrictions/script_component.hpp index 521551c4cd..4e40774124 100644 --- a/optionals/nouniformrestrictions/script_component.hpp +++ b/optionals/nouniformrestrictions/script_component.hpp @@ -4,15 +4,14 @@ // #define DEBUG_MODE_FULL // #define DISABLE_COMPILE_CACHE -// #define CBA_DEBUG_SYNCHRONOUS // #define ENABLE_PERFORMANCE_COUNTERS -#ifdef DEBUG_ENABLED_UNIFORMS +#ifdef DEBUG_ENABLED_NOUNIFORMRESTRICTIONS #define DEBUG_MODE_FULL #endif -#ifdef DEBUG_SETTINGS_UNIFORMS - #define DEBUG_SETTINGS DEBUG_SETTINGS_UNIFORMS +#ifdef DEBUG_SETTINGS_NOUNIFORMRESTRICTIONS + #define DEBUG_SETTINGS DEBUG_SETTINGS_NOUNIFORMRESTRICTIONS #endif #include "\z\ace\addons\main\script_macros.hpp" From 0df98f794c48c2113cc337e67630741d753395a9 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 12 Dec 2016 19:50:16 +0100 Subject: [PATCH 249/826] Prep 3.8.3 --- README.md | 2 +- addons/main/script_version.hpp | 4 ++-- docs/README_DE.md | 2 +- docs/README_PL.md | 2 +- mod.cpp | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c8682b339c..4e78a5aaf3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Issues diff --git a/addons/main/script_version.hpp b/addons/main/script_version.hpp index 35f889f47b..68fa060a97 100644 --- a/addons/main/script_version.hpp +++ b/addons/main/script_version.hpp @@ -1,4 +1,4 @@ #define MAJOR 3 #define MINOR 8 -#define PATCHLVL 2 -#define BUILD 13 +#define PATCHLVL 3 +#define BUILD 14 diff --git a/docs/README_DE.md b/docs/README_DE.md index bad1fc06c1..b479a153a9 100644 --- a/docs/README_DE.md +++ b/docs/README_DE.md @@ -4,7 +4,7 @@

- ACE3 Version + ACE3 Version ACE3 Fehlermeldungen diff --git a/docs/README_PL.md b/docs/README_PL.md index edad01d3aa..f5b93bb417 100644 --- a/docs/README_PL.md +++ b/docs/README_PL.md @@ -3,7 +3,7 @@

- ACE3 Wersja + ACE3 Wersja ACE3 Zagadnienia diff --git a/mod.cpp b/mod.cpp index 3ff10b8aeb..7620a55fea 100644 --- a/mod.cpp +++ b/mod.cpp @@ -1,8 +1,8 @@ -name = "Advanced Combat Environment 3.8.2"; +name = "Advanced Combat Environment 3.8.3"; picture = "logo_ace3_ca.paa"; actionName = "GitHub"; action = "https://github.com/acemod/ACE3"; -description = "ACE3 - Version 3.8.2"; +description = "ACE3 - Version 3.8.3"; logo = "logo_ace3_ca.paa"; logoOver = "logo_ace3_ca.paa"; tooltip = "ACE3"; From 86fd9347f8f4f0b690d19fabd21ff34dfceb11d4 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 13 Dec 2016 23:16:12 +0100 Subject: [PATCH 250/826] #4692 update homepage for v3.8.3 [ci skip] --- docs/_config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_config.yml b/docs/_config.yml index baa2fbdac1..022318e30f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -11,8 +11,8 @@ ace: version: major: 3 minor: 8 - patch: 2 - build: 13 + patch: 3 + build: 14 acex: githubUrl: https://github.com/acemod/ACEX From 2151fcad8f426de558cfd4354cd073e646297abe Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 13 Dec 2016 23:16:41 +0100 Subject: [PATCH 251/826] #4692 Update dev homepage for v3.8.3 [ci skip] --- docs/_config_dev.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_config_dev.yml b/docs/_config_dev.yml index a04a0c424e..7d55c24cf2 100644 --- a/docs/_config_dev.yml +++ b/docs/_config_dev.yml @@ -11,8 +11,8 @@ ace: version: major: 3 minor: 8 - patch: 2 - build: 13 + patch: 3 + build: 14 acex: githubUrl: https://github.com/acemod/ACEX From cc3b669fcdd8f9cb8393e09f8d56ad607727dcfd Mon Sep 17 00:00:00 2001 From: Dystopian Date: Wed, 14 Dec 2016 21:48:00 +0300 Subject: [PATCH 252/826] Fix missing refuel menu on static fuel stations (#4533) * fix static fuel stations * Directly compile menus and remove XEH from buildings --- addons/refuel/CfgVehicles.hpp | 12 +----------- addons/refuel/XEH_postInit.sqf | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/addons/refuel/CfgVehicles.hpp b/addons/refuel/CfgVehicles.hpp index df857066cd..4859cd883f 100644 --- a/addons/refuel/CfgVehicles.hpp +++ b/addons/refuel/CfgVehicles.hpp @@ -144,13 +144,11 @@ class CfgVehicles { class House_F: House {}; class House_Small_F: House_F { - class EventHandlers; - class ACE_Actions { class ACE_MainActions { displayName = ECSTRING(interaction,MainAction); selection = ""; - distance = 10; + distance = 5; condition = "true"; }; }; @@ -501,10 +499,6 @@ class CfgVehicles { // Vanilla buildings class Land_Fuelstation_Feed_F: House_Small_F { - class EventHandlers { - class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; - }; - transportFuel = 0; //50k MACRO_REFUEL_ACTIONS GVAR(hooks)[] = {{0,0,-0.5}}; @@ -512,10 +506,6 @@ class CfgVehicles { }; class Land_fs_feed_F: House_Small_F { - class EventHandlers { - class CBA_Extended_EventHandlers: CBA_Extended_EventHandlers {}; - }; - transportFuel = 0; //50k MACRO_REFUEL_ACTIONS GVAR(hooks)[] = {{-0.4,0.022,-.23}}; diff --git a/addons/refuel/XEH_postInit.sqf b/addons/refuel/XEH_postInit.sqf index f0fb928187..3f20e5d30d 100644 --- a/addons/refuel/XEH_postInit.sqf +++ b/addons/refuel/XEH_postInit.sqf @@ -11,6 +11,20 @@ if (isServer) then { _this call FUNC(resetLocal); }] call CBA_fnc_addEventHandler; +// workaround for static fuel stations +if (hasInterface) then { + { + if ( + configName _x isKindOf "Building" && + {isClass (_x >> "ACE_Actions" >> "ACE_MainActions" >> QGVAR(Refuel))} && + {getNumber (_x >> "scope") == 2} + ) then { + TRACE_1("Compiling menu",configName _x); + [configName _x] call EFUNC(interact_menu,compileMenu); + }; + } count ('true' configClasses (configFile >> "CfgVehicles")); +}; + #ifdef DEBUG_MODE_FULL diag_log text format ["[ACE-refuel] Showing CfgVehicles with vanilla transportFuel"]; From 4f20d1f7c65f2fcd5f5638d21e7cf62062d22034 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Wed, 14 Dec 2016 22:18:04 +0300 Subject: [PATCH 253/826] add rearm to Vehicle Ammo boxes (#4750) --- addons/rearm/CfgVehicles.hpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/addons/rearm/CfgVehicles.hpp b/addons/rearm/CfgVehicles.hpp index 44b7fe38af..c60256dee4 100644 --- a/addons/rearm/CfgVehicles.hpp +++ b/addons/rearm/CfgVehicles.hpp @@ -163,6 +163,21 @@ class CfgVehicles { MACRO_REARM_TRUCK_ACTIONS }; + class NATO_Box_Base: ReammoBox_F{}; + class Box_NATO_AmmoVeh_F: NATO_Box_Base { + transportAmmo = 0; + MACRO_REARM_TRUCK_ACTIONS + }; + class EAST_Box_Base: ReammoBox_F{}; + class Box_East_AmmoVeh_F: EAST_Box_Base { + transportAmmo = 0; + MACRO_REARM_TRUCK_ACTIONS + }; + class IND_Box_Base: ReammoBox_F{}; + class Box_IND_AmmoVeh_F: IND_Box_Base { + transportAmmo = 0; + MACRO_REARM_TRUCK_ACTIONS + }; // Dummy Vehicles class GVAR(defaultCarriedObject): ThingX { From 5379503772d81f3dee476a1b75a8359412d23e3a Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 14 Dec 2016 14:06:32 -0600 Subject: [PATCH 254/826] Fix deadman range, fix clacker transfer, use setShotParents (#4689) --- addons/explosives/XEH_postInit.sqf | 13 +++++++++++++ .../explosives/functions/fnc_detonateExplosive.sqf | 9 ++------- addons/explosives/functions/fnc_onIncapacitated.sqf | 11 +++++++---- .../explosives/functions/fnc_onInventoryChanged.sqf | 8 +++----- 4 files changed, 25 insertions(+), 16 deletions(-) diff --git a/addons/explosives/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf index 1ddd52cc53..7cc99bf921 100644 --- a/addons/explosives/XEH_postInit.sqf +++ b/addons/explosives/XEH_postInit.sqf @@ -22,6 +22,19 @@ //When getting knocked out in medical, trigger deadman explosives: //Event is global, only run on server (ref: ace_medical_fnc_setUnconscious) if (isServer) then { + [QGVAR(detonate), { + params ["_unit", "_explosive", "_delay"]; + TRACE_3("server detonate EH",_unit,_explosive,_delay); + _explosive setShotParents [_unit, _unit]; + [{ + params ["_explosive"]; + TRACE_1("exploding",_explosive); + if (!isNull _explosive) then { + _explosive setDamage 1; + }; + }, _explosive, _delay] call CBA_fnc_waitAndExecute; + }] call CBA_fnc_addEventHandler; + ["ace_unconscious", { params ["_unit", "_isUnconscious"]; if (!_isUnconscious) exitWith {}; diff --git a/addons/explosives/functions/fnc_detonateExplosive.sqf b/addons/explosives/functions/fnc_detonateExplosive.sqf index b7f4893e52..0b7f9f3fa4 100644 --- a/addons/explosives/functions/fnc_detonateExplosive.sqf +++ b/addons/explosives/functions/fnc_detonateExplosive.sqf @@ -43,12 +43,7 @@ if (getNumber (ConfigFile >> "CfgAmmo" >> typeOf (_item select 0) >> "TriggerWhe _exp setPosASL _pos; }; }; -[{ - params ["_explosive"]; - TRACE_1("exploding",_explosive); - if (!isNull _explosive) then { - _explosive setDamage 1; - }; -}, [_item select 0], (_item select 1)] call CBA_fnc_waitAndExecute; + +[QGVAR(detonate), [_unit, _item select 0, _item select 1]] call CBA_fnc_serverEvent; _result diff --git a/addons/explosives/functions/fnc_onIncapacitated.sqf b/addons/explosives/functions/fnc_onIncapacitated.sqf index 6bbf6152d3..96949e7719 100644 --- a/addons/explosives/functions/fnc_onIncapacitated.sqf +++ b/addons/explosives/functions/fnc_onIncapacitated.sqf @@ -19,11 +19,14 @@ params ["_unit"]; TRACE_1("params",_unit); -private ["_deadman"]; +// Exit if no item: +if (({_x == "ACE_DeadManSwitch"} count (items _unit)) == 0) exitWith {}; -_deadman = [_unit, "DeadManSwitch"] call FUNC(getPlacedExplosives); +private _range = getNumber (configFile >> "CfgWeapons" >> "ACE_DeadManSwitch" >> QGVAR(range)); +private _deadman = [_unit, "DeadManSwitch"] call FUNC(getPlacedExplosives); +TRACE_2("placed",_deadman,_range); { - [_unit, -1, _x, true] call FUNC(detonateExplosive); + [_unit, _range, _x, true] call FUNC(detonateExplosive); } forEach _deadman; //Handle deadman connected to explosive in inventory @@ -44,5 +47,5 @@ if (_connectedInventoryExplosive != "") then { private _explosive = createVehicle [_ammo, (getPos _unit), [], 0, "NONE"]; _explosive setPosASL (getPosASL _unit); - [_unit, -1, [_explosive, -1]] call FUNC(detonateExplosive); //Explode, ignoring range, with a random 0-1 second delay + [_unit, -1, [_explosive, 0.5]] call FUNC(detonateExplosive); //Explode, ignoring range, with a 0.5 second delay }; diff --git a/addons/explosives/functions/fnc_onInventoryChanged.sqf b/addons/explosives/functions/fnc_onInventoryChanged.sqf index 889e9e2186..f67995b1c9 100644 --- a/addons/explosives/functions/fnc_onInventoryChanged.sqf +++ b/addons/explosives/functions/fnc_onInventoryChanged.sqf @@ -21,17 +21,15 @@ params ["_receiver", "_giver", "_item"]; TRACE_3("params",_receiver,_giver,_item); -private ["_config", "_detonators"]; +if ((_receiver != ace_player) && {_giver != ace_player}) exitWith {}; -if (_receiver != ace_player) exitWith {}; - -_config = ConfigFile >> "CfgWeapons" >> _item; +private _config = ConfigFile >> "CfgWeapons" >> _item; if (isClass _config && {getNumber(_config >> QGVAR(Detonator)) == 1}) then { private ["_clackerItems"]; _clackerItems = _giver getVariable [QGVAR(Clackers), []]; _receiver setVariable [QGVAR(Clackers), (_receiver getVariable [QGVAR(Clackers), []]) + _clackerItems, true]; - _detonators = [_giver] call FUNC(getDetonators); + private _detonators = [_giver] call FUNC(getDetonators); if (count _detonators == 0) then { _giver setVariable [QGVAR(Clackers), nil, true]; }; From c009000bd91df617fb55291fba02187fd18d8fda Mon Sep 17 00:00:00 2001 From: Dedmen Miller Date: Thu, 15 Dec 2016 06:29:07 +0100 Subject: [PATCH 255/826] Use new private syntax for winddeflection PFH (#4761) --- .../functions/fnc_updateTrajectoryPFH.sqf | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf index acf8b2a9fa..7ee21294e5 100644 --- a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf +++ b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf @@ -18,34 +18,32 @@ [{ // BEGIN_COUNTER(pfeh); - private ["_accel", "_accelRef", "_bulletSpeed", "_bulletVelocity", "_deleted", "_deltaT", "_drag", "_dragRef", "_isWind", "_trueSpeed", "_trueVelocity"]; params ["_args"]; _args params ["_lastTime"]; - _deltaT = CBA_missionTime - _lastTime; + private _deltaT = CBA_missionTime - _lastTime; _args set [0, CBA_missionTime]; - _deleted = 0; - _isWind = (vectorMagnitude ACE_wind > 0); + private _isWind = (vectorMagnitude ACE_wind > 0); { _x params ["_bullet", "_airFriction"]; - _bulletVelocity = velocity _bullet; - _bulletSpeed = vectorMagnitude _bulletVelocity; + private _bulletVelocity = velocity _bullet; + private _bulletSpeed = vectorMagnitude _bulletVelocity; if ((!alive _bullet) || {(_bullet isKindOf "BulletBase") && {_bulletSpeed < 100}}) then { GVAR(trackedBullets) deleteAt (GVAR(trackedBullets) find _x); } else { if (_isWind) then { - _trueVelocity = _bulletVelocity vectorDiff ACE_wind; - _trueSpeed = vectorMagnitude _trueVelocity; + private _trueVelocity = _bulletVelocity vectorDiff ACE_wind; + private _trueSpeed = vectorMagnitude _trueVelocity; - _dragRef = _deltaT * _airFriction * _bulletSpeed * _bulletSpeed; - _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); + private _dragRef = _deltaT * _airFriction * _bulletSpeed * _bulletSpeed; + private _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); _bulletVelocity = _bulletVelocity vectorDiff _accelRef; - _drag = _deltaT * _airFriction * _trueSpeed; - _accel = _trueVelocity vectorMultiply (_drag); + private _drag = _deltaT * _airFriction * _trueSpeed; + private _accel = _trueVelocity vectorMultiply (_drag); _bulletVelocity = _bulletVelocity vectorAdd _accel; }; _bullet setVelocity _bulletVelocity; From ef4d28983688f6639e8838482391f36862b764c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ozan=20E=C4=9Fitmen?= Date: Thu, 15 Dec 2016 07:55:06 +0200 Subject: [PATCH 256/826] Add Zeus Module for FRIES (#4597) * Initial commit * Revert unrelated changes * Add newline * Fix undefined var, localize text * Shorten strings, add missing parameters * Fix logical error * Fix capitalization, Update string, Only add EH on server * Add missing uses of the private command * Remove excess formatting * Add module category --- addons/zeus/CfgVehicles.hpp | 6 +++ addons/zeus/XEH_PREP.hpp | 1 + addons/zeus/XEH_postInit.sqf | 7 +-- addons/zeus/config.cpp | 8 ++- .../functions/fnc_moduleAddOrRemoveFRIES.sqf | 53 +++++++++++++++++++ addons/zeus/stringtable.xml | 9 ++++ 6 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 22d827e16f..c7111e42bc 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -106,6 +106,12 @@ class CfgVehicles { function = QFUNC(moduleAddSpareWheel); icon = QPATHTOF(UI\Icon_Module_Zeus_Medic_ca.paa);//@todo }; + class GVAR(moduleAddOrRemoveFRIES): GVAR(moduleBase) { + curatorCanAttach = 1; + category = QGVAR(Utility); + displayName = CSTRING(ModuleAddOrRemoveFRIES_DisplayName); + function = QFUNC(moduleAddOrRemoveFRIES); + }; class GVAR(moduleCaptive): GVAR(moduleBase) { curatorCanAttach = 1; category = QGVAR(Captive); diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp index 4a54c03920..a04b0a6d2c 100644 --- a/addons/zeus/XEH_PREP.hpp +++ b/addons/zeus/XEH_PREP.hpp @@ -7,6 +7,7 @@ PREP(bi_moduleRemoteControl); PREP(handleZeusUnitAssigned); PREP(moduleAddSpareTrack); PREP(moduleAddSpareWheel); +PREP(moduleAddOrRemoveFRIES); PREP(moduleCaptive); PREP(moduleGlobalSetSkill); PREP(moduleGroupSide); diff --git a/addons/zeus/XEH_postInit.sqf b/addons/zeus/XEH_postInit.sqf index 1ddcaf30d8..44bd406552 100644 --- a/addons/zeus/XEH_postInit.sqf +++ b/addons/zeus/XEH_postInit.sqf @@ -2,7 +2,7 @@ ["ace_settingsInitialized",{ // Only add an InitPost EH if setting is enabled (and apply retroactively) - if (isServer && GVAR(autoAddObjects)) then { + if (isServer && {GVAR(autoAddObjects)}) then { ["AllVehicles", "InitPost", FUNC(addObjectToCurator), true, [], true] call CBA_fnc_addClassEventHandler; }; }] call CBA_fnc_addEventHandler; @@ -17,8 +17,9 @@ QGVAR(GlobalSkillAI) addPublicVariableEventHandler FUNC(moduleGlobalSetSkill); // Editable object commands must be ran on server, this events are used in the respective module if (isServer) then { + [QGVAR(equipFries), EFUNC(fastroping,equipFRIES)] call CBA_fnc_addEventHandler; [QGVAR(addObjects), { - params ["_objects", ["_curator",objNull]]; + params ["_objects", ["_curator", objNull]]; if !(isNull _curator) exitWith { _curator addCuratorEditableObjects [_objects, true]; }; @@ -28,7 +29,7 @@ if (isServer) then { }] call CBA_fnc_addEventHandler; [QGVAR(removeObjects), { - params ["_objects", ["_curator",objNull]]; + params ["_objects", ["_curator", objNull]]; if !(isNull _curator) exitWith { _curator removeCuratorEditableObjects [_objects, true]; }; diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index 84659b0641..248d2af71c 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -22,7 +22,7 @@ class CfgPatches { url = ECSTRING(main,URL); VERSION_CONFIG; }; - // Use additional cfgPatches to contextually remove modules from zeus + // Use additional CfgPatches to contextually remove modules from zeus class GVAR(captives): ADDON { units[] = { QGVAR(moduleCaptive), @@ -43,12 +43,18 @@ class CfgPatches { QGVAR(moduleAddSpareWheel) }; }; + class GVAR(fastroping): ADDON { + units[] = { + QGVAR(moduleAddOrRemoveFRIES) + }; + }; }; class ACE_Curator { GVAR(captives) = "ace_captives"; GVAR(medical) = "ace_medical"; GVAR(cargoAndRepair)[] = {"ace_cargo", "ace_repair"}; + GVAR(fastroping) = "ace_fastroping"; }; #include "CfgFactionClasses.hpp" diff --git a/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf b/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf new file mode 100644 index 0000000000..5c8998b767 --- /dev/null +++ b/addons/zeus/functions/fnc_moduleAddOrRemoveFRIES.sqf @@ -0,0 +1,53 @@ +/* + * Author: 654wak654 + * Add/Removes FRIES from a helicopter. + * + * Arguments: + * 0: The module logic + * 1: Synchronized units + * 2: Activated + * + * Return Value: + * None + * + * Public: No + */ +#include "script_component.hpp" + +params ["_logic", "_units", "_activated"]; + +if !(_activated && {local _logic}) exitWith {}; + +if !(["ace_fastroping"] call EFUNC(common,isModLoaded)) then { + [LSTRING(RequiresAddon)] call EFUNC(common,displayTextStructured); +} else { + (GETMVAR(BIS_fnc_curatorObjectPlaced_mouseOver,[""])) params ["_mouseOverType", "_mouseOverUnit"]; + + if (_mouseOverType != "OBJECT") then { + [LSTRING(NothingSelected)] call EFUNC(common,displayTextStructured); + } else { + if !(alive _mouseOverUnit) then { + [LSTRING(OnlyAlive)] call EFUNC(common,displayTextStructured); + } else { + private _config = configFile >> "CfgVehicles" >> typeOf _mouseOverUnit; + private _displayName = getText (_config >> "displayName"); + if !(isNumber (_config >> QEGVAR(fastroping,enabled))) then { + [[LSTRING(NotFastRopeCompatible), _displayName]] call EFUNC(common,displayTextStructured); + } else { + private _fries = GETVAR(_mouseOverUnit,EGVAR(fastroping,FRIES),objNull); + if (isNull _fries) then { + [QGVAR(equipFries), [_mouseOverUnit]] call CBA_fnc_serverEvent; + } else { + if ([_mouseOverUnit] call EFUNC(fastroping,canCutRopes)) then { + [[LSTRING(CantRemoveFRIES), _displayName]] call EFUNC(common,displayTextStructured); + } else { + [_mouseOverUnit] call EFUNC(fastroping,cutRopes); + deleteVehicle _fries; + }; + }; + }; + }; + }; +}; + +deleteVehicle _logic; diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index 5ae5014139..ed85bd3377 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -393,6 +393,15 @@ Apri Resa 捕虜としてトグル + + Add/Remove FRIES + + + %1 is not fastrope compatible. + + + Unable to remove FRIES, ropes are deployed. + Teleport Players Téléporter joueurs From 0842481c2f8fd95750aaf4cca62a8952d96afd2d Mon Sep 17 00:00:00 2001 From: classic Date: Thu, 15 Dec 2016 20:58:21 +0900 Subject: [PATCH 257/826] fix for jpn translate in medical_menu Delete unnecessary the HTML tags in line 134 --- addons/medical_menu/stringtable.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/medical_menu/stringtable.xml b/addons/medical_menu/stringtable.xml index 3f3fe6e993..1dd242a6e8 100644 --- a/addons/medical_menu/stringtable.xml +++ b/addons/medical_menu/stringtable.xml @@ -131,7 +131,7 @@ EXAMINAR & TRATAMENTO VYŠETŘENÍ & LÉČBA ESAMINA & TRATTA - 診断 &amp; 治療 + 診断 & 治療 STATUS @@ -662,4 +662,4 @@ 鼻咽頭チューブ [NPA] - \ No newline at end of file + From fd09ec595816dba7f27089b706a2abc1b706fb97 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 15 Dec 2016 10:51:47 -0600 Subject: [PATCH 258/826] Rebuild Dlls for x64 dev branch (#4765) --- ace_advanced_ballistics_x64.dll | Bin 0 -> 301056 bytes ace_break_line_x64.dll | Bin 0 -> 209920 bytes ace_clipboard_x64.dll | Bin 0 -> 104960 bytes ace_fcs_x64.dll | Bin 0 -> 269312 bytes ace_medical_x64.dll | Bin 0 -> 295936 bytes ace_parse_imagepath_x64.dll | Bin 0 -> 102400 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 ace_advanced_ballistics_x64.dll create mode 100644 ace_break_line_x64.dll create mode 100644 ace_clipboard_x64.dll create mode 100644 ace_fcs_x64.dll create mode 100644 ace_medical_x64.dll create mode 100644 ace_parse_imagepath_x64.dll diff --git a/ace_advanced_ballistics_x64.dll b/ace_advanced_ballistics_x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..e2dae5caab8aa256a254adfac1b1b490084c59a8 GIT binary patch literal 301056 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%0Df(uy!0Al(e_OoDB|xA9xJ1M>8nIQ?!d^8!oZ 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

ePu$w4^LPY3B3N5u+EbM~-u&mlr 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 TK#M(AHg;F={;&H_THyZySuwqu literal 0 HcmV?d00001 diff --git a/ace_clipboard_x64.dll b/ace_clipboard_x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..db7730f0fedaac844b7e4543fbc642f55f0d1442 GIT binary patch literal 104960 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%0A&p4NjJ+lqLUxY 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

Gc+c)E$11ibpr;rRIan~v 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 zÛ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�_FmSZx&VbUfxxbV$(cIT_RTCS(@EWso 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 F{{Zd$13Ul# literal 0 HcmV?d00001 diff --git a/ace_parse_imagepath_x64.dll b/ace_parse_imagepath_x64.dll new file mode 100644 index 0000000000000000000000000000000000000000..8d154117c5895038c6d4bf512dc6a71b0d7c386d GIT binary patch literal 102400 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 Date: Thu, 15 Dec 2016 17:55:44 +0100 Subject: [PATCH 259/826] add optionals meta.cpp files (#4763) --- optionals/compat_adr_97/meta.cpp | 2 ++ optionals/compat_rhs_afrf3/meta.cpp | 2 ++ optionals/compat_rhs_usf3/meta.cpp | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 optionals/compat_adr_97/meta.cpp create mode 100644 optionals/compat_rhs_afrf3/meta.cpp create mode 100644 optionals/compat_rhs_usf3/meta.cpp diff --git a/optionals/compat_adr_97/meta.cpp b/optionals/compat_adr_97/meta.cpp new file mode 100644 index 0000000000..8ec81b90ab --- /dev/null +++ b/optionals/compat_adr_97/meta.cpp @@ -0,0 +1,2 @@ +protocol = 1; +publishedid = 773136286; diff --git a/optionals/compat_rhs_afrf3/meta.cpp b/optionals/compat_rhs_afrf3/meta.cpp new file mode 100644 index 0000000000..e418f622df --- /dev/null +++ b/optionals/compat_rhs_afrf3/meta.cpp @@ -0,0 +1,2 @@ +protocol = 1; +publishedid = 773131200; diff --git a/optionals/compat_rhs_usf3/meta.cpp b/optionals/compat_rhs_usf3/meta.cpp new file mode 100644 index 0000000000..4dcda17c97 --- /dev/null +++ b/optionals/compat_rhs_usf3/meta.cpp @@ -0,0 +1,2 @@ +protocol = 1; +publishedid = 773125288; From 56c461191994c6adb092077233d8966231256dbc Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 15 Dec 2016 11:28:39 -0600 Subject: [PATCH 260/826] Fix ace_particles smoke on arty shells (#4768) Close #4766 --- optionals/particles/CfgAmmo.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optionals/particles/CfgAmmo.hpp b/optionals/particles/CfgAmmo.hpp index 6065a0b818..361475778b 100644 --- a/optionals/particles/CfgAmmo.hpp +++ b/optionals/particles/CfgAmmo.hpp @@ -63,7 +63,7 @@ class CfgAmmo { // - Artillery smoke submunition ------------------------------------------ class SmokeShellArty: SmokeShell { - explosionTime = 0; + explosionTime = 0.1; effectsSmoke = "ACE_ArtillerySmoke"; }; From d8fec7fbe38ef65041c1bd09ba0a4f9b28b602f7 Mon Sep 17 00:00:00 2001 From: bux578 Date: Thu, 15 Dec 2016 20:42:13 +0100 Subject: [PATCH 261/826] improve german translation for entrenchment tool (#4769) --- addons/trenches/stringtable.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/trenches/stringtable.xml b/addons/trenches/stringtable.xml index 1bb0928c2f..fcb46b3570 100644 --- a/addons/trenches/stringtable.xml +++ b/addons/trenches/stringtable.xml @@ -3,7 +3,7 @@ Entrenching Tool - Schanzzeug + Klappspaten Saperka Pala Pala para trincheras @@ -16,7 +16,7 @@ Entrenching Tool Saperka, używana do budowy wnęk - Mit Schanzzeug können Erdwälle oder Gräben ausgehoben werden. + Mit dem Klappspaten können Erdwälle oder Gräben ausgehoben werden. Pala Pala para trincheras Outil de tranchée @@ -175,4 +175,4 @@ Entferne Schützengraben - \ No newline at end of file + From 988c5b0a25b70308ec1b4e0852e133cac76b3944 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Fri, 16 Dec 2016 01:08:10 -0600 Subject: [PATCH 262/826] Minor wind deflection optimization (#4762) --- addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf index 7ee21294e5..358a434dfa 100644 --- a/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf +++ b/addons/winddeflection/functions/fnc_updateTrajectoryPFH.sqf @@ -29,16 +29,16 @@ _x params ["_bullet", "_airFriction"]; private _bulletVelocity = velocity _bullet; - private _bulletSpeed = vectorMagnitude _bulletVelocity; + private _bulletSpeedSqr = vectorMagnitudeSqr _bulletVelocity; - if ((!alive _bullet) || {(_bullet isKindOf "BulletBase") && {_bulletSpeed < 100}}) then { + if ((!alive _bullet) || {(_bullet isKindOf "BulletBase") && {_bulletSpeedSqr < 10000}}) then { GVAR(trackedBullets) deleteAt (GVAR(trackedBullets) find _x); } else { if (_isWind) then { private _trueVelocity = _bulletVelocity vectorDiff ACE_wind; private _trueSpeed = vectorMagnitude _trueVelocity; - private _dragRef = _deltaT * _airFriction * _bulletSpeed * _bulletSpeed; + private _dragRef = _deltaT * _airFriction * _bulletSpeedSqr; private _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); _bulletVelocity = _bulletVelocity vectorDiff _accelRef; From 552e9ecd87dae9617aac182edea07a37f9501589 Mon Sep 17 00:00:00 2001 From: classic Date: Sat, 17 Dec 2016 20:39:57 +0900 Subject: [PATCH 263/826] fix jpn translation for ballistics fix html tag in the japanese translation. --- addons/ballistics/stringtable.xml | 90 +++++++++++++++---------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index a9cab83480..c26e3c8cc2 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -39,7 +39,7 @@ Ráže: 6.5x47mm (HPBT Scenar)<br />Nábojů: 20<br />Použití u: QBU-88 Calibre: 6.5x47mm (HPBT Scenar)<br/>Cartuchos: 20<br/>Usado em: QBU-88 Kaliber: 6,5x47mm (HPBT Scenar)<br />Lövedékek: 20<br />Használható: QBU-88 - 口径: 6.5x47mm (HPBT Scenar)&lt;br /&gt;装填数: 20&lt;br /&gt;次で使用: QBU-88 + 口径: 6.5x47mm (HPBT Scenar)<br />装填数: 20<br />次で使用: QBU-88 6.5mm Creedmor 20Rnd Mag @@ -78,7 +78,7 @@ Ráže: 6.5x47mm Creedmor<br />Nábojů: 20<br />Použití u: QBU-88 Calibre: 6.5x47mm Creedmor<br/>Cartuchos: 20<br/>Usado em: QBU-88 Kaliber: 6,5x47mm Creedmor<br />Lövedékek: 20<br />Használható: QBU-88 - 口径: 6.5x47mm Creedmor&lt;br /&gt;装填数: 20&lt;br /&gt;次で使用: QBU-88 + 口径: 6.5x47mm Creedmor<br />装填数: 20<br />次で使用: QBU-88 @@ -118,7 +118,7 @@ Calibre: 6,5x39mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL Calibro: 6.5x39mm Traccianti IR-DIM <br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL - 口径: 6.5x39mm 曳光弾 IR-DIM&lt;br /&gt;装填数: 30&lt;br /&gt;次で使用: MX/C/M/SW/3GL + 口径: 6.5x39mm 曳光弾 IR-DIM<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL 6.5mm 30Rnd SD Mag @@ -157,7 +157,7 @@ Calibre: 6,5x39mm SD<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL Calibro: 6.5x39mm Sil.<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL - 口径: 6.5x39mm 亜音速弾&lt;br /&gt;装填数: 30&lt;br /&gt;次で使用: MX/C/M/SW/3GL + 口径: 6.5x39mm 亜音速弾<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL 6.5mm 30Rnd AP Mag @@ -196,7 +196,7 @@ Calibre: 6,5x39mm AP<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL Calibro: 6.5x39mm AP<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL - 口径: 6.5x39mm 徹甲弾&lt;br /&gt;装填数: 30&lt;br /&gt;次で使用: MX/C/M/SW/3GL + 口径: 6.5x39mm 徹甲弾<br />装填数: 30<br />次で使用: MX/C/M/SW/3GL @@ -236,7 +236,7 @@ Calibre: 6,5x39mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: Katiba Calibro: 6.5x39mm Tracciant IR-DIM<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: Katiba - 口径: 6.5x39mm IR-DIM曳光弾&lt;br /&gt;装填数: 30&lt;br /&gt;次で使用: Katiba + 口径: 6.5x39mm IR-DIM曳光弾<br />装填数: 30<br />次で使用: Katiba 6.5mm 30Rnd SD Mag @@ -275,7 +275,7 @@ Calibre: 6,5x39mm SD<br />Projéteis: 30<br />Usado em: Katiba Calibro: 6.5x39mm Sil.<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: Katiba - 口径: 6.5x39mm 亜音速弾&lt;br /&gt;装填数: 30&lt;br /&gt;次で使用: Katiba + 口径: 6.5x39mm 亜音速弾<br />装填数: 30<br />次で使用: Katiba 6.5mm 30Rnd AP Mag @@ -314,7 +314,7 @@ Calibre: 6,5x39mm AP<br />Projéteis: 30<br />Usado em: Katiba Calibro: 6.5x39mm AP<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: Katiba - 口径: 6.5x39mm 徹甲弾&lt;br /&gt;装填数: 30&lt;br /&gt;次で使用: Katiba + 口径: 6.5x39mm 徹甲弾<br />装填数: 30<br />次で使用: Katiba @@ -354,7 +354,7 @@ Calibre: 5,56x45mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Calibro: 5.56x45mm Traccianti IR-DIM<br />Munizioni: 30<br />In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Калибр: 5,56x45 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - 口径: 5.56x45mm IR-DIM曳光弾&lt;br /&gt;装填数: 30&lt;br /&gt;次で使用: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + 口径: 5.56x45mm IR-DIM曳光弾<br />装填数: 30<br />次で使用: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR @@ -394,7 +394,7 @@ Calibre: 7,62x51mm Traçante<br />Projéteis: 20<br />Usado em: Mk18 ABR Calibro: 7.62x51mm Traccianti<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR - 口径: 7.62x51mm 曳光弾&lt;br /&gt;装填数: 20&lt;br /&gt;次で使用: Mk18 ABR + 口径: 7.62x51mm 曳光弾<br />装填数: 20<br />次で使用: Mk18 ABR 7.62mm 20rnd Tracer IR-DIM Mag @@ -433,7 +433,7 @@ Calibre: 7,62x51mm Traçante IR-DIM<br />Projéteis: 20<br />Usado em: Mk18 ABR Calibro: 7.62x51mm Traccianti IR-DIM<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм ИК-трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR - 口径: 7.62x51mm IR-DIM曳光弾&lt;br /&gt;装填数: 20&lt;br /&gt;次で使用: Mk18 ABR + 口径: 7.62x51mm IR-DIM曳光弾<br />装填数: 20<br />次で使用: Mk18 ABR 7.62mm 20Rnd SD Mag @@ -472,7 +472,7 @@ Calibre: 7,62x51mm SD<br />Projéteis: 20<br />Usado em: Mk18 ABR Calibro: 7.62x51mm Sil.<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм дозвуковые<br />Патронов: 20<br />Используются с: Mk18 ABR - 口径: 7.62x51mm 亜音速弾&lt;br /&gt;装填数: 20&lt;br /&gt;次で使用: Mk18 ABR + 口径: 7.62x51mm 亜音速弾<br />装填数: 20<br />次で使用: Mk18 ABR @@ -512,7 +512,7 @@ Ráže: .338 Noma Magnum Svítící<br />Nábojů: 130<br />Použití u: LWMMG Calibre: .338 Norma Magnum Traçante<br />Cartuchos: 130<br />Usado em: SPMG Kaliber: .338 Norma Magnum nyomkövető<br />Lövedékek: 130<br />Használható: SPMG - 口径: .338 Norma Magnum 曳光弾&lt;br /&gt;装填数: 130&lt;br /&gt;次で使用: SPMG + 口径: .338 Norma Magnum 曳光弾<br />装填数: 130<br />次で使用: SPMG .338 NM 130Rnd IR-DIM Belt @@ -551,7 +551,7 @@ Ráže: .338 Noma Magnum Svítící IR-DIM<br />Nábojů: 130<br />Použití u: LWMMG Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartuchos: 130<br />Usado em: SPMG Kaliber: .338 Norma Magnum infravörös nyomkövető<br />Lövedékek: 130<br />Használható: SPMG - 口径: .338 Norma Magnum IR-DIM曳光弾&lt;br /&gt;装填数: 130&lt;br /&gt;次で使用: SPMG + 口径: .338 Norma Magnum IR-DIM曳光弾<br />装填数: 130<br />次で使用: SPMG .338 NM 130Rnd AP Belt @@ -590,7 +590,7 @@ Ráže: .338 Noma Magnum AP<br />Nábojů: 130<br />Použití u: LWMMG Calibre: .338 Norma Magnum AP<br />Cartuchos: 130<br />Usado em: SPMG Kaliber: .338 Norma Magnum páncéltörő<br />Lövedékek: 130<br />Használható: SPMG - 口径: .338 Norma Magnum 徹甲弾&lt;br /&gt;装填数: 130&lt;br /&gt;次で使用: SPMG + 口径: .338 Norma Magnum 徹甲弾<br />装填数: 130<br />次で使用: SPMG @@ -630,7 +630,7 @@ Ráže: 9.3x64mm Svítící<br />Nábojů: 10<br />Použití u: Cyrus Calibre: 9.3x64mm Traçante<br />Cartuchos: 10<br />Usado em: Cyrus Kaliber: 9,3x64mm nyomkövető<br />Lövedékek: 10<br />Használható: Cyrus - 口径: 9.3x64mm 曳光弾&lt;br /&gt;装填数: 10&lt;br /&gt;次で使用: Cyrus + 口径: 9.3x64mm 曳光弾<br />装填数: 10<br />次で使用: Cyrus 9.3mm 10Rnd Tracer IR-DIM Mag @@ -669,7 +669,7 @@ Ráže: 9.3x64mm Svítící IR-DIM<br />Nábojů: 10<br />Použití u: Cyrus Calibre: 9.3x64mm Traçante IR-DIM<br />Cartuchos: 10<br />Usado em: Cyrus Kaliber: 9,3x64mm infravörös nyomkövető<br />Lövedékek: 10<br /> Használható: Cyrus - 口径: 9.3x64mm IR-DIM曳光弾&lt;br /&gt;装填数: 10&lt;br /&gt;次で使用: Cyrus + 口径: 9.3x64mm IR-DIM曳光弾<br />装填数: 10<br />次で使用: Cyrus @@ -709,7 +709,7 @@ Ráže: 9.3x64mm Svítící<br />Nábojů: 150<br />Použití u: HK121 Calibre: 9.3x64mm Traçante<br />Cartuchos: 150<br />Usado em: Navid Kaliber: 9,3x64mm nyomkövető<br />Lövedékek: 150<br />Használható: Navid - 口径: 9.3x64mm 曳光弾&lt;br /&gt;装填数: 150&lt;br /&gt;次で使用: Navid + 口径: 9.3x64mm 曳光弾<br />装填数: 150<br />次で使用: Navid 9.3mm 150Rnd Tracer IR-DIM Belt @@ -748,7 +748,7 @@ Ráže: 9.3x64mm Svítící IR-DIM<br />Nábojů: 150<br />Použití u: HK121 Calibre: 9.3x64mm Traçante IR-DIM<br />Cartuchos: 150<br />Usado em: Navid Kaliber: 9,3x64mm infravörös nyomkövető<br />Lövedékek: 150<br />Használható: Navid - 口径: 9.3x64mm IR-DIM曳光弾&lt;br /&gt;装填数: 150&lt;br /&gt;次で使用: Navid + 口径: 9.3x64mm IR-DIM曳光弾<br />装填数: 150<br />次で使用: Navid 9.3mm 150Rnd AP Belt @@ -787,7 +787,7 @@ Ráže: 9.3x64mm AP<br />Nábojů: 150<br />Použití u: HK121 Calibre: 9.3x64mm AP<br />Cartuchos: 150<br />Usado em: Navid Kaliber: 9,3x64mm páncéltörő<br />Lövedékek: 150<br />Használható: Navid - 口径: 9.3x64mm 徹甲弾&lt;br /&gt;装填数: 150&lt;br /&gt;次で使用: Navid + 口径: 9.3x64mm 徹甲弾<br />装填数: 150<br />次で使用: Navid 9x19mm 16Rnd Mag @@ -943,7 +943,7 @@ 6.5mm 100náb. Svítící IR-DIM Zásobník<br />Nábojů: 100<br />Použití u: MX LSW Carregador 6.5mm 100 Cartuchos Traçantes IR-DIM<br />Cartuchos: 100<br />Usado em: MX LSW 6.5mm 100-lövedékes infravörös nyomkövető tár<br />Lövedékek: 100<br />Használható: MX LSW - 6.5mm 100発入り IR-DIM曳光弾 弾倉&lt;br /&gt;装填数: 100&lt;br /&gt;次で使用: MX LSW + 6.5mm 100発入り IR-DIM曳光弾 弾倉<br />装填数: 100<br />次で使用: MX LSW 6.5mm 200Rnd Tracer IR-DIM Belt @@ -982,7 +982,7 @@ 6.5mm 200náb. Svítící IR-DIM Pás<br />Nábojů: 200<br />Použití u: Stoner 99 LMG Cinto de munição traçante 6.5mm IR-DIM com 200 cartuchos<br />Cartuchos: 200<br />Usado em: Stoner 99 LMG 6.5mm 200-lövedékes infravörös nyomkövető heveder<br />Lövedékek: 200<br />Használható: Stoner 99 LMG - 6.5mm 200発入り IR-DIM曳光弾ベルト&lt;br /&gt;装填数: 200&lt;br /&gt;次で使用: Stoner 99 LMG + 6.5mm 200発入り IR-DIM曳光弾ベルト<br />装填数: 200<br />次で使用: Stoner 99 LMG 5.56mm 30Rnd Mag (Mk262) @@ -1021,7 +1021,7 @@ Ráže: 5.56x45mm NATO (Mk262)<br />Nábojů: 30 Calibre: 5.56x45mm NATO (Mk262)<br/>Cartuchos: 30 Kaliber: 5,56x45mm NATO (Mk262)<br />Lövedékek: 30 - 口径: 5.56x45mm NATO (Mk262)&lt;br /&gt;装填数: 30 + 口径: 5.56x45mm NATO (Mk262)<br />装填数: 30 5.56mm 30Rnd Mag (Mk318) @@ -1060,7 +1060,7 @@ Ráže: 5.56x45mm NATO (Mk318)<br />Nábojů: 30 Calibre: 5.56x45mm NATO (Mk318)<br/>Cartuchos: 30 Kaliber: 5,56x45mm NATO (Mk318)<br />Lövedékek: 30 - 口径: 5.56x45mm NATO (Mk318)&lt;br /&gt;装填数: 30 + 口径: 5.56x45mm NATO (Mk318)<br />装填数: 30 5.56mm 30Rnd Mag (M995 AP) @@ -1099,7 +1099,7 @@ Ráže: 5.56x45mm NATO (M995 AP)<br />Nábojů: 30 Calibre: 5.56x45mm NATO (M995 AP)<br/>Cartuchos: 30 Kaliber: 5,56x45mm NATO (M995 páncéltörő)<br />Lövedékek: 30 - 口径: 5.56x45mm NATO (M995 徹甲弾)&lt;br /&gt;装填数: 30 + 口径: 5.56x45mm NATO (M995 徹甲弾)<br />装填数: 30 7.62mm 10Rnd Mag (M118LR) @@ -1138,7 +1138,7 @@ Ráže: 7.62x51mm NATO (M118LR)<br />Nábojů: 10 Calibre: 7.26x51mm NATO (M118LR)<br/>Cartuchos: 10 Kaliber: 7,62x51mm NATO (M118LR)<br />Lövedékek: 10 - 口径: 7.62x51mm NATO (M118LR)&lt;br /&gt;装填数: 10 + 口径: 7.62x51mm NATO (M118LR)<br />装填数: 10 7.62mm 20Rnd Mag (M118LR) @@ -1177,7 +1177,7 @@ Ráže: 7.62x51mm NATO (M118LR)<br />Nábojů: 20 Calibre: 7.26x51mm NATO (M118LR)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (M118LR)<br />Lövedékek: 20 - 口径: 7.62x51mm NATO (M118LR)&lt;br /&gt;装填数: 20 + 口径: 7.62x51mm NATO (M118LR)<br />装填数: 20 7.62mm 10Rnd Mag (Mk316 Mod 0) @@ -1216,7 +1216,7 @@ Ráže: 7.62x51mm NATO (Mk316 Mod 0)<br />Nábojů: 10 Calibre: 7.26x51mm NATO (Mk316 Mod 0)<br/>Cartuchos: 10 Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Lövedékek: 10 - 口径: 7.62x51mm NATO (Mk316 Mod 0)&lt;br /&gt;装填数: 10 + 口径: 7.62x51mm NATO (Mk316 Mod 0)<br />装填数: 10 7.62mm 20Rnd Mag (Mk316 Mod 0) @@ -1255,7 +1255,7 @@ Ráže: 7.62x51mm NATO (Mk316 Mod 0)<br />Nábojů: 20 Calibre: 7.26x51mm NATO (Mk316 Mod 0)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Lövedékek: 20 - 口径: 7.62x51mm NATO (Mk316 Mod 0)&lt;br /&gt;装填数: 20 + 口径: 7.62x51mm NATO (Mk316 Mod 0)<br />装填数: 20 7.62mm 10Rnd Mag (Mk319 Mod 0) @@ -1294,7 +1294,7 @@ Ráže: 7.62x51mm NATO (Mk319 Mod 0)<br />Nábojů: 10 Calibre: 7.26x51mm NATO (Mk319 Mod 0)<br/>Cartuchos: 10 Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Lövedékek: 10 - 口径: 7.62x51mm NATO (Mk319 Mod 0)&lt;br /&gt;装填数: 10 + 口径: 7.62x51mm NATO (Mk319 Mod 0)<br />装填数: 10 7.62mm 20Rnd Mag (Mk319 Mod 0) @@ -1333,7 +1333,7 @@ Ráže: 7.62x51mm NATO (Mk319 Mod 0)<br />Nábojů: 20 Calibre: 7.26x51mm NATO (Mk319 Mod 0)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Lövedékek: 20 - 口径: 7.62x51mm NATO (Mk319 Mod 0)&lt;br /&gt;装填数: 20 + 口径: 7.62x51mm NATO (Mk319 Mod 0)<br />装填数: 20 7.62mm 10Rnd Mag (M993 AP) @@ -1372,7 +1372,7 @@ Ráže: 7.62x51mm NATO (M993 AP)<br />Nábojů: 10 Calibre: 7.26x51mm NATO (M993 AP)<br/>Cartuchos: 10 Kaliber: 7,62x51mm NATO (M993 páncéltörő)<br />Lövedékek: 10 - 口径: 7.62x51mm NATO (Mk319 Mod 0)&lt;br /&gt;装填数: 10 + 口径: 7.62x51mm NATO (Mk319 Mod 0)<br />装填数: 10 7.62mm 20Rnd Mag (M993 AP) @@ -1411,7 +1411,7 @@ Ráže: 7.62x51mm NATO (M993 AP)<br />Nábojů: 20 Calibre: 7.26x51mm NATO (M993 AP)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (M993 páncéltörő)<br />Lövedékek: 20 - 口径: 7.62x51mm NATO (M993 徹甲弾)&lt;br /&gt;装填数: 20 + 口径: 7.62x51mm NATO (M993 徹甲弾)<br />装填数: 20 7.62mm 20Rnd Mag (Mk248 Mod 0) @@ -1450,7 +1450,7 @@ Ráže: 7.62x67mm NATO (Mk248 Mod 0)<br />Nábojů: 20 Calibre: 7.26x67mm NATO (Mk248 Mod 0)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (Mk248 Mod 0)<br />Lövedékek: 20 - 口径: 7.62x67mm NATO (Mk248 Mod 0)&lt;br /&gt;装填数: 20 + 口径: 7.62x67mm NATO (Mk248 Mod 0)<br />装填数: 20 7.62mm 20Rnd Mag (Mk248 Mod 1) @@ -1489,7 +1489,7 @@ Ráže: 7.62x67mm NATO (Mk248 Mod 1)<br />Nábojů: 20 Calibre: 7.26x67mm NATO (Mk248 Mod 1)<br/>Cartuchos: 20 Kaliber: 7,62x51mm NATO (Mk248 Mod 1)<br />Lövedékek: 20 - 口径: 7.62x67mm NATO (Mk248 Mod 1)&lt;br /&gt;装填数: 20 + 口径: 7.62x67mm NATO (Mk248 Mod 1)<br />装填数: 20 7.62mm 20Rnd Mag (Berger Hybrid OTM) @@ -1528,7 +1528,7 @@ Ráže: 7.62x67mm NATO (Berger Hybrid OTM)<br />Nábojů: 20 Calibre: 7.26x67mm NATO (Berger Hybrid OTM)<br/>Cartuchos: 20 Kaliber: 7,62x67mm NATO (Berger Hybrid OTM)<br />Lövedékek: 20 - 口径: 7.62x67mm NATO (Berger Hybrid OTM)&lt;br /&gt;装填数: 20 + 口径: 7.62x67mm NATO (Berger Hybrid OTM)<br />装填数: 20 6.5x47mm 30Rnd Mag (HPBT Scenar) @@ -1567,7 +1567,7 @@ Ráže: 6.5x47mm (HPBT Scenar)<br />Nábojů: 30<br />Použití u: MXM Calibre: 6.5x47mm (HPBT Scenar)<br/>Cartuchos: 30<br/>Usado em: MXM Kaliber: 6,5x47mm (HPBT Scenar)<br />Lövedékek: 30<br />Használható: MXM - 口径: 6.5x47mm (HPBT Scenar)&lt;br /&gt;装填数: 30&lt;br /&gt;次で使用: MXM + 口径: 6.5x47mm (HPBT Scenar)<br />装填数: 30<br />次で使用: MXM 6.5mm Creedmor 30Rnd Mag @@ -1606,7 +1606,7 @@ Ráže: 6.5x47mm Creedmor<br />Nábojů: 30<br />Použití u: MXM Calibre: 6.5x47mm Creedmor<br/>Cartuchos: 30<br/>Usado em: MXM Kaliber: 6,5x47mm Creedmor<br />Lövedékek: 30<br />Használható: MXM - 口径: 6.5x47mm Creedmor&lt;br /&gt;装填数: 30&lt;br /&gt;次で使用: MXM + 口径: 6.5x47mm Creedmor<br />装填数: 30<br />次で使用: MXM .338 10Rnd Mag (300gr Sierra MatchKing HPBT) @@ -1645,7 +1645,7 @@ Ráže: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Nábojů: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br/>Cartuchos: 10 Kaliber: 8,6x70mm (300gr Sierra MatchKing HPBT)<br />Lövedékek: 10 - 口径: 8.6x70mm (300gr Sierra MatchKing HPBT)&lt;br /&gt;装填数: 10 + 口径: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />装填数: 10 .338 10Rnd Mag (API526) @@ -1684,7 +1684,7 @@ Ráže: 8.6x70mm (API526)<br />Nábojů: 10 Calibre: 8.6x70mm (API526)<br/>Cartuchos: 10 Kaliber: 8,6x70mm (API526)<br />Lövedékek: 10 - 口径: 8.6x70mm (API526)&lt;br /&gt;装填数: 10 + 口径: 8.6x70mm (API526)<br />装填数: 10 .408 7Rnd Mag (305gr) @@ -1723,7 +1723,7 @@ Ráže: .408 CheyTac (305gr)<br />Nábojů: 7 Calibre: .408 CheyTac (305gr)<br/>Cartuchos: 7 Kaliber: .408 CheyTac (305gr)<br />Lövedékek: 7 - 口径: .408 CheyTac (305gr)&lt;br /&gt;装填数: 7 + 口径: .408 CheyTac (305gr)<br />装填数: 7 12.7x99mm 5Rnd Mag @@ -1762,7 +1762,7 @@ Ráže: 12.7x99mm<br />Nábojů: 5 Calibre: 12.7x99mm<br/>Cartuchos: 5 Kaliber: 12,7x99mm<br />Lövedékek: 5 - 口径: 12.7x99mm&lt;br /&gt;装填数: 5 + 口径: 12.7x99mm<br />装填数: 5 12.7x99mm API 5Rnd Mag @@ -1801,7 +1801,7 @@ Ráže: 12.7x99mm API<br />Nábojů: 5 Calibre: 12.7x99mm API<br/>Cartuchos: 5 Kaliber: 12,7x99mm API<br />Lövedékek: 5 - 口径: 12.7x99mm 焼夷徹甲弾&lt;br /&gt;装填数: 5 + 口径: 12.7x99mm 焼夷徹甲弾<br />装填数: 5 12.7x99mm 5Rnd Mag (AMAX) @@ -1840,7 +1840,7 @@ Ráže: 12.7x99mm (AMAX)<br />Nábojů: 5 Calibre: 12.7x99mm (AMAX)<br/>Cartuchos: 5 Kaliber: 12,7x99mm (AMAX)<br />Lövedékek: 5 - 口径: 12.7x99mm (AMAX)&lt;br /&gt;装填数: 5 + 口径: 12.7x99mm (AMAX)<br />装填数: 5 [ACE] Ammo Supply Crate @@ -1856,4 +1856,4 @@ [ACE] 弾薬物資箱 - \ No newline at end of file + From 6a93f58b52f0b2b1d4db4607e5eba84aacf80bdd Mon Sep 17 00:00:00 2001 From: classic Date: Sat, 17 Dec 2016 20:50:19 +0900 Subject: [PATCH 264/826] added missing localization in jpn translation added missing localization in jpn translation --- addons/zeus/stringtable.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index ed85bd3377..e30d69c836 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -395,12 +395,15 @@ Add/Remove FRIES + FRUES の追加と削除 %1 is not fastrope compatible. + %1 はファストロープに対応していません。 Unable to remove FRIES, ropes are deployed. + すでにロープが展開されているため、FRIES を削除できません。 Teleport Players @@ -516,6 +519,7 @@ Toggle Simulation + シミュレーションをトグル Add Spare Wheel From 04d4353b5d7a8e78bb73b93857aea2a4338da54b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 20 Dec 2016 15:37:51 -0600 Subject: [PATCH 265/826] Fix reversed RHS compats - Close #4759 (#4760) --- tools/publish.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/publish.py b/tools/publish.py index 8c764a7bb7..894a79720c 100644 --- a/tools/publish.py +++ b/tools/publish.py @@ -112,11 +112,11 @@ def main(argv): #RHS Compat USA - http://steamcommunity.com/sharedfiles/filedetails/?id=773125288 - folder = buildCompatFolder("@ace_compat_rhs_afrf3", ["ace_compat_rhs_afrf3.*"]) + folder = buildCompatFolder("@ace_compat_rhs_usf3", ["ace_compat_rhs_usf3.*"]) publishFolder(folder, "773125288", changelog_path) #RHS Compat Commies - http://steamcommunity.com/sharedfiles/filedetails/?id=773131200 - folder = buildCompatFolder("@ace_compat_rhs_usf3", ["ace_compat_rhs_usf3.*"]) + folder = buildCompatFolder("@ace_compat_rhs_afrf3", ["ace_compat_rhs_afrf3.*"]) publishFolder(folder, "773131200", changelog_path) #ADR97 (p90)- http://steamcommunity.com/sharedfiles/filedetails/?id=773136286 From 78b655bc1f8eb588611e4f03e3e770e4114641ab Mon Sep 17 00:00:00 2001 From: Dystopian Date: Thu, 22 Dec 2016 01:41:16 +0300 Subject: [PATCH 266/826] Simplify config crawling --- .../functions/fnc_exportConfig.sqf | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf b/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf index 81d4b0b438..f5e3d0cb8b 100644 --- a/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf +++ b/optionals/nouniformrestrictions/functions/fnc_exportConfig.sqf @@ -18,19 +18,15 @@ private _modifyClasses = []; private _baseClasses = []; { - if ((_x >> "modelSides") in (configProperties [_x, "true", false])) then { - private _modifyClass = { - if (!isNull (_x >> "modelSides")) exitWith {_x}; - } forEach (configHierarchy _x); - private _baseClass = inheritsFrom _modifyClass; - _modifyClasses pushBackUnique [_modifyClass, _baseClass]; - if !(_baseClass in (_modifyClasses apply {_x select 0})) then { - _baseClasses pushBackUnique _baseClass; - }; + private _baseClass = inheritsFrom _x; + _modifyClasses pushBackUnique [_x, _baseClass]; + if !(_baseClass in (_modifyClasses apply {_x select 0})) then { + _baseClasses pushBackUnique _baseClass; }; false } count ( ("!isNull (_x >> 'modelSides') &&" + + "{(_x >> 'modelSides') in (configProperties [_x, 'true', false])} &&" + "{!(getArray (_x >> 'modelSides') isEqualTo [6])} &&" + "{!(getArray (_x >> 'modelSides') isEqualTo [0,1,2,3])}") configClasses (configFile >> "CfgVehicles") From c22fce273f3d88eb65b5832561215de7af70065b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 22 Dec 2016 13:29:05 -0600 Subject: [PATCH 267/826] Overpressure changes (#4770) * Add setting to overpressure * Change overpressure on 2a70 cannon Close #4691 Also fix gl smoke causing frag * Handle 2a28 cannon * Fix base class --- .../functions/fnc_addLineToDebugDraw.sqf | 25 +++++++++---------- addons/overpressure/ACE_Settings.hpp | 8 ++++++ addons/overpressure/XEH_postInit.sqf | 13 +++++++--- addons/overpressure/config.cpp | 1 + .../functions/fnc_cacheOverPressureValues.sqf | 2 +- .../functions/fnc_overpressureDamage.sqf | 1 + addons/overpressure/stringtable.xml | 11 ++++++++ optionals/compat_rhs_afrf3/CfgAmmo.hpp | 2 +- optionals/compat_rhs_afrf3/CfgWeapons.hpp | 11 ++++++++ optionals/compat_rhs_afrf3/config.cpp | 2 +- 10 files changed, 56 insertions(+), 20 deletions(-) create mode 100644 addons/overpressure/ACE_Settings.hpp create mode 100644 addons/overpressure/stringtable.xml diff --git a/addons/common/functions/fnc_addLineToDebugDraw.sqf b/addons/common/functions/fnc_addLineToDebugDraw.sqf index f0a643e922..5fd7f028ba 100644 --- a/addons/common/functions/fnc_addLineToDebugDraw.sqf +++ b/addons/common/functions/fnc_addLineToDebugDraw.sqf @@ -7,42 +7,41 @@ * 1: End point ASL * 2: Color * - * None + * Return Value: + * Nothing + * + * Example: + * [[0,0,0], [1,1,0], [1,0,0,1]]] call ace_common_fnc_addLineToDebugDraw; * * Public: No */ #include "script_component.hpp" +params ["_startASL", "_endASL", "_color"]; + if (isNil QGVAR(debugLines)) then { GVAR(debugLines) = []; GVAR(debugLinesIndex) = 0; }; if (count GVAR(debugLines) < 100) then { - GVAR(debugLines) pushBack _this; + GVAR(debugLines) pushBack [ASLtoAGL _startASL, ASLtoAGL _endASL, _color]; GVAR(debugLinesIndex) = 0; } else { - GVAR(debugLines) set [GVAR(debugLinesIndex), _this]; + GVAR(debugLines) set [GVAR(debugLinesIndex), [ASLtoAGL _startASL, ASLtoAGL _endASL, _color]]; GVAR(debugLinesIndex) = (GVAR(debugLinesIndex) + 1) mod 100; }; if (isNil QGVAR(debugDrawHandler)) then { GVAR(debugDrawHandler) = addMissionEventHandler ["Draw3D", { - if (count GVAR(debugLines) == 0) exitWith { + if (GVAR(debugLines) isEqualTo []) exitWith { removeMissionEventHandler ["Draw3D", GVAR(debugDrawHandler)]; GVAR(debugDrawHandler) = nil; }; { - _p0 = _x select 0; - if (!surfaceIsWater _p0) then { - _p0 = ASLtoATL _p0; - }; - _p1 = _x select 1; - if (!surfaceIsWater _p1) then { - _p1 = ASLtoATL _p1; - }; - drawLine3D [_p0, _p1, _x select 2]; + _x params ["_start", "_end", "_color"]; + drawLine3D [_start, _end, _color]; } forEach GVAR(debugLines); }]; }; diff --git a/addons/overpressure/ACE_Settings.hpp b/addons/overpressure/ACE_Settings.hpp new file mode 100644 index 0000000000..f2ddb5e302 --- /dev/null +++ b/addons/overpressure/ACE_Settings.hpp @@ -0,0 +1,8 @@ +class ACE_Settings { + class GVAR(distanceCoefficient) { + displayName = CSTRING(distanceCoefficient_displayName); + description = CSTRING(distanceCoefficient_toolTip); + typeName = "SCALAR"; + value = 1; + }; +}; diff --git a/addons/overpressure/XEH_postInit.sqf b/addons/overpressure/XEH_postInit.sqf index dd74ec5c3a..02b0e71bb6 100644 --- a/addons/overpressure/XEH_postInit.sqf +++ b/addons/overpressure/XEH_postInit.sqf @@ -1,7 +1,12 @@ #include "script_component.hpp" -["ace_overpressure", FUNC(overpressureDamage)] call CBA_fnc_addEventHandler; +["ace_settingsInitialized", { + TRACE_1("settingsInit eh",GVAR(distanceCoefficient)); + if (GVAR(distanceCoefficient) <= 0) exitWith {}; -// Register fire event handler -["ace_firedPlayer", DFUNC(firedEHBB)] call CBA_fnc_addEventHandler; -["ace_firedPlayerVehicle", DFUNC(firedEHOP)] call CBA_fnc_addEventHandler; + ["ace_overpressure", LINKFUNC(overpressureDamage)] call CBA_fnc_addEventHandler; + + // Register fire event handler + ["ace_firedPlayer", LINKFUNC(firedEHBB)] call CBA_fnc_addEventHandler; + ["ace_firedPlayerVehicle", LINKFUNC(firedEHOP)] call CBA_fnc_addEventHandler; +}] call CBA_fnc_addEventHandler; diff --git a/addons/overpressure/config.cpp b/addons/overpressure/config.cpp index 75b58d5988..d99cbb1cc7 100644 --- a/addons/overpressure/config.cpp +++ b/addons/overpressure/config.cpp @@ -14,5 +14,6 @@ class CfgPatches { }; }; +#include "ACE_Settings.hpp" #include "CfgEventHandlers.hpp" #include "CfgWeapons.hpp" diff --git a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf index 4b447b5012..96d45ffe04 100644 --- a/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf +++ b/addons/overpressure/functions/fnc_cacheOverPressureValues.sqf @@ -46,7 +46,7 @@ TRACE_1("ConfigPath",_config); // get the Variables out of the Configes and create a array with then private _return = [ (getNumber (_config >> QGVAR(angle))), - (getNumber (_config >> QGVAR(range))), + (getNumber (_config >> QGVAR(range))) * GVAR(distanceCoefficient), (getNumber (_config >> QGVAR(damage))) ]; diff --git a/addons/overpressure/functions/fnc_overpressureDamage.sqf b/addons/overpressure/functions/fnc_overpressureDamage.sqf index 75286a968b..f75568e29b 100644 --- a/addons/overpressure/functions/fnc_overpressureDamage.sqf +++ b/addons/overpressure/functions/fnc_overpressureDamage.sqf @@ -51,6 +51,7 @@ TRACE_3("cache",_overpressureAngle,_overpressureRange,_overpressureDamage); private _beta = sqrt (1 - _angle / _overpressureAngle); private _damage = _alpha * _beta * _overpressureDamage; + TRACE_1("",_damage); // If the target is the ACE_player if (_x == ACE_player) then {[_damage * 100] call BIS_fnc_bloodEffect}; diff --git a/addons/overpressure/stringtable.xml b/addons/overpressure/stringtable.xml new file mode 100644 index 0000000000..aa3619763f --- /dev/null +++ b/addons/overpressure/stringtable.xml @@ -0,0 +1,11 @@ + + + + + Overpressure Distance Coefficient + + + Scales the overpressure effect [Default: 1] + + + diff --git a/optionals/compat_rhs_afrf3/CfgAmmo.hpp b/optionals/compat_rhs_afrf3/CfgAmmo.hpp index 6f335be3a8..b026fcc49c 100644 --- a/optionals/compat_rhs_afrf3/CfgAmmo.hpp +++ b/optionals/compat_rhs_afrf3/CfgAmmo.hpp @@ -213,7 +213,7 @@ class CfgAmmo { class rhs_g_vg40sz: rhs_g_vog25 { //Flashbang ace_frag_force = 0; }; - class rhs_GDM40: rhs_g_vog25 { //Smoke + class rhs_g_gdm40: rhs_g_vog25 { //Smoke ace_frag_force = 0; }; class rhs_g_vg40md_white: rhs_g_vog25 { //Smoke diff --git a/optionals/compat_rhs_afrf3/CfgWeapons.hpp b/optionals/compat_rhs_afrf3/CfgWeapons.hpp index fc70b8703f..1f193d92f5 100644 --- a/optionals/compat_rhs_afrf3/CfgWeapons.hpp +++ b/optionals/compat_rhs_afrf3/CfgWeapons.hpp @@ -85,4 +85,15 @@ class CfgWeapons { ace_hearing_protection = 0.5; ace_hearing_lowerVolume = 0.60; }; + + class rhs_weap_d81; + class rhs_weap_2a70: rhs_weap_d81 { // "Low pressure" 100mm cannon + ace_overpressure_range = 15; + ace_overpressure_damage = 0.5; + }; + class cannon_120mm; + class rhs_weap_2a28_base: cannon_120mm { // "Low pressure" + ace_overpressure_range = 15; + ace_overpressure_damage = 0.5; + }; }; diff --git a/optionals/compat_rhs_afrf3/config.cpp b/optionals/compat_rhs_afrf3/config.cpp index 904621a2d4..b7cfe3f233 100644 --- a/optionals/compat_rhs_afrf3/config.cpp +++ b/optionals/compat_rhs_afrf3/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_rearm", "ace_refuel", "ace_repair", "rhs_c_weapons", "rhs_c_troops", "rhs_c_bmd", "rhs_c_bmp", "rhs_c_bmp3", "rhs_c_a2port_armor", "rhs_c_btr", "rhs_c_sprut", "rhs_c_t72", "rhs_c_tanks", "rhs_c_a2port_air", "rhs_c_a2port_car", "rhs_c_cars", "rhs_c_trucks", "rhs_c_2s3", "rhs_c_rva"}; + requiredAddons[] = {"ace_rearm", "ace_refuel", "ace_repair", "rhs_c_weapons", "rhs_c_troops", "rhs_c_bmd", "rhs_c_bmp", "rhs_c_bmp3", "rhs_c_a2port_armor", "rhs_c_btr", "rhs_c_sprut", "rhs_c_t72", "rhs_c_tanks", "rhs_c_a2port_air", "rhs_c_a2port_car", "rhs_c_cars", "rhs_c_trucks", "rhs_c_2s3", "rhs_c_rva", "rhs_c_heavyweapons"}; author = ECSTRING(common,ACETeam); authors[] = {"Ruthberg", "GitHawk", "BaerMitUmlaut", "commy2", "Skengman2"}; url = ECSTRING(main,URL); From dff9e1156950061dc74d64cfc5eadc01a039f860 Mon Sep 17 00:00:00 2001 From: ace3mod Date: Thu, 22 Dec 2016 20:30:05 +0100 Subject: [PATCH 268/826] [Docs] Update component dependencies Automatically committed through Travis CI. [ci skip] --- docs/_includes/dependencies_list.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_includes/dependencies_list.md b/docs/_includes/dependencies_list.md index 6e985eea0a..556b9b65b4 100644 --- a/docs/_includes/dependencies_list.md +++ b/docs/_includes/dependencies_list.md @@ -447,7 +447,7 @@ {% endif %} {% if include.component == "compat_rhs_afrf3" %} -`ace_rearm`, `ace_refuel`, `ace_repair`, `rhs_c_weapons`, `rhs_c_troops`, `rhs_c_bmd`, `rhs_c_bmp`, `rhs_c_bmp3`, `rhs_c_a2port_armor`, `rhs_c_btr`, `rhs_c_sprut`, `rhs_c_t72`, `rhs_c_tanks`, `rhs_c_a2port_air`, `rhs_c_a2port_car`, `rhs_c_cars`, `rhs_c_trucks`, `rhs_c_2s3`, `rhs_c_rva` +`ace_rearm`, `ace_refuel`, `ace_repair`, `rhs_c_weapons`, `rhs_c_troops`, `rhs_c_bmd`, `rhs_c_bmp`, `rhs_c_bmp3`, `rhs_c_a2port_armor`, `rhs_c_btr`, `rhs_c_sprut`, `rhs_c_t72`, `rhs_c_tanks`, `rhs_c_a2port_air`, `rhs_c_a2port_car`, `rhs_c_cars`, `rhs_c_trucks`, `rhs_c_2s3`, `rhs_c_rva`, `rhs_c_heavyweapons` {% endif %} {% if include.component == "compat_rhs_usf3" %} From 7ecccde34021926efe674df49ad174c753622c82 Mon Sep 17 00:00:00 2001 From: bux578 Date: Tue, 27 Dec 2016 09:11:58 +0100 Subject: [PATCH 269/826] use https for ace3mod --- docs/README.md | 2 +- docs/README_DE.md | 10 +++++----- docs/README_PL.md | 12 ++++++------ docs/_config.yml | 4 +--- docs/_includes/_footer.html | 2 +- docs/_includes/_header.html | 2 +- docs/_posts/2015-07-30-ace3-version320.md | 2 +- docs/_posts/2015-09-17-ace3-version331.md | 2 +- docs/_posts/2015-12-03-ace3-version340.md | 2 +- docs/_posts/2016-03-02-ace3-version350.md | 2 +- .../2016-06-21-moving-ace3-frameworks-to-cba.md | 4 ++-- docs/_posts/2016-06-30-ace3-version360.md | 2 +- docs/_posts/2016-09-17-ace3-version370.md | 4 ++-- docs/_posts/2016-11-04-ace3-version381.md | 2 +- docs/index.html | 2 +- docs/wiki/development/coding-guidelines.md | 2 +- docs/wiki/feature/rangecard.md | 2 +- docs/wiki/user/information-center.md | 7 ++----- 18 files changed, 30 insertions(+), 35 deletions(-) diff --git a/docs/README.md b/docs/README.md index 24e1a1ff8a..ee47a3cdd9 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,4 @@ -# Source of http://ace3mod.com/ +# Source of https://ace3mod.com/ ## Updating compiled JavaScript and CSS files diff --git a/docs/README_DE.md b/docs/README_DE.md index b479a153a9..1541ef02b5 100644 --- a/docs/README_DE.md +++ b/docs/README_DE.md @@ -15,8 +15,8 @@ ACE3 Lizenz - - ACE3 Slack + + ACE3 Slack ACE3 Build Status @@ -70,14 +70,14 @@ Die Mod ist **modular aufgebaut**. Beinahe jede PBO kann entfernt werden, sodass #### Anleitungen Du hast ACE3 installiert, hast aber keine Ahnung was und wie alles funktioniert und wo sich was befindet? -- [Erste Schritte](http://ace3mod.com/wiki/user/getting-started.html). +- [Erste Schritte](https://ace3mod.com/wiki/user/getting-started.html). #### Mitwirken Wenn du bei der Entwicklung von ACE3 mithelfen möchtest, kannst du dies tun, indem du nach Fehlern Ausschau hältst oder neue Funktionen vorschlägst. Um etwas beizutragen, "Forke" dieses Repository und erstelle deine "Pull-Requests", welche von anderen Entwicklern und Beiträgern überprüft werden. Bitte trage dich dabei in [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) mit deinem Nutzernamen und einer gültigen Email-Adresse ein. Um uns einen Fehler, Anregungen oder neue Funktionalitäten mitzuteilen: Nutze unseren [Issue Tracker](https://github.com/acemod/ACE3/issues). Besuche auch: -- [Wie kann ich ein Problem melden](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) -- [Wie kann ich ein Wunsch zu einer neuen Funktion mitteilen?](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [Wie kann ich ein Problem melden](https://ace3mod.com/wiki/user/how-to-report-an-issue.html) +- [Wie kann ich ein Wunsch zu einer neuen Funktion mitteilen?](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) #### Testen & Mod erstellen Wenn du die neusten Entwicklungen erleben und uns dabei helfen möchtest bestehende Fehler zu entdecken, lade dir die "Master Branch" herunter. Entweder nutzt du [Git](https://help.github.com/articles/fetching-a-remote/) - wenn die Schritte bekannt sind - oder du lädst es dir direkt über [diesen Link](https://github.com/acemod/ACE3/archive/master.zip) herunter. diff --git a/docs/README_PL.md b/docs/README_PL.md index f5b93bb417..72afbc8cdc 100644 --- a/docs/README_PL.md +++ b/docs/README_PL.md @@ -14,8 +14,8 @@ ACE3 Licencja - - ACE3 Slack + + ACE3 Slack ACE3 Build Status @@ -65,15 +65,15 @@ Modyfikacja ta jest **budowana modułowo**, dzięki temu prawie każdy dostarczo ### Poradniki i instrukcje Jeżeli zainstalowałeś ACE3 lecz masz problem ze zrozumieniem jak to wszystko działa, lub gdzie zacząć, zacznij od przeczytania tego: -- [Wprowadzenie](http://ace3mod.com/wiki/user/getting-started.html) +- [Wprowadzenie](https://ace3mod.com/wiki/user/getting-started.html) #### Współpraca Możesz pomóc w rozwoju addonu szukając potencjalnych bugów w naszym kodzie, lub zgłaszając nowe funkcje. Aby wnieść swój wkład do ACE3, po prostu zforkuj to repozytorium na swoje konto GitHub i zgłoś swoje pull requesty do przeglądu przez innych współpracowników. Pamiętaj, aby dodać siebie do listy autorów każdego PBO jakie edytujesz oraz do pliku ['AUTHORS.txt'](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) dodając także swój adres e-mail. Używaj naszego [Issue Tracker-a](https://github.com/acemod/ACE3/issues) aby zgłaszać bugi, proponować nowe funkcje lub sugerować zmiany do aktualnie istniejących. Zobacz także: -- [Jak zgłosić bug-a](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) -- [Jak zgłosić feature request-a](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [Jak zgłosić bug-a](https://ace3mod.com/wiki/user/how-to-report-an-issue.html) +- [Jak zgłosić feature request-a](https://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) #### Testowanie i budowanie Aby pomóc nam w testowaniu najnowszych zmian rozwojowych, pobierz nasz master branch ([bezpośrednio](https://github.com/acemod/ACE3/archive/master.zip), lub [korzystając z git](https://help.github.com/articles/fetching-a-remote/)), a następnie złóż testowego build-a: -- [Konfiguracja środowiska do testów](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE3 do celów testowych. +- [Konfiguracja środowiska do testów](https://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – intrukcja krok-po-kroku jak poprawnie ustawić i zbudować wersję ACE3 do celów testowych. diff --git a/docs/_config.yml b/docs/_config.yml index 022318e30f..81a93be7d3 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,10 +1,8 @@ -#baseurl: /ACE3 - name: ACE3 description: ACE3 is a joint effort by the teams behind ACE 2, AGM and CSE to improve the realism and authenticity of Arma 3. keywords: Advanced Combat Enhancement 3, ACE, ACE3, Arma, Arma 3, Mod, Modification, Realism, AGM, CSE, Bohemia, Interactive -productionUrl: http://ace3mod.com +productionUrl: https://ace3mod.com ace: githubUrl: https://github.com/acemod/ACE3 diff --git a/docs/_includes/_footer.html b/docs/_includes/_footer.html index d391330c6e..5eae052ce6 100644 --- a/docs/_includes/_footer.html +++ b/docs/_includes/_footer.html @@ -18,7 +18,7 @@ - + diff --git a/docs/_includes/_header.html b/docs/_includes/_header.html index 8737b505ae..2077386ecb 100644 --- a/docs/_includes/_header.html +++ b/docs/_includes/_header.html @@ -8,7 +8,7 @@ - + diff --git a/docs/_posts/2015-07-30-ace3-version320.md b/docs/_posts/2015-07-30-ace3-version320.md index 8abb849250..850717f47c 100644 --- a/docs/_posts/2015-07-30-ace3-version320.md +++ b/docs/_posts/2015-07-30-ace3-version320.md @@ -29,7 +29,7 @@ While porting some of ACE 2's AGM's and CSE's features we've ported some of the Fixing errors we were additionally working on further optimizing existing code and we've managed to achieve a big performance boost in our wind deflection code. -Furthermore a problem with vanilla damage being applied to some units has been fixed. If you still encounter this issue please report it following this guideline: http://ace3mod.com/wiki/user/how-to-report-an-issue.html +Furthermore a problem with vanilla damage being applied to some units has been fixed. If you still encounter this issue please report it following this guideline: {{ site.baseurl }}/wiki/user/how-to-report-an-issue.html ### The Shiny Things diff --git a/docs/_posts/2015-09-17-ace3-version331.md b/docs/_posts/2015-09-17-ace3-version331.md index 13d6435d90..2a4fbb46fe 100644 --- a/docs/_posts/2015-09-17-ace3-version331.md +++ b/docs/_posts/2015-09-17-ace3-version331.md @@ -72,4 +72,4 @@ https://github.com/acemod/ACE3/releases/tag/v3.3.0 With the changes of 3.3.1 which can be found here: https://github.com/acemod/ACE3/releases/tag/v3.3.1 (Be sure to download v3.3.1) -If you want to chat with fellow ACE3 users or with a dev feel free to join our public slack chat. Registration is free and open for everyone: http://slackin.ace3mod.com/ +If you want to chat with fellow ACE3 users or with a dev feel free to join our public slack chat. Registration is free and open for everyone: https://slackin.ace3mod.com/ diff --git a/docs/_posts/2015-12-03-ace3-version340.md b/docs/_posts/2015-12-03-ace3-version340.md index ddaf1bd890..1382663470 100644 --- a/docs/_posts/2015-12-03-ace3-version340.md +++ b/docs/_posts/2015-12-03-ace3-version340.md @@ -62,4 +62,4 @@ The complete change log of 3.4.0 can be found at: https://github.com/acemod/ACE3 And most important: If you want to chat with fellow ACE3 users or with a dev, if you have an idea or are in need of help feel free to join our public slack chat. -Registration is open for everyone: http://slackin.ace3mod.com/ +Registration is open for everyone: https://slackin.ace3mod.com/ diff --git a/docs/_posts/2016-03-02-ace3-version350.md b/docs/_posts/2016-03-02-ace3-version350.md index 668e0adee5..a6b6b89d8c 100644 --- a/docs/_posts/2016-03-02-ace3-version350.md +++ b/docs/_posts/2016-03-02-ace3-version350.md @@ -82,4 +82,4 @@ Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_nam **And most important:** If you want to chat with fellow ACE3 users or with a dev, if you have an idea or are in need of help feel free to join our public slack chat. -**Registration is open for everyone: [http://slackin.ace3mod.com/](http://slackin.ace3mod.com/)** +**Registration is open for everyone: [https://slackin.ace3mod.com/](https://slackin.ace3mod.com/)** diff --git a/docs/_posts/2016-06-21-moving-ace3-frameworks-to-cba.md b/docs/_posts/2016-06-21-moving-ace3-frameworks-to-cba.md index 1e7ccc8a1b..e5effd04b2 100644 --- a/docs/_posts/2016-06-21-moving-ace3-frameworks-to-cba.md +++ b/docs/_posts/2016-06-21-moving-ace3-frameworks-to-cba.md @@ -66,7 +66,7 @@ This update does not mean that if your mod depends on any of this functionality ### Replacing deprecated functionality -It is recommended to replace any functionality that is deprecated with its replacement as soon as possible. If you are in need of any help with moving from deprecated ACE3 functionality to it's replacement, please visit our [Public Slack team at http://slackin.ace3mod.com](http://slackin.ace3mod.com){:target="_blank"}. +It is recommended to replace any functionality that is deprecated with its replacement as soon as possible. If you are in need of any help with moving from deprecated ACE3 functionality to it's replacement, please visit our [Public Slack team at https://slackin.ace3mod.com](https://slackin.ace3mod.com){:target="_blank"}. ## ACE3 Events @@ -77,4 +77,4 @@ Any code currently using the old ACE3 event functions will still function correc --- -We hope you like the new frameworks made publicly available in CBA A3 and without needing a dependency on ACE3. Feel free to leave your feedback either on the [CBA BI forum thread](https://forums.bistudio.com/topic/168277-cba-community-base-addons-arma-3/){:target="_blank"}, the [ACE3 BI forum thread](https://forums.bistudio.com/topic/181341-ace3-a-collaborative-merger-between-agm-cse-and-ace/){:target="_blank"} or in our [public chat](http://slackin.ace3mod.com){:target="_blank"}. +We hope you like the new frameworks made publicly available in CBA A3 and without needing a dependency on ACE3. Feel free to leave your feedback either on the [CBA BI forum thread](https://forums.bistudio.com/topic/168277-cba-community-base-addons-arma-3/){:target="_blank"}, the [ACE3 BI forum thread](https://forums.bistudio.com/topic/181341-ace3-a-collaborative-merger-between-agm-cse-and-ace/){:target="_blank"} or in our [public chat](https://slackin.ace3mod.com){:target="_blank"}. diff --git a/docs/_posts/2016-06-30-ace3-version360.md b/docs/_posts/2016-06-30-ace3-version360.md index 3471d85b3a..c8e4ed9a20 100644 --- a/docs/_posts/2016-06-30-ace3-version360.md +++ b/docs/_posts/2016-06-30-ace3-version360.md @@ -100,6 +100,6 @@ The full changelog for ACE3 v3.6.0 can be found here: [https://github.com/acemod We are still in need for translations for some languages within the ACE3 project. Please have a look at [this github issue to track the progress and what languages lack translations](https://github.com/acemod/ACE3/issues/367){:target="_blank"}. Any and all help with this is appreciated. And most finally, we would like to invite you to our ACE3 public Slack chat. Here you can chat with fellow ACE3 users and developers, ask questions and receive help. -Registration is open for everyone: [http://slackin.ace3mod.com](http://slackin.ace3mod.com){:target="_blank"}. +Registration is open for everyone: [https://slackin.ace3mod.com](https://slackin.ace3mod.com){:target="_blank"}. Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} and to [like our facebook page](https://www.facebook.com/ACE3Mod/){:target="_blank"}. diff --git a/docs/_posts/2016-09-17-ace3-version370.md b/docs/_posts/2016-09-17-ace3-version370.md index 44ce8a956c..bd25b4c0fd 100644 --- a/docs/_posts/2016-09-17-ace3-version370.md +++ b/docs/_posts/2016-09-17-ace3-version370.md @@ -66,11 +66,11 @@ We are still in need for translations for some languages within the ACE3 project

- Slack Monochrome black logo + Slack Monochrome black logo
And most finally, we would like to invite you to our ACE3 public Slack chat. Here you can chat with fellow ACE3 users and developers, ask questions and receive help. -Registration is open for everyone: [http://slackin.ace3mod.com](http://slackin.ace3mod.com){:target="_blank"}. +Registration is open for everyone: [https://slackin.ace3mod.com](https://slackin.ace3mod.com){:target="_blank"}. Make sure to [follow us on twitter](https://twitter.com/intent/follow?screen_name=ace3mod&tw_p=followbutton){:target="_blank"} and to [like our facebook page](https://www.facebook.com/ACE3Mod/){:target="_blank"}. diff --git a/docs/_posts/2016-11-04-ace3-version381.md b/docs/_posts/2016-11-04-ace3-version381.md index 8b9a448db3..0ba73a5c2d 100644 --- a/docs/_posts/2016-11-04-ace3-version381.md +++ b/docs/_posts/2016-11-04-ace3-version381.md @@ -15,7 +15,7 @@ A big shoutout to those who helped testing! Thank you. We've used this approach for 3.8.0 as well and hope that again most of the bugs have been fixed already and that you can enjoy ACE3 without annoying interruptions. -We will keep this approach for the future and invite you to join to test the release candidates. All information will be posted in our public chat to which you're invited too. You can access it here: [http://slackin.ace3mod.com](http://slackin.ace3mod.com){:target="_blank"} +We will keep this approach for the future and invite you to join to test the release candidates. All information will be posted in our public chat to which you're invited too. You can access it here: [https://slackin.ace3mod.com](https://slackin.ace3mod.com){:target="_blank"} So, why didn't we release any minor releases for 3.7.0 (e.g. 3.7.1)? In short: We didn't feel that it was necessary. During and directly after the release we had already added new and awesome features so that we had to do a major release. diff --git a/docs/index.html b/docs/index.html index 3bc84a2b03..77fe339a39 100644 --- a/docs/index.html +++ b/docs/index.html @@ -85,7 +85,7 @@ sitemap: and more.

-

ACE3 Public Chat
+

ACE3 Public Chat
Join our public chat! We're glad to answer questions concerning ACE3, development or Arma things.
If you made something with this mod (screen shots, artwork, videos) we'd love to see it.

diff --git a/docs/wiki/development/coding-guidelines.md b/docs/wiki/development/coding-guidelines.md index 2d87063403..b4f844a8e4 100644 --- a/docs/wiki/development/coding-guidelines.md +++ b/docs/wiki/development/coding-guidelines.md @@ -62,7 +62,7 @@ class ACE_Settings { All text that shall be displayed to a user shall be defined in a `stringtable.xml` file for multi-language support. - There shall be no empty stringtable language values. -- All stringtables shall follow the format as specified by [Tabler](https://github.com/bux578/tabler){:target="_blank"} and the [translation guidelines](http://ace3mod.com/wiki/development/how-to-translate-ace3.html){:target="_blank"} form. +- All stringtables shall follow the format as specified by [Tabler](https://github.com/bux/tabler){:target="_blank"} and the [translation guidelines]({{ site.baseurl }}/wiki/development/how-to-translate-ace3.html) form. ## 2. Macro Usage diff --git a/docs/wiki/feature/rangecard.md b/docs/wiki/feature/rangecard.md index 81fa3a466e..708d59261c 100644 --- a/docs/wiki/feature/rangecard.md +++ b/docs/wiki/feature/rangecard.md @@ -30,7 +30,7 @@ Add a range card that updates itself for your weapon and the type of ammo you're - Open your rangetable and look under the `Target range` column. -- Move to the `Bullet Drop` column, the drop is in MRADs, you need to compensate for it by adjusting your sight. Example, you want to adjust for a bullet drop of -7.9 MRADs simply adjust your scope 7.9 MRADs vertically. (check [feature scopes](http://ace3mod.com/wiki/feature/scopes.html) ) for this. +- Move to the `Bullet Drop` column, the drop is in MRADs, you need to compensate for it by adjusting your sight. Example, you want to adjust for a bullet drop of -7.9 MRADs simply adjust your scope 7.9 MRADs vertically. (check [feature scopes]({{ site.baseurl }}/wiki/feature/scopes.html) ) for this. ## 3. Dependencies diff --git a/docs/wiki/user/information-center.md b/docs/wiki/user/information-center.md index 1d76020fb6..fa6077ee3e 100644 --- a/docs/wiki/user/information-center.md +++ b/docs/wiki/user/information-center.md @@ -10,13 +10,10 @@ parent: wiki Downloaded ACE3 and have no idea where to start? This page serves as a starting point to help new players and mission makers understand what's available to them. **Q:** Don't know where to begin your ACE3 journey? -**A:** [**Check out ACE3 features**](http://ace3mod.com/wiki/feature/) - -**Q:** Are you a mission maker but don't know yet what ACE3 has to offer? -**A:** [**We have a wiki section just for you**](http://ace3mod.com/wiki/missionmaker/) +**A:** [**Check out ACE3 features**]({{ site.baseurl }}/wiki/feature/) **Q:** Looking for information on ACE3 class names? -**A:** [**Here they are**](http://ace3mod.com/wiki/missionmaker/class-names.html) +**A:** [**Here they are**]({{ site.baseurl }}/wiki/class-names.html) ## 1. FAQ From d65ffb82f7c21adc060fbb3d2050cc90b55dcd3b Mon Sep 17 00:00:00 2001 From: bux Date: Tue, 27 Dec 2016 09:14:10 +0100 Subject: [PATCH 270/826] use https in PR tempalte --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 2dbbc268af..69565c700e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -2,4 +2,4 @@ - Describe what this pull request will do - Each change in a separate line - Include documentation if applicable -- Respect the [Development Guidelines](http://ace3mod.com/wiki/development/) +- Respect the [Development Guidelines](https://ace3mod.com/wiki/development/) From 2da04846c8e6bfd685979251f71874c1fbe91876 Mon Sep 17 00:00:00 2001 From: bux Date: Tue, 27 Dec 2016 09:36:18 +0100 Subject: [PATCH 271/826] add web app manifest --- docs/_includes/_header.html | 4 ++- docs/img/icons/icon-128x128.png | Bin 0 -> 1276 bytes docs/img/icons/icon-144x144.png | Bin 0 -> 1307 bytes docs/img/icons/icon-256x256.png | Bin 0 -> 1631 bytes docs/img/icons/icon-384x384.png | Bin 0 -> 2142 bytes docs/img/icons/icon-48x48.png | Bin 0 -> 1057 bytes docs/img/icons/icon-512x512.png | Bin 0 -> 2806 bytes docs/img/icons/icon-96x96.png | Bin 0 -> 1205 bytes docs/manifest.json | 42 ++++++++++++++++++++++++++++++++ 9 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 docs/img/icons/icon-128x128.png create mode 100644 docs/img/icons/icon-144x144.png create mode 100644 docs/img/icons/icon-256x256.png create mode 100644 docs/img/icons/icon-384x384.png create mode 100644 docs/img/icons/icon-48x48.png create mode 100644 docs/img/icons/icon-512x512.png create mode 100644 docs/img/icons/icon-96x96.png create mode 100644 docs/manifest.json diff --git a/docs/_includes/_header.html b/docs/_includes/_header.html index 8737b505ae..febd7e921c 100644 --- a/docs/_includes/_header.html +++ b/docs/_includes/_header.html @@ -19,9 +19,11 @@ - + + + diff --git a/docs/img/icons/icon-128x128.png b/docs/img/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..611f8d1a5c32657c45b4c0b557d181011f62d743 GIT binary patch literal 1276 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#)w?G{Iz=0WwQ z;C71>PQCg-$LNEi7AdM>LcsI`V!{(HkONQpsd>QkUIa|o8#o(ZGcYjbdAc};RNQ)V zXCvn!2Z@G2{}?5)X&bkmVrXKHxV5uk!DNf3>LZG4Vh@-;;(f4G;PA{l)dDQ6%>QdA zh#YTS_d0EgHirYlG6e>f1_l8JCIz^_0vzym~i*As9mkS`K(Qx=t|(~ zFK>SF^KFt%r0GX1p4!Pzrfm>tQa!O^?ds$|JN~}4q{ z9h-brE1TisVW|ohBqzYlhiEo1sbP0l+XkK DcR+#i literal 0 HcmV?d00001 diff --git a/docs/img/icons/icon-144x144.png b/docs/img/icons/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..e56c7c1f65b1324cf80c26ea5a8ad6bf4e82b69f GIT binary patch literal 1307 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q4M;wBd$a>cNtU=qlmzFem6RtIr7}3Cer{{GxPyLrY6bkQqisxQ#zd*q`*i1pgH!(Rg4gi&u1T;f0Gc(1?+}X(0#LUFP*~Hk$(9qS)(%jI<$O*z4)y7*cWT z&7F;$ha5y29?s!dC$M!xcXGteM&=!pgm<{-#2ogMzTUCDfm4F>{g>Yg5iC4=ek*GB zdB>#eEBK%2;=1zl))}7~_s)J5>@{tPLhj~0&*tCV{{Q;2sv2gX zJ#gg+d!SBWdVM$KzS-%;f}%_LL<7pUsa3RMaTm}cm>XOYoU0f4yM;_~-ghn7?tP87am`&Rn7nep00i_>zopr03gGWlmGw# literal 0 HcmV?d00001 diff --git a/docs/img/icons/icon-256x256.png b/docs/img/icons/icon-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..5e6e534e05ad2676a91dc6d0e61c3cc8b2373f7d GIT binary patch literal 1631 zcmb_bTWAzl7(Q!a5>f*S;+4qhC}JVIbJ^KRcF5{(W)fX-LfCBUimB{m<|G-CnKPX^ zad!iy)(6EG5ijUN1VseVQm6r;6w**=L8PEq=Gk}OGte>< z%-)#BX|95XtX*Rs>K*IO8e_vo++=oahwVj~3fPF~uxO7szFbT&WnG!#z|1nR>_UbU z%uG@_tp_UDLogPJh7FGAp(I6kF(yfT3lunBU^)6pVP2GDk}R~s*~8Fio;e_A)UMfB z^p#+S2ytbWEffloLNtQCL6(ol@4l@$-^1bbPGM=D+H8NvknL)e8%uLQSgx?wqi;iED`)8w?{6WuXTT1_xiBVt*m z+^Ptjq9lrn7!`QFQ;N6pLPtvC+XO`t6*X1is@NE{kwYq6bB-HZlp8FA?b669@~nf% z?DDV;%SFr90=Ygpqh z?z=}9yKeu54gi+jNvo-B@vrH--!%QetxVpj-M3myuCHr|DJPDHaz{U0x3wkpK~1v$ zH*sst?FWsI?w{&A;9sAdmLKr{KK4CasKyfBcsp1xN&y>)8(K6 zKyZkrSO)W8)%IRs>RIOD-@iO*m~I>Y{0~6xzP!~8uTI+cC+A|kmtNKR^~^4v-hJfX z8>M~CU;f-tpXUnoQ)`#jp*K34H)$C^(K5L4Ps?TeSuSJK|5?V=xyvUnPTFfe*_r?K zc4%Guz0mXJOPX);tp&-qJQ<$|A6h$q#MO@eXYlchRe6y4cH>0J`Vj+q(w*Jv*B$x8 FuK@a2hd=-T literal 0 HcmV?d00001 diff --git a/docs/img/icons/icon-384x384.png b/docs/img/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..004a24c094f9708aaf5b020fab8c5e1628037e49 GIT binary patch literal 2142 zcmeAS@N?(olHy`uVBq!ia0y~yU~B+k4mP03lH*(V11ZT8*NBqf{Irtt#G+IN$CUh} zR0Yr6#Prml)Wnp^!jq{s3=GUFnIRD+5xzcF$@#f@i6Aw46}bgK-3$yi_7w$*$=RtT z3Q4KynR&KK?|1K4QpilPRSGxtHSjHPPR+>ls47YguJQ{>uF6ifOi{A8Q?RM90veE; zT9T+xk(-lOY*k^a1UAKTB%1XJkii(hGOE?jkSNl+@ny;uz{4yi0i z)elN7&Mz%W21Z<(GRUd|E9aur#FG4?ko^1{SSSW$Pw~m=kK>`7$UlFmNz1FflYRkj12`b{)6e${W8w2hR|Bu()YW6p=lXD|SlxTDcUy$2(kY}FV9fXM_{7Be_7fS6X{(Q;x=0JFuqJ%V3Tm+1!Ni2B3P}TT zOp3J&VgTe~DWM4f)-A8M literal 0 HcmV?d00001 diff --git a/docs/img/icons/icon-48x48.png b/docs/img/icons/icon-48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..2eaecef162618b3db29fee8dcdeaa2108ec0d6d4 GIT binary patch literal 1057 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 G+uk4ew0CC! literal 0 HcmV?d00001 diff --git a/docs/manifest.json b/docs/manifest.json new file mode 100644 index 0000000000..2176c0d51f --- /dev/null +++ b/docs/manifest.json @@ -0,0 +1,42 @@ +{ + "name": "ACE3MOD", + "short_name": "ACE3", + "icons": [{ + "src": "/img/icons/icon-48x48.png", + "sizes": "48x48", + "type": "image/png" + }, { + "src": "/img/icons/icon-96x96.png", + "sizes": "96x96", + "type": "image/png" + }, { + "src": "/img/icons/icon-128x128.png", + "sizes": "128x128", + "type": "image/png" + }, { + "src": "/img/icons/icon-144x144.png", + "sizes": "144x144", + "type": "image/png" + }, { + "src": "/img/icons/icon-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, { + "src": "/img/icons/icon-256x256.png", + "sizes": "256x256", + "type": "image/png" + }, { + "src": "/img/icons/icon-384x384.png", + "sizes": "384x384", + "type": "image/png" + }, { + "src": "/img/icons/icon-512x512.png", + "sizes": "512x512", + "type": "image/png" + }], + "start_url": "/index.html", + "display": "browser", + "background_color": "#FFFFFF", + "theme_color": "#951e14", + "lang": "en-US" +} \ No newline at end of file From 427d910450a47392c051ae6c7b0f5df9368206f4 Mon Sep 17 00:00:00 2001 From: bux Date: Wed, 28 Dec 2016 08:53:05 +0100 Subject: [PATCH 272/826] add some rel="noopener" to external links --- docs/_includes/_footer.html | 14 +++++++------- docs/index.html | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/_includes/_footer.html b/docs/_includes/_footer.html index 5eae052ce6..8763b6c35a 100644 --- a/docs/_includes/_footer.html +++ b/docs/_includes/_footer.html @@ -3,20 +3,20 @@

ACE3

ACE3 is a joint effort by the teams behind ACE2, AGM and CSE to improve the realism and authenticity of Arma 3.

-

If you want to contribute something to ACE3, simply fork the GitHub repository and submit your pull requests for review.

+

If you want to contribute something to ACE3, simply fork the GitHub repository and submit your pull requests for review.

Issues / Feedback

-

Issues, feature requests and feedback are welcome at the ACE3 GitHub issue tracker.

-

Before reporting an issue, please read the wiki entry "How to report an issue".

-

We have created a single issue for feature requests.

+

Issues, feature requests and feedback are welcome at the ACE3 GitHub issue tracker.

+

Before reporting an issue, please read the wiki entry "How to report an issue".

+

We have created a single issue for feature requests.

Social Media

diff --git a/docs/index.html b/docs/index.html index 77fe339a39..13bbd53fc1 100644 --- a/docs/index.html +++ b/docs/index.html @@ -8,7 +8,7 @@ sitemap: exclude: "yes" --- -Fork me on GitHub +Fork me on GitHub @@ -64,7 +64,7 @@ sitemap:

Useful frameworks and features

@@ -81,11 +81,11 @@ sitemap:
Everything you need to know about using the mod or developing for it.

-

ACE3 on Github
Latest code, issue reports, feature requests +

ACE3 on Github
Latest code, issue reports, feature requests and more.

-

ACE3 Public Chat
+

ACE3 Public Chat
Join our public chat! We're glad to answer questions concerning ACE3, development or Arma things.
If you made something with this mod (screen shots, artwork, videos) we'd love to see it.

From 33c19f13ae468e532f19119e1879c769769c0e8d Mon Sep 17 00:00:00 2001 From: bux Date: Wed, 28 Dec 2016 09:08:59 +0100 Subject: [PATCH 273/826] add missing manifest meta tag --- docs/_includes/_header.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/_includes/_header.html b/docs/_includes/_header.html index dad21baf8c..84bcab8d2e 100644 --- a/docs/_includes/_header.html +++ b/docs/_includes/_header.html @@ -21,7 +21,8 @@ - + + From f0ebc8ac7425fbaec8346602601dd51a991d1153 Mon Sep 17 00:00:00 2001 From: bux Date: Wed, 28 Dec 2016 09:23:08 +0100 Subject: [PATCH 274/826] update tools --- docs/css/app.css | 2 +- docs/js/footer.dev.js | 3732 ++++++++++++----- docs/js/footer.min.js | 12 +- docs/js/footer.min.js.map | 2 +- docs/src/js/components/contentSearch.js | 4 - docs/src/js/vendor/picturefill/picturefill.js | 2107 +++++++--- docs/src/js/vendor/slick/slick.js | 1621 +++++-- docs/src/package.json | 14 +- docs/src/scss/vendor/_slick-theme.scss | 2 +- 9 files changed, 5338 insertions(+), 2158 deletions(-) mode change 100644 => 100755 docs/src/js/vendor/slick/slick.js diff --git a/docs/css/app.css b/docs/css/app.css index e0c9415d19..6621799c85 100644 --- a/docs/css/app.css +++ b/docs/css/app.css @@ -1,4 +1,4 @@ -/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}meta.foundation-version{font-family:"/5.5.1/"}meta.foundation-mq-small{font-family:"/only screen/";width:0em}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0em}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#222;padding:0;margin:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.5;position:relative;cursor:auto}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}[class*="block-grid-"]{display:block;padding:0;margin:0 -.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;height:auto;float:left;padding:0 .625rem 1.25rem}@media only screen{.small-block-grid-1>li{width:100%;list-style:none}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{width:50%;list-style:none}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{width:33.3333333333%;list-style:none}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{width:25%;list-style:none}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{width:20%;list-style:none}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{width:16.6666666667%;list-style:none}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{width:14.2857142857%;list-style:none}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{width:12.5%;list-style:none}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{width:11.1111111111%;list-style:none}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{width:10%;list-style:none}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{width:9.0909090909%;list-style:none}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{width:8.3333333333%;list-style:none}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.0625em){.medium-block-grid-1>li{width:100%;list-style:none}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{width:50%;list-style:none}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{width:33.3333333333%;list-style:none}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{width:25%;list-style:none}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{width:20%;list-style:none}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{width:16.6666666667%;list-style:none}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{width:14.2857142857%;list-style:none}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{width:12.5%;list-style:none}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{width:11.1111111111%;list-style:none}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{width:10%;list-style:none}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{width:9.0909090909%;list-style:none}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{width:8.3333333333%;list-style:none}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.0625em){.large-block-grid-1>li{width:100%;list-style:none}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{width:50%;list-style:none}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{width:33.3333333333%;list-style:none}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{width:25%;list-style:none}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{width:20%;list-style:none}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{width:16.6666666667%;list-style:none}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{width:14.2857142857%;list-style:none}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{width:12.5%;list-style:none}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{width:11.1111111111%;list-style:none}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{width:10%;list-style:none}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{width:9.0909090909%;list-style:none}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{width:8.3333333333%;list-style:none}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}button,.button{border-style:solid;border-width:0;cursor:pointer;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:normal;margin:0 0 1.25rem;position:relative;text-decoration:none;text-align:center;-webkit-appearance:none;-moz-appearance:none;border-radius:0;display:inline-block;padding-top:1rem;padding-right:2rem;padding-bottom:1.0625rem;padding-left:2rem;font-size:1rem;background-color:#ba2619;border-color:#951e14;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#951e14}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding-top:1.125rem;padding-right:2.25rem;padding-bottom:1.1875rem;padding-left:2.25rem;font-size:1.25rem}button.small,.button.small{padding-top:.875rem;padding-right:1.75rem;padding-bottom:.9375rem;padding-left:1.75rem;font-size:.8125rem}button.tiny,.button.tiny{padding-top:.625rem;padding-right:1.25rem;padding-bottom:.6875rem;padding-left:1.25rem;font-size:.6875rem}button.expand,.button.expand{padding-right:0;padding-left:0;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:.75rem}button.right-align,.button.right-align{text-align:right;padding-right:.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#ba2619;border-color:#951e14;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#951e14}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#ba2619}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;cursor:default;opacity:.7;box-shadow:none}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43AC6A;border-color:#368a55;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43AC6A}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;cursor:default;opacity:.7;box-shadow:none}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.0625em){button,.button{display:inline-block}}.clearing-thumbs,[data-clearing]{margin-bottom:0;margin-left:0;list-style:none}.clearing-thumbs:before,.clearing-thumbs:after,[data-clearing]:before,[data-clearing]:after{content:" ";display:table}.clearing-thumbs:after,[data-clearing]:after{clear:both}.clearing-thumbs li,[data-clearing] li{float:left;margin-right:10px}.clearing-thumbs[class*="block-grid-"] li,[data-clearing][class*="block-grid-"] li{margin-right:0}.clearing-blackout{background:#333;position:fixed;width:100%;height:100%;top:0;left:0;z-index:998}.clearing-blackout .clearing-close{display:block}.clearing-container{position:relative;z-index:998;height:100%;overflow:hidden;margin:0}.clearing-touch-label{position:absolute;top:50%;left:50%;color:#aaa;font-size:0.6em}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;transform:translateY(-50%) translateX(-50%);-webkit-transform:translateY(-50%) translateX(-50%);-ms-transform:translateY(-50%) translateX(-50%);max-height:100%;max-width:100%}.clearing-caption{color:#ccc;font-size:.875em;line-height:1.3;margin-bottom:0;text-align:center;bottom:0;background:#333;width:100%;padding:10px 30px 20px;position:absolute;left:0}.clearing-close{z-index:999;padding-left:20px;padding-top:10px;font-size:30px;line-height:1;color:#ccc;display:none}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 40.0625em){.clearing-main-prev,.clearing-main-next{position:absolute;height:100%;width:40px;top:0}.clearing-main-prev>span,.clearing-main-next>span{position:absolute;top:50%;display:block;width:0;height:0;border:solid 12px}.clearing-main-prev>span:hover,.clearing-main-next>span:hover{opacity:0.8}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#ccc}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#ccc}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:0.3}.clearing-assembled .clearing-container .carousel{background:rgba(51,51,51,0.8);height:120px;margin-top:10px;text-align:center}.clearing-assembled .clearing-container .carousel>ul{display:inline-block;z-index:999;height:100%;position:relative;float:none}.clearing-assembled .clearing-container .carousel>ul li{display:block;width:120px;min-height:inherit;float:left;overflow:hidden;margin-right:0;padding:0;position:relative;cursor:pointer;opacity:0.4;clear:none}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .carousel>ul li:hover{opacity:0.8}.clearing-assembled .clearing-container .visible-img{background:#333;overflow:hidden;height:85%}.clearing-close{position:absolute;top:10px;right:20px;padding-left:0;padding-top:0}}form{margin:0 0 1rem}form .row .row{margin:0 -.5rem}form .row .row .column,form .row .row .columns{padding:0 .5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:.5rem}label{font-size:.875rem;color:#4d4d4d;cursor:pointer;display:block;font-weight:400;line-height:1.5;margin-bottom:0}label.right{float:none !important;text-align:right}label.inline{margin:0 0 1rem 0;padding:.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{display:block;position:relative;z-index:2;text-align:center;width:100%;padding-top:0;padding-bottom:0;border-style:solid;border-width:1px;overflow:visible;font-size:.875rem;height:2.3125rem;line-height:2.3125rem}.postfix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;border-left:none;color:#333;border-color:#ccc}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="week"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],input[type="color"],textarea{-webkit-appearance:none;border-radius:0;background-color:#fff;font-family:inherit;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-size:.875rem;margin:0 0 1rem 0;padding:.5rem;height:2.3125rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:all .15s linear}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input[type="text"]:disabled,input[type="password"]:disabled,input[type="date"]:disabled,input[type="datetime"]:disabled,input[type="datetime-local"]:disabled,input[type="month"]:disabled,input[type="week"]:disabled,input[type="email"]:disabled,input[type="number"]:disabled,input[type="search"]:disabled,input[type="tel"]:disabled,input[type="time"]:disabled,input[type="url"]:disabled,input[type="color"]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[type="text"][disabled],input[type="text"][readonly],fieldset[disabled] input[type="text"],input[type="password"][disabled],input[type="password"][readonly],fieldset[disabled] input[type="password"],input[type="date"][disabled],input[type="date"][readonly],fieldset[disabled] input[type="date"],input[type="datetime"][disabled],input[type="datetime"][readonly],fieldset[disabled] input[type="datetime"],input[type="datetime-local"][disabled],input[type="datetime-local"][readonly],fieldset[disabled] input[type="datetime-local"],input[type="month"][disabled],input[type="month"][readonly],fieldset[disabled] input[type="month"],input[type="week"][disabled],input[type="week"][readonly],fieldset[disabled] input[type="week"],input[type="email"][disabled],input[type="email"][readonly],fieldset[disabled] input[type="email"],input[type="number"][disabled],input[type="number"][readonly],fieldset[disabled] input[type="number"],input[type="search"][disabled],input[type="search"][readonly],fieldset[disabled] input[type="search"],input[type="tel"][disabled],input[type="tel"][readonly],fieldset[disabled] input[type="tel"],input[type="time"][disabled],input[type="time"][readonly],fieldset[disabled] input[type="time"],input[type="url"][disabled],input[type="url"][readonly],fieldset[disabled] input[type="url"],input[type="color"][disabled],input[type="color"][readonly],fieldset[disabled] input[type="color"],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input[type="text"].radius,input[type="password"].radius,input[type="date"].radius,input[type="datetime"].radius,input[type="datetime-local"].radius,input[type="month"].radius,input[type="week"].radius,input[type="email"].radius,input[type="number"].radius,input[type="search"].radius,input[type="tel"].radius,input[type="time"].radius,input[type="url"].radius,input[type="color"].radius,textarea.radius{border-radius:3px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select,form .row .prefix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select,form .row .postfix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select,form .row .prefix-round.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select,form .row .postfix-round.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type="submit"]{-webkit-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}select{-webkit-appearance:none !important;border-radius:0;background-color:#FAFAFA;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;padding:.5rem;font-size:.875rem;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;color:rgba(0,0,0,0.75);line-height:normal;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:3px}select:hover{background-color:#f3f3f3;border-color:#999}select:disabled{background-color:#ddd;cursor:default}select[multiple]{height:auto}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1rem 0}input[type="checkbox"]+label,input[type="radio"]+label{display:inline-block;margin-left:.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type="file"]{width:100%}fieldset{border:1px solid #ddd;padding:1.25rem;margin:1.125rem 0}fieldset legend{font-weight:700;background:#fff;padding:0 .1875rem;margin:0;margin-left:-.1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type="checkbox"],.error input[type="radio"]{margin-bottom:1rem}.error label,.error label.error{color:#f04124}.error small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}.error>label>small{color:#676767;background:transparent;padding:0;text-transform:capitalize;font-style:normal;font-size:60%;margin:0;display:inline}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#f04124}.row{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5rem}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{width:auto;margin-left:-.9375rem;margin-right:-.9375rem;margin-top:0;margin-bottom:0;max-width:none}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{width:auto;margin:0;max-width:none}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:.9375rem;padding-right:.9375rem;width:100%;float:left}[class*="column"]+[class*="column"]:last-child{float:right}[class*="column"]+[class*="column"].end{float:left}@media only screen{.small-push-0{position:relative;left:0%;right:auto}.small-pull-0{position:relative;right:0%;left:auto}.small-push-1{position:relative;left:8.3333333333%;right:auto}.small-pull-1{position:relative;right:8.3333333333%;left:auto}.small-push-2{position:relative;left:16.6666666667%;right:auto}.small-pull-2{position:relative;right:16.6666666667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.3333333333%;right:auto}.small-pull-4{position:relative;right:33.3333333333%;left:auto}.small-push-5{position:relative;left:41.6666666667%;right:auto}.small-pull-5{position:relative;right:41.6666666667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.3333333333%;right:auto}.small-pull-7{position:relative;right:58.3333333333%;left:auto}.small-push-8{position:relative;left:66.6666666667%;right:auto}.small-pull-8{position:relative;right:66.6666666667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.3333333333%;right:auto}.small-pull-10{position:relative;right:83.3333333333%;left:auto}.small-push-11{position:relative;left:91.6666666667%;right:auto}.small-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.small-1{width:8.3333333333%}.small-2{width:16.6666666667%}.small-3{width:25%}.small-4{width:33.3333333333%}.small-5{width:41.6666666667%}.small-6{width:50%}.small-7{width:58.3333333333%}.small-8{width:66.6666666667%}.small-9{width:75%}.small-10{width:83.3333333333%}.small-11{width:91.6666666667%}.small-12{width:100%}.small-offset-0{margin-left:0% !important}.small-offset-1{margin-left:8.3333333333% !important}.small-offset-2{margin-left:16.6666666667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.3333333333% !important}.small-offset-5{margin-left:41.6666666667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.3333333333% !important}.small-offset-8{margin-left:66.6666666667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.3333333333% !important}.small-offset-11{margin-left:91.6666666667% !important}.small-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{margin-left:0;margin-right:0;float:left}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}}@media only screen and (min-width: 40.0625em){.medium-push-0{position:relative;left:0%;right:auto}.medium-pull-0{position:relative;right:0%;left:auto}.medium-push-1{position:relative;left:8.3333333333%;right:auto}.medium-pull-1{position:relative;right:8.3333333333%;left:auto}.medium-push-2{position:relative;left:16.6666666667%;right:auto}.medium-pull-2{position:relative;right:16.6666666667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.3333333333%;right:auto}.medium-pull-4{position:relative;right:33.3333333333%;left:auto}.medium-push-5{position:relative;left:41.6666666667%;right:auto}.medium-pull-5{position:relative;right:41.6666666667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.3333333333%;right:auto}.medium-pull-7{position:relative;right:58.3333333333%;left:auto}.medium-push-8{position:relative;left:66.6666666667%;right:auto}.medium-pull-8{position:relative;right:66.6666666667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.3333333333%;right:auto}.medium-pull-10{position:relative;right:83.3333333333%;left:auto}.medium-push-11{position:relative;left:91.6666666667%;right:auto}.medium-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.medium-1{width:8.3333333333%}.medium-2{width:16.6666666667%}.medium-3{width:25%}.medium-4{width:33.3333333333%}.medium-5{width:41.6666666667%}.medium-6{width:50%}.medium-7{width:58.3333333333%}.medium-8{width:66.6666666667%}.medium-9{width:75%}.medium-10{width:83.3333333333%}.medium-11{width:91.6666666667%}.medium-12{width:100%}.medium-offset-0{margin-left:0% !important}.medium-offset-1{margin-left:8.3333333333% !important}.medium-offset-2{margin-left:16.6666666667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.3333333333% !important}.medium-offset-5{margin-left:41.6666666667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.3333333333% !important}.medium-offset-8{margin-left:66.6666666667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.3333333333% !important}.medium-offset-11{margin-left:91.6666666667% !important}.medium-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{margin-left:0;margin-right:0;float:left}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.3333333333%;right:auto}.pull-1{position:relative;right:8.3333333333%;left:auto}.push-2{position:relative;left:16.6666666667%;right:auto}.pull-2{position:relative;right:16.6666666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.3333333333%;right:auto}.pull-4{position:relative;right:33.3333333333%;left:auto}.push-5{position:relative;left:41.6666666667%;right:auto}.pull-5{position:relative;right:41.6666666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.3333333333%;right:auto}.pull-7{position:relative;right:58.3333333333%;left:auto}.push-8{position:relative;left:66.6666666667%;right:auto}.pull-8{position:relative;right:66.6666666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.3333333333%;right:auto}.pull-10{position:relative;right:83.3333333333%;left:auto}.push-11{position:relative;left:91.6666666667%;right:auto}.pull-11{position:relative;right:91.6666666667%;left:auto}}@media only screen and (min-width: 64.0625em){.large-push-0{position:relative;left:0%;right:auto}.large-pull-0{position:relative;right:0%;left:auto}.large-push-1{position:relative;left:8.3333333333%;right:auto}.large-pull-1{position:relative;right:8.3333333333%;left:auto}.large-push-2{position:relative;left:16.6666666667%;right:auto}.large-pull-2{position:relative;right:16.6666666667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.3333333333%;right:auto}.large-pull-4{position:relative;right:33.3333333333%;left:auto}.large-push-5{position:relative;left:41.6666666667%;right:auto}.large-pull-5{position:relative;right:41.6666666667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.3333333333%;right:auto}.large-pull-7{position:relative;right:58.3333333333%;left:auto}.large-push-8{position:relative;left:66.6666666667%;right:auto}.large-pull-8{position:relative;right:66.6666666667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.3333333333%;right:auto}.large-pull-10{position:relative;right:83.3333333333%;left:auto}.large-push-11{position:relative;left:91.6666666667%;right:auto}.large-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.large-1{width:8.3333333333%}.large-2{width:16.6666666667%}.large-3{width:25%}.large-4{width:33.3333333333%}.large-5{width:41.6666666667%}.large-6{width:50%}.large-7{width:58.3333333333%}.large-8{width:66.6666666667%}.large-9{width:75%}.large-10{width:83.3333333333%}.large-11{width:91.6666666667%}.large-12{width:100%}.large-offset-0{margin-left:0% !important}.large-offset-1{margin-left:8.3333333333% !important}.large-offset-2{margin-left:16.6666666667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.3333333333% !important}.large-offset-5{margin-left:41.6666666667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.3333333333% !important}.large-offset-8{margin-left:66.6666666667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.3333333333% !important}.large-offset-11{margin-left:91.6666666667% !important}.large-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{margin-left:0;margin-right:0;float:left}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.3333333333%;right:auto}.pull-1{position:relative;right:8.3333333333%;left:auto}.push-2{position:relative;left:16.6666666667%;right:auto}.pull-2{position:relative;right:16.6666666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.3333333333%;right:auto}.pull-4{position:relative;right:33.3333333333%;left:auto}.push-5{position:relative;left:41.6666666667%;right:auto}.pull-5{position:relative;right:41.6666666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.3333333333%;right:auto}.pull-7{position:relative;right:58.3333333333%;left:auto}.push-8{position:relative;left:66.6666666667%;right:auto}.pull-8{position:relative;right:66.6666666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.3333333333%;right:auto}.pull-10{position:relative;right:83.3333333333%;left:auto}.push-11{position:relative;left:91.6666666667%;right:auto}.pull-11{position:relative;right:91.6666666667%;left:auto}}.inline-list{margin:0 auto 1.0625rem auto;margin-left:-1.375rem;margin-right:0;padding:0;list-style:none;overflow:hidden}.inline-list>li{list-style:none;float:left;margin-left:1.375rem;display:block}.inline-list>li>*{display:block}.panel{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#f2f2f2;color:#333}.panel>:first-child{margin-top:0}.panel>:last-child{margin-bottom:0}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6,.panel p,.panel li,.panel dl{color:#333}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6{line-height:1;margin-bottom:.625rem}.panel h1.subheader,.panel h2.subheader,.panel h3.subheader,.panel h4.subheader,.panel h5.subheader,.panel h6.subheader{line-height:1.4}.panel.callout{border-style:solid;border-width:1px;border-color:#f6c4bf;margin-bottom:1.25rem;padding:1.25rem;background:#fdf0ef;color:#333}.panel.callout>:first-child{margin-top:0}.panel.callout>:last-child{margin-bottom:0}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6,.panel.callout p,.panel.callout li,.panel.callout dl{color:#333}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6{line-height:1;margin-bottom:.625rem}.panel.callout h1.subheader,.panel.callout h2.subheader,.panel.callout h3.subheader,.panel.callout h4.subheader,.panel.callout h5.subheader,.panel.callout h6.subheader{line-height:1.4}.panel.callout a:not(.button){color:#ba2619}.panel.callout a:not(.button):hover,.panel.callout a:not(.button):focus{color:#a02116}.panel.radius{border-radius:3px}.side-nav{display:block;margin:0;padding:.875rem 0;list-style-type:none;list-style-position:outside;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li{margin:0 0 .4375rem 0;font-size:.875rem;font-weight:400}.side-nav li a:not(.button){display:block;color:#ba2619;margin:0;padding:.4375rem .875rem}.side-nav li a:not(.button):hover,.side-nav li a:not(.button):focus{background:rgba(0,0,0,0.025);color:#e65346}.side-nav li.active>a:first-child:not(.button){color:#e65346;font-weight:400;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li.divider{border-top:1px solid;height:0;padding:0;list-style:none;border-top-color:#fff}.side-nav li.heading{color:#ba2619;font-size:.875rem;font-weight:bold;text-transform:uppercase}table{background:#fff;margin-bottom:1.25rem;border:solid 1px #ddd;table-layout:auto}table caption{background:transparent;color:#222;font-size:1rem;font-weight:bold}table thead{background:#f5f5f5}table thead tr th,table thead tr td{padding:.5rem .625rem .625rem;font-size:.875rem;font-weight:700;color:#222}table tfoot{background:#f5f5f5}table tfoot tr th,table tfoot tr td{padding:.5rem .625rem .625rem;font-size:.875rem;font-weight:700;color:#222}table tr th,table tr td{padding:.5625rem .625rem;font-size:.875rem;color:#222;text-align:left}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#F9F9F9}table thead tr th,table tfoot tr th,table tfoot tr td,table tbody tr th,table tbody tr td,table tr td{display:table-cell;line-height:1.125rem}.th{line-height:0;display:inline-block;border:solid 4px #fff;max-width:100%;box-shadow:0 0 0 1px rgba(0,0,0,0.2);transition:all 200ms ease-out}.th:hover,.th:focus{box-shadow:0 0 6px 1px rgba(186,38,25,0.5)}.th.radius{border-radius:3px}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{width:100%;left:0;position:fixed;top:0;z-index:99}.fixed.expanded:not(.top-bar){overflow-y:auto;height:auto;width:100%;max-height:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{z-index:98;margin-top:2.8125rem}.top-bar{overflow:hidden;height:2.8125rem;line-height:2.8125rem;position:relative;background:#333;margin-bottom:0}.top-bar ul{margin-bottom:0;list-style:none}.top-bar .row{max-width:none}.top-bar form,.top-bar input{margin-bottom:0}.top-bar input{height:1.75rem;padding-top:.35rem;padding-bottom:.35rem;font-size:.75rem}.top-bar .button,.top-bar button{padding-top:0.4125rem;padding-bottom:0.4125rem;margin-bottom:0;font-size:.75rem}@media only screen and (max-width: 40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{position:relative;margin:0}.top-bar .name{height:2.8125rem;margin:0;font-size:16px}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{line-height:2.8125rem;font-size:1.0625rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{font-weight:400;color:#fff;width:75%;display:block;padding:0 .9375rem}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;text-transform:uppercase;font-size:.8125rem;font-weight:700;position:relative;display:block;padding:0 .9375rem;height:2.8125rem;line-height:2.8125rem}.top-bar .toggle-topbar.menu-icon{top:50%;margin-top:-16px}.top-bar .toggle-topbar.menu-icon a{height:34px;line-height:33px;padding:0 2.5rem 0 .9375rem;color:#fff;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";position:absolute;display:block;height:0;top:50%;margin-top:-8px;right:.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{height:auto;background:transparent}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{padding:0;width:100%;height:auto;display:block;font-size:16px;margin:0}.top-bar-section .divider,.top-bar-section [role="separator"]{border-top:solid 1px #1a1a1a;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{display:block;width:100%;color:#fff;padding:12px 0 12px 0;padding-left:.9375rem;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:.8125rem;font-weight:400;text-transform:none}.top-bar-section ul li>a.button{font-size:.8125rem;padding-right:.9375rem;padding-left:.9375rem;background-color:#ba2619;border-color:#951e14;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#951e14}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#368a55}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>button{font-size:.8125rem;padding-right:.9375rem;padding-left:.9375rem;background-color:#ba2619;border-color:#951e14;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#951e14}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#368a55}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;background:#333;color:#fff}.top-bar-section ul li.active>a{background:#ba2619;color:#fff}.top-bar-section ul li.active>a:hover{background:#a02116;color:#fff}.top-bar-section .has-form{padding:.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:transparent transparent transparent rgba(255,255,255,0.4);border-left-style:solid;margin-right:.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{padding:0;position:absolute;left:100%;top:0;z-index:99;display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .dropdown li{width:100%;height:auto}.top-bar-section .dropdown li a{font-weight:400;padding:8px .9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:400}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:none}.top-bar-section .dropdown li.has-form{padding:8px .9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{padding:8px .9375rem 2px;margin-bottom:0;text-transform:uppercase;color:#777;font-weight:700;font-size:.625rem}.js-generated{display:block}@media only screen and (min-width: 40.0625em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name h5 a,.top-bar .name h6 a{width:auto}.top-bar input,.top-bar .button,.top-bar button{font-size:.875rem;position:relative;height:1.75rem;top:.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{max-width:62.5rem;margin:0 auto;margin-bottom:0}.top-bar-section{transition:none 0 0;left:0 !important}.top-bar-section ul{width:auto;height:auto !important;display:inline}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#333;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){padding:0 .9375rem;line-height:2.8125rem;background:#333}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#333}.top-bar-section li.active:not(.has-form) a:not(.button){padding:0 .9375rem;line-height:2.8125rem;color:#fff;background:#ba2619}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#a02116;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem !important}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:rgba(255,255,255,0.4) transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:1rem;margin-top:-1px;right:5px;line-height:1.2}.top-bar-section .dropdown{left:0;top:auto;background:transparent;min-width:100%}.top-bar-section .dropdown li a{color:#fff;line-height:2.8125rem;white-space:nowrap;padding:12px .9375rem;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){color:#fff;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){color:#fff;background-color:#555;background:#333}.top-bar-section .dropdown li label{white-space:nowrap;background:#333}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role="separator"]{border-bottom:none;border-top:none;border-right:solid 1px #4e4e4e;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;padding:0 .9375rem;height:2.8125rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#333;color:#fff}.no-js .top-bar-section ul li:active>a{background:#ba2619;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em) and (max-width: 99999999em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#ba2619;text-decoration:none;line-height:inherit}a:hover,a:focus{color:#a02116}a img{border:none}p{font-family:inherit;font-weight:400;font-size:1rem;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:.875rem;line-height:1.35;font-style:italic}h1,h2,h3,h4,h5,h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:700;font-style:normal;color:#222;text-rendering:optimizeLegibility;margin-top:.2rem;margin-bottom:.5rem;line-height:1.4}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-size:80%;color:#6f6f6f;line-height:0}h1{font-size:1.5625rem}h2{font-size:1.25rem}h3{font-size:1.0625rem}h4{font-size:.9375rem}h5{font-size:1rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:400;margin-top:.2rem;margin-bottom:.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;margin:1.25rem 0 1.1875rem;height:0}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:700;line-height:inherit}small{font-size:80%;line-height:inherit}code{font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:400;color:#333;background-color:rgba(0,0,0,0.04);border-width:1px;border-style:none;border-color:rgba(0,0,0,0.04);padding:.125rem .3125rem .0625rem}ul,ol,dl{font-size:1rem;line-height:1.6;margin-bottom:1.25rem;list-style-position:outside;font-family:inherit}ul{margin-left:1.1rem}ul.no-bullet{margin-left:0}ul.no-bullet li ul,ul.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ul.no-bullet{list-style:none}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}dl dt{margin-bottom:.3rem;font-weight:700}dl dd{margin-bottom:.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:.625rem .75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:700;font-size:.9375rem}.vevent .summary{font-weight:700}.vevent abbr{cursor:default;text-decoration:none;font-weight:700;border:none;padding:0 .0625rem}@media only screen and (min-width: 40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:1.875rem}h2{font-size:1.5625rem}h3{font-size:1.375rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:1rem}}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.print-only{display:none !important}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}}.slick-slider{position:relative;display:block;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0}.slick-list:focus{outline:none}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-track,.slick-slider .slick-list{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.slick-track{position:relative;left:0;top:0;display:block}.slick-track:before,.slick-track:after{content:"";display:table}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{float:left;height:100%;min-height:1px;display:none}[dir="rtl"] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-loading .slick-list{background:#fff url("../img/ajax-loader.gif") center center no-repeat}.slick-prev,.slick-next{position:absolute;display:block;height:20px;width:20px;line-height:0;font-size:0;cursor:pointer;background:transparent;color:transparent;top:50%;margin-top:-10px;padding:0;border:none;outline:none}.slick-prev:hover,.slick-prev:focus,.slick-next:hover,.slick-next:focus{outline:none;background:transparent;color:transparent}.slick-prev:hover:before,.slick-prev:focus:before,.slick-next:hover:before,.slick-next:focus:before{opacity:1}.slick-prev.slick-disabled:before,.slick-next.slick-disabled:before{opacity:.25}.slick-prev:before,.slick-next:before{font-family:"FontAwesome";font-size:20px;line-height:1;color:#ba2619;opacity:.75;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-prev{left:15px}[dir="rtl"] .slick-prev{left:auto;right:15px}.slick-prev:before{content:""}[dir="rtl"] .slick-prev:before{content:""}.slick-next{right:15px}[dir="rtl"] .slick-next{left:15px;right:auto}.slick-next:before{content:""}[dir="rtl"] .slick-next:before{content:""}.slick-slider{margin-bottom:30px}.slick-dots{margin:0;position:absolute;bottom:15px;list-style:none;display:block;text-align:center;padding:0;width:100%}.slick-dots li{position:relative;display:inline-block;height:20px;width:20px;margin:0 5px;padding:0;cursor:pointer}.slick-dots li button{border:0;background:transparent;display:block;height:20px;width:20px;outline:none;line-height:0;font-size:0;color:transparent;padding:5px;cursor:pointer}.slick-dots li button:hover,.slick-dots li button:focus{outline:none}.slick-dots li button:hover:before,.slick-dots li button:focus:before{opacity:1}.slick-dots li button:before{position:absolute;top:0;left:0;content:"";width:20px;height:20px;font-family:"FontAwesome";font-size:12px;line-height:20px;text-align:center;color:#000;opacity:.25;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-dots li.slick-active button:before{color:#ba2619;opacity:.75}/*! +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}meta.foundation-version{font-family:"/5.5.1/"}meta.foundation-mq-small{font-family:"/only screen/";width:0em}meta.foundation-mq-small-only{font-family:"/only screen and (max-width: 40em)/";width:0em}meta.foundation-mq-medium{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}meta.foundation-mq-medium-only{font-family:"/only screen and (min-width:40.0625em) and (max-width:64em)/";width:40.0625em}meta.foundation-mq-large{font-family:"/only screen and (min-width:64.0625em)/";width:64.0625em}meta.foundation-mq-large-only{font-family:"/only screen and (min-width:64.0625em) and (max-width:90em)/";width:64.0625em}meta.foundation-mq-xlarge{font-family:"/only screen and (min-width:90.0625em)/";width:90.0625em}meta.foundation-mq-xlarge-only{font-family:"/only screen and (min-width:90.0625em) and (max-width:120em)/";width:90.0625em}meta.foundation-mq-xxlarge{font-family:"/only screen and (min-width:120.0625em)/";width:120.0625em}meta.foundation-data-attribute-namespace{font-family:false}html,body{height:100%}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html,body{font-size:100%}body{background:#fff;color:#222;padding:0;margin:0;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;font-style:normal;line-height:1.5;position:relative;cursor:auto}a:hover{cursor:pointer}img{max-width:100%;height:auto}img{-ms-interpolation-mode:bicubic}#map_canvas img,#map_canvas embed,#map_canvas object,.map_canvas img,.map_canvas embed,.map_canvas object{max-width:none !important}.left{float:left !important}.right{float:right !important}.clearfix:before,.clearfix:after{content:" ";display:table}.clearfix:after{clear:both}.hide{display:none}.invisible{visibility:hidden}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}img{display:inline-block;vertical-align:middle}textarea{height:auto;min-height:50px}select{width:100%}[class*="block-grid-"]{display:block;padding:0;margin:0 -.625rem}[class*="block-grid-"]:before,[class*="block-grid-"]:after{content:" ";display:table}[class*="block-grid-"]:after{clear:both}[class*="block-grid-"]>li{display:block;height:auto;float:left;padding:0 .625rem 1.25rem}@media only screen{.small-block-grid-1>li{width:100%;list-style:none}.small-block-grid-1>li:nth-of-type(1n){clear:none}.small-block-grid-1>li:nth-of-type(1n+1){clear:both}.small-block-grid-2>li{width:50%;list-style:none}.small-block-grid-2>li:nth-of-type(1n){clear:none}.small-block-grid-2>li:nth-of-type(2n+1){clear:both}.small-block-grid-3>li{width:33.3333333333%;list-style:none}.small-block-grid-3>li:nth-of-type(1n){clear:none}.small-block-grid-3>li:nth-of-type(3n+1){clear:both}.small-block-grid-4>li{width:25%;list-style:none}.small-block-grid-4>li:nth-of-type(1n){clear:none}.small-block-grid-4>li:nth-of-type(4n+1){clear:both}.small-block-grid-5>li{width:20%;list-style:none}.small-block-grid-5>li:nth-of-type(1n){clear:none}.small-block-grid-5>li:nth-of-type(5n+1){clear:both}.small-block-grid-6>li{width:16.6666666667%;list-style:none}.small-block-grid-6>li:nth-of-type(1n){clear:none}.small-block-grid-6>li:nth-of-type(6n+1){clear:both}.small-block-grid-7>li{width:14.2857142857%;list-style:none}.small-block-grid-7>li:nth-of-type(1n){clear:none}.small-block-grid-7>li:nth-of-type(7n+1){clear:both}.small-block-grid-8>li{width:12.5%;list-style:none}.small-block-grid-8>li:nth-of-type(1n){clear:none}.small-block-grid-8>li:nth-of-type(8n+1){clear:both}.small-block-grid-9>li{width:11.1111111111%;list-style:none}.small-block-grid-9>li:nth-of-type(1n){clear:none}.small-block-grid-9>li:nth-of-type(9n+1){clear:both}.small-block-grid-10>li{width:10%;list-style:none}.small-block-grid-10>li:nth-of-type(1n){clear:none}.small-block-grid-10>li:nth-of-type(10n+1){clear:both}.small-block-grid-11>li{width:9.0909090909%;list-style:none}.small-block-grid-11>li:nth-of-type(1n){clear:none}.small-block-grid-11>li:nth-of-type(11n+1){clear:both}.small-block-grid-12>li{width:8.3333333333%;list-style:none}.small-block-grid-12>li:nth-of-type(1n){clear:none}.small-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 40.0625em){.medium-block-grid-1>li{width:100%;list-style:none}.medium-block-grid-1>li:nth-of-type(1n){clear:none}.medium-block-grid-1>li:nth-of-type(1n+1){clear:both}.medium-block-grid-2>li{width:50%;list-style:none}.medium-block-grid-2>li:nth-of-type(1n){clear:none}.medium-block-grid-2>li:nth-of-type(2n+1){clear:both}.medium-block-grid-3>li{width:33.3333333333%;list-style:none}.medium-block-grid-3>li:nth-of-type(1n){clear:none}.medium-block-grid-3>li:nth-of-type(3n+1){clear:both}.medium-block-grid-4>li{width:25%;list-style:none}.medium-block-grid-4>li:nth-of-type(1n){clear:none}.medium-block-grid-4>li:nth-of-type(4n+1){clear:both}.medium-block-grid-5>li{width:20%;list-style:none}.medium-block-grid-5>li:nth-of-type(1n){clear:none}.medium-block-grid-5>li:nth-of-type(5n+1){clear:both}.medium-block-grid-6>li{width:16.6666666667%;list-style:none}.medium-block-grid-6>li:nth-of-type(1n){clear:none}.medium-block-grid-6>li:nth-of-type(6n+1){clear:both}.medium-block-grid-7>li{width:14.2857142857%;list-style:none}.medium-block-grid-7>li:nth-of-type(1n){clear:none}.medium-block-grid-7>li:nth-of-type(7n+1){clear:both}.medium-block-grid-8>li{width:12.5%;list-style:none}.medium-block-grid-8>li:nth-of-type(1n){clear:none}.medium-block-grid-8>li:nth-of-type(8n+1){clear:both}.medium-block-grid-9>li{width:11.1111111111%;list-style:none}.medium-block-grid-9>li:nth-of-type(1n){clear:none}.medium-block-grid-9>li:nth-of-type(9n+1){clear:both}.medium-block-grid-10>li{width:10%;list-style:none}.medium-block-grid-10>li:nth-of-type(1n){clear:none}.medium-block-grid-10>li:nth-of-type(10n+1){clear:both}.medium-block-grid-11>li{width:9.0909090909%;list-style:none}.medium-block-grid-11>li:nth-of-type(1n){clear:none}.medium-block-grid-11>li:nth-of-type(11n+1){clear:both}.medium-block-grid-12>li{width:8.3333333333%;list-style:none}.medium-block-grid-12>li:nth-of-type(1n){clear:none}.medium-block-grid-12>li:nth-of-type(12n+1){clear:both}}@media only screen and (min-width: 64.0625em){.large-block-grid-1>li{width:100%;list-style:none}.large-block-grid-1>li:nth-of-type(1n){clear:none}.large-block-grid-1>li:nth-of-type(1n+1){clear:both}.large-block-grid-2>li{width:50%;list-style:none}.large-block-grid-2>li:nth-of-type(1n){clear:none}.large-block-grid-2>li:nth-of-type(2n+1){clear:both}.large-block-grid-3>li{width:33.3333333333%;list-style:none}.large-block-grid-3>li:nth-of-type(1n){clear:none}.large-block-grid-3>li:nth-of-type(3n+1){clear:both}.large-block-grid-4>li{width:25%;list-style:none}.large-block-grid-4>li:nth-of-type(1n){clear:none}.large-block-grid-4>li:nth-of-type(4n+1){clear:both}.large-block-grid-5>li{width:20%;list-style:none}.large-block-grid-5>li:nth-of-type(1n){clear:none}.large-block-grid-5>li:nth-of-type(5n+1){clear:both}.large-block-grid-6>li{width:16.6666666667%;list-style:none}.large-block-grid-6>li:nth-of-type(1n){clear:none}.large-block-grid-6>li:nth-of-type(6n+1){clear:both}.large-block-grid-7>li{width:14.2857142857%;list-style:none}.large-block-grid-7>li:nth-of-type(1n){clear:none}.large-block-grid-7>li:nth-of-type(7n+1){clear:both}.large-block-grid-8>li{width:12.5%;list-style:none}.large-block-grid-8>li:nth-of-type(1n){clear:none}.large-block-grid-8>li:nth-of-type(8n+1){clear:both}.large-block-grid-9>li{width:11.1111111111%;list-style:none}.large-block-grid-9>li:nth-of-type(1n){clear:none}.large-block-grid-9>li:nth-of-type(9n+1){clear:both}.large-block-grid-10>li{width:10%;list-style:none}.large-block-grid-10>li:nth-of-type(1n){clear:none}.large-block-grid-10>li:nth-of-type(10n+1){clear:both}.large-block-grid-11>li{width:9.0909090909%;list-style:none}.large-block-grid-11>li:nth-of-type(1n){clear:none}.large-block-grid-11>li:nth-of-type(11n+1){clear:both}.large-block-grid-12>li{width:8.3333333333%;list-style:none}.large-block-grid-12>li:nth-of-type(1n){clear:none}.large-block-grid-12>li:nth-of-type(12n+1){clear:both}}button,.button{border-style:solid;border-width:0;cursor:pointer;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:400;line-height:normal;margin:0 0 1.25rem;position:relative;text-decoration:none;text-align:center;-webkit-appearance:none;-moz-appearance:none;border-radius:0;display:inline-block;padding-top:1rem;padding-right:2rem;padding-bottom:1.0625rem;padding-left:2rem;font-size:1rem;background-color:#ba2619;border-color:#951e14;color:#fff;transition:background-color 300ms ease-out}button:hover,button:focus,.button:hover,.button:focus{background-color:#951e14}button:hover,button:focus,.button:hover,.button:focus{color:#fff}button.secondary,.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{background-color:#b9b9b9}button.secondary:hover,button.secondary:focus,.button.secondary:hover,.button.secondary:focus{color:#333}button.success,.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{background-color:#368a55}button.success:hover,button.success:focus,.button.success:hover,.button.success:focus{color:#fff}button.alert,.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{background-color:#cf2a0e}button.alert:hover,button.alert:focus,.button.alert:hover,.button.alert:focus{color:#fff}button.warning,.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{background-color:#cf6e0e}button.warning:hover,button.warning:focus,.button.warning:hover,.button.warning:focus{color:#fff}button.info,.button.info{background-color:#a0d3e8;border-color:#61b6d9;color:#333}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{background-color:#61b6d9}button.info:hover,button.info:focus,.button.info:hover,.button.info:focus{color:#fff}button.large,.button.large{padding-top:1.125rem;padding-right:2.25rem;padding-bottom:1.1875rem;padding-left:2.25rem;font-size:1.25rem}button.small,.button.small{padding-top:.875rem;padding-right:1.75rem;padding-bottom:.9375rem;padding-left:1.75rem;font-size:.8125rem}button.tiny,.button.tiny{padding-top:.625rem;padding-right:1.25rem;padding-bottom:.6875rem;padding-left:1.25rem;font-size:.6875rem}button.expand,.button.expand{padding-right:0;padding-left:0;width:100%}button.left-align,.button.left-align{text-align:left;text-indent:.75rem}button.right-align,.button.right-align{text-align:right;padding-right:.75rem}button.radius,.button.radius{border-radius:3px}button.round,.button.round{border-radius:1000px}button.disabled,button[disabled],.button.disabled,.button[disabled]{background-color:#ba2619;border-color:#951e14;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#951e14}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{color:#fff}button.disabled:hover,button.disabled:focus,button[disabled]:hover,button[disabled]:focus,.button.disabled:hover,.button.disabled:focus,.button[disabled]:hover,.button[disabled]:focus{background-color:#ba2619}button.disabled.secondary,button[disabled].secondary,.button.disabled.secondary,.button[disabled].secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333;cursor:default;opacity:.7;box-shadow:none}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#b9b9b9}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{color:#333}button.disabled.secondary:hover,button.disabled.secondary:focus,button[disabled].secondary:hover,button[disabled].secondary:focus,.button.disabled.secondary:hover,.button.disabled.secondary:focus,.button[disabled].secondary:hover,.button[disabled].secondary:focus{background-color:#e7e7e7}button.disabled.success,button[disabled].success,.button.disabled.success,.button[disabled].success{background-color:#43AC6A;border-color:#368a55;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#368a55}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{color:#fff}button.disabled.success:hover,button.disabled.success:focus,button[disabled].success:hover,button[disabled].success:focus,.button.disabled.success:hover,.button.disabled.success:focus,.button[disabled].success:hover,.button[disabled].success:focus{background-color:#43AC6A}button.disabled.alert,button[disabled].alert,.button.disabled.alert,.button[disabled].alert{background-color:#f04124;border-color:#cf2a0e;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#cf2a0e}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{color:#fff}button.disabled.alert:hover,button.disabled.alert:focus,button[disabled].alert:hover,button[disabled].alert:focus,.button.disabled.alert:hover,.button.disabled.alert:focus,.button[disabled].alert:hover,.button[disabled].alert:focus{background-color:#f04124}button.disabled.warning,button[disabled].warning,.button.disabled.warning,.button[disabled].warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff;cursor:default;opacity:.7;box-shadow:none}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#cf6e0e}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{color:#fff}button.disabled.warning:hover,button.disabled.warning:focus,button[disabled].warning:hover,button[disabled].warning:focus,.button.disabled.warning:hover,.button.disabled.warning:focus,.button[disabled].warning:hover,.button[disabled].warning:focus{background-color:#f08a24}button.disabled.info,button[disabled].info,.button.disabled.info,.button[disabled].info{background-color:#a0d3e8;border-color:#61b6d9;color:#333;cursor:default;opacity:.7;box-shadow:none}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#61b6d9}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{color:#fff}button.disabled.info:hover,button.disabled.info:focus,button[disabled].info:hover,button[disabled].info:focus,.button.disabled.info:hover,.button.disabled.info:focus,.button[disabled].info:hover,.button[disabled].info:focus{background-color:#a0d3e8}button::-moz-focus-inner{border:0;padding:0}@media only screen and (min-width: 40.0625em){button,.button{display:inline-block}}.clearing-thumbs,[data-clearing]{margin-bottom:0;margin-left:0;list-style:none}.clearing-thumbs:before,.clearing-thumbs:after,[data-clearing]:before,[data-clearing]:after{content:" ";display:table}.clearing-thumbs:after,[data-clearing]:after{clear:both}.clearing-thumbs li,[data-clearing] li{float:left;margin-right:10px}.clearing-thumbs[class*="block-grid-"] li,[data-clearing][class*="block-grid-"] li{margin-right:0}.clearing-blackout{background:#333;position:fixed;width:100%;height:100%;top:0;left:0;z-index:998}.clearing-blackout .clearing-close{display:block}.clearing-container{position:relative;z-index:998;height:100%;overflow:hidden;margin:0}.clearing-touch-label{position:absolute;top:50%;left:50%;color:#aaa;font-size:0.6em}.visible-img{height:95%;position:relative}.visible-img img{position:absolute;left:50%;top:50%;transform:translateY(-50%) translateX(-50%);-webkit-transform:translateY(-50%) translateX(-50%);-ms-transform:translateY(-50%) translateX(-50%);max-height:100%;max-width:100%}.clearing-caption{color:#ccc;font-size:.875em;line-height:1.3;margin-bottom:0;text-align:center;bottom:0;background:#333;width:100%;padding:10px 30px 20px;position:absolute;left:0}.clearing-close{z-index:999;padding-left:20px;padding-top:10px;font-size:30px;line-height:1;color:#ccc;display:none}.clearing-close:hover,.clearing-close:focus{color:#ccc}.clearing-assembled .clearing-container{height:100%}.clearing-assembled .clearing-container .carousel>ul{display:none}.clearing-feature li{display:none}.clearing-feature li.clearing-featured-img{display:block}@media only screen and (min-width: 40.0625em){.clearing-main-prev,.clearing-main-next{position:absolute;height:100%;width:40px;top:0}.clearing-main-prev>span,.clearing-main-next>span{position:absolute;top:50%;display:block;width:0;height:0;border:solid 12px}.clearing-main-prev>span:hover,.clearing-main-next>span:hover{opacity:0.8}.clearing-main-prev{left:0}.clearing-main-prev>span{left:5px;border-color:transparent;border-right-color:#ccc}.clearing-main-next{right:0}.clearing-main-next>span{border-color:transparent;border-left-color:#ccc}.clearing-main-prev.disabled,.clearing-main-next.disabled{opacity:0.3}.clearing-assembled .clearing-container .carousel{background:rgba(51,51,51,0.8);height:120px;margin-top:10px;text-align:center}.clearing-assembled .clearing-container .carousel>ul{display:inline-block;z-index:999;height:100%;position:relative;float:none}.clearing-assembled .clearing-container .carousel>ul li{display:block;width:120px;min-height:inherit;float:left;overflow:hidden;margin-right:0;padding:0;position:relative;cursor:pointer;opacity:0.4;clear:none}.clearing-assembled .clearing-container .carousel>ul li.fix-height img{height:100%;max-width:none}.clearing-assembled .clearing-container .carousel>ul li a.th{border:none;box-shadow:none;display:block}.clearing-assembled .clearing-container .carousel>ul li img{cursor:pointer !important;width:100% !important}.clearing-assembled .clearing-container .carousel>ul li.visible{opacity:1}.clearing-assembled .clearing-container .carousel>ul li:hover{opacity:0.8}.clearing-assembled .clearing-container .visible-img{background:#333;overflow:hidden;height:85%}.clearing-close{position:absolute;top:10px;right:20px;padding-left:0;padding-top:0}}form{margin:0 0 1rem}form .row .row{margin:0 -.5rem}form .row .row .column,form .row .row .columns{padding:0 .5rem}form .row .row.collapse{margin:0}form .row .row.collapse .column,form .row .row.collapse .columns{padding:0}form .row .row.collapse input{-webkit-border-bottom-right-radius:0;-webkit-border-top-right-radius:0;border-bottom-right-radius:0;border-top-right-radius:0}form .row input.column,form .row input.columns,form .row textarea.column,form .row textarea.columns{padding-left:.5rem}label{font-size:.875rem;color:#4d4c4c;cursor:pointer;display:block;font-weight:400;line-height:1.5;margin-bottom:0}label.right{float:none !important;text-align:right}label.inline{margin:0 0 1rem 0;padding:.5625rem 0}label small{text-transform:capitalize;color:#676767}.prefix,.postfix{display:block;position:relative;z-index:2;text-align:center;width:100%;padding-top:0;padding-bottom:0;border-style:solid;border-width:1px;overflow:visible;font-size:.875rem;height:2.3125rem;line-height:2.3125rem}.postfix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button{padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;text-align:center;border:none}.prefix.button.radius{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}.postfix.button.radius{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}.prefix.button.round{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}.postfix.button.round{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}span.prefix,label.prefix{background:#f2f2f2;border-right:none;color:#333;border-color:#ccc}span.postfix,label.postfix{background:#f2f2f2;border-left:none;color:#333;border-color:#ccc}input[type="text"],input[type="password"],input[type="date"],input[type="datetime"],input[type="datetime-local"],input[type="month"],input[type="week"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="time"],input[type="url"],input[type="color"],textarea{-webkit-appearance:none;border-radius:0;background-color:#fff;font-family:inherit;border-style:solid;border-width:1px;border-color:#ccc;box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);color:rgba(0,0,0,0.75);display:block;font-size:.875rem;margin:0 0 1rem 0;padding:.5rem;height:2.3125rem;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;transition:all .15s linear}input[type="text"]:focus,input[type="password"]:focus,input[type="date"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="month"]:focus,input[type="week"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="time"]:focus,input[type="url"]:focus,input[type="color"]:focus,textarea:focus{background:#fafafa;border-color:#999;outline:none}input[type="text"]:disabled,input[type="password"]:disabled,input[type="date"]:disabled,input[type="datetime"]:disabled,input[type="datetime-local"]:disabled,input[type="month"]:disabled,input[type="week"]:disabled,input[type="email"]:disabled,input[type="number"]:disabled,input[type="search"]:disabled,input[type="tel"]:disabled,input[type="time"]:disabled,input[type="url"]:disabled,input[type="color"]:disabled,textarea:disabled{background-color:#ddd;cursor:default}input[type="text"][disabled],input[type="text"][readonly],fieldset[disabled] input[type="text"],input[type="password"][disabled],input[type="password"][readonly],fieldset[disabled] input[type="password"],input[type="date"][disabled],input[type="date"][readonly],fieldset[disabled] input[type="date"],input[type="datetime"][disabled],input[type="datetime"][readonly],fieldset[disabled] input[type="datetime"],input[type="datetime-local"][disabled],input[type="datetime-local"][readonly],fieldset[disabled] input[type="datetime-local"],input[type="month"][disabled],input[type="month"][readonly],fieldset[disabled] input[type="month"],input[type="week"][disabled],input[type="week"][readonly],fieldset[disabled] input[type="week"],input[type="email"][disabled],input[type="email"][readonly],fieldset[disabled] input[type="email"],input[type="number"][disabled],input[type="number"][readonly],fieldset[disabled] input[type="number"],input[type="search"][disabled],input[type="search"][readonly],fieldset[disabled] input[type="search"],input[type="tel"][disabled],input[type="tel"][readonly],fieldset[disabled] input[type="tel"],input[type="time"][disabled],input[type="time"][readonly],fieldset[disabled] input[type="time"],input[type="url"][disabled],input[type="url"][readonly],fieldset[disabled] input[type="url"],input[type="color"][disabled],input[type="color"][readonly],fieldset[disabled] input[type="color"],textarea[disabled],textarea[readonly],fieldset[disabled] textarea{background-color:#ddd;cursor:default}input[type="text"].radius,input[type="password"].radius,input[type="date"].radius,input[type="datetime"].radius,input[type="datetime-local"].radius,input[type="month"].radius,input[type="week"].radius,input[type="email"].radius,input[type="number"].radius,input[type="search"].radius,input[type="tel"].radius,input[type="time"].radius,input[type="url"].radius,input[type="color"].radius,textarea.radius{border-radius:3px}form .row .prefix-radius.row.collapse input,form .row .prefix-radius.row.collapse textarea,form .row .prefix-radius.row.collapse select,form .row .prefix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-radius.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse input,form .row .postfix-radius.row.collapse textarea,form .row .postfix-radius.row.collapse select,form .row .postfix-radius.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:3px;-webkit-border-top-left-radius:3px;border-bottom-left-radius:3px;border-top-left-radius:3px}form .row .postfix-radius.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:3px;-webkit-border-top-right-radius:3px;border-bottom-right-radius:3px;border-top-right-radius:3px}form .row .prefix-round.row.collapse input,form .row .prefix-round.row.collapse textarea,form .row .prefix-round.row.collapse select,form .row .prefix-round.row.collapse button{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}form .row .prefix-round.row.collapse .prefix{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse input,form .row .postfix-round.row.collapse textarea,form .row .postfix-round.row.collapse select,form .row .postfix-round.row.collapse button{border-radius:0;-webkit-border-bottom-left-radius:1000px;-webkit-border-top-left-radius:1000px;border-bottom-left-radius:1000px;border-top-left-radius:1000px}form .row .postfix-round.row.collapse .postfix{border-radius:0;-webkit-border-bottom-right-radius:1000px;-webkit-border-top-right-radius:1000px;border-bottom-right-radius:1000px;border-top-right-radius:1000px}input[type="submit"]{-webkit-appearance:none;border-radius:0}textarea[rows]{height:auto}textarea{max-width:100%}select{-webkit-appearance:none !important;border-radius:0;background-color:#FAFAFA;background-image:url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgeD0iMTJweCIgeT0iMHB4IiB3aWR0aD0iMjRweCIgaGVpZ2h0PSIzcHgiIHZpZXdCb3g9IjAgMCA2IDMiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDYgMyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBvbHlnb24gcG9pbnRzPSI1Ljk5MiwwIDIuOTkyLDMgLTAuMDA4LDAgIi8+PC9zdmc+);background-position:100% center;background-repeat:no-repeat;border-style:solid;border-width:1px;border-color:#ccc;padding:.5rem;font-size:.875rem;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;color:rgba(0,0,0,0.75);line-height:normal;border-radius:0;height:2.3125rem}select::-ms-expand{display:none}select.radius{border-radius:3px}select:hover{background-color:#f3f2f2;border-color:#999}select:disabled{background-color:#ddd;cursor:default}select[multiple]{height:auto}input[type="file"],input[type="checkbox"],input[type="radio"],select{margin:0 0 1rem 0}input[type="checkbox"]+label,input[type="radio"]+label{display:inline-block;margin-left:.5rem;margin-right:1rem;margin-bottom:0;vertical-align:baseline}input[type="file"]{width:100%}fieldset{border:1px solid #ddd;padding:1.25rem;margin:1.125rem 0}fieldset legend{font-weight:700;background:#fff;padding:0 .1875rem;margin:0;margin-left:-.1875rem}[data-abide] .error small.error,[data-abide] .error span.error,[data-abide] span.error,[data-abide] small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}[data-abide] span.error,[data-abide] small.error{display:none}span.error,small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}.error input,.error textarea,.error select{margin-bottom:0}.error input[type="checkbox"],.error input[type="radio"]{margin-bottom:1rem}.error label,.error label.error{color:#f04124}.error small.error{display:block;padding:.375rem .5625rem .5625rem;margin-top:-1px;margin-bottom:1rem;font-size:.75rem;font-weight:400;font-style:italic;background:#f04124;color:#fff}.error>label>small{color:#676767;background:transparent;padding:0;text-transform:capitalize;font-style:normal;font-size:60%;margin:0;display:inline}.error span.error-message{display:block}input.error,textarea.error,select.error{margin-bottom:0}label.error{color:#f04124}.row{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5rem}.row:before,.row:after{content:" ";display:table}.row:after{clear:both}.row.collapse>.column,.row.collapse>.columns{padding-left:0;padding-right:0}.row.collapse .row{margin-left:0;margin-right:0}.row .row{width:auto;margin-left:-.9375rem;margin-right:-.9375rem;margin-top:0;margin-bottom:0;max-width:none}.row .row:before,.row .row:after{content:" ";display:table}.row .row:after{clear:both}.row .row.collapse{width:auto;margin:0;max-width:none}.row .row.collapse:before,.row .row.collapse:after{content:" ";display:table}.row .row.collapse:after{clear:both}.column,.columns{padding-left:.9375rem;padding-right:.9375rem;width:100%;float:left}[class*="column"]+[class*="column"]:last-child{float:right}[class*="column"]+[class*="column"].end{float:left}@media only screen{.small-push-0{position:relative;left:0%;right:auto}.small-pull-0{position:relative;right:0%;left:auto}.small-push-1{position:relative;left:8.3333333333%;right:auto}.small-pull-1{position:relative;right:8.3333333333%;left:auto}.small-push-2{position:relative;left:16.6666666667%;right:auto}.small-pull-2{position:relative;right:16.6666666667%;left:auto}.small-push-3{position:relative;left:25%;right:auto}.small-pull-3{position:relative;right:25%;left:auto}.small-push-4{position:relative;left:33.3333333333%;right:auto}.small-pull-4{position:relative;right:33.3333333333%;left:auto}.small-push-5{position:relative;left:41.6666666667%;right:auto}.small-pull-5{position:relative;right:41.6666666667%;left:auto}.small-push-6{position:relative;left:50%;right:auto}.small-pull-6{position:relative;right:50%;left:auto}.small-push-7{position:relative;left:58.3333333333%;right:auto}.small-pull-7{position:relative;right:58.3333333333%;left:auto}.small-push-8{position:relative;left:66.6666666667%;right:auto}.small-pull-8{position:relative;right:66.6666666667%;left:auto}.small-push-9{position:relative;left:75%;right:auto}.small-pull-9{position:relative;right:75%;left:auto}.small-push-10{position:relative;left:83.3333333333%;right:auto}.small-pull-10{position:relative;right:83.3333333333%;left:auto}.small-push-11{position:relative;left:91.6666666667%;right:auto}.small-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.small-1{width:8.3333333333%}.small-2{width:16.6666666667%}.small-3{width:25%}.small-4{width:33.3333333333%}.small-5{width:41.6666666667%}.small-6{width:50%}.small-7{width:58.3333333333%}.small-8{width:66.6666666667%}.small-9{width:75%}.small-10{width:83.3333333333%}.small-11{width:91.6666666667%}.small-12{width:100%}.small-offset-0{margin-left:0% !important}.small-offset-1{margin-left:8.3333333333% !important}.small-offset-2{margin-left:16.6666666667% !important}.small-offset-3{margin-left:25% !important}.small-offset-4{margin-left:33.3333333333% !important}.small-offset-5{margin-left:41.6666666667% !important}.small-offset-6{margin-left:50% !important}.small-offset-7{margin-left:58.3333333333% !important}.small-offset-8{margin-left:66.6666666667% !important}.small-offset-9{margin-left:75% !important}.small-offset-10{margin-left:83.3333333333% !important}.small-offset-11{margin-left:91.6666666667% !important}.small-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.small-centered,.columns.small-centered{margin-left:auto;margin-right:auto;float:none}.column.small-uncentered,.columns.small-uncentered{margin-left:0;margin-right:0;float:left}.column.small-centered:last-child,.columns.small-centered:last-child{float:none}.column.small-uncentered:last-child,.columns.small-uncentered:last-child{float:left}.column.small-uncentered.opposite,.columns.small-uncentered.opposite{float:right}.row.small-collapse>.column,.row.small-collapse>.columns{padding-left:0;padding-right:0}.row.small-collapse .row{margin-left:0;margin-right:0}.row.small-uncollapse>.column,.row.small-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}}@media only screen and (min-width: 40.0625em){.medium-push-0{position:relative;left:0%;right:auto}.medium-pull-0{position:relative;right:0%;left:auto}.medium-push-1{position:relative;left:8.3333333333%;right:auto}.medium-pull-1{position:relative;right:8.3333333333%;left:auto}.medium-push-2{position:relative;left:16.6666666667%;right:auto}.medium-pull-2{position:relative;right:16.6666666667%;left:auto}.medium-push-3{position:relative;left:25%;right:auto}.medium-pull-3{position:relative;right:25%;left:auto}.medium-push-4{position:relative;left:33.3333333333%;right:auto}.medium-pull-4{position:relative;right:33.3333333333%;left:auto}.medium-push-5{position:relative;left:41.6666666667%;right:auto}.medium-pull-5{position:relative;right:41.6666666667%;left:auto}.medium-push-6{position:relative;left:50%;right:auto}.medium-pull-6{position:relative;right:50%;left:auto}.medium-push-7{position:relative;left:58.3333333333%;right:auto}.medium-pull-7{position:relative;right:58.3333333333%;left:auto}.medium-push-8{position:relative;left:66.6666666667%;right:auto}.medium-pull-8{position:relative;right:66.6666666667%;left:auto}.medium-push-9{position:relative;left:75%;right:auto}.medium-pull-9{position:relative;right:75%;left:auto}.medium-push-10{position:relative;left:83.3333333333%;right:auto}.medium-pull-10{position:relative;right:83.3333333333%;left:auto}.medium-push-11{position:relative;left:91.6666666667%;right:auto}.medium-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.medium-1{width:8.3333333333%}.medium-2{width:16.6666666667%}.medium-3{width:25%}.medium-4{width:33.3333333333%}.medium-5{width:41.6666666667%}.medium-6{width:50%}.medium-7{width:58.3333333333%}.medium-8{width:66.6666666667%}.medium-9{width:75%}.medium-10{width:83.3333333333%}.medium-11{width:91.6666666667%}.medium-12{width:100%}.medium-offset-0{margin-left:0% !important}.medium-offset-1{margin-left:8.3333333333% !important}.medium-offset-2{margin-left:16.6666666667% !important}.medium-offset-3{margin-left:25% !important}.medium-offset-4{margin-left:33.3333333333% !important}.medium-offset-5{margin-left:41.6666666667% !important}.medium-offset-6{margin-left:50% !important}.medium-offset-7{margin-left:58.3333333333% !important}.medium-offset-8{margin-left:66.6666666667% !important}.medium-offset-9{margin-left:75% !important}.medium-offset-10{margin-left:83.3333333333% !important}.medium-offset-11{margin-left:91.6666666667% !important}.medium-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.medium-centered,.columns.medium-centered{margin-left:auto;margin-right:auto;float:none}.column.medium-uncentered,.columns.medium-uncentered{margin-left:0;margin-right:0;float:left}.column.medium-centered:last-child,.columns.medium-centered:last-child{float:none}.column.medium-uncentered:last-child,.columns.medium-uncentered:last-child{float:left}.column.medium-uncentered.opposite,.columns.medium-uncentered.opposite{float:right}.row.medium-collapse>.column,.row.medium-collapse>.columns{padding-left:0;padding-right:0}.row.medium-collapse .row{margin-left:0;margin-right:0}.row.medium-uncollapse>.column,.row.medium-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.3333333333%;right:auto}.pull-1{position:relative;right:8.3333333333%;left:auto}.push-2{position:relative;left:16.6666666667%;right:auto}.pull-2{position:relative;right:16.6666666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.3333333333%;right:auto}.pull-4{position:relative;right:33.3333333333%;left:auto}.push-5{position:relative;left:41.6666666667%;right:auto}.pull-5{position:relative;right:41.6666666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.3333333333%;right:auto}.pull-7{position:relative;right:58.3333333333%;left:auto}.push-8{position:relative;left:66.6666666667%;right:auto}.pull-8{position:relative;right:66.6666666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.3333333333%;right:auto}.pull-10{position:relative;right:83.3333333333%;left:auto}.push-11{position:relative;left:91.6666666667%;right:auto}.pull-11{position:relative;right:91.6666666667%;left:auto}}@media only screen and (min-width: 64.0625em){.large-push-0{position:relative;left:0%;right:auto}.large-pull-0{position:relative;right:0%;left:auto}.large-push-1{position:relative;left:8.3333333333%;right:auto}.large-pull-1{position:relative;right:8.3333333333%;left:auto}.large-push-2{position:relative;left:16.6666666667%;right:auto}.large-pull-2{position:relative;right:16.6666666667%;left:auto}.large-push-3{position:relative;left:25%;right:auto}.large-pull-3{position:relative;right:25%;left:auto}.large-push-4{position:relative;left:33.3333333333%;right:auto}.large-pull-4{position:relative;right:33.3333333333%;left:auto}.large-push-5{position:relative;left:41.6666666667%;right:auto}.large-pull-5{position:relative;right:41.6666666667%;left:auto}.large-push-6{position:relative;left:50%;right:auto}.large-pull-6{position:relative;right:50%;left:auto}.large-push-7{position:relative;left:58.3333333333%;right:auto}.large-pull-7{position:relative;right:58.3333333333%;left:auto}.large-push-8{position:relative;left:66.6666666667%;right:auto}.large-pull-8{position:relative;right:66.6666666667%;left:auto}.large-push-9{position:relative;left:75%;right:auto}.large-pull-9{position:relative;right:75%;left:auto}.large-push-10{position:relative;left:83.3333333333%;right:auto}.large-pull-10{position:relative;right:83.3333333333%;left:auto}.large-push-11{position:relative;left:91.6666666667%;right:auto}.large-pull-11{position:relative;right:91.6666666667%;left:auto}.column,.columns{position:relative;padding-left:.9375rem;padding-right:.9375rem;float:left}.large-1{width:8.3333333333%}.large-2{width:16.6666666667%}.large-3{width:25%}.large-4{width:33.3333333333%}.large-5{width:41.6666666667%}.large-6{width:50%}.large-7{width:58.3333333333%}.large-8{width:66.6666666667%}.large-9{width:75%}.large-10{width:83.3333333333%}.large-11{width:91.6666666667%}.large-12{width:100%}.large-offset-0{margin-left:0% !important}.large-offset-1{margin-left:8.3333333333% !important}.large-offset-2{margin-left:16.6666666667% !important}.large-offset-3{margin-left:25% !important}.large-offset-4{margin-left:33.3333333333% !important}.large-offset-5{margin-left:41.6666666667% !important}.large-offset-6{margin-left:50% !important}.large-offset-7{margin-left:58.3333333333% !important}.large-offset-8{margin-left:66.6666666667% !important}.large-offset-9{margin-left:75% !important}.large-offset-10{margin-left:83.3333333333% !important}.large-offset-11{margin-left:91.6666666667% !important}.large-reset-order{margin-left:0;margin-right:0;left:auto;right:auto;float:left}.column.large-centered,.columns.large-centered{margin-left:auto;margin-right:auto;float:none}.column.large-uncentered,.columns.large-uncentered{margin-left:0;margin-right:0;float:left}.column.large-centered:last-child,.columns.large-centered:last-child{float:none}.column.large-uncentered:last-child,.columns.large-uncentered:last-child{float:left}.column.large-uncentered.opposite,.columns.large-uncentered.opposite{float:right}.row.large-collapse>.column,.row.large-collapse>.columns{padding-left:0;padding-right:0}.row.large-collapse .row{margin-left:0;margin-right:0}.row.large-uncollapse>.column,.row.large-uncollapse>.columns{padding-left:.9375rem;padding-right:.9375rem;float:left}.push-0{position:relative;left:0%;right:auto}.pull-0{position:relative;right:0%;left:auto}.push-1{position:relative;left:8.3333333333%;right:auto}.pull-1{position:relative;right:8.3333333333%;left:auto}.push-2{position:relative;left:16.6666666667%;right:auto}.pull-2{position:relative;right:16.6666666667%;left:auto}.push-3{position:relative;left:25%;right:auto}.pull-3{position:relative;right:25%;left:auto}.push-4{position:relative;left:33.3333333333%;right:auto}.pull-4{position:relative;right:33.3333333333%;left:auto}.push-5{position:relative;left:41.6666666667%;right:auto}.pull-5{position:relative;right:41.6666666667%;left:auto}.push-6{position:relative;left:50%;right:auto}.pull-6{position:relative;right:50%;left:auto}.push-7{position:relative;left:58.3333333333%;right:auto}.pull-7{position:relative;right:58.3333333333%;left:auto}.push-8{position:relative;left:66.6666666667%;right:auto}.pull-8{position:relative;right:66.6666666667%;left:auto}.push-9{position:relative;left:75%;right:auto}.pull-9{position:relative;right:75%;left:auto}.push-10{position:relative;left:83.3333333333%;right:auto}.pull-10{position:relative;right:83.3333333333%;left:auto}.push-11{position:relative;left:91.6666666667%;right:auto}.pull-11{position:relative;right:91.6666666667%;left:auto}}.inline-list{margin:0 auto 1.0625rem auto;margin-left:-1.375rem;margin-right:0;padding:0;list-style:none;overflow:hidden}.inline-list>li{list-style:none;float:left;margin-left:1.375rem;display:block}.inline-list>li>*{display:block}.panel{border-style:solid;border-width:1px;border-color:#d8d8d8;margin-bottom:1.25rem;padding:1.25rem;background:#f2f2f2;color:#333}.panel>:first-child{margin-top:0}.panel>:last-child{margin-bottom:0}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6,.panel p,.panel li,.panel dl{color:#333}.panel h1,.panel h2,.panel h3,.panel h4,.panel h5,.panel h6{line-height:1;margin-bottom:.625rem}.panel h1.subheader,.panel h2.subheader,.panel h3.subheader,.panel h4.subheader,.panel h5.subheader,.panel h6.subheader{line-height:1.4}.panel.callout{border-style:solid;border-width:1px;border-color:#f6c4bf;margin-bottom:1.25rem;padding:1.25rem;background:#fdf0ef;color:#333}.panel.callout>:first-child{margin-top:0}.panel.callout>:last-child{margin-bottom:0}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6,.panel.callout p,.panel.callout li,.panel.callout dl{color:#333}.panel.callout h1,.panel.callout h2,.panel.callout h3,.panel.callout h4,.panel.callout h5,.panel.callout h6{line-height:1;margin-bottom:.625rem}.panel.callout h1.subheader,.panel.callout h2.subheader,.panel.callout h3.subheader,.panel.callout h4.subheader,.panel.callout h5.subheader,.panel.callout h6.subheader{line-height:1.4}.panel.callout a:not(.button){color:#ba2619}.panel.callout a:not(.button):hover,.panel.callout a:not(.button):focus{color:#a02116}.panel.radius{border-radius:3px}.side-nav{display:block;margin:0;padding:.875rem 0;list-style-type:none;list-style-position:outside;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li{margin:0 0 .4375rem 0;font-size:.875rem;font-weight:400}.side-nav li a:not(.button){display:block;color:#ba2619;margin:0;padding:.4375rem .875rem}.side-nav li a:not(.button):hover,.side-nav li a:not(.button):focus{background:rgba(0,0,0,0.025);color:#e65346}.side-nav li.active>a:first-child:not(.button){color:#e65346;font-weight:400;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif}.side-nav li.divider{border-top:1px solid;height:0;padding:0;list-style:none;border-top-color:#fff}.side-nav li.heading{color:#ba2619;font-size:.875rem;font-weight:bold;text-transform:uppercase}table{background:#fff;margin-bottom:1.25rem;border:solid 1px #ddd;table-layout:auto}table caption{background:transparent;color:#222;font-size:1rem;font-weight:bold}table thead{background:#f5f5f5}table thead tr th,table thead tr td{padding:.5rem .625rem .625rem;font-size:.875rem;font-weight:700;color:#222}table tfoot{background:#f5f5f5}table tfoot tr th,table tfoot tr td{padding:.5rem .625rem .625rem;font-size:.875rem;font-weight:700;color:#222}table tr th,table tr td{padding:.5625rem .625rem;font-size:.875rem;color:#222;text-align:left}table tr.even,table tr.alt,table tr:nth-of-type(even){background:#F9F9F9}table thead tr th,table tfoot tr th,table tfoot tr td,table tbody tr th,table tbody tr td,table tr td{display:table-cell;line-height:1.125rem}.th{line-height:0;display:inline-block;border:solid 4px #fff;max-width:100%;box-shadow:0 0 0 1px rgba(0,0,0,0.2);transition:all 200ms ease-out}.th:hover,.th:focus{box-shadow:0 0 6px 1px rgba(186,38,25,0.5)}.th.radius{border-radius:3px}meta.foundation-mq-topbar{font-family:"/only screen and (min-width:40.0625em)/";width:40.0625em}.contain-to-grid{width:100%;background:#333}.contain-to-grid .top-bar{margin-bottom:0}.fixed{width:100%;left:0;position:fixed;top:0;z-index:99}.fixed.expanded:not(.top-bar){overflow-y:auto;height:auto;width:100%;max-height:100%}.fixed.expanded:not(.top-bar) .title-area{position:fixed;width:100%;z-index:99}.fixed.expanded:not(.top-bar) .top-bar-section{z-index:98;margin-top:2.8125rem}.top-bar{overflow:hidden;height:2.8125rem;line-height:2.8125rem;position:relative;background:#333;margin-bottom:0}.top-bar ul{margin-bottom:0;list-style:none}.top-bar .row{max-width:none}.top-bar form,.top-bar input{margin-bottom:0}.top-bar input{height:1.75rem;padding-top:.35rem;padding-bottom:.35rem;font-size:.75rem}.top-bar .button,.top-bar button{padding-top:0.4125rem;padding-bottom:0.4125rem;margin-bottom:0;font-size:.75rem}@media only screen and (max-width: 40em){.top-bar .button,.top-bar button{position:relative;top:-1px}}.top-bar .title-area{position:relative;margin:0}.top-bar .name{height:2.8125rem;margin:0;font-size:16px}.top-bar .name h1,.top-bar .name h2,.top-bar .name h3,.top-bar .name h4,.top-bar .name p,.top-bar .name span{line-height:2.8125rem;font-size:1.0625rem;margin:0}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name p a,.top-bar .name span a{font-weight:400;color:#fff;width:75%;display:block;padding:0 .9375rem}.top-bar .toggle-topbar{position:absolute;right:0;top:0}.top-bar .toggle-topbar a{color:#fff;text-transform:uppercase;font-size:.8125rem;font-weight:700;position:relative;display:block;padding:0 .9375rem;height:2.8125rem;line-height:2.8125rem}.top-bar .toggle-topbar.menu-icon{top:50%;margin-top:-16px}.top-bar .toggle-topbar.menu-icon a{height:34px;line-height:33px;padding:0 2.5rem 0 .9375rem;color:#fff;position:relative}.top-bar .toggle-topbar.menu-icon a span::after{content:"";position:absolute;display:block;height:0;top:50%;margin-top:-8px;right:.9375rem;box-shadow:0 0 0 1px #fff,0 7px 0 1px #fff,0 14px 0 1px #fff;width:16px}.top-bar .toggle-topbar.menu-icon a span:hover:after{box-shadow:0 0 0 1px "",0 7px 0 1px "",0 14px 0 1px ""}.top-bar.expanded{height:auto;background:transparent}.top-bar.expanded .title-area{background:#333}.top-bar.expanded .toggle-topbar a{color:#888}.top-bar.expanded .toggle-topbar a span::after{box-shadow:0 0 0 1px #888,0 7px 0 1px #888,0 14px 0 1px #888}.top-bar-section{left:0;position:relative;width:auto;transition:left 300ms ease-out}.top-bar-section ul{padding:0;width:100%;height:auto;display:block;font-size:16px;margin:0}.top-bar-section .divider,.top-bar-section [role="separator"]{border-top:solid 1px #1a1919;clear:both;height:1px;width:100%}.top-bar-section ul li{background:#333}.top-bar-section ul li>a{display:block;width:100%;color:#fff;padding:12px 0 12px 0;padding-left:.9375rem;font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-size:.8125rem;font-weight:400;text-transform:none}.top-bar-section ul li>a.button{font-size:.8125rem;padding-right:.9375rem;padding-left:.9375rem;background-color:#ba2619;border-color:#951e14;color:#fff}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{background-color:#951e14}.top-bar-section ul li>a.button:hover,.top-bar-section ul li>a.button:focus{color:#fff}.top-bar-section ul li>a.button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>a.button.secondary:hover,.top-bar-section ul li>a.button.secondary:focus{color:#333}.top-bar-section ul li>a.button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{background-color:#368a55}.top-bar-section ul li>a.button.success:hover,.top-bar-section ul li>a.button.success:focus{color:#fff}.top-bar-section ul li>a.button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>a.button.alert:hover,.top-bar-section ul li>a.button.alert:focus{color:#fff}.top-bar-section ul li>a.button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>a.button.warning:hover,.top-bar-section ul li>a.button.warning:focus{color:#fff}.top-bar-section ul li>button{font-size:.8125rem;padding-right:.9375rem;padding-left:.9375rem;background-color:#ba2619;border-color:#951e14;color:#fff}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{background-color:#951e14}.top-bar-section ul li>button:hover,.top-bar-section ul li>button:focus{color:#fff}.top-bar-section ul li>button.secondary{background-color:#e7e7e7;border-color:#b9b9b9;color:#333}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{background-color:#b9b9b9}.top-bar-section ul li>button.secondary:hover,.top-bar-section ul li>button.secondary:focus{color:#333}.top-bar-section ul li>button.success{background-color:#43AC6A;border-color:#368a55;color:#fff}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{background-color:#368a55}.top-bar-section ul li>button.success:hover,.top-bar-section ul li>button.success:focus{color:#fff}.top-bar-section ul li>button.alert{background-color:#f04124;border-color:#cf2a0e;color:#fff}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{background-color:#cf2a0e}.top-bar-section ul li>button.alert:hover,.top-bar-section ul li>button.alert:focus{color:#fff}.top-bar-section ul li>button.warning{background-color:#f08a24;border-color:#cf6e0e;color:#fff}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{background-color:#cf6e0e}.top-bar-section ul li>button.warning:hover,.top-bar-section ul li>button.warning:focus{color:#fff}.top-bar-section ul li:hover:not(.has-form)>a{background-color:#555;background:#333;color:#fff}.top-bar-section ul li.active>a{background:#ba2619;color:#fff}.top-bar-section ul li.active>a:hover{background:#a02116;color:#fff}.top-bar-section .has-form{padding:.9375rem}.top-bar-section .has-dropdown{position:relative}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:transparent transparent transparent rgba(255,255,255,0.4);border-left-style:solid;margin-right:.9375rem;margin-top:-4.5px;position:absolute;top:50%;right:0}.top-bar-section .has-dropdown.moved{position:static}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important;width:100%}.top-bar-section .has-dropdown.moved>a:after{display:none}.top-bar-section .dropdown{padding:0;position:absolute;left:100%;top:0;z-index:99;display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .dropdown li{width:100%;height:auto}.top-bar-section .dropdown li a{font-weight:400;padding:8px .9375rem}.top-bar-section .dropdown li a.parent-link{font-weight:400}.top-bar-section .dropdown li.title h5,.top-bar-section .dropdown li.parent-link{margin-bottom:0;margin-top:0;font-size:1.125rem}.top-bar-section .dropdown li.title h5 a,.top-bar-section .dropdown li.parent-link a{color:#fff;display:block}.top-bar-section .dropdown li.title h5 a:hover,.top-bar-section .dropdown li.parent-link a:hover{background:none}.top-bar-section .dropdown li.has-form{padding:8px .9375rem}.top-bar-section .dropdown li .button,.top-bar-section .dropdown li button{top:auto}.top-bar-section .dropdown label{padding:8px .9375rem 2px;margin-bottom:0;text-transform:uppercase;color:#777;font-weight:700;font-size:.625rem}.js-generated{display:block}@media only screen and (min-width: 40.0625em){.top-bar{background:#333;overflow:visible}.top-bar:before,.top-bar:after{content:" ";display:table}.top-bar:after{clear:both}.top-bar .toggle-topbar{display:none}.top-bar .title-area{float:left}.top-bar .name h1 a,.top-bar .name h2 a,.top-bar .name h3 a,.top-bar .name h4 a,.top-bar .name h5 a,.top-bar .name h6 a{width:auto}.top-bar input,.top-bar .button,.top-bar button{font-size:.875rem;position:relative;height:1.75rem;top:.53125rem}.top-bar.expanded{background:#333}.contain-to-grid .top-bar{max-width:62.5rem;margin:0 auto;margin-bottom:0}.top-bar-section{transition:none 0 0;left:0 !important}.top-bar-section ul{width:auto;height:auto !important;display:inline}.top-bar-section ul li{float:left}.top-bar-section ul li .js-generated{display:none}.top-bar-section li.hover>a:not(.button){background-color:#555;background:#333;color:#fff}.top-bar-section li:not(.has-form) a:not(.button){padding:0 .9375rem;line-height:2.8125rem;background:#333}.top-bar-section li:not(.has-form) a:not(.button):hover{background-color:#555;background:#333}.top-bar-section li.active:not(.has-form) a:not(.button){padding:0 .9375rem;line-height:2.8125rem;color:#fff;background:#ba2619}.top-bar-section li.active:not(.has-form) a:not(.button):hover{background:#a02116;color:#fff}.top-bar-section .has-dropdown>a{padding-right:2.1875rem !important}.top-bar-section .has-dropdown>a:after{content:"";display:block;width:0;height:0;border:inset 5px;border-color:rgba(255,255,255,0.4) transparent transparent transparent;border-top-style:solid;margin-top:-2.5px;top:1.40625rem}.top-bar-section .has-dropdown.moved{position:relative}.top-bar-section .has-dropdown.moved>.dropdown{display:block;position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}.top-bar-section .has-dropdown.hover>.dropdown,.top-bar-section .has-dropdown.not-click:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.top-bar-section .has-dropdown .dropdown li.has-dropdown>a:after{border:none;content:"\00bb";top:1rem;margin-top:-1px;right:5px;line-height:1.2}.top-bar-section .dropdown{left:0;top:auto;background:transparent;min-width:100%}.top-bar-section .dropdown li a{color:#fff;line-height:2.8125rem;white-space:nowrap;padding:12px .9375rem;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active)>a:not(.button){color:#fff;background:#333}.top-bar-section .dropdown li:not(.has-form):not(.active):hover>a:not(.button){color:#fff;background-color:#555;background:#333}.top-bar-section .dropdown li label{white-space:nowrap;background:#333}.top-bar-section .dropdown li .dropdown{left:100%;top:0}.top-bar-section>ul>.divider,.top-bar-section>ul>[role="separator"]{border-bottom:none;border-top:none;border-right:solid 1px #4e4e4e;clear:none;height:2.8125rem;width:0}.top-bar-section .has-form{background:#333;padding:0 .9375rem;height:2.8125rem}.top-bar-section .right li .dropdown{left:auto;right:0}.top-bar-section .right li .dropdown li .dropdown{right:100%}.top-bar-section .left li .dropdown{right:auto;left:0}.top-bar-section .left li .dropdown li .dropdown{left:100%}.no-js .top-bar-section ul li:hover>a{background-color:#555;background:#333;color:#fff}.no-js .top-bar-section ul li:active>a{background:#ba2619;color:#fff}.no-js .top-bar-section .has-dropdown:hover>.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}.no-js .top-bar-section .has-dropdown>a:focus+.dropdown{display:block;position:static !important;height:auto;width:auto;overflow:visible;clip:auto;position:absolute !important}}.text-left{text-align:left !important}.text-right{text-align:right !important}.text-center{text-align:center !important}.text-justify{text-align:justify !important}@media only screen and (max-width: 40em){.small-only-text-left{text-align:left !important}.small-only-text-right{text-align:right !important}.small-only-text-center{text-align:center !important}.small-only-text-justify{text-align:justify !important}}@media only screen{.small-text-left{text-align:left !important}.small-text-right{text-align:right !important}.small-text-center{text-align:center !important}.small-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em) and (max-width: 64em){.medium-only-text-left{text-align:left !important}.medium-only-text-right{text-align:right !important}.medium-only-text-center{text-align:center !important}.medium-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 40.0625em){.medium-text-left{text-align:left !important}.medium-text-right{text-align:right !important}.medium-text-center{text-align:center !important}.medium-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em) and (max-width: 90em){.large-only-text-left{text-align:left !important}.large-only-text-right{text-align:right !important}.large-only-text-center{text-align:center !important}.large-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 64.0625em){.large-text-left{text-align:left !important}.large-text-right{text-align:right !important}.large-text-center{text-align:center !important}.large-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em) and (max-width: 120em){.xlarge-only-text-left{text-align:left !important}.xlarge-only-text-right{text-align:right !important}.xlarge-only-text-center{text-align:center !important}.xlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 90.0625em){.xlarge-text-left{text-align:left !important}.xlarge-text-right{text-align:right !important}.xlarge-text-center{text-align:center !important}.xlarge-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em) and (max-width: 99999999em){.xxlarge-only-text-left{text-align:left !important}.xxlarge-only-text-right{text-align:right !important}.xxlarge-only-text-center{text-align:center !important}.xxlarge-only-text-justify{text-align:justify !important}}@media only screen and (min-width: 120.0625em){.xxlarge-text-left{text-align:left !important}.xxlarge-text-right{text-align:right !important}.xxlarge-text-center{text-align:center !important}.xxlarge-text-justify{text-align:justify !important}}div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0}a{color:#ba2619;text-decoration:none;line-height:inherit}a:hover,a:focus{color:#a02116}a img{border:none}p{font-family:inherit;font-weight:400;font-size:1rem;line-height:1.6;margin-bottom:1.25rem;text-rendering:optimizeLegibility}p.lead{font-size:1.21875rem;line-height:1.6}p aside{font-size:.875rem;line-height:1.35;font-style:italic}h1,h2,h3,h4,h5,h6{font-family:"Open Sans","Helvetica Neue",Helvetica,Roboto,Arial,sans-serif;font-weight:700;font-style:normal;color:#222;text-rendering:optimizeLegibility;margin-top:.2rem;margin-bottom:.5rem;line-height:1.4}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-size:80%;color:#6f6f6f;line-height:0}h1{font-size:1.5625rem}h2{font-size:1.25rem}h3{font-size:1.0625rem}h4{font-size:.9375rem}h5{font-size:1rem}h6{font-size:1rem}.subheader{line-height:1.4;color:#6f6f6f;font-weight:400;margin-top:.2rem;margin-bottom:.5rem}hr{border:solid #ddd;border-width:1px 0 0;clear:both;margin:1.25rem 0 1.1875rem;height:0}em,i{font-style:italic;line-height:inherit}strong,b{font-weight:700;line-height:inherit}small{font-size:80%;line-height:inherit}code{font-family:Consolas,"Liberation Mono",Courier,monospace;font-weight:400;color:#333;background-color:rgba(0,0,0,0.04);border-width:1px;border-style:none;border-color:rgba(0,0,0,0.04);padding:.125rem .3125rem .0625rem}ul,ol,dl{font-size:1rem;line-height:1.6;margin-bottom:1.25rem;list-style-position:outside;font-family:inherit}ul{margin-left:1.1rem}ul.no-bullet{margin-left:0}ul.no-bullet li ul,ul.no-bullet li ol{margin-left:1.25rem;margin-bottom:0;list-style:none}ul li ul,ul li ol{margin-left:1.25rem;margin-bottom:0}ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}ul.square{list-style-type:square;margin-left:1.1rem}ul.circle{list-style-type:circle;margin-left:1.1rem}ul.disc{list-style-type:disc;margin-left:1.1rem}ul.no-bullet{list-style:none}ol{margin-left:1.4rem}ol li ul,ol li ol{margin-left:1.25rem;margin-bottom:0}dl dt{margin-bottom:.3rem;font-weight:700}dl dd{margin-bottom:.75rem}abbr,acronym{text-transform:uppercase;font-size:90%;color:#222;cursor:help}abbr{text-transform:none}abbr[title]{border-bottom:1px dotted #ddd}blockquote{margin:0 0 1.25rem;padding:.5625rem 1.25rem 0 1.1875rem;border-left:1px solid #ddd}blockquote cite{display:block;font-size:.8125rem;color:#555}blockquote cite:before{content:"\2014 \0020"}blockquote cite a,blockquote cite a:visited{color:#555}blockquote,blockquote p{line-height:1.6;color:#6f6f6f}.vcard{display:inline-block;margin:0 0 1.25rem 0;border:1px solid #ddd;padding:.625rem .75rem}.vcard li{margin:0;display:block}.vcard .fn{font-weight:700;font-size:.9375rem}.vevent .summary{font-weight:700}.vevent abbr{cursor:default;text-decoration:none;font-weight:700;border:none;padding:0 .0625rem}@media only screen and (min-width: 40.0625em){h1,h2,h3,h4,h5,h6{line-height:1.4}h1{font-size:1.875rem}h2{font-size:1.5625rem}h3{font-size:1.375rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:1rem}}@media only screen{.show-for-small-only,.show-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.hide-for-small-only,.hide-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.visible-for-small-only,.visible-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.hidden-for-small-only,.hidden-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.show-for-small-only,table.show-for-small-up,table.show-for-small,table.show-for-small-down,table.hide-for-medium-only,table.hide-for-medium-up,table.hide-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.show-for-small-only,thead.show-for-small-up,thead.show-for-small,thead.show-for-small-down,thead.hide-for-medium-only,thead.hide-for-medium-up,thead.hide-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.show-for-small-only,tbody.show-for-small-up,tbody.show-for-small,tbody.show-for-small-down,tbody.hide-for-medium-only,tbody.hide-for-medium-up,tbody.hide-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.show-for-small-only,tr.show-for-small-up,tr.show-for-small,tr.show-for-small-down,tr.hide-for-medium-only,tr.hide-for-medium-up,tr.hide-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.show-for-small-only,td.show-for-small-only,th.show-for-small-up,td.show-for-small-up,th.show-for-small,td.show-for-small,th.show-for-small-down,td.show-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.hide-for-medium-up,td.hide-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 40.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.show-for-medium-only,.show-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.hide-for-medium-only,.hide-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.visible-for-medium-only,.visible-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.hidden-for-medium-only,.hidden-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.show-for-medium-only,table.show-for-medium-up,table.show-for-medium,table.show-for-medium-down,table.hide-for-large-only,table.hide-for-large-up,table.hide-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.show-for-medium-only,thead.show-for-medium-up,thead.show-for-medium,thead.show-for-medium-down,thead.hide-for-large-only,thead.hide-for-large-up,thead.hide-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.show-for-medium-only,tbody.show-for-medium-up,tbody.show-for-medium,tbody.show-for-medium-down,tbody.hide-for-large-only,tbody.hide-for-large-up,tbody.hide-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.show-for-medium-only,tr.show-for-medium-up,tr.show-for-medium,tr.show-for-medium-down,tr.hide-for-large-only,tr.hide-for-large-up,tr.hide-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.show-for-medium-only,td.show-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.show-for-medium,td.show-for-medium,th.show-for-medium-down,td.show-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.hide-for-large-up,td.hide-for-large-up,th.hide-for-large,td.hide-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 64.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.show-for-large-only,.show-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.hide-for-large-only,.hide-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.visible-for-large-only,.visible-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.hidden-for-large-only,.hidden-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.show-for-large-only,table.show-for-large-up,table.show-for-large,table.show-for-large-down,table.hide-for-xlarge-only,table.hide-for-xlarge-up,table.hide-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.show-for-large-only,thead.show-for-large-up,thead.show-for-large,thead.show-for-large-down,thead.hide-for-xlarge-only,thead.hide-for-xlarge-up,thead.hide-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.show-for-large-only,tbody.show-for-large-up,tbody.show-for-large,tbody.show-for-large-down,tbody.hide-for-xlarge-only,tbody.hide-for-xlarge-up,tbody.hide-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.show-for-large-only,tr.show-for-large-up,tr.show-for-large,tr.show-for-large-down,tr.hide-for-xlarge-only,tr.hide-for-xlarge-up,tr.hide-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.show-for-large-only,td.show-for-large-only,th.show-for-large-up,td.show-for-large-up,th.show-for-large,td.show-for-large,th.show-for-large-down,td.show-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.hide-for-xlarge-up,td.hide-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 90.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.show-for-xlarge-only,.show-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.hide-for-xlarge-only,.hide-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.visible-for-xlarge-only,.visible-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.hidden-for-xlarge-only,.hidden-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.show-for-xlarge-only,table.show-for-xlarge-up,table.show-for-xlarge,table.show-for-xlarge-down,table.hide-for-xxlarge-only,table.hide-for-xxlarge-up,table.hide-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.show-for-xlarge-only,thead.show-for-xlarge-up,thead.show-for-xlarge,thead.show-for-xlarge-down,thead.hide-for-xxlarge-only,thead.hide-for-xxlarge-up,thead.hide-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.show-for-xlarge-only,tbody.show-for-xlarge-up,tbody.show-for-xlarge,tbody.show-for-xlarge-down,tbody.hide-for-xxlarge-only,tbody.hide-for-xxlarge-up,tbody.hide-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.show-for-xlarge-only,tr.show-for-xlarge-up,tr.show-for-xlarge,tr.show-for-xlarge-down,tr.hide-for-xxlarge-only,tr.hide-for-xxlarge-up,tr.hide-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.show-for-xlarge-only,td.show-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.show-for-xlarge,td.show-for-xlarge,th.show-for-xlarge-down,td.show-for-xlarge-down,th.hide-for-xxlarge-only,td.hide-for-xxlarge-only,th.hide-for-xxlarge-up,td.hide-for-xxlarge-up,th.hide-for-xxlarge,td.hide-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}@media only screen and (min-width: 120.0625em){.hide-for-small-only,.show-for-small-up,.hide-for-small,.hide-for-small-down,.hide-for-medium-only,.show-for-medium-up,.hide-for-medium,.hide-for-medium-down,.hide-for-large-only,.show-for-large-up,.hide-for-large,.hide-for-large-down,.hide-for-xlarge-only,.show-for-xlarge-up,.hide-for-xlarge,.hide-for-xlarge-down,.show-for-xxlarge-only,.show-for-xxlarge-up,.show-for-xxlarge,.show-for-xxlarge-down{display:inherit !important}.show-for-small-only,.hide-for-small-up,.show-for-small,.show-for-small-down,.show-for-medium-only,.hide-for-medium-up,.show-for-medium,.show-for-medium-down,.show-for-large-only,.hide-for-large-up,.show-for-large,.show-for-large-down,.show-for-xlarge-only,.hide-for-xlarge-up,.show-for-xlarge,.show-for-xlarge-down,.hide-for-xxlarge-only,.hide-for-xxlarge-up,.hide-for-xxlarge,.hide-for-xxlarge-down{display:none !important}.hidden-for-small-only,.visible-for-small-up,.hidden-for-small,.hidden-for-small-down,.hidden-for-medium-only,.visible-for-medium-up,.hidden-for-medium,.hidden-for-medium-down,.hidden-for-large-only,.visible-for-large-up,.hidden-for-large,.hidden-for-large-down,.hidden-for-xlarge-only,.visible-for-xlarge-up,.hidden-for-xlarge,.hidden-for-xlarge-down,.visible-for-xxlarge-only,.visible-for-xxlarge-up,.visible-for-xxlarge,.visible-for-xxlarge-down{position:static !important;height:auto;width:auto;overflow:visible;clip:auto}.visible-for-small-only,.hidden-for-small-up,.visible-for-small,.visible-for-small-down,.visible-for-medium-only,.hidden-for-medium-up,.visible-for-medium,.visible-for-medium-down,.visible-for-large-only,.hidden-for-large-up,.visible-for-large,.visible-for-large-down,.visible-for-xlarge-only,.hidden-for-xlarge-up,.visible-for-xlarge,.visible-for-xlarge-down,.hidden-for-xxlarge-only,.hidden-for-xxlarge-up,.hidden-for-xxlarge,.hidden-for-xxlarge-down{position:absolute !important;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px)}table.hide-for-small-only,table.show-for-small-up,table.hide-for-small,table.hide-for-small-down,table.hide-for-medium-only,table.show-for-medium-up,table.hide-for-medium,table.hide-for-medium-down,table.hide-for-large-only,table.show-for-large-up,table.hide-for-large,table.hide-for-large-down,table.hide-for-xlarge-only,table.show-for-xlarge-up,table.hide-for-xlarge,table.hide-for-xlarge-down,table.show-for-xxlarge-only,table.show-for-xxlarge-up,table.show-for-xxlarge,table.show-for-xxlarge-down{display:table !important}thead.hide-for-small-only,thead.show-for-small-up,thead.hide-for-small,thead.hide-for-small-down,thead.hide-for-medium-only,thead.show-for-medium-up,thead.hide-for-medium,thead.hide-for-medium-down,thead.hide-for-large-only,thead.show-for-large-up,thead.hide-for-large,thead.hide-for-large-down,thead.hide-for-xlarge-only,thead.show-for-xlarge-up,thead.hide-for-xlarge,thead.hide-for-xlarge-down,thead.show-for-xxlarge-only,thead.show-for-xxlarge-up,thead.show-for-xxlarge,thead.show-for-xxlarge-down{display:table-header-group !important}tbody.hide-for-small-only,tbody.show-for-small-up,tbody.hide-for-small,tbody.hide-for-small-down,tbody.hide-for-medium-only,tbody.show-for-medium-up,tbody.hide-for-medium,tbody.hide-for-medium-down,tbody.hide-for-large-only,tbody.show-for-large-up,tbody.hide-for-large,tbody.hide-for-large-down,tbody.hide-for-xlarge-only,tbody.show-for-xlarge-up,tbody.hide-for-xlarge,tbody.hide-for-xlarge-down,tbody.show-for-xxlarge-only,tbody.show-for-xxlarge-up,tbody.show-for-xxlarge,tbody.show-for-xxlarge-down{display:table-row-group !important}tr.hide-for-small-only,tr.show-for-small-up,tr.hide-for-small,tr.hide-for-small-down,tr.hide-for-medium-only,tr.show-for-medium-up,tr.hide-for-medium,tr.hide-for-medium-down,tr.hide-for-large-only,tr.show-for-large-up,tr.hide-for-large,tr.hide-for-large-down,tr.hide-for-xlarge-only,tr.show-for-xlarge-up,tr.hide-for-xlarge,tr.hide-for-xlarge-down,tr.show-for-xxlarge-only,tr.show-for-xxlarge-up,tr.show-for-xxlarge,tr.show-for-xxlarge-down{display:table-row}th.hide-for-small-only,td.hide-for-small-only,th.show-for-small-up,td.show-for-small-up,th.hide-for-small,td.hide-for-small,th.hide-for-small-down,td.hide-for-small-down,th.hide-for-medium-only,td.hide-for-medium-only,th.show-for-medium-up,td.show-for-medium-up,th.hide-for-medium,td.hide-for-medium,th.hide-for-medium-down,td.hide-for-medium-down,th.hide-for-large-only,td.hide-for-large-only,th.show-for-large-up,td.show-for-large-up,th.hide-for-large,td.hide-for-large,th.hide-for-large-down,td.hide-for-large-down,th.hide-for-xlarge-only,td.hide-for-xlarge-only,th.show-for-xlarge-up,td.show-for-xlarge-up,th.hide-for-xlarge,td.hide-for-xlarge,th.hide-for-xlarge-down,td.hide-for-xlarge-down,th.show-for-xxlarge-only,td.show-for-xxlarge-only,th.show-for-xxlarge-up,td.show-for-xxlarge-up,th.show-for-xxlarge,td.show-for-xxlarge,th.show-for-xxlarge-down,td.show-for-xxlarge-down{display:table-cell !important}}.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.hide-for-landscape,table.show-for-portrait{display:table !important}thead.hide-for-landscape,thead.show-for-portrait{display:table-header-group !important}tbody.hide-for-landscape,tbody.show-for-portrait{display:table-row-group !important}tr.hide-for-landscape,tr.show-for-portrait{display:table-row !important}td.hide-for-landscape,td.show-for-portrait,th.hide-for-landscape,th.show-for-portrait{display:table-cell !important}@media only screen and (orientation: landscape){.show-for-landscape,.hide-for-portrait{display:inherit !important}.hide-for-landscape,.show-for-portrait{display:none !important}table.show-for-landscape,table.hide-for-portrait{display:table !important}thead.show-for-landscape,thead.hide-for-portrait{display:table-header-group !important}tbody.show-for-landscape,tbody.hide-for-portrait{display:table-row-group !important}tr.show-for-landscape,tr.hide-for-portrait{display:table-row !important}td.show-for-landscape,td.hide-for-portrait,th.show-for-landscape,th.hide-for-portrait{display:table-cell !important}}@media only screen and (orientation: portrait){.show-for-portrait,.hide-for-landscape{display:inherit !important}.hide-for-portrait,.show-for-landscape{display:none !important}table.show-for-portrait,table.hide-for-landscape{display:table !important}thead.show-for-portrait,thead.hide-for-landscape{display:table-header-group !important}tbody.show-for-portrait,tbody.hide-for-landscape{display:table-row-group !important}tr.show-for-portrait,tr.hide-for-landscape{display:table-row !important}td.show-for-portrait,td.hide-for-landscape,th.show-for-portrait,th.hide-for-landscape{display:table-cell !important}}.show-for-touch{display:none !important}.hide-for-touch{display:inherit !important}.touch .show-for-touch{display:inherit !important}.touch .hide-for-touch{display:none !important}table.hide-for-touch{display:table !important}.touch table.show-for-touch{display:table !important}thead.hide-for-touch{display:table-header-group !important}.touch thead.show-for-touch{display:table-header-group !important}tbody.hide-for-touch{display:table-row-group !important}.touch tbody.show-for-touch{display:table-row-group !important}tr.hide-for-touch{display:table-row !important}.touch tr.show-for-touch{display:table-row !important}td.hide-for-touch{display:table-cell !important}.touch td.show-for-touch{display:table-cell !important}th.hide-for-touch{display:table-cell !important}.touch th.show-for-touch{display:table-cell !important}.print-only{display:none !important}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.hide-on-print{display:none !important}.print-only{display:block !important}.hide-for-print{display:none !important}.show-for-print{display:inherit !important}}@media print{.show-for-print{display:block}.hide-for-print{display:none}table.show-for-print{display:table !important}thead.show-for-print{display:table-header-group !important}tbody.show-for-print{display:table-row-group !important}tr.show-for-print{display:table-row !important}td.show-for-print{display:table-cell !important}th.show-for-print{display:table-cell !important}}.slick-slider{position:relative;display:block;box-sizing:border-box;-moz-box-sizing:border-box;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-touch-action:pan-y;touch-action:pan-y;-webkit-tap-highlight-color:transparent}.slick-list{position:relative;overflow:hidden;display:block;margin:0;padding:0}.slick-list:focus{outline:none}.slick-list.dragging{cursor:pointer;cursor:hand}.slick-slider .slick-track,.slick-slider .slick-list{-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.slick-track{position:relative;left:0;top:0;display:block}.slick-track:before,.slick-track:after{content:"";display:table}.slick-track:after{clear:both}.slick-loading .slick-track{visibility:hidden}.slick-slide{float:left;height:100%;min-height:1px;display:none}[dir="rtl"] .slick-slide{float:right}.slick-slide img{display:block}.slick-slide.slick-loading img{display:none}.slick-slide.dragging img{pointer-events:none}.slick-initialized .slick-slide{display:block}.slick-loading .slick-slide{visibility:hidden}.slick-vertical .slick-slide{display:block;height:auto;border:1px solid transparent}.slick-loading .slick-list{background:#fff url("../img/ajax-loader.gif") center center no-repeat}.slick-prev,.slick-next{position:absolute;display:block;height:20px;width:20px;line-height:0;font-size:0;cursor:pointer;background:transparent;color:transparent;top:50%;margin-top:-10px;padding:0;border:none;outline:none}.slick-prev:hover,.slick-prev:focus,.slick-next:hover,.slick-next:focus{outline:none;background:transparent;color:transparent}.slick-prev:hover:before,.slick-prev:focus:before,.slick-next:hover:before,.slick-next:focus:before{opacity:1}.slick-prev.slick-disabled:before,.slick-next.slick-disabled:before{opacity:.25}.slick-prev:before,.slick-next:before{font-family:"FontAwesome";font-size:20px;line-height:1;color:#ba2619;opacity:.75;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-prev{left:15px}[dir="rtl"] .slick-prev{left:auto;right:15px}.slick-prev:before{content:""}[dir="rtl"] .slick-prev:before{content:""}.slick-next{right:15px}[dir="rtl"] .slick-next{left:15px;right:auto}.slick-next:before{content:""}[dir="rtl"] .slick-next:before{content:""}.slick-slider{margin-bottom:30px}.slick-dots{margin:0;position:absolute;bottom:30px;list-style:none;display:block;text-align:center;padding:0;width:100%}.slick-dots li{position:relative;display:inline-block;height:20px;width:20px;margin:0 5px;padding:0;cursor:pointer}.slick-dots li button{border:0;background:transparent;display:block;height:20px;width:20px;outline:none;line-height:0;font-size:0;color:transparent;padding:5px;cursor:pointer}.slick-dots li button:hover,.slick-dots li button:focus{outline:none}.slick-dots li button:hover:before,.slick-dots li button:focus:before{opacity:1}.slick-dots li button:before{position:absolute;top:0;left:0;content:"";width:20px;height:20px;font-family:"FontAwesome";font-size:12px;line-height:20px;text-align:center;color:#000;opacity:.25;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.slick-dots li.slick-active button:before{color:#ba2619;opacity:.75}/*! * Font Awesome 4.4.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */@font-face{font-family:'FontAwesome';src:url("./fonts/fontawesome-webfont.eot?v=4.4.0");src:url("./fonts/fontawesome-webfont.eot?#iefix&v=4.4.0") format("embedded-opentype"),url("./fonts/fontawesome-webfont.woff2?v=4.4.0") format("woff2"),url("./fonts/fontawesome-webfont.woff?v=4.4.0") format("woff"),url("./fonts/fontawesome-webfont.ttf?v=4.4.0") format("truetype"),url("./fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before{content:""}.fa-check-circle:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.maxWidth{width:100%}.hidden{display:none}*{transition:all 0.15s ease}body{background-color:#333}body>main{padding:2.5rem 0;background-color:#fff}@media only screen and (max-width: 40em){body>main{padding:1.25rem 0}}body>main img{margin-bottom:1.25rem}@media only screen and (max-width: 40em){aside{margin-bottom:1.5rem}}@media only screen and (max-width: 40em){.row{overflow:hidden}}body>footer{background-color:#333;padding:2.5rem 0;color:#999}body>footer p,body>footer h1,body>footer h2,body>footer h3,body>footer h4,body>footer h5,body>footer h6{color:inherit}body>footer a{color:#e23424}code{font-size:85%;color:inherit !important;overflow-x:scroll;-webkit-overflow-scrolling:touch}.highlight{border:solid 1px #ddd;background:#fff;padding:1em;line-height:23px;margin-bottom:30px;white-space:pre;overflow-x:auto;word-break:inherit;word-wrap:inherit;background:#ffffff}@media only screen and (max-width: 40em){.highlight{overflow-x:scroll;-webkit-overflow-scrolling:touch}}.highlight code{background-color:transparent;border:none;padding:0}.highlight td{padding:8px 15px}.highlight .gl{background:#fafafa;border-right:1px solid #ddd;color:#999;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.highlight .c{color:#999988;font-style:italic}.highlight .err{color:#a61717;background-color:#e3d2d2}.highlight .k{font-weight:bold}.highlight .o{font-weight:bold}.highlight .cm{color:#999988;font-style:italic}.highlight .cp{color:#999999;font-weight:bold}.highlight .c1{color:#999988;font-style:italic}.highlight .cs{color:#999999;font-weight:bold;font-style:italic}.highlight .gd{color:#000000;background-color:#ffdddd}.highlight .gd .x{color:#000000;background-color:#ffaaaa}.highlight .ge{font-style:italic}.highlight .gr{color:#aa0000}.highlight .gh{color:#999999}.highlight .gi{color:#000000;background-color:#ddffdd}.highlight .gi .x{color:#000000;background-color:#aaffaa}.highlight .go{color:#888888}.highlight .gp{color:#555555}.highlight .gs{font-weight:bold}.highlight .gu{color:#aaaaaa}.highlight .gt{color:#aa0000}.highlight .kc{font-weight:bold}.highlight .kd{font-weight:bold}.highlight .kp{font-weight:bold}.highlight .kr{font-weight:bold}.highlight .kt{color:#445588;font-weight:bold}.highlight .m{color:#009999}.highlight .s{color:#d14}.highlight .na{color:#008080}.highlight .nb{color:#0086B3}.highlight .nc{color:#445588;font-weight:bold}.highlight .no{color:#008080}.highlight .ni{color:#800080}.highlight .ne{color:#990000;font-weight:bold}.highlight .nf{color:#990000;font-weight:bold}.highlight .nn{color:#555555}.highlight .nt{color:#000080}.highlight .nv{color:#008080}.highlight .ow{font-weight:bold}.highlight .w{color:#bbbbbb}.highlight .mf{color:#009999}.highlight .mh{color:#009999}.highlight .mi{color:#009999}.highlight .mo{color:#009999}.highlight .sb{color:#d14}.highlight .sc{color:#d14}.highlight .sd{color:#d14}.highlight .s2{color:#d14}.highlight .se{color:#d14}.highlight .sh{color:#d14}.highlight .si{color:#d14}.highlight .sx{color:#d14}.highlight .sr{color:#009926}.highlight .s1{color:#d14}.highlight .ss{color:#990073}.highlight .bp{color:#999999}.highlight .vc{color:#008080}.highlight .vg{color:#008080}.highlight .vi{color:#008080}.highlight .il{color:#009999}kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:solid 1px #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.social__icons{margin-bottom:10px}.social__icon{display:inline-block;margin-right:10px}.slider picture img{width:100%}.videoWrapper{position:relative;padding-top:56.25%;margin-bottom:1.25rem}.videoWrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}.icon{position:relative;top:1px;display:inline-block;width:16px;height:16px}.icon-color{border:1px solid #aaa}.icon-color-white{background-color:#fff}.icon-color-black{background-color:#000}.icon-color-red{background-color:#ba2619}.toc-header{margin-bottom:0}#toc{display:block;margin:1rem 0 0 0}#toc>ol{margin-left:0}#toc>ol>li{margin-bottom:0.5rem}#toc ol{list-style-type:none}.clickable-header{cursor:pointer}.clickable-header:hover{text-decoration:underline}.top-level-header{display:inline-block}.back-to-top{position:relative;margin-left:8px;cursor:pointer;top:-3px}.contentSearch{margin-bottom:30px}@media only screen and (max-width: 40em){.contentSearch{margin-bottom:5px}}.contentSearch-wrapper{position:relative}.contentSearch-wrapper.small-collapse{margin:0 !important}.liveSearch-field{margin-bottom:0 !important}.liveSearch-button{margin-bottom:0}.liveSearch-result-list{position:absolute;width:100%;height:auto;background:white;border:1px #ccc;border-style:none solid solid solid;z-index:99;margin:0;list-style-type:none}@media only screen and (max-width: 40em){.liveSearch-result-list{position:relative}}.liveSearch-result-list li a{-webkit-transition:all 0.15s ease;transition:all 0.15s ease;padding:4px 10px;display:block;width:100%;height:100%;line-height:1.2}.liveSearch-result-list li a:hover{background-color:#eee}.liveSearch-result-list li a:first-child{padding-top:8px}.liveSearch-result-list li a:last-child{padding-bottom:8px}.searchPage-result-list{line-height:1.2;list-style-type:none}.searchPage-result-list li{margin-bottom:20px}@media only screen and (max-width: 40em){.searchPage-result-list li{margin-bottom:15px}}.searchPage-result-list li a{font-weight:bold;color:#1a0dab}.searchPage-result-list li a:hover{color:#1a0dab;text-decoration:underline}.searchPage-result-list li .url{color:#006621}@media only screen and (max-width: 40em){.searchPage-result-list li .additionalInfo{display:none}}.article-list{margin:0;padding:0;list-style-type:none}.article-list header h1{font-size:1.5rem}article header{margin-bottom:0.5rem}article header h1{margin-bottom:0}article .meta{font-size:0.9em}.table-wrapper{width:100%;overflow-y:auto;_overflow:auto;margin:0 0 1em} diff --git a/docs/js/footer.dev.js b/docs/js/footer.dev.js index 6d39cf285c..b594d22c70 100644 --- a/docs/js/footer.dev.js +++ b/docs/js/footer.dev.js @@ -2,743 +2,1594 @@ * Build: http://modernizr.com/download/#-shiv-cssclasses-load */ ;window.Modernizr=function(a,b,c){function u(a){j.cssText=a}function v(a,b){return u(prefixes.join(a+";")+(b||""))}function w(a,b){return typeof a===b}function x(a,b){return!!~(""+a).indexOf(b)}function y(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:w(f,"function")?f.bind(d||b):f}return!1}var d="2.8.3",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m={},n={},o={},p=[],q=p.slice,r,s={}.hasOwnProperty,t;!w(s,"undefined")&&!w(s.call,"undefined")?t=function(a,b){return s.call(a,b)}:t=function(a,b){return b in a&&w(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=q.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(q.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(q.call(arguments)))};return e});for(var z in m)t(m,z)&&(r=z.toLowerCase(),e[r]=m[z](),p.push((e[r]?"":"no-")+r));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)t(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},u(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+p.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f img._pfLastSize) { + img._pfLastSize = img.offsetWidth; + sizes = img.sizes; + img.sizes += ",100vw"; + setTimeout(function () { + img.sizes = sizes; + }); + } + }; - // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers - info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle; + var findPictureImgs = function () { + var i; + var imgs = document.querySelectorAll("picture > img, img[srcset][sizes]"); + for (i = 0; i < imgs.length; i++) { + fixRespimg(imgs[i]); + } + }; + var onResize = function () { + clearTimeout(timer); + timer = setTimeout(findPictureImgs, 99); + }; + var mq = window.matchMedia && matchMedia("(orientation: landscape)"); + var init = function () { + onResize(); - styleMedia = { - matchMedium: function(media) { - var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }'; + if (mq && mq.addListener) { + mq.addListener(onResize); + } + }; - // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers - if (style.styleSheet) { - style.styleSheet.cssText = text; - } else { - style.textContent = text; - } + dummySrc.srcset = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - // Test if media query is true or false - return info.width === '1px'; - } - }; - } + if (/^[c|i]|d$/.test(document.readyState || "")) { + init(); + } else { + document.addEventListener("DOMContentLoaded", init); + } - return function(media) { - return { - matches: styleMedia.matchMedium(media || 'all'), - media: media || 'all' - }; - }; -}()); -/*! Picturefill - Responsive Images that work today. -* Author: Scott Jehl, Filament Group, 2012 ( new proposal implemented by Shawn Jansepar ) -* License: MIT/GPLv2 -* Spec: http://picture.responsiveimages.org/ -*/ -(function( w, doc, image ) { - // Enable strict mode - "use strict"; + return onResize; + })()); + } +})(window); - function expose(picturefill) { - /* expose picturefill */ - if ( typeof module === "object" && typeof module.exports === "object" ) { - // CommonJS, just export - module.exports = picturefill; - } else if ( typeof define === "function" && define.amd ) { - // AMD support - define( "picturefill", function() { return picturefill; } ); - } - if ( typeof w === "object" ) { - // If no AMD and we are in the browser, attach to window - w.picturefill = picturefill; - } - } +/*! Picturefill - v3.0.2 + * http://scottjehl.github.io/picturefill + * Copyright (c) 2015 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; + * License: MIT + */ - // If picture is supported, well, that's awesome. Let's get outta here... - if ( w.HTMLPictureElement ) { - expose(function() { }); - return; - } +(function (window, document, undefined) { + // Enable strict mode + "use strict"; - // HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround) - doc.createElement( "picture" ); + // HTML shim|v it for old IE (IE9 will still need the HTML video tag workaround) + document.createElement("picture"); - // local object for method references and testing exposure - var pf = w.picturefill || {}; + var warn, eminpx, alwaysCheckWDescriptor, evalId; + // local object for method references and testing exposure + var pf = {}; + var isSupportTestReady = false; + var noop = function () { + }; + var image = document.createElement("img"); + var getImgAttr = image.getAttribute; + var setImgAttr = image.setAttribute; + var removeImgAttr = image.removeAttribute; + var docElem = document.documentElement; + var types = {}; + var cfg = { + //resource selection: + algorithm: "" + }; + var srcAttr = "data-pfsrc"; + var srcsetAttr = srcAttr + "set"; + // ua sniffing is done for undetectable img loading features, + // to do some non crucial perf optimizations + var ua = navigator.userAgent; + var supportAbort = (/rident/).test(ua) || ((/ecko/).test(ua) && ua.match(/rv\:(\d+)/) && RegExp.$1 > 35 ); + var curSrcProp = "currentSrc"; + var regWDesc = /\s+\+?\d+(e\d+)?w/; + var regSize = /(\([^)]+\))?\s*(.+)/; + var setOptions = window.picturefillCFG; + /** + * Shortcut property for https://w3c.github.io/webappsec/specs/mixedcontent/#restricts-mixed-content ( for easy overriding in tests ) + */ + // baseStyle also used by getEmValue (i.e.: width: 1em is important) + var baseStyle = "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)"; + var fsCss = "font-size:100%!important;"; + var isVwDirty = true; - var regWDesc = /\s+\+?\d+(e\d+)?w/; + var cssCache = {}; + var sizeLengthCache = {}; + var DPR = window.devicePixelRatio; + var units = { + px: 1, + "in": 96 + }; + var anchor = document.createElement("a"); + /** + * alreadyRun flag used for setOptions. is it true setOptions will reevaluate + * @type {boolean} + */ + var alreadyRun = false; - // namespace - pf.ns = "picturefill"; + // Reusable, non-"g" Regexes - // srcset support test - (function() { - pf.srcsetSupported = "srcset" in image; - pf.sizesSupported = "sizes" in image; - })(); + // (Don't use \s, to avoid matching non-breaking space.) + var regexLeadingSpaces = /^[ \t\n\r\u000c]+/, + regexLeadingCommasOrSpaces = /^[, \t\n\r\u000c]+/, + regexLeadingNotSpaces = /^[^ \t\n\r\u000c]+/, + regexTrailingCommas = /[,]+$/, + regexNonNegativeInteger = /^\d+$/, - // just a string trim workaround - pf.trim = function( str ) { - return str.trim ? str.trim() : str.replace( /^\s+|\s+$/g, "" ); - }; + // ( Positive or negative or unsigned integers or decimals, without or without exponents. + // Must include at least one digit. + // According to spec tests any decimal point must be followed by a digit. + // No leading plus sign is allowed.) + // https://html.spec.whatwg.org/multipage/infrastructure.html#valid-floating-point-number + regexFloatingPoint = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/; - /** - * Gets a string and returns the absolute URL - * @param src - * @returns {String} absolute URL - */ - pf.makeUrl = (function() { - var anchor = doc.createElement( "a" ); - return function(src) { - anchor.href = src; - return anchor.href; - }; - })(); + var on = function (obj, evt, fn, capture) { + if (obj.addEventListener) { + obj.addEventListener(evt, fn, capture || false); + } else if (obj.attachEvent) { + obj.attachEvent("on" + evt, fn); + } + }; - /** - * Shortcut method for https://w3c.github.io/webappsec/specs/mixedcontent/#restricts-mixed-content ( for easy overriding in tests ) - */ - pf.restrictsMixedContent = function() { - return w.location.protocol === "https:"; - }; - /** - * Shortcut method for matchMedia ( for easy overriding in tests ) - */ + /** + * simple memoize function: + */ - pf.matchesMedia = function( media ) { - return w.matchMedia && w.matchMedia( media ).matches; - }; + var memoize = function (fn) { + var cache = {}; + return function (input) { + if (!(input in cache)) { + cache[input] = fn(input); + } + return cache[input]; + }; + }; - // Shortcut method for `devicePixelRatio` ( for easy overriding in tests ) - pf.getDpr = function() { - return ( w.devicePixelRatio || 1 ); - }; + // UTILITY FUNCTIONS - /** - * Get width in css pixel value from a "length" value - * http://dev.w3.org/csswg/css-values-3/#length-value - */ - pf.getWidthFromLength = function( length ) { - var cssValue; - // If a length is specified and doesn’t contain a percentage, and it is greater than 0 or using `calc`, use it. Else, abort. - if ( !(length && length.indexOf( "%" ) > -1 === false && ( parseFloat( length ) > 0 || length.indexOf( "calc(" ) > -1 )) ) { - return false; + // Manual is faster than RegEx + // http://jsperf.com/whitespace-character/5 + function isSpace(c) { + return (c === "\u0020" || // space + c === "\u0009" || // horizontal tab + c === "\u000A" || // new line + c === "\u000C" || // form feed + c === "\u000D"); // carriage return + } + + /** + * gets a mediaquery and returns a boolean or gets a css length and returns a number + * @param css mediaqueries or css length + * @returns {boolean|number} + * + * based on: https://gist.github.com/jonathantneal/db4f77009b155f083738 + */ + var evalCSS = (function () { + + var regLength = /^([\d\.]+)(em|vw|px)$/; + var replace = function () { + var args = arguments, index = 0, string = args[0]; + while (++index in args) { + string = string.replace(args[index], args[++index]); + } + return string; + }; + + var buildStr = memoize(function (css) { + + return "return " + replace((css || "").toLowerCase(), + // interpret `and` + /\band\b/g, "&&", + + // interpret `,` + /,/g, "||", + + // interpret `min-` as >= + /min-([a-z-\s]+):/g, "e.$1>=", + + // interpret `max-` as <= + /max-([a-z-\s]+):/g, "e.$1<=", + + //calc value + /calc([^)]+)/g, "($1)", + + // interpret css values + /(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)", + //make eval less evil + /^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/ig, "" + ) + ";"; + }); + + return function (css, length) { + var parsedLength; + if (!(css in cssCache)) { + cssCache[css] = false; + if (length && (parsedLength = css.match(regLength))) { + cssCache[css] = parsedLength[1] * units[parsedLength[2]]; + } else { + /*jshint evil:true */ + try { + cssCache[css] = new Function("e", buildStr(css))(units); + } catch (e) { + } + /*jshint evil:false */ + } + } + return cssCache[css]; + }; + })(); + + var setResolution = function (candidate, sizesattr) { + if (candidate.w) { // h = means height: || descriptor.type === 'h' do not handle yet... + candidate.cWidth = pf.calcListLength(sizesattr || "100vw"); + candidate.res = candidate.w / candidate.cWidth; + } else { + candidate.res = candidate.d; + } + return candidate; + }; + + /** + * + * @param opt + */ + var picturefill = function (opt) { + + if (!isSupportTestReady) { + return; } - /** - * If length is specified in `vw` units, use `%` instead since the div we’re measuring - * is injected at the top of the document. - * - * TODO: maybe we should put this behind a feature test for `vw`? The risk of doing this is possible browser inconsistancies with vw vs % - */ - length = length.replace( "vw", "%" ); + var elements, i, plen; - // Create a cached element for getting length value widths - if ( !pf.lengthEl ) { - pf.lengthEl = doc.createElement( "div" ); + var options = opt || {}; - // Positioning styles help prevent padding/margin/width on `html` or `body` from throwing calculations off. - pf.lengthEl.style.cssText = "border:0;display:block;font-size:1em;left:0;margin:0;padding:0;position:absolute;visibility:hidden"; + if (options.elements && options.elements.nodeType === 1) { + if (options.elements.nodeName.toUpperCase() === "IMG") { + options.elements = [options.elements]; + } else { + options.context = options.elements; + options.elements = null; + } + } - // Add a class, so that everyone knows where this element comes from - pf.lengthEl.className = "helper-from-picturefill-js"; - } + elements = options.elements || pf.qsa((options.context || document), ( options.reevaluate || options.reselect ) ? pf.sel : pf.selShort); - pf.lengthEl.style.width = "0px"; + if ((plen = elements.length)) { - try { - pf.lengthEl.style.width = length; - } catch ( e ) {} + pf.setupRun(options); + alreadyRun = true; - doc.body.appendChild(pf.lengthEl); + // Loop through all elements + for (i = 0; i < plen; i++) { + pf.fillImg(elements[i], options); + } - cssValue = pf.lengthEl.offsetWidth; + pf.teardownRun(options); + } + }; - if ( cssValue <= 0 ) { - cssValue = false; - } + /** + * outputs a warning for the developer + * @param {message} + * @type {Function} + */ + warn = ( window.console && console.warn ) ? + function (message) { + console.warn(message); + } : + noop + ; - doc.body.removeChild( pf.lengthEl ); + if (!(curSrcProp in image)) { + curSrcProp = "src"; + } - return cssValue; - }; + // Add support for standard mime types. + types["image/jpeg"] = true; + types["image/gif"] = true; + types["image/png"] = true; - pf.detectTypeSupport = function( type, typeUri ) { + function detectTypeSupport(type, typeUri) { // based on Modernizr's lossless img-webp test // note: asynchronous - var image = new w.Image(); - image.onerror = function() { - pf.types[ type ] = false; + var image = new window.Image(); + image.onerror = function () { + types[type] = false; picturefill(); }; - image.onload = function() { - pf.types[ type ] = image.width === 1; + image.onload = function () { + types[type] = image.width === 1; picturefill(); }; image.src = typeUri; - return "pending"; - }; - // container of supported mime types that one might need to qualify before using - pf.types = pf.types || {}; + } - pf.initTypeDetects = function() { - // Add support for standard mime types - pf.types[ "image/jpeg" ] = true; - pf.types[ "image/gif" ] = true; - pf.types[ "image/png" ] = true; - pf.types[ "image/svg+xml" ] = doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1"); - pf.types[ "image/webp" ] = pf.detectTypeSupport("image/webp", "data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAAAAAAfQ//73v/+BiOh/AAA="); - }; + // test svg support + types["image/svg+xml"] = document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1"); - pf.verifyTypeSupport = function( source ) { - var type = source.getAttribute( "type" ); - // if type attribute exists, return test result, otherwise return true - if ( type === null || type === "" ) { - return true; - } else { - var pfType = pf.types[ type ]; - // if the type test is a function, run it and return "pending" status. The function will rerun picturefill on pending elements once finished. - if ( typeof pfType === "string" && pfType !== "pending") { - pf.types[ type ] = pf.detectTypeSupport( type, pfType ); - return "pending"; - } else if ( typeof pfType === "function" ) { - pfType(); - return "pending"; - } else { - return pfType; - } - } - }; + /** + * updates the internal vW property with the current viewport width in px + */ + function updateMetrics() { - // Parses an individual `size` and returns the length, and optional media query - pf.parseSize = function( sourceSizeStr ) { - var match = /(\([^)]+\))?\s*(.+)/g.exec( sourceSizeStr ); - return { - media: match && match[1], - length: match && match[2] - }; - }; + isVwDirty = false; + DPR = window.devicePixelRatio; + cssCache = {}; + sizeLengthCache = {}; - // Takes a string of sizes and returns the width in pixels as a number - pf.findWidthFromSourceSize = function( sourceSizeListStr ) { - // Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33% - // or (min-width:30em) calc(30% - 15px) - var sourceSizeList = pf.trim( sourceSizeListStr ).split( /\s*,\s*/ ), - winningLength; + pf.DPR = DPR || 1; - for ( var i = 0, len = sourceSizeList.length; i < len; i++ ) { - // Match ? length, ie ( min-width: 50em ) 100% - var sourceSize = sourceSizeList[ i ], - // Split "( min-width: 50em ) 100%" into separate strings - parsedSize = pf.parseSize( sourceSize ), - length = parsedSize.length, - media = parsedSize.media; + units.width = Math.max(window.innerWidth || 0, docElem.clientWidth); + units.height = Math.max(window.innerHeight || 0, docElem.clientHeight); - if ( !length ) { - continue; - } - // if there is no media query or it matches, choose this as our winning length - if ( (!media || pf.matchesMedia( media )) && - // pass the length to a method that can properly determine length - // in pixels based on these formats: http://dev.w3.org/csswg/css-values-3/#length-value - (winningLength = pf.getWidthFromLength( length )) ) { - break; - } - } + units.vw = units.width / 100; + units.vh = units.height / 100; - //if we have no winningLength fallback to 100vw - return winningLength || Math.max(w.innerWidth || 0, doc.documentElement.clientWidth); - }; + evalId = [units.height, units.width, DPR].join("-"); - pf.parseSrcset = function( srcset ) { - /** - * A lot of this was pulled from Boris Smus’ parser for the now-defunct WHATWG `srcset` - * https://github.com/borismus/srcset-polyfill/blob/master/js/srcset-info.js - * - * 1. Let input (`srcset`) be the value passed to this algorithm. - * 2. Let position be a pointer into input, initially pointing at the start of the string. - * 3. Let raw candidates be an initially empty ordered list of URLs with associated - * unparsed descriptors. The order of entries in the list is the order in which entries - * are added to the list. - */ - var candidates = []; + units.em = pf.getEmValue(); + units.rem = units.em; + } - while ( srcset !== "" ) { - srcset = srcset.replace( /^\s+/g, "" ); + function chooseLowRes(lowerValue, higherValue, dprValue, isCached) { + var bonusFactor, tooMuch, bonus, meanDensity; - // 5. Collect a sequence of characters that are not space characters, and let that be url. - var pos = srcset.search(/\s/g), - url, descriptor = null; + //experimental + if (cfg.algorithm === "saveData") { + if (lowerValue > 2.7) { + meanDensity = dprValue + 1; + } else { + tooMuch = higherValue - dprValue; + bonusFactor = Math.pow(lowerValue - 0.6, 1.5); - if ( pos !== -1 ) { - url = srcset.slice( 0, pos ); + bonus = tooMuch * bonusFactor; - var last = url.slice(-1); + if (isCached) { + bonus += 0.1 * bonusFactor; + } - // 6. If url ends with a U+002C COMMA character (,), remove that character from url - // and let descriptors be the empty string. Otherwise, follow these substeps - // 6.1. If url is empty, then jump to the step labeled descriptor parser. - - if ( last === "," || url === "" ) { - url = url.replace( /,+$/, "" ); - descriptor = ""; - } - srcset = srcset.slice( pos + 1 ); - - // 6.2. Collect a sequence of characters that are not U+002C COMMA characters (,), and - // let that be descriptors. - if ( descriptor === null ) { - var descpos = srcset.indexOf( "," ); - if ( descpos !== -1 ) { - descriptor = srcset.slice( 0, descpos ); - srcset = srcset.slice( descpos + 1 ); - } else { - descriptor = srcset; - srcset = ""; - } - } - } else { - url = srcset; - srcset = ""; - } - - // 7. Add url to raw candidates, associated with descriptors. - if ( url || descriptor ) { - candidates.push({ - url: url, - descriptor: descriptor - }); - } - } - return candidates; - }; - - pf.parseDescriptor = function( descriptor, sizesattr ) { - // 11. Descriptor parser: Let candidates be an initially empty source set. The order of entries in the list - // is the order in which entries are added to the list. - var sizes = sizesattr || "100vw", - sizeDescriptor = descriptor && descriptor.replace( /(^\s+|\s+$)/g, "" ), - widthInCssPixels = pf.findWidthFromSourceSize( sizes ), - resCandidate; - - if ( sizeDescriptor ) { - var splitDescriptor = sizeDescriptor.split(" "); - - for (var i = splitDescriptor.length - 1; i >= 0; i--) { - var curr = splitDescriptor[ i ], - lastchar = curr && curr.slice( curr.length - 1 ); - - if ( ( lastchar === "h" || lastchar === "w" ) && !pf.sizesSupported ) { - resCandidate = parseFloat( ( parseInt( curr, 10 ) / widthInCssPixels ) ); - } else if ( lastchar === "x" ) { - var res = curr && parseFloat( curr, 10 ); - resCandidate = res && !isNaN( res ) ? res : 1; - } - } - } - return resCandidate || 1; - }; - - /** - * Takes a srcset in the form of url/ - * ex. "images/pic-medium.png 1x, images/pic-medium-2x.png 2x" or - * "images/pic-medium.png 400w, images/pic-medium-2x.png 800w" or - * "images/pic-small.png" - * Get an array of image candidates in the form of - * {url: "/foo/bar.png", resolution: 1} - * where resolution is http://dev.w3.org/csswg/css-values-3/#resolution-value - * If sizes is specified, resolution is calculated - */ - pf.getCandidatesFromSourceSet = function( srcset, sizes ) { - var candidates = pf.parseSrcset( srcset ), - formattedCandidates = []; - - for ( var i = 0, len = candidates.length; i < len; i++ ) { - var candidate = candidates[ i ]; - - formattedCandidates.push({ - url: candidate.url, - resolution: pf.parseDescriptor( candidate.descriptor, sizes ) - }); - } - return formattedCandidates; - }; - - /** - * if it's an img element and it has a srcset property, - * we need to remove the attribute so we can manipulate src - * (the property's existence infers native srcset support, and a srcset-supporting browser will prioritize srcset's value over our winning picture candidate) - * this moves srcset's value to memory for later use and removes the attr - */ - pf.dodgeSrcset = function( img ) { - if ( img.srcset ) { - img[ pf.ns ].srcset = img.srcset; - img.srcset = ""; - img.setAttribute( "data-pfsrcset", img[ pf.ns ].srcset ); - } - }; - - // Accept a source or img element and process its srcset and sizes attrs - pf.processSourceSet = function( el ) { - var srcset = el.getAttribute( "srcset" ), - sizes = el.getAttribute( "sizes" ), - candidates = []; - - // if it's an img element, use the cached srcset property (defined or not) - if ( el.nodeName.toUpperCase() === "IMG" && el[ pf.ns ] && el[ pf.ns ].srcset ) { - srcset = el[ pf.ns ].srcset; - } - - if ( srcset ) { - candidates = pf.getCandidatesFromSourceSet( srcset, sizes ); - } - return candidates; - }; - - pf.backfaceVisibilityFix = function( picImg ) { - // See: https://github.com/scottjehl/picturefill/issues/332 - var style = picImg.style || {}, - WebkitBackfaceVisibility = "webkitBackfaceVisibility" in style, - currentZoom = style.zoom; - - if (WebkitBackfaceVisibility) { - style.zoom = ".999"; - - WebkitBackfaceVisibility = picImg.offsetWidth; - - style.zoom = currentZoom; - } - }; - - pf.setIntrinsicSize = (function() { - var urlCache = {}; - var setSize = function( picImg, width, res ) { - if ( width ) { - picImg.setAttribute( "width", parseInt(width / res, 10) ); + meanDensity = lowerValue + bonus; } - }; - return function( picImg, bestCandidate ) { - var img; - if ( !picImg[ pf.ns ] || w.pfStopIntrinsicSize ) { - return; - } - if ( picImg[ pf.ns ].dims === undefined ) { - picImg[ pf.ns].dims = picImg.getAttribute("width") || picImg.getAttribute("height"); - } - if ( picImg[ pf.ns].dims ) { return; } + } else { + meanDensity = (dprValue > 1) ? + Math.sqrt(lowerValue * higherValue) : + lowerValue; + } - if ( bestCandidate.url in urlCache ) { - setSize( picImg, urlCache[bestCandidate.url], bestCandidate.resolution ); - } else { - img = doc.createElement( "img" ); - img.onload = function() { - urlCache[bestCandidate.url] = img.width; + return meanDensity > dprValue; + } - //IE 10/11 don't calculate width for svg outside document - if ( !urlCache[bestCandidate.url] ) { - try { - doc.body.appendChild( img ); - urlCache[bestCandidate.url] = img.width || img.offsetWidth; - doc.body.removeChild( img ); - } catch(e){} + function applyBestCandidate(img) { + var srcSetCandidates; + var matchingSet = pf.getSet(img); + var evaluated = false; + if (matchingSet !== "pending") { + evaluated = evalId; + if (matchingSet) { + srcSetCandidates = pf.setRes(matchingSet); + pf.applySetCandidate(srcSetCandidates, img); + } + } + img[pf.ns].evaled = evaluated; + } + + function ascendingSort(a, b) { + return a.res - b.res; + } + + function setSrcToCur(img, src, set) { + var candidate; + if (!set && src) { + set = img[pf.ns].sets; + set = set && set[set.length - 1]; + } + + candidate = getCandidateForSrc(src, set); + + if (candidate) { + src = pf.makeUrl(src); + img[pf.ns].curSrc = src; + img[pf.ns].curCan = candidate; + + if (!candidate.res) { + setResolution(candidate, candidate.set.sizes); + } + } + return candidate; + } + + function getCandidateForSrc(src, set) { + var i, candidate, candidates; + if (src && set) { + candidates = pf.parseSet(set); + src = pf.makeUrl(src); + for (i = 0; i < candidates.length; i++) { + if (src === pf.makeUrl(candidates[i].url)) { + candidate = candidates[i]; + break; + } + } + } + return candidate; + } + + function getAllSourceElements(picture, candidates) { + var i, len, source, srcset; + + // SPEC mismatch intended for size and perf: + // actually only source elements preceding the img should be used + // also note: don't use qsa here, because IE8 sometimes doesn't like source as the key part in a selector + var sources = picture.getElementsByTagName("source"); + + for (i = 0, len = sources.length; i < len; i++) { + source = sources[i]; + source[pf.ns] = true; + srcset = source.getAttribute("srcset"); + + // if source does not have a srcset attribute, skip + if (srcset) { + candidates.push({ + srcset: srcset, + media: source.getAttribute("media"), + type: source.getAttribute("type"), + sizes: source.getAttribute("sizes") + }); + } + } + } + + /** + * Srcset Parser + * By Alex Bell | MIT License + * + * @returns Array [{url: _, d: _, w: _, h:_, set:_(????)}, ...] + * + * Based super duper closely on the reference algorithm at: + * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-srcset-attribute + */ + + // 1. Let input be the value passed to this algorithm. + // (TO-DO : Explain what "set" argument is here. Maybe choose a more + // descriptive & more searchable name. Since passing the "set" in really has + // nothing to do with parsing proper, I would prefer this assignment eventually + // go in an external fn.) + function parseSrcset(input, set) { + + function collectCharacters(regEx) { + var chars, + match = regEx.exec(input.substring(pos)); + if (match) { + chars = match[0]; + pos += chars.length; + return chars; + } + } + + var inputLength = input.length, + url, + descriptors, + currentDescriptor, + state, + c, + + // 2. Let position be a pointer into input, initially pointing at the start + // of the string. + pos = 0, + + // 3. Let candidates be an initially empty source set. + candidates = []; + + /** + * Adds descriptor properties to a candidate, pushes to the candidates array + * @return undefined + */ + // (Declared outside of the while loop so that it's only created once. + // (This fn is defined before it is used, in order to pass JSHINT. + // Unfortunately this breaks the sequencing of the spec comments. :/ ) + function parseDescriptors() { + + // 9. Descriptor parser: Let error be no. + var pError = false, + + // 10. Let width be absent. + // 11. Let density be absent. + // 12. Let future-compat-h be absent. (We're implementing it now as h) + w, d, h, i, + candidate = {}, + desc, lastChar, value, intVal, floatVal; + + // 13. For each descriptor in descriptors, run the appropriate set of steps + // from the following list: + for (i = 0; i < descriptors.length; i++) { + desc = descriptors[i]; + + lastChar = desc[desc.length - 1]; + value = desc.substring(0, desc.length - 1); + intVal = parseInt(value, 10); + floatVal = parseFloat(value); + + // If the descriptor consists of a valid non-negative integer followed by + // a U+0077 LATIN SMALL LETTER W character + if (regexNonNegativeInteger.test(value) && (lastChar === "w")) { + + // If width and density are not both absent, then let error be yes. + if (w || d) { + pError = true; } - if ( picImg.src === bestCandidate.url ) { - setSize( picImg, urlCache[bestCandidate.url], bestCandidate.resolution ); - } - picImg = null; - img.onload = null; - img = null; - }; - img.src = bestCandidate.url; - } - }; - })(); + // Apply the rules for parsing non-negative integers to the descriptor. + // If the result is zero, let error be yes. + // Otherwise, let width be the result. + if (intVal === 0) { + pError = true; + } else { + w = intVal; + } - pf.applyBestCandidate = function( candidates, picImg ) { - var candidate, - length, - bestCandidate; + // If the descriptor consists of a valid floating-point number followed by + // a U+0078 LATIN SMALL LETTER X character + } else if (regexFloatingPoint.test(value) && (lastChar === "x")) { - candidates.sort( pf.ascendingSort ); + // If width, density and future-compat-h are not all absent, then let error + // be yes. + if (w || d || h) { + pError = true; + } - length = candidates.length; - bestCandidate = candidates[ length - 1 ]; + // Apply the rules for parsing floating-point number values to the descriptor. + // If the result is less than zero, let error be yes. Otherwise, let density + // be the result. + if (floatVal < 0) { + pError = true; + } else { + d = floatVal; + } - for ( var i = 0; i < length; i++ ) { - candidate = candidates[ i ]; - if ( candidate.resolution >= pf.getDpr() ) { - bestCandidate = candidate; - break; - } - } + // If the descriptor consists of a valid non-negative integer followed by + // a U+0068 LATIN SMALL LETTER H character + } else if (regexNonNegativeInteger.test(value) && (lastChar === "h")) { - if ( bestCandidate ) { + // If height and density are not both absent, then let error be yes. + if (h || d) { + pError = true; + } - bestCandidate.url = pf.makeUrl( bestCandidate.url ); + // Apply the rules for parsing non-negative integers to the descriptor. + // If the result is zero, let error be yes. Otherwise, let future-compat-h + // be the result. + if (intVal === 0) { + pError = true; + } else { + h = intVal; + } - if ( picImg.src !== bestCandidate.url ) { - if ( pf.restrictsMixedContent() && bestCandidate.url.substr(0, "http:".length).toLowerCase() === "http:" ) { - if ( window.console !== undefined ) { - console.warn( "Blocked mixed content image " + bestCandidate.url ); - } - } else { - picImg.src = bestCandidate.url; - // currentSrc attribute and property to match - // http://picture.responsiveimages.org/#the-img-element - picImg.currentSrc = picImg.src; + // Anything else, Let error be yes. + } else { + pError = true; + } + } // (close step 13 for loop) - pf.backfaceVisibilityFix( picImg ); - } - } + // 15. If error is still no, then append a new image source to candidates whose + // URL is url, associated with a width width if not absent and a pixel + // density density if not absent. Otherwise, there is a parse error. + if (!pError) { + candidate.url = url; - pf.setIntrinsicSize(picImg, bestCandidate); - } - }; + if (w) { + candidate.w = w; + } + if (d) { + candidate.d = d; + } + if (h) { + candidate.h = h; + } + if (!h && !d && !w) { + candidate.d = 1; + } + if (candidate.d === 1) { + set.has1x = true; + } + candidate.set = set; - pf.ascendingSort = function( a, b ) { - return a.resolution - b.resolution; - }; + candidates.push(candidate); + } + } // (close parseDescriptors fn) - /** - * In IE9, elements get removed if they aren't children of - * video elements. Thus, we conditionally wrap source elements - * using - * and must account for that here by moving those source elements - * back into the picture element. - */ - pf.removeVideoShim = function( picture ) { - var videos = picture.getElementsByTagName( "video" ); - if ( videos.length ) { - var video = videos[ 0 ], - vsources = video.getElementsByTagName( "source" ); - while ( vsources.length ) { - picture.insertBefore( vsources[ 0 ], video ); - } - // Remove the video element once we're finished removing its children - video.parentNode.removeChild( video ); - } - }; + /** + * Tokenizes descriptor properties prior to parsing + * Returns undefined. + * (Again, this fn is defined before it is used, in order to pass JSHINT. + * Unfortunately this breaks the logical sequencing of the spec comments. :/ ) + */ + function tokenize() { - /** - * Find all `img` elements, and add them to the candidate list if they have - * a `picture` parent, a `sizes` attribute in basic `srcset` supporting browsers, - * a `srcset` attribute at all, and they haven’t been evaluated already. - */ - pf.getAllElements = function() { - var elems = [], - imgs = doc.getElementsByTagName( "img" ); + // 8.1. Descriptor tokeniser: Skip whitespace + collectCharacters(regexLeadingSpaces); - for ( var h = 0, len = imgs.length; h < len; h++ ) { - var currImg = imgs[ h ]; + // 8.2. Let current descriptor be the empty string. + currentDescriptor = ""; - if ( currImg.parentNode.nodeName.toUpperCase() === "PICTURE" || - ( currImg.getAttribute( "srcset" ) !== null ) || currImg[ pf.ns ] && currImg[ pf.ns ].srcset !== null ) { - elems.push( currImg ); - } - } - return elems; - }; + // 8.3. Let state be in descriptor. + state = "in descriptor"; - pf.getMatch = function( img, picture ) { - var sources = picture.childNodes, - match; + while (true) { - // Go through each child, and if they have media queries, evaluate them - for ( var j = 0, slen = sources.length; j < slen; j++ ) { - var source = sources[ j ]; + // 8.4. Let c be the character at position. + c = input.charAt(pos); - // ignore non-element nodes - if ( source.nodeType !== 1 ) { - continue; - } + // Do the following depending on the value of state. + // For the purpose of this step, "EOF" is a special character representing + // that position is past the end of input. - // Hitting the `img` element that started everything stops the search for `sources`. - // If no previous `source` matches, the `img` itself is evaluated later. - if ( source === img ) { - return match; - } + // In descriptor + if (state === "in descriptor") { + // Do the following, depending on the value of c: - // ignore non-`source` nodes - if ( source.nodeName.toUpperCase() !== "SOURCE" ) { - continue; - } - // if it's a source element that has the `src` property set, throw a warning in the console - if ( source.getAttribute( "src" ) !== null && typeof console !== undefined ) { - console.warn("The `src` attribute is invalid on `picture` `source` element; instead, use `srcset`."); - } + // Space character + // If current descriptor is not empty, append current descriptor to + // descriptors and let current descriptor be the empty string. + // Set state to after descriptor. + if (isSpace(c)) { + if (currentDescriptor) { + descriptors.push(currentDescriptor); + currentDescriptor = ""; + state = "after descriptor"; + } - var media = source.getAttribute( "media" ); + // U+002C COMMA (,) + // Advance position to the next character in input. If current descriptor + // is not empty, append current descriptor to descriptors. Jump to the step + // labeled descriptor parser. + } else if (c === ",") { + pos += 1; + if (currentDescriptor) { + descriptors.push(currentDescriptor); + } + parseDescriptors(); + return; - // if source does not have a srcset attribute, skip - if ( !source.getAttribute( "srcset" ) ) { - continue; - } + // U+0028 LEFT PARENTHESIS (() + // Append c to current descriptor. Set state to in parens. + } else if (c === "\u0028") { + currentDescriptor = currentDescriptor + c; + state = "in parens"; - // if there's no media specified, OR w.matchMedia is supported - if ( ( !media || pf.matchesMedia( media ) ) ) { - var typeSupported = pf.verifyTypeSupport( source ); + // EOF + // If current descriptor is not empty, append current descriptor to + // descriptors. Jump to the step labeled descriptor parser. + } else if (c === "") { + if (currentDescriptor) { + descriptors.push(currentDescriptor); + } + parseDescriptors(); + return; - if ( typeSupported === true ) { - match = source; - break; - } else if ( typeSupported === "pending" ) { - return false; - } - } - } + // Anything else + // Append c to current descriptor. + } else { + currentDescriptor = currentDescriptor + c; + } + // (end "in descriptor" - return match; - }; + // In parens + } else if (state === "in parens") { - function picturefill( opt ) { - var elements, - element, - parent, - firstMatch, - candidates, - options = opt || {}; + // U+0029 RIGHT PARENTHESIS ()) + // Append c to current descriptor. Set state to in descriptor. + if (c === ")") { + currentDescriptor = currentDescriptor + c; + state = "in descriptor"; - elements = options.elements || pf.getAllElements(); + // EOF + // Append current descriptor to descriptors. Jump to the step labeled + // descriptor parser. + } else if (c === "") { + descriptors.push(currentDescriptor); + parseDescriptors(); + return; - // Loop through all elements - for ( var i = 0, plen = elements.length; i < plen; i++ ) { - element = elements[ i ]; - parent = element.parentNode; - firstMatch = undefined; - candidates = undefined; + // Anything else + // Append c to current descriptor. + } else { + currentDescriptor = currentDescriptor + c; + } - // immediately skip non-`img` nodes - if ( element.nodeName.toUpperCase() !== "IMG" ) { - continue; - } + // After descriptor + } else if (state === "after descriptor") { - // expando for caching data on the img - if ( !element[ pf.ns ] ) { - element[ pf.ns ] = {}; - } + // Do the following, depending on the value of c: + // Space character: Stay in this state. + if (isSpace(c)) { - // if the element has already been evaluated, skip it unless - // `options.reevaluate` is set to true ( this, for example, - // is set to true when running `picturefill` on `resize` ). - if ( !options.reevaluate && element[ pf.ns ].evaluated ) { - continue; - } + // EOF: Jump to the step labeled descriptor parser. + } else if (c === "") { + parseDescriptors(); + return; - // if `img` is in a `picture` element - if ( parent && parent.nodeName.toUpperCase() === "PICTURE" ) { + // Anything else + // Set state to in descriptor. Set position to the previous character in input. + } else { + state = "in descriptor"; + pos -= 1; - // IE9 video workaround - pf.removeVideoShim( parent ); + } + } - // return the first match which might undefined - // returns false if there is a pending source - // TODO the return type here is brutal, cleanup - firstMatch = pf.getMatch( element, parent ); + // Advance position to the next character in input. + pos += 1; - // if any sources are pending in this picture due to async type test(s) - // remove the evaluated attr and skip for now ( the pending test will - // rerun picturefill on this element when complete) - if ( firstMatch === false ) { - continue; - } - } else { - firstMatch = undefined; - } + // Repeat this step. + } // (close while true loop) + } - // Cache and remove `srcset` if present and we’re going to be doing `picture`/`srcset`/`sizes` polyfilling to it. - if ( ( parent && parent.nodeName.toUpperCase() === "PICTURE" ) || - ( !pf.sizesSupported && ( element.srcset && regWDesc.test( element.srcset ) ) ) ) { - pf.dodgeSrcset( element ); - } + // 4. Splitting loop: Collect a sequence of characters that are space + // characters or U+002C COMMA characters. If any U+002C COMMA characters + // were collected, that is a parse error. + while (true) { + collectCharacters(regexLeadingCommasOrSpaces); - if ( firstMatch ) { - candidates = pf.processSourceSet( firstMatch ); - pf.applyBestCandidate( candidates, element ); - } else { - // No sources matched, so we’re down to processing the inner `img` as a source. - candidates = pf.processSourceSet( element ); + // 5. If position is past the end of input, return candidates and abort these steps. + if (pos >= inputLength) { + return candidates; // (we're done, this is the sole return path) + } - if ( element.srcset === undefined || element[ pf.ns ].srcset ) { - // Either `srcset` is completely unsupported, or we need to polyfill `sizes` functionality. - pf.applyBestCandidate( candidates, element ); - } // Else, resolution-only `srcset` is supported natively. - } + // 6. Collect a sequence of characters that are not space characters, + // and let that be url. + url = collectCharacters(regexLeadingNotSpaces); - // set evaluated to true to avoid unnecessary reparsing - element[ pf.ns ].evaluated = true; - } - } + // 7. Let descriptors be a new empty list. + descriptors = []; - /** - * Sets up picture polyfill by polling the document and running - * the polyfill every 250ms until the document is ready. - * Also attaches picturefill on resize - */ - function runPicturefill() { - pf.initTypeDetects(); - picturefill(); - var intervalId = setInterval( function() { - // When the document has finished loading, stop checking for new images - // https://github.com/ded/domready/blob/master/ready.js#L15 - picturefill(); + // 8. If url ends with a U+002C COMMA character (,), follow these substeps: + // (1). Remove all trailing U+002C COMMA characters from url. If this removed + // more than one character, that is a parse error. + if (url.slice(-1) === ",") { + url = url.replace(regexTrailingCommas, ""); + // (Jump ahead to step 9 to skip tokenization and just push the candidate). + parseDescriptors(); - if ( /^loaded|^i|^c/.test( doc.readyState ) ) { - clearInterval( intervalId ); - return; - } - }, 250 ); + // Otherwise, follow these substeps: + } else { + tokenize(); + } // (close else of step 8) - function checkResize() { - var resizeThrottle; + // 16. Return to the step labeled splitting loop. + } // (Close of big while loop.) + } - if ( !w._picturefillWorking ) { - w._picturefillWorking = true; - w.clearTimeout( resizeThrottle ); - resizeThrottle = w.setTimeout( function() { - picturefill({ reevaluate: true }); - w._picturefillWorking = false; - }, 60 ); - } - } + /* + * Sizes Parser + * + * By Alex Bell | MIT License + * + * Non-strict but accurate and lightweight JS Parser for the string value + * + * Reference algorithm at: + * https://html.spec.whatwg.org/multipage/embedded-content.html#parse-a-sizes-attribute + * + * Most comments are copied in directly from the spec + * (except for comments in parens). + * + * Grammar is: + * = # [ , ]? | + * = + * = + * http://www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-sizes + * + * E.g. "(max-width: 30em) 100vw, (max-width: 50em) 70vw, 100vw" + * or "(min-width: 30em), calc(30vw - 15px)" or just "30vw" + * + * Returns the first valid with a media condition that evaluates to true, + * or "100vw" if all valid media conditions evaluate to false. + * + */ - if ( w.addEventListener ) { - w.addEventListener( "resize", checkResize, false ); - } else if ( w.attachEvent ) { - w.attachEvent( "onresize", checkResize ); - } - } + function parseSizes(strValue) { - runPicturefill(); + // (Percentage CSS lengths are not allowed in this case, to avoid confusion: + // https://html.spec.whatwg.org/multipage/embedded-content.html#valid-source-size-list + // CSS allows a single optional plus or minus sign: + // http://www.w3.org/TR/CSS2/syndata.html#numbers + // CSS is ASCII case-insensitive: + // http://www.w3.org/TR/CSS2/syndata.html#characters ) + // Spec allows exponential notation for type: + // http://dev.w3.org/csswg/css-values/#numbers + var regexCssLengthWithUnits = /^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i; - /* expose methods for testing */ - picturefill._ = pf; + // (This is a quick and lenient test. Because of optional unlimited-depth internal + // grouping parens and strict spacing rules, this could get very complicated.) + var regexCssCalc = /^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i; - expose( picturefill ); + var i; + var unparsedSizesList; + var unparsedSizesListLength; + var unparsedSize; + var lastComponentValue; + var size; -} )( window, window.document, new window.Image() ); + // UTILITY FUNCTIONS + + // (Toy CSS parser. The goals here are: + // 1) expansive test coverage without the weight of a full CSS parser. + // 2) Avoiding regex wherever convenient. + // Quick tests: http://jsfiddle.net/gtntL4gr/3/ + // Returns an array of arrays.) + function parseComponentValues(str) { + var chrctr; + var component = ""; + var componentArray = []; + var listArray = []; + var parenDepth = 0; + var pos = 0; + var inComment = false; + + function pushComponent() { + if (component) { + componentArray.push(component); + component = ""; + } + } + + function pushComponentArray() { + if (componentArray[0]) { + listArray.push(componentArray); + componentArray = []; + } + } + + // (Loop forwards from the beginning of the string.) + while (true) { + chrctr = str.charAt(pos); + + if (chrctr === "") { // ( End of string reached.) + pushComponent(); + pushComponentArray(); + return listArray; + } else if (inComment) { + if ((chrctr === "*") && (str[pos + 1] === "/")) { // (At end of a comment.) + inComment = false; + pos += 2; + pushComponent(); + continue; + } else { + pos += 1; // (Skip all characters inside comments.) + continue; + } + } else if (isSpace(chrctr)) { + // (If previous character in loop was also a space, or if + // at the beginning of the string, do not add space char to + // component.) + if ((str.charAt(pos - 1) && isSpace(str.charAt(pos - 1)) ) || !component) { + pos += 1; + continue; + } else if (parenDepth === 0) { + pushComponent(); + pos += 1; + continue; + } else { + // (Replace any space character with a plain space for legibility.) + chrctr = " "; + } + } else if (chrctr === "(") { + parenDepth += 1; + } else if (chrctr === ")") { + parenDepth -= 1; + } else if (chrctr === ",") { + pushComponent(); + pushComponentArray(); + pos += 1; + continue; + } else if ((chrctr === "/") && (str.charAt(pos + 1) === "*")) { + inComment = true; + pos += 2; + continue; + } + + component = component + chrctr; + pos += 1; + } + } + + function isValidNonNegativeSourceSizeValue(s) { + if (regexCssLengthWithUnits.test(s) && (parseFloat(s) >= 0)) { + return true; + } + if (regexCssCalc.test(s)) { + return true; + } + // ( http://www.w3.org/TR/CSS2/syndata.html#numbers says: + // "-0 is equivalent to 0 and is not a negative number." which means that + // unitless zero and unitless negative zero must be accepted as special cases.) + if ((s === "0") || (s === "-0") || (s === "+0")) { + return true; + } + return false; + } + + // When asked to parse a sizes attribute from an element, parse a + // comma-separated list of component values from the value of the element's + // sizes attribute (or the empty string, if the attribute is absent), and let + // unparsed sizes list be the result. + // http://dev.w3.org/csswg/css-syntax/#parse-comma-separated-list-of-component-values + + unparsedSizesList = parseComponentValues(strValue); + unparsedSizesListLength = unparsedSizesList.length; + + // For each unparsed size in unparsed sizes list: + for (i = 0; i < unparsedSizesListLength; i++) { + unparsedSize = unparsedSizesList[i]; + + // 1. Remove all consecutive s from the end of unparsed size. + // ( parseComponentValues() already omits spaces outside of parens. ) + + // If unparsed size is now empty, that is a parse error; continue to the next + // iteration of this algorithm. + // ( parseComponentValues() won't push an empty array. ) + + // 2. If the last component value in unparsed size is a valid non-negative + // , let size be its value and remove the component value + // from unparsed size. Any CSS function other than the calc() function is + // invalid. Otherwise, there is a parse error; continue to the next iteration + // of this algorithm. + // http://dev.w3.org/csswg/css-syntax/#parse-component-value + lastComponentValue = unparsedSize[unparsedSize.length - 1]; + + if (isValidNonNegativeSourceSizeValue(lastComponentValue)) { + size = lastComponentValue; + unparsedSize.pop(); + } else { + continue; + } + + // 3. Remove all consecutive s from the end of unparsed + // size. If unparsed size is now empty, return size and exit this algorithm. + // If this was not the last item in unparsed sizes list, that is a parse error. + if (unparsedSize.length === 0) { + return size; + } + + // 4. Parse the remaining component values in unparsed size as a + // . If it does not parse correctly, or it does parse + // correctly but the evaluates to false, continue to the + // next iteration of this algorithm. + // (Parsing all possible compound media conditions in JS is heavy, complicated, + // and the payoff is unclear. Is there ever an situation where the + // media condition parses incorrectly but still somehow evaluates to true? + // Can we just rely on the browser/polyfill to do it?) + unparsedSize = unparsedSize.join(" "); + if (!(pf.matchesMedia(unparsedSize) )) { + continue; + } + + // 5. Return size and exit this algorithm. + return size; + } + + // If the above algorithm exhausts unparsed sizes list without returning a + // size value, return 100vw. + return "100vw"; + } + + // namespace + pf.ns = ("pf" + new Date().getTime()).substr(0, 9); + + // srcset support test + pf.supSrcset = "srcset" in image; + pf.supSizes = "sizes" in image; + pf.supPicture = !!window.HTMLPictureElement; + + // UC browser does claim to support srcset and picture, but not sizes, + // this extended test reveals the browser does support nothing + if (pf.supSrcset && pf.supPicture && !pf.supSizes) { + (function (image2) { + image.srcset = "data:,a"; + image2.src = "data:,a"; + pf.supSrcset = image.complete === image2.complete; + pf.supPicture = pf.supSrcset && pf.supPicture; + })(document.createElement("img")); + } + + // Safari9 has basic support for sizes, but does't expose the `sizes` idl attribute + if (pf.supSrcset && !pf.supSizes) { + + (function () { + var width2 = "data:image/gif;base64,R0lGODlhAgABAPAAAP///wAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw=="; + var width1 = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + var img = document.createElement("img"); + var test = function () { + var width = img.width; + + if (width === 2) { + pf.supSizes = true; + } + + alwaysCheckWDescriptor = pf.supSrcset && !pf.supSizes; + + isSupportTestReady = true; + // force async + setTimeout(picturefill); + }; + + img.onload = test; + img.onerror = test; + img.setAttribute("sizes", "9px"); + + img.srcset = width1 + " 1w," + width2 + " 9w"; + img.src = width1; + })(); + + } else { + isSupportTestReady = true; + } + + // using pf.qsa instead of dom traversing does scale much better, + // especially on sites mixing responsive and non-responsive images + pf.selShort = "picture>img,img[srcset]"; + pf.sel = pf.selShort; + pf.cfg = cfg; + + /** + * Shortcut property for `devicePixelRatio` ( for easy overriding in tests ) + */ + pf.DPR = (DPR || 1 ); + pf.u = units; + + // container of supported mime types that one might need to qualify before using + pf.types = types; + + pf.setSize = noop; + + /** + * Gets a string and returns the absolute URL + * @param src + * @returns {String} absolute URL + */ + + pf.makeUrl = memoize(function (src) { + anchor.href = src; + return anchor.href; + }); + + /** + * Gets a DOM element or document and a selctor and returns the found matches + * Can be extended with jQuery/Sizzle for IE7 support + * @param context + * @param sel + * @returns {NodeList|Array} + */ + pf.qsa = function (context, sel) { + return ( "querySelector" in context ) ? context.querySelectorAll(sel) : []; + }; + + /** + * Shortcut method for matchMedia ( for easy overriding in tests ) + * wether native or pf.mMQ is used will be decided lazy on first call + * @returns {boolean} + */ + pf.matchesMedia = function () { + if (window.matchMedia && (matchMedia("(min-width: 0.1em)") || {}).matches) { + pf.matchesMedia = function (media) { + return !media || ( matchMedia(media).matches ); + }; + } else { + pf.matchesMedia = pf.mMQ; + } + + return pf.matchesMedia.apply(this, arguments); + }; + + /** + * A simplified matchMedia implementation for IE8 and IE9 + * handles only min-width/max-width with px or em values + * @param media + * @returns {boolean} + */ + pf.mMQ = function (media) { + return media ? evalCSS(media) : true; + }; + + /** + * Returns the calculated length in css pixel from the given sourceSizeValue + * http://dev.w3.org/csswg/css-values-3/#length-value + * intended Spec mismatches: + * * Does not check for invalid use of CSS functions + * * Does handle a computed length of 0 the same as a negative and therefore invalid value + * @param sourceSizeValue + * @returns {Number} + */ + pf.calcLength = function (sourceSizeValue) { + + var value = evalCSS(sourceSizeValue, true) || false; + if (value < 0) { + value = false; + } + + return value; + }; + + /** + * Takes a type string and checks if its supported + */ + + pf.supportsType = function (type) { + return ( type ) ? types[type] : true; + }; + + /** + * Parses a sourceSize into mediaCondition (media) and sourceSizeValue (length) + * @param sourceSizeStr + * @returns {*} + */ + pf.parseSize = memoize(function (sourceSizeStr) { + var match = ( sourceSizeStr || "" ).match(regSize); + return { + media: match && match[1], + length: match && match[2] + }; + }); + + pf.parseSet = function (set) { + if (!set.cands) { + set.cands = parseSrcset(set.srcset, set); + } + return set.cands; + }; + + /** + * returns 1em in css px for html/body default size + * function taken from respondjs + * @returns {*|number} + */ + pf.getEmValue = function () { + var body; + if (!eminpx && (body = document.body)) { + var div = document.createElement("div"), + originalHTMLCSS = docElem.style.cssText, + originalBodyCSS = body.style.cssText; + + div.style.cssText = baseStyle; + + // 1em in a media query is the value of the default font size of the browser + // reset docElem and body to ensure the correct value is returned + docElem.style.cssText = fsCss; + body.style.cssText = fsCss; + + body.appendChild(div); + eminpx = div.offsetWidth; + body.removeChild(div); + + //also update eminpx before returning + eminpx = parseFloat(eminpx, 10); + + // restore the original values + docElem.style.cssText = originalHTMLCSS; + body.style.cssText = originalBodyCSS; + + } + return eminpx || 16; + }; + + /** + * Takes a string of sizes and returns the width in pixels as a number + */ + pf.calcListLength = function (sourceSizeListStr) { + // Split up source size list, ie ( max-width: 30em ) 100%, ( max-width: 50em ) 50%, 33% + // + // or (min-width:30em) calc(30% - 15px) + if (!(sourceSizeListStr in sizeLengthCache) || cfg.uT) { + var winningLength = pf.calcLength(parseSizes(sourceSizeListStr)); + + sizeLengthCache[sourceSizeListStr] = !winningLength ? units.width : winningLength; + } + + return sizeLengthCache[sourceSizeListStr]; + }; + + /** + * Takes a candidate object with a srcset property in the form of url/ + * ex. "images/pic-medium.png 1x, images/pic-medium-2x.png 2x" or + * "images/pic-medium.png 400w, images/pic-medium-2x.png 800w" or + * "images/pic-small.png" + * Get an array of image candidates in the form of + * {url: "/foo/bar.png", resolution: 1} + * where resolution is http://dev.w3.org/csswg/css-values-3/#resolution-value + * If sizes is specified, res is calculated + */ + pf.setRes = function (set) { + var candidates; + if (set) { + + candidates = pf.parseSet(set); + + for (var i = 0, len = candidates.length; i < len; i++) { + setResolution(candidates[i], set.sizes); + } + } + return candidates; + }; + + pf.setRes.res = setResolution; + + pf.applySetCandidate = function (candidates, img) { + if (!candidates.length) { + return; + } + var candidate, + i, + j, + length, + bestCandidate, + curSrc, + curCan, + candidateSrc, + abortCurSrc; + + var imageData = img[pf.ns]; + var dpr = pf.DPR; + + curSrc = imageData.curSrc || img[curSrcProp]; + + curCan = imageData.curCan || setSrcToCur(img, curSrc, candidates[0].set); + + // if we have a current source, we might either become lazy or give this source some advantage + if (curCan && curCan.set === candidates[0].set) { + + // if browser can abort image request and the image has a higher pixel density than needed + // and this image isn't downloaded yet, we skip next part and try to save bandwidth + abortCurSrc = (supportAbort && !img.complete && curCan.res - 0.1 > dpr); + + if (!abortCurSrc) { + curCan.cached = true; + + // if current candidate is "best", "better" or "okay", + // set it to bestCandidate + if (curCan.res >= dpr) { + bestCandidate = curCan; + } + } + } + + if (!bestCandidate) { + + candidates.sort(ascendingSort); + + length = candidates.length; + bestCandidate = candidates[length - 1]; + + for (i = 0; i < length; i++) { + candidate = candidates[i]; + if (candidate.res >= dpr) { + j = i - 1; + + // we have found the perfect candidate, + // but let's improve this a little bit with some assumptions ;-) + if (candidates[j] && + (abortCurSrc || curSrc !== pf.makeUrl(candidate.url)) && + chooseLowRes(candidates[j].res, candidate.res, dpr, candidates[j].cached)) { + + bestCandidate = candidates[j]; + + } else { + bestCandidate = candidate; + } + break; + } + } + } + + if (bestCandidate) { + + candidateSrc = pf.makeUrl(bestCandidate.url); + + imageData.curSrc = candidateSrc; + imageData.curCan = bestCandidate; + + if (candidateSrc !== curSrc) { + pf.setSrc(img, bestCandidate); + } + pf.setSize(img); + } + }; + + pf.setSrc = function (img, bestCandidate) { + var origWidth; + img.src = bestCandidate.url; + + // although this is a specific Safari issue, we don't want to take too much different code paths + if (bestCandidate.set.type === "image/svg+xml") { + origWidth = img.style.width; + img.style.width = (img.offsetWidth + 1) + "px"; + + // next line only should trigger a repaint + // if... is only done to trick dead code removal + if (img.offsetWidth + 1) { + img.style.width = origWidth; + } + } + }; + + pf.getSet = function (img) { + var i, set, supportsType; + var match = false; + var sets = img [pf.ns].sets; + + for (i = 0; i < sets.length && !match; i++) { + set = sets[i]; + + if (!set.srcset || !pf.matchesMedia(set.media) || !(supportsType = pf.supportsType(set.type))) { + continue; + } + + if (supportsType === "pending") { + set = supportsType; + } + + match = set; + break; + } + + return match; + }; + + pf.parseSets = function (element, parent, options) { + var srcsetAttribute, imageSet, isWDescripor, srcsetParsed; + + var hasPicture = parent && parent.nodeName.toUpperCase() === "PICTURE"; + var imageData = element[pf.ns]; + + if (imageData.src === undefined || options.src) { + imageData.src = getImgAttr.call(element, "src"); + if (imageData.src) { + setImgAttr.call(element, srcAttr, imageData.src); + } else { + removeImgAttr.call(element, srcAttr); + } + } + + if (imageData.srcset === undefined || options.srcset || !pf.supSrcset || element.srcset) { + srcsetAttribute = getImgAttr.call(element, "srcset"); + imageData.srcset = srcsetAttribute; + srcsetParsed = true; + } + + imageData.sets = []; + + if (hasPicture) { + imageData.pic = true; + getAllSourceElements(parent, imageData.sets); + } + + if (imageData.srcset) { + imageSet = { + srcset: imageData.srcset, + sizes: getImgAttr.call(element, "sizes") + }; + + imageData.sets.push(imageSet); + + isWDescripor = (alwaysCheckWDescriptor || imageData.src) && regWDesc.test(imageData.srcset || ""); + + // add normal src as candidate, if source has no w descriptor + if (!isWDescripor && imageData.src && !getCandidateForSrc(imageData.src, imageSet) && !imageSet.has1x) { + imageSet.srcset += ", " + imageData.src; + imageSet.cands.push({ + url: imageData.src, + d: 1, + set: imageSet + }); + } + + } else if (imageData.src) { + imageData.sets.push({ + srcset: imageData.src, + sizes: null + }); + } + + imageData.curCan = null; + imageData.curSrc = undefined; + + // if img has picture or the srcset was removed or has a srcset and does not support srcset at all + // or has a w descriptor (and does not support sizes) set support to false to evaluate + imageData.supported = !( hasPicture || ( imageSet && !pf.supSrcset ) || (isWDescripor && !pf.supSizes) ); + + if (srcsetParsed && pf.supSrcset && !imageData.supported) { + if (srcsetAttribute) { + setImgAttr.call(element, srcsetAttr, srcsetAttribute); + element.srcset = ""; + } else { + removeImgAttr.call(element, srcsetAttr); + } + } + + if (imageData.supported && !imageData.srcset && ((!imageData.src && element.src) || element.src !== pf.makeUrl(imageData.src))) { + if (imageData.src === null) { + element.removeAttribute("src"); + } else { + element.src = imageData.src; + } + } + + imageData.parsed = true; + }; + + pf.fillImg = function (element, options) { + var imageData; + var extreme = options.reselect || options.reevaluate; + + // expando for caching data on the img + if (!element[pf.ns]) { + element[pf.ns] = {}; + } + + imageData = element[pf.ns]; + + // if the element has already been evaluated, skip it + // unless `options.reevaluate` is set to true ( this, for example, + // is set to true when running `picturefill` on `resize` ). + if (!extreme && imageData.evaled === evalId) { + return; + } + + if (!imageData.parsed || options.reevaluate) { + pf.parseSets(element, element.parentNode, options); + } + + if (!imageData.supported) { + applyBestCandidate(element); + } else { + imageData.evaled = evalId; + } + }; + + pf.setupRun = function () { + if (!alreadyRun || isVwDirty || (DPR !== window.devicePixelRatio)) { + updateMetrics(); + } + }; + + // If picture is supported, well, that's awesome. + if (pf.supPicture) { + picturefill = noop; + pf.fillImg = noop; + } else { + + // Set up picture polyfill by polling the document + (function () { + var isDomReady; + var regReady = window.attachEvent ? /d$|^c/ : /d$|^c|^i/; + + var run = function () { + var readyState = document.readyState || ""; + + timerId = setTimeout(run, readyState === "loading" ? 200 : 999); + if (document.body) { + pf.fillImgs(); + isDomReady = isDomReady || regReady.test(readyState); + if (isDomReady) { + clearTimeout(timerId); + } + + } + }; + + var timerId = setTimeout(run, document.body ? 9 : 99); + + // Also attach picturefill on resize and readystatechange + // http://modernjavascript.blogspot.com/2013/08/building-better-debounce.html + var debounce = function (func, wait) { + var timeout, timestamp; + var later = function () { + var last = (new Date()) - timestamp; + + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + func(); + } + }; + + return function () { + timestamp = new Date(); + + if (!timeout) { + timeout = setTimeout(later, wait); + } + }; + }; + var lastClientWidth = docElem.clientHeight; + var onResize = function () { + isVwDirty = Math.max(window.innerWidth || 0, docElem.clientWidth) !== units.width || docElem.clientHeight !== lastClientWidth; + lastClientWidth = docElem.clientHeight; + if (isVwDirty) { + pf.fillImgs(); + } + }; + + on(window, "resize", debounce(onResize, 99)); + on(document, "readystatechange", run); + })(); + } + + pf.picturefill = picturefill; + //use this internally for easy monkey patching/performance testing + pf.fillImgs = picturefill; + pf.teardownRun = noop; + + /* expose methods for testing */ + picturefill._ = pf; + + window.picturefillCFG = { + pf: pf, + push: function (args) { + var name = args.shift(); + if (typeof pf[name] === "function") { + pf[name].apply(pf, args); + } else { + cfg[name] = args[0]; + if (alreadyRun) { + pf.fillImgs({reselect: true}); + } + } + } + }; + + while (setOptions && setOptions.length) { + window.picturefillCFG.push(setOptions.shift()); + } + + /* expose picturefill */ + window.picturefill = picturefill; + + /* expose picturefill */ + if (typeof module === "object" && typeof module.exports === "object") { + // CommonJS, just export + module.exports = picturefill; + } else if (typeof define === "function" && define.amd) { + // AMD support + define("picturefill", function () { + return picturefill; + }); + } + + // IE8 evals this sync, so it must be the last thing we do + if (!pf.supPicture) { + types["image/webp"] = detectTypeSupport("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA=="); + } + +})(window, document); /*! jQuery v2.2.0 | (c) jQuery Foundation | jquery.org/license */ !function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c}catch(e){}O.set(a,b,c); @@ -2467,7 +3318,7 @@ window.matchMedia || (window.matchMedia = function() { |___/_|_|\___|_|\_(_)/ |___/ |__/ - Version: 1.4.1 + Version: 1.6.0 Author: Ken Wheeler Website: http://kenwheeler.github.io Docs: http://kenwheeler.github.io/slick @@ -2475,9 +3326,7 @@ window.matchMedia || (window.matchMedia = function() { Issues: http://github.com/kenwheeler/slick/issues */ - /* global window, document, define, jQuery, setInterval, clearInterval */ - (function(factory) { 'use strict'; if (typeof define === 'function' && define.amd) { @@ -2498,8 +3347,7 @@ window.matchMedia || (window.matchMedia = function() { function Slick(element, settings) { - var _ = this, - dataSettings, responsiveSettings, breakpoint; + var _ = this, dataSettings; _.defaults = { accessibility: true, @@ -2508,15 +3356,15 @@ window.matchMedia || (window.matchMedia = function() { appendDots: $(element), arrows: true, asNavFor: null, - prevArrow: '', - nextArrow: '', + prevArrow: '', + nextArrow: '', autoplay: false, autoplaySpeed: 3000, centerMode: false, centerPadding: '50px', cssEase: 'ease', customPaging: function(slider, i) { - return ''; + return $('