mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Merge remote-tracking branch 'origin/master' into pl-strings
This commit is contained in:
commit
b6d2cdee69
@ -9,6 +9,7 @@ before_script:
|
|||||||
- pip install pygithub3
|
- pip install pygithub3
|
||||||
script:
|
script:
|
||||||
- python3 tools/deploy.py
|
- python3 tools/deploy.py
|
||||||
|
- python3 tools/sqf_validator.py
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- secure: "KcJQbknBOdC5lA4nFGKPXVRVIGLDXDRzC8XkHuXJCE9pIR/wbxbkvx8fHKcC6SC9eHgzneC3+o4m4+CjIbVvIwDgslRbJ8Y59i90ncONmdoRx1HUYHwuYWVZm9HJFjCsIbrEqhSyyKS+PB3WZVOLbErtNHsgS8f43PTh5Ujg7Vg="
|
- secure: "KcJQbknBOdC5lA4nFGKPXVRVIGLDXDRzC8XkHuXJCE9pIR/wbxbkvx8fHKcC6SC9eHgzneC3+o4m4+CjIbVvIwDgslRbJ8Y59i90ncONmdoRx1HUYHwuYWVZm9HJFjCsIbrEqhSyyKS+PB3WZVOLbErtNHsgS8f43PTh5Ujg7Vg="
|
||||||
|
@ -26,7 +26,7 @@ if (isServer) then {
|
|||||||
["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler);
|
["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler);
|
||||||
["SetSurrendered", {_this call FUNC(setSurrendered)}] call EFUNC(common,addEventHandler);
|
["SetSurrendered", {_this call FUNC(setSurrendered)}] call EFUNC(common,addEventHandler);
|
||||||
|
|
||||||
//Medical Integration Events???
|
//Medical Integration Events
|
||||||
["medical_onUnconscious", {_this call ACE_Captives_fnc_handleOnUnconscious}] call EFUNC(common,addEventHandler);
|
["medical_onUnconscious", {_this call ACE_Captives_fnc_handleOnUnconscious}] call EFUNC(common,addEventHandler);
|
||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
@ -109,3 +109,6 @@ if (_state) then {
|
|||||||
showHUD true;
|
showHUD true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//Global Event after changes:
|
||||||
|
["CaptiveStatusChanged", [_unit, _state, "SetHandcuffed"]] call EFUNC(common,globalEvent);
|
||||||
|
@ -101,3 +101,6 @@ if (_state) then {
|
|||||||
}, 0, [_unit, (ACE_time + 20)]] call CBA_fnc_addPerFrameHandler;
|
}, 0, [_unit, (ACE_time + 20)]] call CBA_fnc_addPerFrameHandler;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//Global Event after changes:
|
||||||
|
["CaptiveStatusChanged", [_unit, _state, "SetSurrendered"]] call EFUNC(common,globalEvent);
|
||||||
|
@ -31,4 +31,6 @@ if (_nearestVehicle isKindOf "Cargo_Base_F" || isNull _nearestVehicle) then {
|
|||||||
|
|
||||||
if (isNull _nearestVehicle) exitWith {false};
|
if (isNull _nearestVehicle) exitWith {false};
|
||||||
|
|
||||||
|
if ((locked _nearestVehicle) >= 2) exitWith {false};
|
||||||
|
|
||||||
[_object, _nearestVehicle] call FUNC(canLoadItemIn)
|
[_object, _nearestVehicle] call FUNC(canLoadItemIn)
|
||||||
|
@ -140,4 +140,10 @@ class CfgVehicles {
|
|||||||
isBicycle = 1;
|
isBicycle = 1;
|
||||||
XEH_DISABLED;
|
XEH_DISABLED;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Bag_Base;
|
||||||
|
class ACE_FakeBackpack: Bag_Base {
|
||||||
|
scope = 1;
|
||||||
|
maximumLoad = 1E6;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
@ -7,9 +7,9 @@
|
|||||||
// PFHs
|
// PFHs
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
//Singe PFEH to handle execNextFrame and waitAndExec:
|
//Singe PFEH to handle execNextFrame, waitAndExec and waitUntilAndExec:
|
||||||
[{
|
[{
|
||||||
private "_entry";
|
private ["_entry", "_deleted"];
|
||||||
|
|
||||||
//Handle the waitAndExec array:
|
//Handle the waitAndExec array:
|
||||||
while {!(GVAR(waitAndExecArray) isEqualTo []) && {GVAR(waitAndExecArray) select 0 select 0 <= ACE_Time}} do {
|
while {!(GVAR(waitAndExecArray) isEqualTo []) && {GVAR(waitAndExecArray) select 0 select 0 <= ACE_Time}} do {
|
||||||
@ -27,6 +27,18 @@
|
|||||||
GVAR(nextFrameBufferA) = GVAR(nextFrameBufferB);
|
GVAR(nextFrameBufferA) = GVAR(nextFrameBufferB);
|
||||||
GVAR(nextFrameBufferB) = [];
|
GVAR(nextFrameBufferB) = [];
|
||||||
GVAR(nextFrameNo) = diag_frameno + 1;
|
GVAR(nextFrameNo) = diag_frameno + 1;
|
||||||
|
|
||||||
|
//Handle the waitUntilAndExec array:
|
||||||
|
_deleted = 0;
|
||||||
|
{
|
||||||
|
// if condition is satisifed call statement
|
||||||
|
if ((_x select 2) call (_x select 0)) then {
|
||||||
|
// make sure to delete the correct handle when multiple conditions are met in one frame
|
||||||
|
GVAR(waitUntilAndExecArray) deleteAt (_forEachIndex - _deleted);
|
||||||
|
_deleted = _deleted + 1;
|
||||||
|
(_x select 2) call (_x select 1);
|
||||||
|
};
|
||||||
|
} forEach GVAR(waitUntilAndExecArray);
|
||||||
}, 0, []] call CBA_fnc_addPerFrameHandler;
|
}, 0, []] call CBA_fnc_addPerFrameHandler;
|
||||||
|
|
||||||
|
|
||||||
|
@ -146,8 +146,10 @@ PREP(resetAllDefaults);
|
|||||||
PREP(restoreVariablesJIP);
|
PREP(restoreVariablesJIP);
|
||||||
PREP(runAfterSettingsInit);
|
PREP(runAfterSettingsInit);
|
||||||
PREP(sanitizeString);
|
PREP(sanitizeString);
|
||||||
|
PREP(selectWeaponMode);
|
||||||
PREP(sendRequest);
|
PREP(sendRequest);
|
||||||
PREP(serverLog);
|
PREP(serverLog);
|
||||||
|
PREP(setAllGear);
|
||||||
PREP(setCaptivityStatus);
|
PREP(setCaptivityStatus);
|
||||||
PREP(setDefinedVariable);
|
PREP(setDefinedVariable);
|
||||||
PREP(setDisableUserInputStatus);
|
PREP(setDisableUserInputStatus);
|
||||||
@ -181,6 +183,7 @@ PREP(unmuteUnit);
|
|||||||
PREP(useItem);
|
PREP(useItem);
|
||||||
PREP(useMagazine);
|
PREP(useMagazine);
|
||||||
PREP(waitAndExecute);
|
PREP(waitAndExecute);
|
||||||
|
PREP(waitUntilAndExecute);
|
||||||
PREP(waveHeightAt);
|
PREP(waveHeightAt);
|
||||||
|
|
||||||
PREP(translateToWeaponSpace);
|
PREP(translateToWeaponSpace);
|
||||||
@ -220,6 +223,10 @@ PREP(getDoorTurrets);
|
|||||||
PREP(getTurretsFFV);
|
PREP(getTurretsFFV);
|
||||||
PREP(getTurretsOther);
|
PREP(getTurretsOther);
|
||||||
|
|
||||||
|
// missing inventory commands
|
||||||
|
PREP(binocularMagazine);
|
||||||
|
PREP(removeBinocularMagazine);
|
||||||
|
|
||||||
// ACE_Debug
|
// ACE_Debug
|
||||||
PREP(exportConfig);
|
PREP(exportConfig);
|
||||||
PREP(getChildren);
|
PREP(getChildren);
|
||||||
@ -282,11 +289,12 @@ PREP(hashListPush);
|
|||||||
|
|
||||||
GVAR(syncedEvents) = HASH_CREATE;
|
GVAR(syncedEvents) = HASH_CREATE;
|
||||||
|
|
||||||
//GVARS for execNextFrame and waitAndExec
|
//GVARS for execNextFrame and waitAndExec and waitUntilAndExecute
|
||||||
GVAR(waitAndExecArray) = [];
|
GVAR(waitAndExecArray) = [];
|
||||||
GVAR(nextFrameNo) = diag_frameno;
|
GVAR(nextFrameNo) = diag_frameno;
|
||||||
GVAR(nextFrameBufferA) = [];
|
GVAR(nextFrameBufferA) = [];
|
||||||
GVAR(nextFrameBufferB) = [];
|
GVAR(nextFrameBufferB) = [];
|
||||||
|
GVAR(waitUntilAndExecArray) = [];
|
||||||
|
|
||||||
GVAR(settingsInitFinished) = false;
|
GVAR(settingsInitFinished) = false;
|
||||||
GVAR(runAtSettingsInitialized) = [];
|
GVAR(runAtSettingsInitialized) = [];
|
||||||
|
40
addons/common/functions/fnc_binocularMagazine.sqf
Normal file
40
addons/common/functions/fnc_binocularMagazine.sqf
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* Author: commy2
|
||||||
|
* Returns the magazine of the units rangefinder.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Unit <OBJECT>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* Magazine of the units binocular <STRING>
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [player] call ace_common_fnc_binocularMagazine
|
||||||
|
*
|
||||||
|
* Public: Yes
|
||||||
|
*
|
||||||
|
* Note: Doesn't work on dead units
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
params ["_unit"];
|
||||||
|
|
||||||
|
private ["_binocular", "_muzzle", "_mode", "_magazine"];
|
||||||
|
|
||||||
|
_binocular = binocular _unit;
|
||||||
|
|
||||||
|
if (_binocular == "") exitWith {""};
|
||||||
|
|
||||||
|
_muzzle = currentMuzzle _unit;
|
||||||
|
_mode = currentWeaponMode _unit;
|
||||||
|
|
||||||
|
_unit selectWeapon _binocular;
|
||||||
|
|
||||||
|
// didn't select the binocular (unit probably dead or not local). function won't work. quit with empty string
|
||||||
|
if (currentWeapon _unit != _binocular) exitWith {""};
|
||||||
|
|
||||||
|
_magazine = currentMagazine _unit;
|
||||||
|
|
||||||
|
[_unit, _muzzle, _mode] call FUNC(selectWeaponMode);
|
||||||
|
|
||||||
|
_magazine
|
@ -18,7 +18,7 @@ private ["_backpackObject", "_holder"];
|
|||||||
|
|
||||||
_backpackObject = backpackContainer _unit;
|
_backpackObject = backpackContainer _unit;
|
||||||
|
|
||||||
_unit addBackpack "Bag_Base";
|
_unit addBackpack "ACE_FakeBackpack";
|
||||||
removeBackpack _unit;
|
removeBackpack _unit;
|
||||||
|
|
||||||
objectParent _backpackObject // return
|
objectParent _backpackObject // return
|
||||||
|
@ -25,6 +25,7 @@
|
|||||||
* 16: Handgun Magazines <ARRAY>
|
* 16: Handgun Magazines <ARRAY>
|
||||||
* 17: Assigned Items (map, compass, watch, etc.) <ARRAY>
|
* 17: Assigned Items (map, compass, watch, etc.) <ARRAY>
|
||||||
* 18: Binoculars <STRING>
|
* 18: Binoculars <STRING>
|
||||||
|
* 19: Binocular Magazine (E.g. Laserbatteries) <STRING>
|
||||||
*
|
*
|
||||||
* Public: Yes
|
* Public: Yes
|
||||||
*
|
*
|
||||||
@ -44,6 +45,7 @@ if (isNull _unit) exitWith {[
|
|||||||
"", ["","","",""], [],
|
"", ["","","",""], [],
|
||||||
"", ["","","",""], [],
|
"", ["","","",""], [],
|
||||||
[],
|
[],
|
||||||
|
"",
|
||||||
""
|
""
|
||||||
]};
|
]};
|
||||||
|
|
||||||
@ -57,5 +59,6 @@ if (isNull _unit) exitWith {[
|
|||||||
secondaryWeapon _unit, secondaryWeaponItems _unit, secondaryWeaponMagazine _unit,
|
secondaryWeapon _unit, secondaryWeaponItems _unit, secondaryWeaponMagazine _unit,
|
||||||
handgunWeapon _unit, handgunItems _unit, handgunMagazine _unit,
|
handgunWeapon _unit, handgunItems _unit, handgunMagazine _unit,
|
||||||
assignedItems _unit,
|
assignedItems _unit,
|
||||||
binocular _unit
|
binocular _unit,
|
||||||
|
[_unit] call FUNC(binocularMagazine)
|
||||||
]
|
]
|
||||||
|
30
addons/common/functions/fnc_removeBinocularMagazine.sqf
Normal file
30
addons/common/functions/fnc_removeBinocularMagazine.sqf
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Author: commy2
|
||||||
|
* Removes the magazine of the units rangefinder.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Unit <OBJECT>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [player] call ace_common_fnc_removeBinocularMagazine
|
||||||
|
*
|
||||||
|
* Public: Yes
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
params ["_unit"];
|
||||||
|
|
||||||
|
private ["_binocular", "_selectBinocular"];
|
||||||
|
|
||||||
|
_binocular = binocular _unit;
|
||||||
|
|
||||||
|
_selectBinocular = currentWeapon _unit == _binocular;
|
||||||
|
|
||||||
|
_unit addWeapon _binocular;
|
||||||
|
|
||||||
|
if (_selectBinocular) then {
|
||||||
|
_unit selectWeapon _binocular;
|
||||||
|
};
|
31
addons/common/functions/fnc_selectWeaponMode.sqf
Normal file
31
addons/common/functions/fnc_selectWeaponMode.sqf
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Author: commy2
|
||||||
|
* Unit selects given muzzle and weapon mode.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: unit <OBJECT>
|
||||||
|
* 1: weapon or Muzzle <STRING>
|
||||||
|
* 2: weapon Mode <STRING>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* Successful? <BOOL>
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [player, primaryWeapon player, "FullAuto"] call ace_common_fnc_selectWeaponMode
|
||||||
|
*
|
||||||
|
* Public: Yes
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
params ["_unit", "_muzzle", "_mode"];
|
||||||
|
|
||||||
|
local _index = 0;
|
||||||
|
|
||||||
|
while {
|
||||||
|
_index < 100 && {currentMuzzle _unit != _muzzle || {currentWeaponMode _unit != _mode}}
|
||||||
|
} do {
|
||||||
|
_unit action ["SwitchWeapon", _unit, _unit, _index];
|
||||||
|
_index = _index + 1;
|
||||||
|
};
|
||||||
|
|
||||||
|
_index < 100 // return
|
172
addons/common/functions/fnc_setAllGear.sqf
Normal file
172
addons/common/functions/fnc_setAllGear.sqf
Normal file
@ -0,0 +1,172 @@
|
|||||||
|
/*
|
||||||
|
* Author: bux578, commy2
|
||||||
|
* Applies gear to unit.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Unit <OBJECT>
|
||||||
|
* 1: All Gear based on return value of ACE_common_fnc_getAllGear <ARRAY>
|
||||||
|
* 2: Remove all attachments from weapons? (default: false) <BOOL>
|
||||||
|
* 3: Remove all items from prefilled backpacks? (default: false) <BOOL>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [player, gear_array, true, true] call ace_common_fnc_setAllGear
|
||||||
|
*
|
||||||
|
* Public: Yes
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
params ["_unit", "_allGear", ["_clearAttachments", false], ["_clearBackpack", false]];
|
||||||
|
|
||||||
|
// remove all starting gear of a player
|
||||||
|
removeAllWeapons _unit;
|
||||||
|
removeGoggles _unit;
|
||||||
|
removeHeadgear _unit;
|
||||||
|
removeVest _unit;
|
||||||
|
removeUniform _unit;
|
||||||
|
removeAllAssignedItems _unit;
|
||||||
|
removeBackpack _unit;
|
||||||
|
|
||||||
|
_allGear params [
|
||||||
|
"_headgear", "_goggles",
|
||||||
|
"_uniform", "_uniformitems",
|
||||||
|
"_vest", "_vestitems",
|
||||||
|
"_backpack", "_backpackitems",
|
||||||
|
"_primaryweapon", "_primaryweaponitems", "_primaryweaponmagazine",
|
||||||
|
"_secondaryweapon", "_secondaryweaponitems", "_secondaryweaponmagazine",
|
||||||
|
"_handgunweapon", "_handgunweaponitems", "_handgunweaponmagazine",
|
||||||
|
"_assigneditems",
|
||||||
|
"_binocular",
|
||||||
|
"_binocularmagazine"
|
||||||
|
];
|
||||||
|
|
||||||
|
// start restoring the items
|
||||||
|
if (_headgear != "") then {_unit addHeadgear _headgear};
|
||||||
|
if (_goggles != "") then {_unit addGoggles _goggles};
|
||||||
|
|
||||||
|
// ensure all weapons being loaded
|
||||||
|
_unit addBackpack "ACE_FakeBackpack";
|
||||||
|
|
||||||
|
// primaryWeapon
|
||||||
|
if (_primaryweapon != "") then {
|
||||||
|
{
|
||||||
|
_unit addMagazine _x;
|
||||||
|
false
|
||||||
|
} count _primaryweaponmagazine;
|
||||||
|
|
||||||
|
_unit addWeapon _primaryweapon;
|
||||||
|
|
||||||
|
if (_clearAttachments) then {
|
||||||
|
removeAllPrimaryWeaponItems _unit;
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
if (_x != "") then {
|
||||||
|
_unit addPrimaryWeaponItem _x;
|
||||||
|
};
|
||||||
|
false
|
||||||
|
} count _primaryweaponitems;
|
||||||
|
};
|
||||||
|
|
||||||
|
// secondaryWeapon
|
||||||
|
if (_secondaryweapon != "") then {
|
||||||
|
{
|
||||||
|
_unit addMagazine _x;
|
||||||
|
false
|
||||||
|
} count _secondaryweaponmagazine;
|
||||||
|
|
||||||
|
_unit addWeapon _secondaryweapon;
|
||||||
|
|
||||||
|
if (_clearAttachments) then {
|
||||||
|
//removeAllSecondaryWeaponItems _unit;
|
||||||
|
{
|
||||||
|
_unit removeSecondaryWeaponItem _x;
|
||||||
|
false
|
||||||
|
} count secondaryWeaponItems _unit;
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
if (_x != "") then {
|
||||||
|
_unit addSecondaryWeaponItem _x;
|
||||||
|
};
|
||||||
|
false
|
||||||
|
} count _secondaryweaponitems;
|
||||||
|
};
|
||||||
|
|
||||||
|
// handgun
|
||||||
|
if (_handgunweapon != "") then {
|
||||||
|
{
|
||||||
|
_unit addMagazine _x;
|
||||||
|
false
|
||||||
|
} count _handgunweaponmagazine;
|
||||||
|
|
||||||
|
_unit addWeapon _handgunweapon;
|
||||||
|
|
||||||
|
if (_clearAttachments) then {
|
||||||
|
removeAllHandgunItems _unit;
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
if (_x != "") then {
|
||||||
|
_unit addHandgunItem _x;
|
||||||
|
};
|
||||||
|
false
|
||||||
|
} count _handgunweaponitems;
|
||||||
|
};
|
||||||
|
|
||||||
|
// binocular
|
||||||
|
_unit addWeapon _binocular;
|
||||||
|
_unit addMagazine _binocularmagazine;
|
||||||
|
|
||||||
|
// done with dummy backpack. now remove
|
||||||
|
removeBackpack _unit;
|
||||||
|
|
||||||
|
// uniform
|
||||||
|
if (_uniform != "") then {
|
||||||
|
_unit forceAddUniform _uniform;
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
_unit addItemToUniform _x;
|
||||||
|
false
|
||||||
|
} count _uniformitems;
|
||||||
|
|
||||||
|
// vest
|
||||||
|
if (_vest != "") then {
|
||||||
|
_unit addVest _vest;
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
_unit addItemToVest _x;
|
||||||
|
false
|
||||||
|
} count _vestitems;
|
||||||
|
|
||||||
|
// backpack
|
||||||
|
if (_backpack != "") then {
|
||||||
|
_unit addBackpack _backpack;
|
||||||
|
|
||||||
|
if (_clearBackpack) then {
|
||||||
|
local _backpackObject = unitBackpack _unit;
|
||||||
|
|
||||||
|
clearMagazineCargoGlobal _backpackObject;
|
||||||
|
clearWeaponCargoGlobal _backpackObject;
|
||||||
|
clearItemCargoGlobal _backpackObject;
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
_unit addItemToBackpack _x;
|
||||||
|
false
|
||||||
|
} count _backpackitems;
|
||||||
|
};
|
||||||
|
|
||||||
|
// assigned items
|
||||||
|
_assignedItems deleteAt (_assignedItems find _binocular);
|
||||||
|
|
||||||
|
{
|
||||||
|
_unit linkItem _x;
|
||||||
|
false
|
||||||
|
} count _assignedItems;
|
||||||
|
|
||||||
|
nil
|
23
addons/common/functions/fnc_waitUntilAndExecute.sqf
Normal file
23
addons/common/functions/fnc_waitUntilAndExecute.sqf
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
/*
|
||||||
|
* Author: joko // Jonas
|
||||||
|
* Executes a code once with after the Condition is True, using a PFH
|
||||||
|
*
|
||||||
|
* Argument:
|
||||||
|
* 0: Condition <CODE>
|
||||||
|
* 1: Code to execute <CODE>
|
||||||
|
* 2: Parameters to run the code with <ARRAY,ANY,NIL>
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [{(_this select 0) == vehicle (_this select 0)}, {(_this select 0) setDamage 1;}, [ACE_player]] call ace_common_fnc_waitAndExecute
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
TRACE_1("Adding",_this);
|
||||||
|
|
||||||
|
GVAR(waitUntilAndExecArray) pushBack _this;
|
||||||
|
nil
|
@ -35,7 +35,7 @@ if (isClass _config && {getText (_config >> "ACE_UsedTube") != ""} && {getNumber
|
|||||||
_unit removeMagazines _magazine;
|
_unit removeMagazines _magazine;
|
||||||
|
|
||||||
if (backpack _unit == "") then {
|
if (backpack _unit == "") then {
|
||||||
_unit addBackpack "Bag_Base";
|
_unit addBackpack "ACE_FakeBackpack";
|
||||||
_unit removeWeapon _launcher;
|
_unit removeWeapon _launcher;
|
||||||
_unit addMagazine _magazine;
|
_unit addMagazine _magazine;
|
||||||
_didAdd = _magazine in (magazines _unit);
|
_didAdd = _magazine in (magazines _unit);
|
||||||
|
@ -8,17 +8,19 @@ GVAR(cachedBuildingActionPairs) = [];
|
|||||||
|
|
||||||
GVAR(ParsedTextCached) = [];
|
GVAR(ParsedTextCached) = [];
|
||||||
|
|
||||||
//Setup text/shadow/size/color settings matrix
|
|
||||||
[] call FUNC(setupTextColors);
|
|
||||||
["SettingChanged", {
|
["SettingChanged", {
|
||||||
PARAMS_1(_name);
|
params ["_name"];
|
||||||
if (_name in [QGVAR(colorTextMax), QGVAR(colorTextMin), QGVAR(colorShadowMax), QGVAR(colorShadowMin), QGVAR(textSize), QGVAR(shadowSetting)]) then {
|
if (({_x == _name} count [QGVAR(colorTextMax), QGVAR(colorTextMin), QGVAR(colorShadowMax), QGVAR(colorShadowMin), QGVAR(textSize), QGVAR(shadowSetting)]) == 1) then {
|
||||||
[] call FUNC(setupTextColors);
|
[] call FUNC(setupTextColors);
|
||||||
};
|
};
|
||||||
}] call EFUNC(common,addEventhandler);
|
}] call EFUNC(common,addEventhandler);
|
||||||
|
|
||||||
// Install the render EH on the main display
|
["SettingsInitialized", {
|
||||||
addMissionEventHandler ["Draw3D", DFUNC(render)];
|
//Setup text/shadow/size/color settings matrix
|
||||||
|
[] call FUNC(setupTextColors);
|
||||||
|
// Install the render EH on the main display
|
||||||
|
addMissionEventHandler ["Draw3D", DFUNC(render)];
|
||||||
|
}] call EFUNC(common,addEventHandler);
|
||||||
|
|
||||||
//Add Actions to Houses:
|
//Add Actions to Houses:
|
||||||
["interactMenuOpened", {_this call FUNC(userActions_addHouseActions)}] call EFUNC(common,addEventHandler);
|
["interactMenuOpened", {_this call FUNC(userActions_addHouseActions)}] call EFUNC(common,addEventHandler);
|
||||||
@ -54,7 +56,7 @@ addMissionEventHandler ["Draw3D", DFUNC(render)];
|
|||||||
// If no menu is open just quit
|
// If no menu is open just quit
|
||||||
if (GVAR(openedMenuType) < 0) exitWith {};
|
if (GVAR(openedMenuType) < 0) exitWith {};
|
||||||
|
|
||||||
EXPLODE_2_PVT(_this,_unit,_isUnconscious);
|
params ["_unit", "_isUnconscious"];
|
||||||
|
|
||||||
if (_unit != ACE_player || !_isUnconscious) exitWith {};
|
if (_unit != ACE_player || !_isUnconscious) exitWith {};
|
||||||
|
|
||||||
|
@ -14,13 +14,14 @@
|
|||||||
|
|
||||||
BEGIN_COUNTER(fnc_render);
|
BEGIN_COUNTER(fnc_render);
|
||||||
|
|
||||||
private ["_cursorPos1", "_cursorPos2", "_p1", "_p2", "_forEachIndex", "_x", "_cursorScreenPos", "_closestDistance", "_closestSelection", "_sPos", "_disSq", "_closest", "_cTime", "_delta", "_foundTarget", "_misMatch", "_hoverPath", "_i", "_actionData", "_player", "_target"];
|
private ["_cursorPos2", "_p1", "_p2", "_forEachIndex", "_x", "_cursorScreenPos", "_closestDistance", "_closestSelection", "_sPos", "_disSq", "_closest", "_cTime", "_delta", "_foundTarget", "_misMatch", "_hoverPath", "_i", "_actionData", "_player", "_target"];
|
||||||
_foundTarget = false;
|
|
||||||
_cursorPos1 = positionCameraToWorld [0, 0, 0];
|
|
||||||
_cursorPos2 = positionCameraToWorld [0, 0, 2];
|
|
||||||
|
|
||||||
|
_foundTarget = false;
|
||||||
|
|
||||||
if (GVAR(openedMenuType) >= 0) then {
|
if (GVAR(openedMenuType) >= 0) then {
|
||||||
|
// _cursorPos1 = positionCameraToWorld [0, 0, 2];
|
||||||
|
_cursorPos2 = positionCameraToWorld [0, 0, 2];
|
||||||
|
|
||||||
// Render all available nearby interactions
|
// Render all available nearby interactions
|
||||||
call FUNC(renderActionPoints);
|
call FUNC(renderActionPoints);
|
||||||
|
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -35,10 +35,12 @@ if (_target getvariable[QGVAR(hasLostBlood), 0] > 0) then {
|
|||||||
_genericMessages pushback LSTRING(noBloodloss);
|
_genericMessages pushback LSTRING(noBloodloss);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (_target getvariable[QGVAR(hasPain), false]) then {
|
if (alive _target) then {
|
||||||
|
if (_target getvariable[QGVAR(hasPain), false]) then {
|
||||||
_genericMessages pushback LSTRING(inPain);
|
_genericMessages pushback LSTRING(inPain);
|
||||||
} else {
|
} else {
|
||||||
_genericMessages pushback LSTRING(noPain);
|
_genericMessages pushback LSTRING(noPain);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
["displayTextStructured", [_caller], [_genericMessages, 3.0, _caller]] call EFUNC(common,targetEvent);
|
["displayTextStructured", [_caller], [_genericMessages, 3.0, _caller]] call EFUNC(common,targetEvent);
|
||||||
|
@ -29,7 +29,7 @@ _amount = 1;
|
|||||||
private "_info";
|
private "_info";
|
||||||
_info = _log select _foreachIndex;
|
_info = _log select _foreachIndex;
|
||||||
_info set [1,(_info select 1) + 1];
|
_info set [1,(_info select 1) + 1];
|
||||||
_info set [2, ACE_time];
|
_info set [2, ACE_gameTime];
|
||||||
_log set [_foreachIndex, _info];
|
_log set [_foreachIndex, _info];
|
||||||
|
|
||||||
_amount = (_info select 1);
|
_amount = (_info select 1);
|
||||||
@ -38,7 +38,7 @@ _amount = 1;
|
|||||||
} foreach _log;
|
} foreach _log;
|
||||||
|
|
||||||
if (!_inList) then {
|
if (!_inList) then {
|
||||||
_log pushback [_newItem, 1, ACE_time];
|
_log pushback [_newItem, 1, ACE_gameTime];
|
||||||
};
|
};
|
||||||
_unit setvariable [QGVAR(triageCard), _log, true];
|
_unit setvariable [QGVAR(triageCard), _log, true];
|
||||||
["Medical_onItemAddedToTriageCard", [_unit, _newItem, _amount]] call EFUNC(common,localEvent);
|
["Medical_onItemAddedToTriageCard", [_unit, _newItem, _amount]] call EFUNC(common,localEvent);
|
||||||
|
@ -94,12 +94,79 @@ if (_impact > 0 && {GVAR(enableAdvancedWounds)}) then {
|
|||||||
[_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening);
|
[_target, _impact, _part, _mostEffectiveSpot, _mostEffectiveInjury, _bandage] call FUNC(handleBandageOpening);
|
||||||
};
|
};
|
||||||
|
|
||||||
// If all wounds have been bandaged, we will reset all damage to 0, so the unit is not showing any blood on the model anymore.
|
// If all wounds to a body part have been bandaged, reset damage to that body part to zero
|
||||||
if (GVAR(healHitPointAfterAdvBandage) && {{(_x select 2) == _part && {((_x select 4) * (_x select 3)) > 0}}count _openWounds == 0}) then {
|
// so that the body part functions normally and blood is removed from the uniform.
|
||||||
_hitSelections = ["head", "body", "hand_l", "hand_r", "leg_l", "leg_r"];
|
// Arma combines left and right arms into a single body part (HitHands), same with left and right legs (HitLegs).
|
||||||
_hitPoints = ["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"];
|
// Arms are actually hands.
|
||||||
_point = _hitPoints select (_hitSelections find _selectionName);
|
if (GVAR(healHitPointAfterAdvBandage)) then {
|
||||||
_target setHitPointDamage [_point, 0];
|
private["_currentWounds", "_headWounds", "_bodyWounds", "_legsWounds", "_armWounds"];
|
||||||
|
|
||||||
|
// Get the list of the wounds the target is currently suffering from.
|
||||||
|
_currentWounds = _target getVariable [QGVAR(openWounds), []];
|
||||||
|
|
||||||
|
// Tally of unbandaged wounds to each body part.
|
||||||
|
_headWounds = 0;
|
||||||
|
_bodyWounds = 0;
|
||||||
|
_legsWounds = 0;
|
||||||
|
_armWounds = 0;
|
||||||
|
|
||||||
|
// Loop through all current wounds and add up the number of unbandaged wounds on each body part.
|
||||||
|
{
|
||||||
|
_x params ["", "", "_bodyPart", "_numOpenWounds", "_bloodLoss"];
|
||||||
|
|
||||||
|
// Use switch/case for early termination if wounded limb is found before all six are checked.
|
||||||
|
// Number of wounds multiplied by blood loss will return zero for a fully
|
||||||
|
// bandaged body part, not incrementing the wound counter; or it will return
|
||||||
|
// some other number which will increment the wound counter.
|
||||||
|
switch (_bodyPart) do {
|
||||||
|
// Head
|
||||||
|
case 0: {
|
||||||
|
_headWounds = _headWounds + (_numOpenWounds * _bloodLoss);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Body
|
||||||
|
case 1: {
|
||||||
|
_bodyWounds = _bodyWounds + (_numOpenWounds * _bloodLoss);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Left Arm
|
||||||
|
case 2: {
|
||||||
|
_armWounds = _armWounds + (_numOpenWounds * _bloodLoss);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Right Arm
|
||||||
|
case 3: {
|
||||||
|
_armWounds = _armWounds + (_numOpenWounds * _bloodLoss);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Left Leg
|
||||||
|
case 4: {
|
||||||
|
_legsWounds = _legsWounds + (_numOpenWounds * _bloodLoss);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Right Leg
|
||||||
|
case 5: {
|
||||||
|
_legsWounds = _legsWounds + (_numOpenWounds * _bloodLoss);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} forEach _currentWounds;
|
||||||
|
|
||||||
|
// Any body part that has no wounds is healed to full health
|
||||||
|
if (_headWounds == 0) then {
|
||||||
|
_target setHitPointDamage ["hitHead", 0.0];
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_bodyWounds == 0) then {
|
||||||
|
_target setHitPointDamage ["hitBody", 0.0];
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_armWounds == 0) then {
|
||||||
|
_target setHitPointDamage ["hitHands", 0.0];
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_legsWounds == 0) then {
|
||||||
|
_target setHitPointDamage ["hitLegs", 0.0];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
true;
|
true;
|
||||||
|
@ -75,7 +75,7 @@ if (_name isEqualTo "triage") exitwith {
|
|||||||
_message = localize _message;
|
_message = localize _message;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
_triageCardTexts pushback format["%1x - %2 (%3m)", _amount, _message, round((ACE_time - _time) / 60)];
|
_triageCardTexts pushback format["%1x - %2 (%3m)", _amount, _message, round((ACE_gameTime - _time) / 60)];
|
||||||
nil;
|
nil;
|
||||||
} count _log;
|
} count _log;
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ if (ACE_player == _unit) then {
|
|||||||
|
|
||||||
if (GVAR(SavePreDeathGear)) then {
|
if (GVAR(SavePreDeathGear)) then {
|
||||||
GVAR(unitGear) = [_unit] call EFUNC(common,getAllGear);
|
GVAR(unitGear) = [_unit] call EFUNC(common,getAllGear);
|
||||||
GVAR(unitGear) pushBack [currentWeapon _unit, currentMuzzle _unit, currentWeaponMode _unit];
|
GVAR(unitGear) append [currentWeapon _unit, currentMuzzle _unit, currentWeaponMode _unit];
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ _position set [2, 0];
|
|||||||
_rallypoint setPosATL _position;
|
_rallypoint setPosATL _position;
|
||||||
_unit reveal _rallypoint;
|
_unit reveal _rallypoint;
|
||||||
|
|
||||||
_rallypoint setVariable [QGVAR(markerDate), format ["%1:%2", date select 3, date select 4], true];
|
_rallypoint setVariable [QGVAR(markerDate), [dayTime, "HH:MM"] call BIS_fnc_timeToString, true];
|
||||||
|
|
||||||
["rallypointMoved", [_rallypoint, _side, _position]] call EFUNC(common,globalEvent);
|
["rallypointMoved", [_rallypoint, _side, _position]] call EFUNC(common,globalEvent);
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Author: bux578
|
* Author: bux578, commy2
|
||||||
* Restores previously saved gear.
|
* Restores previously saved gear.
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
@ -10,150 +10,16 @@
|
|||||||
* None
|
* None
|
||||||
*
|
*
|
||||||
* Example:
|
* Example:
|
||||||
* [ACE_Player, stored_allGear] call ace_respawn_fnc_restoreGear
|
* [ACE_Player, stored_allGear, active_weapon_muzzle_and_mode] call ace_respawn_fnc_restoreGear
|
||||||
*
|
*
|
||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
params ["_unit", "_allGear"];
|
params ["_unit", "_allGear", "_activeWeaponAndMuzzle"];
|
||||||
|
|
||||||
// remove all starting gear of a player
|
// restore all gear
|
||||||
removeAllWeapons _unit;
|
[_unit, _allGear, true, true] call EFUNC(common,setAllGear);
|
||||||
removeGoggles _unit;
|
|
||||||
removeHeadgear _unit;
|
|
||||||
removeVest _unit;
|
|
||||||
removeUniform _unit;
|
|
||||||
removeAllAssignedItems _unit;
|
|
||||||
clearAllItemsFromBackpack _unit;
|
|
||||||
removeBackpack _unit;
|
|
||||||
|
|
||||||
_allGear params [
|
|
||||||
"_headgear", "_goggles",
|
|
||||||
"_uniform", "_uniformitems",
|
|
||||||
"_vest", "_vestitems",
|
|
||||||
"_backpack", "_backpackitems",
|
|
||||||
"_primaryweapon", "_primaryweaponitems", "_primaryweaponmagazine",
|
|
||||||
"_secondaryweapon", "_secondaryweaponitems", "_secondaryweaponmagazine",
|
|
||||||
"_handgunweapon", "_handgunweaponitems", "_handgunweaponmagazine",
|
|
||||||
"_assigneditems", "_binocular",
|
|
||||||
"_activeWeaponAndMuzzle"
|
|
||||||
];
|
|
||||||
|
|
||||||
// start restoring the items
|
|
||||||
if (_headgear != "") then {_unit addHeadgear _headgear};
|
|
||||||
if (_goggles != "") then {_unit addGoggles _goggles};
|
|
||||||
if (_uniform != "") then {_unit forceAddUniform _uniform};
|
|
||||||
if (_vest != "") then {_unit addVest _vest};
|
|
||||||
|
|
||||||
{
|
|
||||||
_unit addItemToUniform _x;
|
|
||||||
false
|
|
||||||
} count _uniformitems;
|
|
||||||
|
|
||||||
{
|
|
||||||
_unit addItemToVest _x;
|
|
||||||
false
|
|
||||||
} count _vestitems;
|
|
||||||
|
|
||||||
private "_flagRemoveDummyBag";
|
|
||||||
|
|
||||||
if (format ["%1", _backpack] != "") then {
|
|
||||||
_unit addBackpack _backpack;
|
|
||||||
|
|
||||||
// make sure the backpack is empty. Some bags are prefilled by config
|
|
||||||
private "_backpackObject";
|
|
||||||
_backpackObject = unitBackpack _unit;
|
|
||||||
|
|
||||||
clearMagazineCargoGlobal _backpackObject;
|
|
||||||
clearWeaponCargoGlobal _backpackObject;
|
|
||||||
clearItemCargoGlobal _backpackObject;
|
|
||||||
|
|
||||||
{
|
|
||||||
_unit addItemToBackpack _x;
|
|
||||||
false
|
|
||||||
} count _backpackitems;
|
|
||||||
|
|
||||||
_flagRemoveDummyBag = false;
|
|
||||||
} else {
|
|
||||||
// dummy backpack to ensure mags being loaded
|
|
||||||
_unit addBackpack "Bag_Base";
|
|
||||||
|
|
||||||
_flagRemoveDummyBag = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
// primaryWeapon
|
|
||||||
if ((_primaryweapon != "") && {_primaryweapon != "ACE_FakePrimaryWeapon"}) then {
|
|
||||||
{
|
|
||||||
_unit addMagazine _x;
|
|
||||||
false
|
|
||||||
} count _primaryweaponmagazine;
|
|
||||||
|
|
||||||
_unit addWeapon _primaryweapon;
|
|
||||||
|
|
||||||
{
|
|
||||||
if (_x != "") then {
|
|
||||||
_unit addPrimaryWeaponItem _x;
|
|
||||||
};
|
|
||||||
false
|
|
||||||
} count _primaryweaponitems;
|
|
||||||
};
|
|
||||||
|
|
||||||
// secondaryWeapon
|
|
||||||
if (_secondaryweapon != "") then {
|
|
||||||
{
|
|
||||||
_unit addMagazine _x;
|
|
||||||
false
|
|
||||||
} count _secondaryweaponmagazine;
|
|
||||||
|
|
||||||
_unit addWeapon _secondaryweapon;
|
|
||||||
|
|
||||||
{
|
|
||||||
if (_x != "") then {
|
|
||||||
_unit addSecondaryWeaponItem _x;
|
|
||||||
};
|
|
||||||
false
|
|
||||||
} count _secondaryweaponitems;
|
|
||||||
};
|
|
||||||
|
|
||||||
// handgun
|
|
||||||
if (_handgunweapon != "") then {
|
|
||||||
{
|
|
||||||
_unit addMagazine _x;
|
|
||||||
false
|
|
||||||
} count _handgunweaponmagazine;
|
|
||||||
|
|
||||||
_unit addWeapon _handgunweapon;
|
|
||||||
|
|
||||||
{
|
|
||||||
if (_x != "") then {
|
|
||||||
_unit addHandgunItem _x;
|
|
||||||
};
|
|
||||||
false
|
|
||||||
} count _handgunweaponitems;
|
|
||||||
};
|
|
||||||
|
|
||||||
// remove dummy bagpack
|
|
||||||
if (_flagRemoveDummyBag) then {
|
|
||||||
removeBackpack _unit;
|
|
||||||
};
|
|
||||||
|
|
||||||
_assignedItems deleteAt (_assignedItems find _binocular);
|
|
||||||
|
|
||||||
// items
|
|
||||||
{_unit linkItem _x; false} count _assignedItems;
|
|
||||||
|
|
||||||
_unit addWeapon _binocular;
|
|
||||||
|
|
||||||
// reload Laserdesignator
|
|
||||||
// we assume that if the unit had a Laserdesignator it probably had batteries for it
|
|
||||||
if ("Laserdesignator" in assignedItems _unit) then {
|
|
||||||
_unit selectWeapon "Laserdesignator";
|
|
||||||
|
|
||||||
if (currentMagazine _unit == "") then {
|
|
||||||
_unit addMagazine "Laserbatteries";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// restore the last active weapon, muzzle and weaponMode
|
// restore the last active weapon, muzzle and weaponMode
|
||||||
_activeWeaponAndMuzzle params ["_activeWeapon", "_activeMuzzle", "_activeWeaponMode"];
|
_activeWeaponAndMuzzle params ["_activeWeapon", "_activeMuzzle", "_activeWeaponMode"];
|
||||||
@ -171,8 +37,7 @@ if (
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (currentWeapon _unit != "") then {
|
if (currentWeapon _unit != "") then {
|
||||||
private "_index";
|
local _index = 0;
|
||||||
_index = 0;
|
|
||||||
|
|
||||||
while {
|
while {
|
||||||
_index < 100 && {currentWeaponMode _unit != _activeWeaponMode}
|
_index < 100 && {currentWeaponMode _unit != _activeWeaponMode}
|
||||||
|
Binary file not shown.
@ -9,14 +9,14 @@
|
|||||||
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: density of air - kg * m^(-3) <NUMBER>
|
* density of air - kg * m^(-3) <NUMBER>
|
||||||
*
|
*
|
||||||
* Return value:
|
* Return value:
|
||||||
* None
|
* None
|
||||||
*/
|
*/
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
PARAMS_3(_temperature,_pressure,_relativeHumidity);
|
params ["_temperature", "_pressure", "_relativeHumidity"];
|
||||||
|
|
||||||
_pressure = _pressure * 100; // hPa to Pa
|
_pressure = _pressure * 100; // hPa to Pa
|
||||||
|
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
* Calculates the barometric pressure based on altitude and weather
|
* Calculates the barometric pressure based on altitude and weather
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: altitude - meters <NUMBER>
|
* altitude - meters <NUMBER>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: barometric pressure - hPA <NUMBER>
|
* barometric pressure - hPA <NUMBER>
|
||||||
*
|
*
|
||||||
* Return value:
|
* Return value:
|
||||||
* None
|
* None
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: dew point <NUMBER>
|
* dew point <NUMBER>
|
||||||
*
|
*
|
||||||
* Return value:
|
* Return value:
|
||||||
* None
|
* None
|
||||||
@ -18,7 +18,7 @@
|
|||||||
#define __b 17.67
|
#define __b 17.67
|
||||||
#define __c 243.5
|
#define __c 243.5
|
||||||
|
|
||||||
PARAMS_2(_t,_rh);
|
params ["_t", "_rh"];
|
||||||
|
|
||||||
if (_rh == 0) exitWith { CELSIUS(0) };
|
if (_rh == 0) exitWith { CELSIUS(0) };
|
||||||
|
|
||||||
|
@ -5,10 +5,10 @@
|
|||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: temperature - degrees celcius <NUMBER>
|
* 0: temperature - degrees celcius <NUMBER>
|
||||||
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
* 1: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: heat index <NUMBER>
|
* heat index <NUMBER>
|
||||||
*
|
*
|
||||||
* Return value:
|
* Return value:
|
||||||
* None
|
* None
|
||||||
@ -24,7 +24,7 @@
|
|||||||
#define __C7 0.000687678
|
#define __C7 0.000687678
|
||||||
#define __C8 0.000274954
|
#define __C8 0.000274954
|
||||||
|
|
||||||
PARAMS_2(_t,_rh);
|
params ["_t", "_rh"];
|
||||||
|
|
||||||
// Source: https://en.wikipedia.org/wiki/Heat_index
|
// Source: https://en.wikipedia.org/wiki/Heat_index
|
||||||
|
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
* Calculates the terrain roughness length at a given world position
|
* Calculates the terrain roughness length at a given world position
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: _this - world position <posASL>
|
* world position <posASL>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: roughness length <NUMBER>
|
* roughness length <NUMBER>
|
||||||
*
|
*
|
||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
* Calculates the temperature based on altitude and weather
|
* Calculates the temperature based on altitude and weather
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: height - meters <NUMBER>
|
* height - meters <NUMBER>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: temperature - degrees celsius <NUMBER>
|
* temperature - degrees celsius <NUMBER>
|
||||||
*
|
*
|
||||||
* Return value:
|
* Return value:
|
||||||
* None
|
* None
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: wet bulb <NUMBER>
|
* wet bulb <NUMBER>
|
||||||
*
|
*
|
||||||
* Return value:
|
* Return value:
|
||||||
* None
|
* None
|
||||||
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
private ["_es", "_e", "_eDiff", "_eGuessPrev", "_cTempDelta", "_twGuess", "_eguess"];
|
private ["_es", "_e", "_eDiff", "_eGuessPrev", "_cTempDelta", "_twGuess", "_eguess"];
|
||||||
|
|
||||||
PARAMS_3(_temperature,_pressure,_relativeHumidity);
|
params ["_temperature", "_pressure", "_relativeHumidity"];
|
||||||
|
|
||||||
// Source: http://cosmoquest.org/forum/showthread.php?155366-Calculating-Wet-Bulb-Temperature-from-RH-amp-Dry-Bulb
|
// Source: http://cosmoquest.org/forum/showthread.php?155366-Calculating-Wet-Bulb-Temperature-from-RH-amp-Dry-Bulb
|
||||||
_es = 6.112 * exp((17.67 * _temperature) / (_temperature + 243.5));
|
_es = 6.112 * exp((17.67 * _temperature) / (_temperature + 243.5));
|
||||||
|
@ -5,16 +5,16 @@
|
|||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: temperature - degrees celcius <NUMBER>
|
* 0: temperature - degrees celcius <NUMBER>
|
||||||
* 2: wind speed - m/s <NUMBER>
|
* 1: wind speed - m/s <NUMBER>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: wind chill <NUMBER>
|
* wind chill <NUMBER>
|
||||||
*
|
*
|
||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
PARAMS_2(_t,_v);
|
params ["_t", "_v"];
|
||||||
|
|
||||||
// Source: https://en.wikipedia.org/wiki/Wind_chill
|
// Source: https://en.wikipedia.org/wiki/Wind_chill
|
||||||
|
|
||||||
|
@ -10,24 +10,26 @@
|
|||||||
* 3: Account for obstacles <BOOL>
|
* 3: Account for obstacles <BOOL>
|
||||||
*
|
*
|
||||||
* Return Value:
|
* Return Value:
|
||||||
* 0: wind speed - m/s <NUMBER>
|
* wind speed - m/s <NUMBER>
|
||||||
*
|
*
|
||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
private ["_windSpeed", "_windDir", "_height", "_newWindSpeed", "_windSource", "_roughnessLength"];
|
private ["_fnc_polar2vect", "_windSpeed", "_windDir", "_windDirAdjusted", "_height", "_newWindSpeed", "_windSource", "_roughnessLength"];
|
||||||
|
|
||||||
PARAMS_4(_position,_windGradientEnabled,_terrainEffectEnabled,_obstacleEffectEnabled);
|
params ["_position", "_windGradientEnabled", "_terrainEffectEnabled", "_obstacleEffectEnabled"];
|
||||||
|
|
||||||
fnc_polar2vect = {
|
_fnc_polar2vect = {
|
||||||
private ["_mag2D"];
|
private ["_mag2D"];
|
||||||
_mag2D = (_this select 0) * cos((_this select 2));
|
params ["_x", "_y", "_z"];
|
||||||
[_mag2D * sin((_this select 1)), _mag2D * cos((_this select 1)), (_this select 0) * sin((_this select 2))];
|
_mag2D = _x * cos(_z);
|
||||||
|
[_mag2D * sin(_y), _mag2D * cos(_y), _x * sin(_z)];
|
||||||
};
|
};
|
||||||
|
|
||||||
_windSpeed = vectorMagnitude ACE_wind;
|
_windSpeed = vectorMagnitude ACE_wind;
|
||||||
_windDir = (ACE_wind select 0) atan2 (ACE_wind select 1);
|
_windDir = (ACE_wind select 0) atan2 (ACE_wind select 1);
|
||||||
|
_windDirAdjusted = _windDir + 180;
|
||||||
|
|
||||||
// Wind gradient
|
// Wind gradient
|
||||||
if (_windGradientEnabled) then {
|
if (_windGradientEnabled) then {
|
||||||
@ -46,19 +48,19 @@ if (_terrainEffectEnabled) then {
|
|||||||
if (_windSpeed > 0.05) then {
|
if (_windSpeed > 0.05) then {
|
||||||
_newWindSpeed = 0;
|
_newWindSpeed = 0;
|
||||||
{
|
{
|
||||||
_windSource = [100, _windDir + 180, _x] call fnc_polar2vect;
|
_windSource = [100, _windDirAdjusted, _x] call _fnc_polar2vect;
|
||||||
if (!(terrainIntersectASL [_position, _position vectorAdd _windSource])) exitWith {
|
if (!(terrainIntersectASL [_position, _position vectorAdd _windSource])) exitWith {
|
||||||
_newWindSpeed = cos(_x * 9) * _windSpeed;
|
_newWindSpeed = cos(_x * 9) * _windSpeed;
|
||||||
};
|
};
|
||||||
_windSource = [100, _windDir + 180 + _x, 0] call fnc_polar2vect;
|
_windSource = [100, _windDirAdjusted + _x, 0] call _fnc_polar2vect;
|
||||||
if (!(terrainIntersectASL [_position, _position vectorAdd _windSource])) exitWith {
|
if (!(terrainIntersectASL [_position, _position vectorAdd _windSource])) exitWith {
|
||||||
_newWindSpeed = cos(_x * 9) * _windSpeed;
|
_newWindSpeed = cos(_x * 9) * _windSpeed;
|
||||||
};
|
};
|
||||||
_windSource = [100, _windDir + 180 - _x, 0] call fnc_polar2vect;
|
_windSource = [100, _windDirAdjusted - _x, 0] call _fnc_polar2vect;
|
||||||
if (!(terrainIntersectASL [_position, _position vectorAdd _windSource])) exitWith {
|
if (!(terrainIntersectASL [_position, _position vectorAdd _windSource])) exitWith {
|
||||||
_newWindSpeed = cos(_x * 9) * _windSpeed;
|
_newWindSpeed = cos(_x * 9) * _windSpeed;
|
||||||
};
|
};
|
||||||
} forEach [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
} count [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
|
||||||
_windSpeed = _newWindSpeed;
|
_windSpeed = _newWindSpeed;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -68,19 +70,19 @@ if (_obstacleEffectEnabled) then {
|
|||||||
if (_windSpeed > 0.05) then {
|
if (_windSpeed > 0.05) then {
|
||||||
_newWindSpeed = 0;
|
_newWindSpeed = 0;
|
||||||
{
|
{
|
||||||
_windSource = [20, _windDir + 180, _x] call fnc_polar2vect;
|
_windSource = [20, _windDirAdjusted, _x] call _fnc_polar2vect;
|
||||||
if (!(lineIntersects [_position, _position vectorAdd _windSource])) exitWith {
|
if (!(lineIntersects [_position, _position vectorAdd _windSource])) exitWith {
|
||||||
_newWindSpeed = cos(_x * 2) * _windSpeed;
|
_newWindSpeed = cos(_x * 2) * _windSpeed;
|
||||||
};
|
};
|
||||||
_windSource = [20, _windDir + 180 + _x, 0] call fnc_polar2vect;
|
_windSource = [20, _windDirAdjusted + _x, 0] call _fnc_polar2vect;
|
||||||
if (!(lineIntersects [_position, _position vectorAdd _windSource])) exitWith {
|
if (!(lineIntersects [_position, _position vectorAdd _windSource])) exitWith {
|
||||||
_newWindSpeed = cos(_x * 2) * _windSpeed;
|
_newWindSpeed = cos(_x * 2) * _windSpeed;
|
||||||
};
|
};
|
||||||
_windSource = [20, _windDir + 180 - _x, 0] call fnc_polar2vect;
|
_windSource = [20, _windDirAdjusted - _x, 0] call _fnc_polar2vect;
|
||||||
if (!(lineIntersects [_position, _position vectorAdd _windSource])) exitWith {
|
if (!(lineIntersects [_position, _position vectorAdd _windSource])) exitWith {
|
||||||
_newWindSpeed = cos(_x * 2) * _windSpeed;
|
_newWindSpeed = cos(_x * 2) * _windSpeed;
|
||||||
};
|
};
|
||||||
} forEach [0, 5, 10, 15, 20, 25, 30, 35, 40, 45];
|
} count [0, 5, 10, 15, 20, 25, 30, 35, 40, 45];
|
||||||
_windSpeed = _newWindSpeed;
|
_windSpeed = _newWindSpeed;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -11,11 +11,12 @@
|
|||||||
*/
|
*/
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
private ["_periodPercent", "_periodPosition"];
|
||||||
|
|
||||||
if (isNil "ACE_WIND_PARAMS") exitWith { [0, 0, 0] };
|
if (isNil "ACE_WIND_PARAMS") exitWith { [0, 0, 0] };
|
||||||
|
|
||||||
EXPLODE_5_PVT(ACE_WIND_PARAMS,_dir,_dirChange,_spd,_spdChange,_period);
|
ACE_WIND_PARAMS params ["_dir", "_dirChange", "_spd", "_spdChange", "_period"];
|
||||||
|
|
||||||
private ["_periodPercent", "_periodPosition"];
|
|
||||||
_periodPosition = (ACE_time - GVAR(wind_period_start_time)) min _period;
|
_periodPosition = (ACE_time - GVAR(wind_period_start_time)) min _period;
|
||||||
_periodPercent = _periodPosition / _period;
|
_periodPercent = _periodPosition / _period;
|
||||||
|
|
||||||
|
@ -15,10 +15,7 @@
|
|||||||
|
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
private ["_logic", "_units", "_activated"];
|
params ["_logic", "_units", "_activated"];
|
||||||
_logic = _this select 0;
|
|
||||||
_units = _this select 1;
|
|
||||||
_activated = _this select 2;
|
|
||||||
|
|
||||||
if !(_activated) exitWith {};
|
if !(_activated) exitWith {};
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
if (!GVAR(syncRain)) exitWith {};
|
if (!GVAR(syncRain)) exitWith {};
|
||||||
|
|
||||||
if (!isNil "ACE_RAIN_PARAMS") then {
|
if (!isNil "ACE_RAIN_PARAMS") then {
|
||||||
EXPLODE_3_PVT(ACE_RAIN_PARAMS,_oldRain,_newRain,_period);
|
ACE_RAIN_PARAMS params ["_oldRain", "_newRain", "_period"];
|
||||||
|
|
||||||
private ["_periodPosition", "_periodPercent"];
|
private ["_periodPosition", "_periodPercent"];
|
||||||
_periodPosition = (ACE_time - GVAR(rain_period_start_time)) min _period;
|
_periodPosition = (ACE_time - GVAR(rain_period_start_time)) min _period;
|
||||||
|
121
tools/sqf_validator.py
Normal file
121
tools/sqf_validator.py
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
|
||||||
|
import fnmatch
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import ntpath
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
def check_sqf_syntax(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') as file:
|
||||||
|
content = file.read()
|
||||||
|
brackets_list = []
|
||||||
|
|
||||||
|
isInCommentBlock = False
|
||||||
|
checkIfInComment = False
|
||||||
|
ignoreTillEndOfLine = False
|
||||||
|
checkIfNextIsClosingBlock = False
|
||||||
|
isInString = False
|
||||||
|
|
||||||
|
lineNumber = 0
|
||||||
|
|
||||||
|
for c in content:
|
||||||
|
if c == '\n':
|
||||||
|
lineNumber += 1 # so we can print accurate line number information when we detect a possible error
|
||||||
|
if (isInString):
|
||||||
|
if (c == inStringType):
|
||||||
|
isInString = False
|
||||||
|
elif (isInCommentBlock == False): # if we are not in a comment block, we will check if we are at the start of one or count the () {} and []
|
||||||
|
if (checkIfInComment): # This means we have encountered a /, so we are now checking if this is an inline comment or a comment block
|
||||||
|
checkIfInComment = False
|
||||||
|
if c == '*': # if the next character after / is a *, we are at the start of a comment block
|
||||||
|
isInCommentBlock = True
|
||||||
|
if (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:
|
||||||
|
if (c == '"'):
|
||||||
|
isInString = True
|
||||||
|
inStringType = c
|
||||||
|
elif (c == '/'):
|
||||||
|
checkIfInComment = True
|
||||||
|
elif (c == '('):
|
||||||
|
brackets_list.append('(')
|
||||||
|
elif (c == ')'):
|
||||||
|
if (brackets_list[-1] in ['{', '[']):
|
||||||
|
print "Possible missing bracket detected at )"
|
||||||
|
print filepath + "Line number: " + str(lineNumber)
|
||||||
|
bad_count_file += 1
|
||||||
|
brackets_list.append(')')
|
||||||
|
elif (c == '['):
|
||||||
|
brackets_list.append('[')
|
||||||
|
elif (c == ']'):
|
||||||
|
if (brackets_list[-1] in ['{', '(']):
|
||||||
|
print "Possible missing bracket detected at ]"
|
||||||
|
print filepath + "Line number: " + str(lineNumber)
|
||||||
|
bad_count_file += 1
|
||||||
|
brackets_list.append(']')
|
||||||
|
elif (c == '{'):
|
||||||
|
brackets_list.append('{')
|
||||||
|
elif (c == '}'):
|
||||||
|
if (brackets_list[-1] in ['(', '[']):
|
||||||
|
print "Possible missing bracket detected at }"
|
||||||
|
print filepath + "Line number: " + str(lineNumber)
|
||||||
|
bad_count_file += 1
|
||||||
|
brackets_list.append('}')
|
||||||
|
else:
|
||||||
|
if (c == '*'):
|
||||||
|
checkIfNextIsClosingBlock = True;
|
||||||
|
elif (checkIfNextIsClosingBlock):
|
||||||
|
if (c == '/'):
|
||||||
|
isInCommentBlock = False
|
||||||
|
elif (c != '*'):
|
||||||
|
checkIfNextIsClosingBlock = False
|
||||||
|
|
||||||
|
if brackets_list.count('[') != brackets_list.count(']'):
|
||||||
|
print "A possible missing [ or ] in file " + filepath + "[ = " + str(brackets_list.count('[')) + " ] =" + str(brackets_list.count(']'))
|
||||||
|
bad_count_file += 1
|
||||||
|
if brackets_list.count('(') != brackets_list.count(')'):
|
||||||
|
print "A possible missing ( or ) in file " + filepath + "( = " + str(brackets_list.count('(')) + " ) =" + str(brackets_list.count(')'))
|
||||||
|
bad_count_file += 1
|
||||||
|
if brackets_list.count('{') != brackets_list.count('}'):
|
||||||
|
print "A possible missing { or } in file " + filepath + "{ = " + str(brackets_list.count('{')) + " } =" + str(brackets_list.count('}'))
|
||||||
|
bad_count_file += 1
|
||||||
|
return bad_count_file
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
print("#########################")
|
||||||
|
print("# Validate SQF files missing brackets #")
|
||||||
|
print("#########################")
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
for root, dirnames, filenames in os.walk('../addons' + '/' + args.module):
|
||||||
|
for filename in fnmatch.filter(filenames, '*.sqf'):
|
||||||
|
sqf_list.append(os.path.join(root, filename))
|
||||||
|
|
||||||
|
for filename in sqf_list:
|
||||||
|
bad_count = bad_count + check_sqf_syntax(filename)
|
||||||
|
|
||||||
|
print ("Bad Count {0}".format(bad_count))
|
||||||
|
return bad_count
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
Loading…
Reference in New Issue
Block a user