diff --git a/AUTHORS.txt b/AUTHORS.txt index 62329d7c1d..80046475ff 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -1,4 +1,4 @@ -# ACE 3 CONTRIBUTOR LIST +# ACE3 CONTRIBUTOR LIST # If you contributed, but are not listed here, contact me: # koffeinflummi@gmail.com # @@ -14,6 +14,7 @@ Garth "L-H" de Wet Giallustio Glowbal Janus +jokoho482 ` Kieran NouberNou PabstMirror @@ -50,6 +51,7 @@ Coren Crusty Dharma Bellamkonda Dimaslg +Drill eRazeri evromalarkey F3 Project @@ -68,8 +70,7 @@ Hamburger SV Harakhti havena Hawkins -Head -jokoho482 ` +Head Jonpas Karneck Kavinsky @@ -81,6 +82,7 @@ Macusercom MarcBook meat Michail Nikolaev +MikeMatrix nic547 nikolauska nomisum @@ -106,5 +108,3 @@ Valentin Torikian VyMajoris(W-Cephei) Winter zGuba -Drill -MikeMatrix diff --git a/README.md b/README.md index 2739ce55be..755eaceb30 100644 --- a/README.md +++ b/README.md @@ -3,75 +3,75 @@

- ACE3 version + ACE3 Version - ACE3 download + ACE3 Download - ACE3 issues + ACE3 Issues - - BIF thread + + BIF Thread - ACE3 license + ACE3 License

-

Requires the latest version of CBA A3. Visit us on Facebook | YouTube | Twitter | Reddit

+

Requires the latest version of CBA A3. Visit us on Facebook | YouTube | Twitter | Reddit

**ACE3** is a joint effort by the teams behind **ACE2**, **AGM** and **CSE** to improve the realism and authenticity of Arma 3. The project is entirely **open-source** and all contributions are welcome. Feel free to maintain your own custom version, so long as the changes you make are open to the public in accordance with the GNU General Public License ([GPLv2](https://github.com/acemod/ACE3/blob/master/LICENSE)). -The mod is **built modularly**, so almost any included PBO can be easily removed from the configuration. This way, a team can maintain its own tailored version of ACE by simply excluding any components they don't need, or those possibly in conflict with other add-ons. Modules themselves, e.g. the medical system, also include various customization options, allowing mission designers to tweak the overall experience. +The mod is **built modularly**, so almost any included PBO can be easily removed from the configuration. This way, a team can maintain its own tailored version of ACE3 by simply excluding any components they don't need, or those possibly in conflict with other mods. Modules themselves, e.g. the medical system, also include various customization options, allowing mission designers to tweak the overall experience. ### Core features -* Brand new 3D interaction/action system -* Performance and reliability framework -* Focus on modularity and customization -* New flexible client and server settings & configuration -* Improved medical system with various levels (basic/advanced) focus on gameplay/realism -* Proper & consistent network-synced weather -* Wind and weather-based ballistics -* Captivity system -* Explosives system, including different trigger types -* Map screen improvements – marker placement and map tools -* Advanced missile guidance and laser designation +- Brand new 3D interaction/action system +- Performance and reliability framework +- Focus on modularity and customization +- New flexible client and server settings & configuration +- Improved medical system with various levels (basic/advanced) focus on gameplay/realism +- Proper & consistent network-synced weather +- Wind and weather-based ballistics +- Captivity system +- Explosives system, including different trigger types +- Map screen improvements – marker placement and map tools +- Advanced missile guidance and laser designation #### Additional features -* Carrying and dragging -* Realistic names for vehicles and weapons -* A fire control system (FCS) for armored vehicles and helicopters -* Realistic ballistics/FCS calculated in C/C++ extensions -* Backblast area and overpressure simulation -* Disposable launchers -* Realistic G-forces -* Vehicle locking -* Realistic night and thermal vision modes -* Magazine repacking -* Realistic weapon overheating mechanic -* Combat deafness (temporary loss of hearing) simulation -* Improved ragdoll physics -* Improved interactions for AARs and ammo bearers -* Adjustable sniper scopes -* No idle animation with lowered weapon -* No talking player avatar -* Jumping over obstacles, climbing over walls and cutting down fences -* Vector, MicroDAGR and Kestrel devices
+- Carrying and dragging +- Realistic names for vehicles and weapons +- A fire control system (FCS) for armored vehicles and helicopters +- Realistic ballistics/FCS calculated in C/C++ extensions +- Backblast area and overpressure simulation +- Disposable launchers +- Realistic G-forces +- Vehicle locking +- Realistic night and thermal vision modes +- Magazine repacking +- Realistic weapon overheating mechanic +- Combat deafness (temporary loss of hearing) simulation +- Improved ragdoll physics +- Improved interactions for AARs and ammo bearers +- Adjustable sniper scopes +- No idle animation with lowered weapon +- No talking player avatar +- Jumping over obstacles, climbing over walls and cutting down fences +- Vector, MicroDAGR and Kestrel devices
***and much more...*** ### Guides & how-tos If you installed ACE3 but have trouble understanding how it all works, or where to start, read this first: -* [Getting started](http://ace3mod.com/wiki/user/getting-started.html) +- [Getting started](http://ace3mod.com/wiki/user/getting-started.html) #### Contributing -You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. To contribute something to ACE, simply fork this repository and submit your pull requests for review by other collaborators. Remember to add yourself to the author array of any PBO you will be editing and the [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) file; including a valid email address. +You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. To contribute something to ACE3, simply fork this repository and submit your pull requests for review by other collaborators. Remember to add yourself to the author array of any PBO you will be editing and the [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) file; including a valid email address. Please, use our [Issue Tracker](https://github.com/acemod/ACE3/issues) to report a bug, propose a feature, or suggest changes to the existing ones. See also: -* [How to report an issue](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) -* [How to make a feature request](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) +- [How to report an issue](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) +- [How to make a feature request](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) #### Testing & building To help us test the latest development changes, download our master branch ([directly](https://github.com/acemod/ACE3/archive/master.zip), or [with git](https://help.github.com/articles/fetching-a-remote/)), then assemble a test build: -* [Setting up the development environment](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – step-by-step instructions on how to properly setup and build a version of ACE for testing purposes. +- [Setting up the development environment](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) – step-by-step instructions on how to properly setup and build a version of ACE3 for testing purposes. diff --git a/addons/advanced_ballistics/README.md b/addons/advanced_ballistics/README.md index ef98bcd2b6..122769b191 100644 --- a/addons/advanced_ballistics/README.md +++ b/addons/advanced_ballistics/README.md @@ -3,8 +3,9 @@ ace_advanced_ballistics The Advanced Ballistics module introduces advanced external- and internal ballistics to the game. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf index b199acb9e5..1f9002e606 100644 --- a/addons/advanced_ballistics/XEH_postInit.sqf +++ b/addons/advanced_ballistics/XEH_postInit.sqf @@ -6,9 +6,8 @@ GVAR(currentbulletID) = -1; GVAR(Protractor) = false; GVAR(ProtractorStart) = ACE_time; - +GVAR(allBullets) = []; GVAR(currentGrid) = 0; -GVAR(initMessageEnabled) = false; GVAR(extensionAvailable) = true; /* @TODO: Remove this until versioning is in sync with cmake/build versioning diff --git a/addons/advanced_ballistics/XEH_preInit.sqf b/addons/advanced_ballistics/XEH_preInit.sqf index 12018ad412..f722d9c573 100644 --- a/addons/advanced_ballistics/XEH_preInit.sqf +++ b/addons/advanced_ballistics/XEH_preInit.sqf @@ -13,5 +13,5 @@ PREP(initializeTerrainExtension); PREP(initModuleSettings); PREP(readAmmoDataFromConfig); PREP(readWeaponDataFromConfig); - +PREP(handleFirePFH); ADDON = true; diff --git a/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf b/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf index 28df9d1d97..8b0c78e86c 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateAmmoTemperatureVelocityShift.sqf @@ -8,29 +8,29 @@ * 1: temperature - degrees celcius * * Return Value: - * 0: muzzle velocity shift - m/s + * muzzle velocity shift - m/s * - * Return value: - * None + * Public: No */ #include "script_component.hpp" -private ["_muzzleVelocityShiftTable", "_temperature", "_muzzleVelocityShift", "_temperatureIndexA", "_temperatureIndexB", "_temperatureRatio"]; -_muzzleVelocityShiftTable = _this select 0; -_temperature = _this select 1; +private ["_muzzleVelocityShiftTableUpperLimit", "_temperatureIndexFunction", + "_temperatureIndexA", "_temperatureIndexB", "_interpolationRatio"]; +params["_muzzleVelocityShiftTable", "_temperature"]; -if (count _muzzleVelocityShiftTable != 11) exitWith { 0 }; +// Check if muzzleVelocityShiftTable is Larger Than 11 Entrys +_muzzleVelocityShiftTableUpperLimit = _muzzleVelocityShiftTable select 10; +if (isNil "_muzzleVelocityShiftTableUpperLimit") exitWith { 0 }; -_temperatureIndexA = floor((_temperature + 15) / 5); -_temperatureIndexA = 0 max _temperatureIndexA; -_temperatureIndexA = _temperatureIndexA min 10; +// Find exact data index required for given temperature +_temperatureIndexFunction = (_temperature + 15) / 5; -_temperatureIndexB = ceil((_temperature + 15) / 5); -_temperatureIndexB = 0 max _temperatureIndexB; -_temperatureIndexB = _temperatureIndexB min 10; +// lower and upper data index used for interpolation +_temperatureIndexA = (0 max (floor(_temperatureIndexFunction))) min 10; +_temperatureIndexB = (0 max (ceil(_temperatureIndexFunction))) min 10; -_temperatureRatio = ((_temperature + 15) / 5) - floor((_temperature + 15) / 5); +// Interpolation ratio +_interpolationRatio = _temperatureIndexFunction - floor(_temperatureIndexFunction); -_muzzleVelocityShift = (_muzzleVelocityShiftTable select _temperatureIndexA) * (1 - _temperatureRatio) + (_muzzleVelocityShiftTable select _temperatureIndexB) * _temperatureRatio; - -_muzzleVelocityShift +// Interpolation +(_muzzleVelocityShiftTable select _temperatureIndexA) * (1 - _interpolationRatio) + (_muzzleVelocityShiftTable select _temperatureIndexB) * _interpolationRatio // Return diff --git a/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf b/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf index b0166109f5..fac048c061 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateAtmosphericCorrection.sqf @@ -17,12 +17,9 @@ */ #include "script_component.hpp" -private ["_ballisticCoefficient", "_temperature", "_pressure", "_relativeHumidity", "_atmosphereModel", "_airDensity"]; -_ballisticCoefficient = _this select 0; -_temperature = _this select 1; // in C -_pressure = _this select 2; // in hPa -_relativeHumidity = _this select 3; // as ratio 0-1 -_atmosphereModel = _this select 4; // "ICAO" or "ASM" +private "_airDensity"; + +params ["_ballisticCoefficient", "_temperature"/*in C*/, "_pressure"/*in hPa*/, "_relativeHumidity"/*as ratio 0-1*/, "_atmosphereModel"/*"ICAO" or "ASM"*/]; _airDensity = [_temperature, _pressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity); diff --git a/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf b/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf index de037f49bc..9c46cc2423 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateBarrelLengthVelocityShift.sqf @@ -1,5 +1,5 @@ /* - * Author: Ruthberg + * Author: Ruthberg, MikeMatrix, joko // Jonas * * Calculates the muzzle velocity shift caused by different barrel lengths * @@ -10,46 +10,61 @@ * 3: muzzle velocity - m/s * * Return Value: - * 0: muzzle velocity shift - m/s + * muzzle velocity shift - m/s * - * Return value: - * None + * Public: No */ #include "script_component.hpp" -private ["_barrelLength", "_muzzleVelocityTable", "_barrelLengthTable", "_muzzleVelocity", "_lowerIndex", "_upperIndex", "_barrelLengthRatio", "_muzzleVelocityNew"]; -_barrelLength = _this select 0; -_muzzleVelocityTable = _this select 1; -_barrelLengthTable = _this select 2; -_muzzleVelocity = _this select 3; +scopeName "main"; +private ["_muzzleVelocityTableCount", "_barrelLengthTableCount", "_lowerDataIndex", + "_upperDataIndex", "_lowerBarrelLength", "_upperBarrelLength", "_lowerMuzzleVelocity", + "_upperMuzzleVelocity", "_interpolationRatio"]; +params ["_barrelLength", "_muzzleVelocityTable", "_barrelLengthTable", "_muzzleVelocity"]; + +// If barrel length is not defined, then there is no point in calculating muzzle velocity if (_barrelLength == 0) exitWith { 0 }; -if (count _muzzleVelocityTable != count _barrelLengthTable) exitWith { 0 }; -if (count _muzzleVelocityTable == 0 || count _barrelLengthTable == 0) exitWith { 0 }; -if (count _muzzleVelocityTable == 1) exitWith { (_muzzleVelocityTable select 0) - _muzzleVelocity }; -_lowerIndex = 0; -_upperIndex = (count _barrelLengthTable) - 1; +_muzzleVelocityTableCount = count _muzzleVelocityTable; +_barrelLengthTableCount = count _barrelLengthTable; -if (_barrelLength <= (_barrelLengthTable select _lowerIndex)) exitWith { (_muzzleVelocityTable select _lowerIndex) - _muzzleVelocity }; -if (_barrelLength >= (_barrelLengthTable select _upperIndex)) exitWith { (_muzzleVelocityTable select _upperIndex) - _muzzleVelocity }; +// Exit if tables are different sizes, have no elements or have only one element +if (_muzzleVelocityTableCount != _barrelLengthTableCount || _muzzleVelocityTableCount == 0 || _barrelLengthTableCount == 0) exitWith { 0 }; +if (_muzzleVelocityTableCount == 1) exitWith { (_muzzleVelocityTable select 0) - _muzzleVelocity }; -for "_i" from 0 to (count _barrelLengthTable) - 1 do { - if (_barrelLength >= _barrelLengthTable select _i) then { - _lowerIndex = _i; - }; -}; -for "_i" from (count _barrelLengthTable) - 1 to 0 step -1 do { - if (_barrelLength <= _barrelLengthTable select _i) then { - _upperIndex = _i; +// If we have the precise barrel length value, return result immediately +if (_barrelLength in _barrelLengthTable) exitWith { + (_muzzleVelocityTable select (_barrelLengthTable find _barrelLength)) - _muzzleVelocity +}; + +// Limit values to lower and upper bound of data we have available +if (_barrelLength <= (_barrelLengthTable select 0)) exitWith { (_muzzleVelocityTable select 0) - _muzzleVelocity }; +if (_barrelLength >= (_barrelLengthTable select _barrelLengthTableCount - 1)) exitWith { (_muzzleVelocityTable select _barrelLengthTableCount - 1) - _muzzleVelocity }; + +// Find closest bordering values for barrel length +{ + if (_barrelLength <= _x) then { + _upperDataIndex = _forEachIndex; + _lowerDataIndex = _upperDataIndex - 1; + breakTo "main"; }; +} forEach _barrelLengthTable; + +// Worst case scenario +if (isNil "_lowerDataIndex" || isNil "_upperDataIndex") exitWith {0}; + +_lowerBarrelLength = _barrelLengthTable select _lowerDataIndex; +_upperBarrelLength = _barrelLengthTable select _upperDataIndex; +_lowerMuzzleVelocity = _muzzleVelocityTable select _lowerDataIndex; +_upperMuzzleVelocity = _muzzleVelocityTable select _upperDataIndex; + +// Calculate interpolation ratio +_interpolationRatio = if (abs (_lowerBarrelLength - _upperBarrelLength) > 0) then { + (_upperBarrelLength - _barrelLength) / (_upperBarrelLength - _lowerBarrelLength) +} else { + 0 }; -_barrelLengthRatio = 0; -if ((_barrelLengthTable select _upperIndex) - (_barrelLengthTable select _lowerIndex) > 0) then { - _barrelLengthRatio = ((_barrelLengthTable select _upperIndex) - _barrelLength) / ((_barrelLengthTable select _upperIndex) - (_barrelLengthTable select _lowerIndex)); -}; - -_muzzleVelocityNew = (_muzzleVelocityTable select _lowerIndex) + ((_muzzleVelocityTable select _upperIndex) - (_muzzleVelocityTable select _lowerIndex)) * (1 - _barrelLengthRatio); - -_muzzleVelocityNew - _muzzleVelocity +// Calculate interpolated muzzle velocity shift +(_lowerMuzzleVelocity + ((_upperMuzzleVelocity - _lowerMuzzleVelocity) * (1 - _interpolationRatio))) - _muzzleVelocity // Return diff --git a/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf b/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf index 433dafbe10..0bd801c6b9 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateRetardation.sqf @@ -4,142 +4,129 @@ * Calculates the retardation of the bullet * * Arguments: - * 0: drag model - 1-7 + * 0: drag model - integer 1-7 * 1: drag coefficient - bc * 2: velocity - m/s * * Return Value: - * 0: retardation - m/(s^2) + * retardation - m/(s^2) * - * Return value: - * None + * Public: No */ #include "script_component.hpp" // Source: GNU Exterior Ballistics -private ["_dragModel", "_dragCoefficient", "_velocity", "_A", "_M", "_result"]; -_dragModel = _this select 0; -_dragCoefficient = _this select 1; -_velocity = (_this select 2) * 3.2808399; - -_A = -1; -_M = -1; -_result = 0; +private ["_A", "_M"]; +params ["_dragModel", "_dragCoefficient", "_velocity"]; +_velocity = _velocity * 3.2808399; switch _dragModel do { - case 1: - { - switch true do { - case (_velocity > 4230) : { _A = 0.0001477404177730177; _M = 1.9565; }; - case (_velocity > 3680) : { _A = 0.0001920339268755614; _M = 1.925 ; }; - case (_velocity > 3450) : { _A = 0.0002894751026819746; _M = 1.875 ; }; - case (_velocity > 3295) : { _A = 0.0004349905111115636; _M = 1.825 ; }; - case (_velocity > 3130) : { _A = 0.0006520421871892662; _M = 1.775 ; }; - case (_velocity > 2960) : { _A = 0.0009748073694078696; _M = 1.725 ; }; - case (_velocity > 2830) : { _A = 0.001453721560187286; _M = 1.675 ; }; - case (_velocity > 2680) : { _A = 0.002162887202930376; _M = 1.625 ; }; - case (_velocity > 2460) : { _A = 0.003209559783129881; _M = 1.575 ; }; - case (_velocity > 2225) : { _A = 0.003904368218691249; _M = 1.55 ; }; - case (_velocity > 2015) : { _A = 0.003222942271262336; _M = 1.575 ; }; - case (_velocity > 1890) : { _A = 0.002203329542297809; _M = 1.625 ; }; - case (_velocity > 1810) : { _A = 0.001511001028891904; _M = 1.675 ; }; - case (_velocity > 1730) : { _A = 0.0008609957592468259; _M = 1.75 ; }; - case (_velocity > 1595) : { _A = 0.0004086146797305117; _M = 1.85 ; }; - case (_velocity > 1520) : { _A = 0.0001954473210037398; _M = 1.95 ; }; - case (_velocity > 1420) : { _A = 0.00005431896266462351; _M = 2.125 ; }; - case (_velocity > 1360) : { _A = 0.000008847742581674416; _M = 2.375 ; }; - case (_velocity > 1315) : { _A = 0.000001456922328720298; _M = 2.625 ; }; - case (_velocity > 1280) : { _A = 0.0000002419485191895565; _M = 2.875 ; }; - case (_velocity > 1220) : { _A = 0.00000001657956321067612; _M = 3.25 ; }; - case (_velocity > 1185) : { _A = 0.0000000004745469537157371; _M = 3.75 ; }; - case (_velocity > 1150) : { _A = 0.00000000001379746590025088; _M = 4.25 ; }; - case (_velocity > 1100) : { _A = 0.0000000000004070157961147882; _M = 4.75 ; }; - case (_velocity > 1060) : { _A = 0.00000000000002938236954847331; _M = 5.125 ; }; - case (_velocity > 1025) : { _A = 0.00000000000001228597370774746; _M = 5.25 ; }; - case (_velocity > 980) : { _A = 0.00000000000002916938264100495; _M = 5.125 ; }; - case (_velocity > 945) : { _A = 0.0000000000003855099424807451; _M = 4.75 ; }; - case (_velocity > 905) : { _A = 0.00000000001185097045689854; _M = 4.25 ; }; - case (_velocity > 860) : { _A = 0.0000000003566129470974951; _M = 3.75 ; }; - case (_velocity > 810) : { _A = 0.00000001045513263966272; _M = 3.25 ; }; - case (_velocity > 780) : { _A = 0.0000001291159200846216; _M = 2.875 ; }; - case (_velocity > 750) : { _A = 0.0000006824429329105383; _M = 2.625 ; }; - case (_velocity > 700) : { _A = 0.000003569169672385163; _M = 2.375 ; }; - case (_velocity > 640) : { _A = 0.00001839015095899579; _M = 2.125 ; }; - case (_velocity > 600) : { _A = 0.00005711174688734240; _M = 1.950 ; }; - case (_velocity > 550) : { _A = 0.00009226557091973427; _M = 1.875 ; }; - case (_velocity > 250) : { _A = 0.00009337991957131389; _M = 1.875 ; }; - case (_velocity > 100) : { _A = 0.00007225247327590413; _M = 1.925 ; }; - case (_velocity > 65) : { _A = 0.00005792684957074546; _M = 1.975 ; }; - case (_velocity > 0) : { _A = 0.00005206214107320588; _M = 2.000 ; }; + case 1: { + call { + if (_velocity > 4230) exitWith { _A = 0.0001477404177730177; _M = 1.9565; }; + if (_velocity > 3680) exitWith { _A = 0.0001920339268755614; _M = 1.925; }; + if (_velocity > 3450) exitWith { _A = 0.0002894751026819746; _M = 1.875; }; + if (_velocity > 3295) exitWith { _A = 0.0004349905111115636; _M = 1.825; }; + if (_velocity > 3130) exitWith { _A = 0.0006520421871892662; _M = 1.775; }; + if (_velocity > 2960) exitWith { _A = 0.0009748073694078696; _M = 1.725; }; + if (_velocity > 2830) exitWith { _A = 0.001453721560187286; _M = 1.675; }; + if (_velocity > 2680) exitWith { _A = 0.002162887202930376; _M = 1.625; }; + if (_velocity > 2460) exitWith { _A = 0.003209559783129881; _M = 1.575; }; + if (_velocity > 2225) exitWith { _A = 0.003904368218691249; _M = 1.55; }; + if (_velocity > 2015) exitWith { _A = 0.003222942271262336; _M = 1.575; }; + if (_velocity > 1890) exitWith { _A = 0.002203329542297809; _M = 1.625; }; + if (_velocity > 1810) exitWith { _A = 0.001511001028891904; _M = 1.675; }; + if (_velocity > 1730) exitWith { _A = 0.0008609957592468259; _M = 1.75; }; + if (_velocity > 1595) exitWith { _A = 0.0004086146797305117; _M = 1.85; }; + if (_velocity > 1520) exitWith { _A = 0.0001954473210037398; _M = 1.95; }; + if (_velocity > 1420) exitWith { _A = 0.00005431896266462351; _M = 2.125; }; + if (_velocity > 1360) exitWith { _A = 0.000008847742581674416; _M = 2.375; }; + if (_velocity > 1315) exitWith { _A = 0.000001456922328720298; _M = 2.625; }; + if (_velocity > 1280) exitWith { _A = 0.0000002419485191895565; _M = 2.875; }; + if (_velocity > 1220) exitWith { _A = 0.00000001657956321067612; _M = 3.25; }; + if (_velocity > 1185) exitWith { _A = 0.0000000004745469537157371; _M = 3.75; }; + if (_velocity > 1150) exitWith { _A = 0.00000000001379746590025088; _M = 4.25; }; + if (_velocity > 1100) exitWith { _A = 0.0000000000004070157961147882; _M = 4.75; }; + if (_velocity > 1060) exitWith { _A = 0.00000000000002938236954847331; _M = 5.125; }; + if (_velocity > 1025) exitWith { _A = 0.00000000000001228597370774746; _M = 5.25; }; + if (_velocity > 980) exitWith { _A = 0.00000000000002916938264100495; _M = 5.125; }; + if (_velocity > 945) exitWith { _A = 0.0000000000003855099424807451; _M = 4.75; }; + if (_velocity > 905) exitWith { _A = 0.00000000001185097045689854; _M = 4.25; }; + if (_velocity > 860) exitWith { _A = 0.0000000003566129470974951; _M = 3.75; }; + if (_velocity > 810) exitWith { _A = 0.00000001045513263966272; _M = 3.25; }; + if (_velocity > 780) exitWith { _A = 0.0000001291159200846216; _M = 2.875; }; + if (_velocity > 750) exitWith { _A = 0.0000006824429329105383; _M = 2.625; }; + if (_velocity > 700) exitWith { _A = 0.000003569169672385163; _M = 2.375; }; + if (_velocity > 640) exitWith { _A = 0.00001839015095899579; _M = 2.125; }; + if (_velocity > 600) exitWith { _A = 0.00005711174688734240; _M = 1.950; }; + if (_velocity > 550) exitWith { _A = 0.00009226557091973427; _M = 1.875; }; + if (_velocity > 250) exitWith { _A = 0.00009337991957131389; _M = 1.875; }; + if (_velocity > 100) exitWith { _A = 0.00007225247327590413; _M = 1.925; }; + if (_velocity > 65) exitWith { _A = 0.00005792684957074546; _M = 1.975; }; + if (_velocity > 0) exitWith { _A = 0.00005206214107320588; _M = 2.000; }; }; }; - case 2: - { - switch true do { - case (_velocity > 1674) : { _A = 0.0079470052136733; _M = 1.36999902851493; }; - case (_velocity > 1172) : { _A = 0.00100419763721974; _M = 1.65392237010294; }; - case (_velocity > 1060) : { _A = 0.0000000000000000000000715571228255369; _M = 7.91913562392361; }; - case (_velocity > 949) : { _A = 0.000000000139589807205091; _M = 3.81439537623717; }; - case (_velocity > 670) : { _A = 0.000234364342818625; _M = 1.71869536324748; }; - case (_velocity > 335) : { _A = 0.000177962438921838; _M = 1.76877550388679; }; - case (_velocity > 0) : { _A = 0.0000518033561289704; _M = 1.98160270524632; }; + case 2: { + call { + if (_velocity > 1674) exitWith { _A = 0.0079470052136733; _M = 1.36999902851493; }; + if (_velocity > 1172) exitWith { _A = 0.00100419763721974; _M = 1.65392237010294; }; + if (_velocity > 1060) exitWith { _A = 0.0000000000000000000000715571228255369; _M = 7.91913562392361; }; + if (_velocity > 949) exitWith { _A = 0.000000000139589807205091; _M = 3.81439537623717; }; + if (_velocity > 670) exitWith { _A = 0.000234364342818625; _M = 1.71869536324748; }; + if (_velocity > 335) exitWith { _A = 0.000177962438921838; _M = 1.76877550388679; }; + if (_velocity > 0) exitWith { _A = 0.0000518033561289704; _M = 1.98160270524632; }; }; }; - case 5: - { - switch true do { - case (_velocity > 1730) : { _A = 0.00724854775171929; _M = 1.41538574492812; }; - case (_velocity > 1228) : { _A = 0.0000350563361516117; _M = 2.13077307854948; }; - case (_velocity > 1116) : { _A = 0.000000000000184029481181151; _M = 4.81927320350395; }; - case (_velocity > 1004) : { _A = 0.000000000000000000000134713064017409; _M = 7.8100555281422 ; }; - case (_velocity > 837) : { _A = 0.000000103965974081168; _M = 2.84204791809926; }; - case (_velocity > 335) : { _A = 0.0001093015938698234; _M = 1.81096361579504; }; - case (_velocity > 0) : { _A = 0.0000351963178524273; _M = 2.00477856801111; }; + case 5: { + call { + if (_velocity > 1730) exitWith { _A = 0.00724854775171929; _M = 1.41538574492812; }; + if (_velocity > 1228) exitWith { _A = 0.0000350563361516117; _M = 2.13077307854948; }; + if (_velocity > 1116) exitWith { _A = 0.000000000000184029481181151; _M = 4.81927320350395; }; + if (_velocity > 1004) exitWith { _A = 0.000000000000000000000134713064017409; _M = 7.8100555281422; }; + if (_velocity > 837) exitWith { _A = 0.000000103965974081168; _M = 2.84204791809926; }; + if (_velocity > 335) exitWith { _A = 0.0001093015938698234; _M = 1.81096361579504; }; + if (_velocity > 0) exitWith { _A = 0.0000351963178524273; _M = 2.00477856801111; }; }; }; - case 6: - { - switch true do { - case (_velocity > 3236) : { _A = 0.0455384883480781; _M = 1.15997674041274; }; - case (_velocity > 2065) : { _A = 0.07167261849653769; _M = 1.10704436538885; }; - case (_velocity > 1311) : { _A = 0.00166676386084348; _M = 1.60085100195952; }; - case (_velocity > 1144) : { _A = 0.000000101482730119215; _M = 2.9569674731838 ; }; - case (_velocity > 1004) : { _A = 0.00000000000000000431542773103552; _M = 6.34106317069757; }; - case (_velocity > 670) : { _A = 0.0000204835650496866; _M = 2.11688446325998; }; - case (_velocity > 0) : { _A = 0.0000750912466084823; _M = 1.92031057847052; }; + case 6: { + call { + if (_velocity > 3236) exitWith { _A = 0.0455384883480781; _M = 1.15997674041274; }; + if (_velocity > 2065) exitWith { _A = 0.07167261849653769; _M = 1.10704436538885; }; + if (_velocity > 1311) exitWith { _A = 0.00166676386084348; _M = 1.60085100195952; }; + if (_velocity > 1144) exitWith { _A = 0.000000101482730119215; _M = 2.9569674731838; }; + if (_velocity > 1004) exitWith { _A = 0.00000000000000000431542773103552; _M = 6.34106317069757; }; + if (_velocity > 670) exitWith { _A = 0.0000204835650496866; _M = 2.11688446325998; }; + if (_velocity > 0) exitWith { _A = 0.0000750912466084823; _M = 1.92031057847052; }; }; }; - case 7: - { - switch true do { - case (_velocity > 4200) : { _A = 0.00000000129081656775919; _M = 3.24121295355962; }; - case (_velocity > 3000) : { _A = 0.0171422231434847; _M = 1.27907168025204; }; - case (_velocity > 1470) : { _A = 0.00233355948302505; _M = 1.52693913274526; }; - case (_velocity > 1260) : { _A = 0.000797592111627665; _M = 1.67688974440324; }; - case (_velocity > 1110) : { _A = 0.00000000000571086414289273; _M = 4.3212826264889 ; }; - case (_velocity > 960) : { _A = 0.0000000000000000302865108244904; _M = 5.99074203776707; }; - case (_velocity > 670) : { _A = 0.00000752285155782535; _M = 2.1738019851075 ; }; - case (_velocity > 540) : { _A = 0.0000131766281225189; _M = 2.08774690257991; }; - case (_velocity > 0) : { _A = 0.0000134504843776525; _M = 2.08702306738884; }; + case 7: { + call { + if (_velocity > 4200) exitWith { _A = 0.00000000129081656775919; _M = 3.24121295355962; }; + if (_velocity > 3000) exitWith { _A = 0.0171422231434847; _M = 1.27907168025204; }; + if (_velocity > 1470) exitWith { _A = 0.00233355948302505; _M = 1.52693913274526; }; + if (_velocity > 1260) exitWith { _A = 0.000797592111627665; _M = 1.67688974440324; }; + if (_velocity > 1110) exitWith { _A = 0.00000000000571086414289273; _M = 4.3212826264889; }; + if (_velocity > 960) exitWith { _A = 0.0000000000000000302865108244904; _M = 5.99074203776707; }; + if (_velocity > 670) exitWith { _A = 0.00000752285155782535; _M = 2.1738019851075; }; + if (_velocity > 540) exitWith { _A = 0.0000131766281225189; _M = 2.08774690257991; }; + if (_velocity > 0) exitWith { _A = 0.0000134504843776525; _M = 2.08702306738884; }; }; }; - case 8: - { - switch true do { - case (_velocity > 3571) : { _A = 0.0112263766252305; _M = 1.33207346655961; }; - case (_velocity > 1841) : { _A = 0.0167252613732636; _M = 1.28662041261785; }; - case (_velocity > 1120) : { _A = 0.00220172456619625; _M = 1.55636358091189; }; - case (_velocity > 1088) : { _A = 0.00000000000000020538037167098; _M = 5.80410776994789; }; - case (_velocity > 976) : { _A = 0.00000000000592182174254121; _M = 4.29275576134191; }; - case (_velocity > 0) : { _A = 0.000043917343795117; _M = 1.99978116283334; }; + case 8: { + call { + if (_velocity > 3571) exitWith { _A = 0.0112263766252305; _M = 1.33207346655961; }; + if (_velocity > 1841) exitWith { _A = 0.0167252613732636; _M = 1.28662041261785; }; + if (_velocity > 1120) exitWith { _A = 0.00220172456619625; _M = 1.55636358091189; }; + if (_velocity > 1088) exitWith { _A = 0.00000000000000020538037167098; _M = 5.80410776994789; }; + if (_velocity > 976) exitWith { _A = 0.00000000000592182174254121; _M = 4.29275576134191; }; + if (_velocity > 0) exitWith { _A = 0.000043917343795117; _M = 1.99978116283334; }; }; }; }; -if (_A != -1 && _M != -1 && _velocity > 0 && _velocity < 10000) then { - _result = _A * (_velocity ^ _M) / _dragCoefficient; - _result = _result / 3.2808399; +if (!isNil "_A" && !isNil "_M" && _velocity > 0 && _velocity < 10000) then { + (_A * (_velocity ^ _M) / _dragCoefficient) / 3.2808399 +} else { + 0 }; - -_result diff --git a/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf b/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf index 9b205c3ec2..671ab2ccb0 100644 --- a/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf +++ b/addons/advanced_ballistics/functions/fnc_calculateStabilityFactor.sqf @@ -13,33 +13,23 @@ * 6: barometric Pressure - hPA * * Return Value: - * 0: stability factor + * stability factor * * Public: No */ #include "script_component.hpp" -private ["_caliber", "_bulletLength", "_bulletMass", "_barrelTwist", "_muzzleVelocity", "_temperature", "_barometricPressure", "_l", "_t", "_stabilityFactor"]; -_caliber = _this select 0; -_bulletLength = _this select 1; -_bulletMass = _this select 2; -_barrelTwist = _this select 3; -_muzzleVelocity = _this select 4; -_temperature = _this select 5; -_barometricPressure = _this select 6; +private ["_twist", "_length", "_stabilityFactor"]; +params ["_caliber", "_bulletLength", "_bulletMass", "_barrelTwist", "_muzzleVelocity", "_temperature", "_barometricPressure"]; // Source: http://www.jbmballistics.com/ballistics/bibliography/articles/miller_stability_1.pdf -_t = _barrelTwist / _caliber; -_l = _bulletLength / _caliber; +_twist = _barrelTwist / _caliber; +_length = _bulletLength / _caliber; -_stabilityFactor = 7587000 * _bulletMass / (_t^2 * _caliber^3 * _l * (1 + _l^2)); +_stabilityFactor = 7587000 * _bulletMass / (_twist^2 * _caliber^3 * _length * (1 + _length^2)); if (_muzzleVelocity > 341.376) then { - _stabilityFactor = _stabilityFactor * (_muzzleVelocity / 853.44) ^ (1/3); + (_stabilityFactor * (_muzzleVelocity / 853.44) ^ (1/3)) * KELVIN(_temperature) / KELVIN(15) * 1013.25 / _barometricPressure } else { - _stabilityFactor = _stabilityFactor * (_muzzleVelocity / 341.376) ^ (1/3); + (_stabilityFactor * (_muzzleVelocity / 341.376) ^ (1/3)) * KELVIN(_temperature) / KELVIN(15) * 1013.25 / _barometricPressure }; - -_stabilityFactor = _stabilityFactor * KELVIN(_temperature) / KELVIN(15) * 1013.25 / _barometricPressure; - -_stabilityFactor diff --git a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf index 1a4c344b2e..9debec1dc8 100644 --- a/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf +++ b/addons/advanced_ballistics/functions/fnc_displayProtractor.sqf @@ -8,6 +8,8 @@ * * Return value: * None + * + * Public: No */ #include "script_component.hpp" @@ -15,8 +17,6 @@ #define __ctrl1 (__dsp displayCtrl 132950) #define __ctrl2 (__dsp displayCtrl 132951) -private ["_inclinationAngle", "_refPosition"]; - if (GVAR(Protractor)) exitWith { GVAR(Protractor) = false; 1 cutText ["", "PLAIN"]; @@ -32,30 +32,26 @@ EGVAR(weather,WindInfo) = false; GVAR(Protractor) = true; [{ + params ["","_idPFH"]; if !(GVAR(Protractor) && !(weaponLowered ACE_player) && currentWeapon ACE_player == primaryWeapon ACE_player) exitWith { GVAR(Protractor) = false; 1 cutText ["", "PLAIN"]; - [_this select 1] call cba_fnc_removePerFrameHandler; + [_idPFH] call cba_fnc_removePerFrameHandler; }; - - _refPosition = [SafeZoneX + 0.001, SafeZoneY + 0.001, 0.2, 0.2 * 4/3]; - - _inclinationAngle = asin((ACE_player weaponDirection currentWeapon ACE_player) select 2); - _inclinationAngle = -58 max _inclinationAngle min 58; - + 1 cutRsc ["RscProtractor", "PLAIN", 1, false]; - + __ctrl1 ctrlSetScale 1; __ctrl1 ctrlCommit 0; __ctrl1 ctrlSetText QUOTE(PATHTOF(UI\protractor.paa)); __ctrl1 ctrlSetTextColor [1, 1, 1, 1]; - + __ctrl2 ctrlSetScale 1; - __ctrl2 ctrlSetPosition [(_refPosition select 0), (_refPosition select 1) - 0.0012 * _inclinationAngle, (_refPosition select 2), (_refPosition select 3)]; + __ctrl2 ctrlSetPosition [SafeZoneX + 0.001, SafeZoneY + 0.001 - 0.0012 * (-58 max (asin((ACE_player weaponDirection currentWeapon ACE_player) select 2)) min 58), 0.2, 0.2 * 4/3]; __ctrl2 ctrlCommit 0; __ctrl2 ctrlSetText QUOTE(PATHTOF(UI\protractor_marker.paa)); __ctrl2 ctrlSetTextColor [1, 1, 1, 1]; - + }, 0.1, []] call CBA_fnc_addPerFrameHandler; true diff --git a/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf b/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf new file mode 100644 index 0000000000..2ae2bf2f9c --- /dev/null +++ b/addons/advanced_ballistics/functions/fnc_handleFirePFH.sqf @@ -0,0 +1,47 @@ +/* + * Author: Glowbal, Ruthberg, joko // Jonas + * Handle the PFH for Bullets + * + * Arguments: + * None + * + * Return Value: + * None + * + * Public: No + */ +#include "script_component.hpp" + +private "_deleted"; + + + +_deleted = 0; + +{ + private ["_bulletVelocity", "_bulletPosition", "_bulletSpeed"]; + _x params["_bullet","_caliber","_bulletTraceVisible","_index"]; + + _bulletVelocity = velocity _bullet; + + _bulletSpeed = vectorMagnitude _bulletVelocity; + + if (!alive _bullet || _bulletSpeed < 100) exitWith { + GVAR(allBullets) deleteAt (_forEachIndex - _deleted); + _deleted = _deleted + 1; + }; + + _bulletPosition = getPosASL _bullet; + + if (_bulletTraceVisible && _bulletSpeed > 500) then { + drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.02*_caliber,0.01*_caliber],[[0,0,0,0.65],[0,0,0,0.2]],[1,0],0,0,"","",""]; + }; + + _aceTimeSecond = floor ACE_time; + call compile ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, _aceTimeSecond, ACE_time - _aceTimeSecond]); +} forEach GVAR(allBullets); + +if (GVAR(allBullets) isEqualTo []) then { + [_this select 1] call CBA_fnc_removePerFrameHandler; + GVAR(BulletPFH) = nil; +}; diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index 7c01bd9f23..74c16bdd47 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -13,28 +13,28 @@ * 6: projectile - Object of the projectile that was shot * * Return Value: - * Nothing + * None * * Public: No */ #include "script_component.hpp" -private ["_unit", "_weapon", "_mode", "_ammo", "_magazine", "_caliber", "_bullet", "_abort", "_AmmoCacheEntry", "_WeaponCacheEntry", "_opticsName", "_opticType", "_bulletTraceVisible", "_temperature", "_barometricPressure", "_bulletMass", "_bulletLength", "_muzzleVelocity", "_muzzleVelocityShift", "_bulletVelocity", "_bulletSpeed", "_bulletLength", "_barrelTwist", "_stabilityFactor"]; -_unit = _this select 0; -_weapon = _this select 1; -_mode = _this select 3; -_ammo = _this select 4; -_magazine = _this select 5; -_bullet = _this select 6; +// Early Quiting +if (!hasInterface) exitWith {}; +if (!GVAR(enabled)) exitWith {}; + +// Parameterization +private ["_abort", "_AmmoCacheEntry", "_WeaponCacheEntry", "_opticsName", "_opticType", "_bulletTraceVisible", "_temperature", "_barometricPressure", "_bulletMass", "_bulletLength", "_muzzleVelocity", "_muzzleVelocityShift", "_bulletVelocity", "_bulletSpeed", "_bulletLength", "_barrelTwist", "_stabilityFactor"]; +params ["_unit", "_weapon", "", "_mode", "_ammo", "_magazine", "_bullet"]; _abort = false; -if (!hasInterface) exitWith {}; -if (!alive _bullet) exitWith {}; -if (!GVAR(enabled)) exitWith {}; -if (!([_unit] call EFUNC(common,isPlayer))) exitWith {}; -if (underwater _unit) exitWith {}; + + if (!(_ammo isKindOf "BulletBase")) exitWith {}; +if (!alive _bullet) exitWith {}; +if (!([_unit] call EFUNC(common,isPlayer))) exitWith {}; if (_unit distance ACE_player > GVAR(simulationRadius)) exitWith {}; +if (underwater _unit) exitWith {}; if (!GVAR(simulateForEveryone) && !(local _unit)) then { // The shooter is non local _abort = true; @@ -53,39 +53,44 @@ if (!GVAR(simulateForEveryone) && !(local _unit)) then { 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 [_bullet, getNumber(configFile >> "cfgAmmo" >> _ammo >> "airFriction")]; - }; + [_bullet, getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction")] call EFUNC(winddeflection,updateTrajectoryPFH); }; +// Get Weapon and Ammo Configurations _AmmoCacheEntry = uiNamespace getVariable format[QGVAR(%1), _ammo]; -if (isNil {_AmmoCacheEntry}) then { +if (isNil "_AmmoCacheEntry") then { _AmmoCacheEntry = _ammo call FUNC(readAmmoDataFromConfig); }; _WeaponCacheEntry = uiNamespace getVariable format[QGVAR(%1), _weapon]; -if (isNil {_WeaponCacheEntry}) then { +if (isNil "_WeaponCacheEntry") then { _WeaponCacheEntry = _weapon call FUNC(readWeaponDataFromConfig); }; +_AmmoCacheEntry params ["_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable"]; +_WeaponCacheEntry params ["_barrelTwist", "_twistDirection", "_barrelLength"]; + + _bulletVelocity = velocity _bullet; _muzzleVelocity = vectorMagnitude _bulletVelocity; if (GVAR(barrelLengthInfluenceEnabled)) then { - _muzzleVelocityShift = [_WeaponCacheEntry select 2, _AmmoCacheEntry select 10, _AmmoCacheEntry select 11, _muzzleVelocity] call FUNC(calculateBarrelLengthVelocityShift); - if (_muzzleVelocityShift != 0) then { - _bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift)); - _bullet setVelocity _bulletVelocity; - _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; + _barrelVelocityShift = uiNamespace getVariable [format [QGVAR(%1_muzzleVelocityShift),_weapon],nil]; + if (isNil "_barrelVelocityShift") then { + _barrelVelocityShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, _muzzleVelocity] call FUNC(calculateBarrelLengthVelocityShift); + uiNamespace setVariable [format [QGVAR(%1_muzzleVelocityShift),_weapon],_muzzleVelocityShift]; }; }; if (GVAR(ammoTemperatureEnabled)) then { _temperature = ((getPosASL _unit) select 2) call EFUNC(weather,calculateTemperatureAtHeight); - _muzzleVelocityShift = [_AmmoCacheEntry select 9, _temperature] call FUNC(calculateAmmoTemperatureVelocityShift); + _temperatureVelocityShift = ([_ammoTempMuzzleVelocityShifts, _temperature] call FUNC(calculateAmmoTemperatureVelocityShift)); +}; + +if (GVAR(ammoTemperatureEnabled) || GVAR(barrelLengthInfluenceEnabled)) then { if (_muzzleVelocityShift != 0) then { + _muzzleVelocity = _muzzleVelocity + (_barrelVelocityShift + _ammoTemperatureVelocityShift); _bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift)); _bullet setVelocity _bulletVelocity; - _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; }; }; @@ -102,43 +107,22 @@ if (GVAR(bulletTraceEnabled) && cameraView == "GUNNER") then { }; }; -_caliber = _AmmoCacheEntry select 1; -_bulletLength = _AmmoCacheEntry select 2; -_bulletMass = _AmmoCacheEntry select 3; -_barrelTwist = _WeaponCacheEntry select 0; _stabilityFactor = 1.5; - if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { - _temperature = ((getPosASL _unit) select 2) call EFUNC(weather,calculateTemperatureAtHeight); + if (isNil "_temperature") then { + _temperature = ((getPosASL _unit) select 2) call EFUNC(weather,calculateTemperatureAtHeight); + }; _barometricPressure = ((getPosASL _bullet) select 2) call EFUNC(weather,calculateBarometricPressure); _stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor); }; GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000; -"ace_advanced_ballistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", GVAR(currentbulletID), _AmmoCacheEntry select 0, _AmmoCacheEntry select 6, _AmmoCacheEntry select 7, _AmmoCacheEntry select 8, _AmmoCacheEntry select 5, _stabilityFactor, _WeaponCacheEntry select 1, _muzzleVelocity, _AmmoCacheEntry select 4, getPosASL _bullet, EGVAR(common,mapLatitude), EGVAR(weather,currentTemperature), EGVAR(common,mapAltitude), EGVAR(weather,currentHumidity), overcast, floor(ACE_time), ACE_time - floor(ACE_time)]; +_aceTimeSecond = floor ACE_time; +"ace_advanced_ballistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", GVAR(currentbulletID), _airFriction, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _stabilityFactor, _twistDirection, _muzzleVelocity, _transonicStabilityCoef, getPosASL _bullet, EGVAR(common,mapLatitude), EGVAR(weather,currentTemperature), EGVAR(common,mapAltitude), EGVAR(weather,currentHumidity), overcast, _aceTimeSecond, ACE_time - _aceTimeSecond]; -[{ - private ["_args", "_index", "_bullet", "_caliber", "_bulletTraceVisible", "_bulletVelocity", "_bulletPosition"]; - _args = _this select 0; - _bullet = _args select 0; - _caliber = _args select 1; - _bulletTraceVisible = _args select 2; - _index = _args select 3; - - _bulletVelocity = velocity _bullet; - _bulletPosition = getPosASL _bullet; - - _bulletSpeed = vectorMagnitude _bulletVelocity; - - if (!alive _bullet || _bulletSpeed < 100) exitWith { - [_this select 1] call cba_fnc_removePerFrameHandler; - }; - - if (_bulletTraceVisible && _bulletSpeed > 500) then { - drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.02*_caliber,0.01*_caliber],[[0,0,0,0.65],[0,0,0,0.2]],[1,0],0,0,"","",""]; - }; +GVAR(allBullets) pushBack [_bullet, _caliber, _bulletTraceVisible, GVAR(currentbulletID)]; - call compile ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, floor(ACE_time), ACE_time - floor(ACE_time)]); - -}, GVAR(simulationInterval), [_bullet, _caliber, _bulletTraceVisible, GVAR(currentbulletID)]] call CBA_fnc_addPerFrameHandler; +if (isNil QGVAR(BulletPFH)) then { + GVAR(BulletPFH) = [FUNC(handleFirePFH), GVAR(simulationInterval), []] call CBA_fnc_addPerFrameHandler; +}; diff --git a/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf b/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf index 186c0d0649..4898c51c10 100644 --- a/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf +++ b/addons/advanced_ballistics/functions/fnc_initModuleSettings.sqf @@ -8,17 +8,13 @@ * 2: activated * * Return Value: - * None + * None * * Public: No */ - #include "script_component.hpp" -private ["_logic", "_units", "_activated"]; -_logic = _this select 0; -_units = _this select 1; -_activated = _this select 2; +params ["_logic","_units", "_activated"]; if !(_activated) exitWith {}; diff --git a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf index b2fc7ba084..53ac6aa874 100644 --- a/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf +++ b/addons/advanced_ballistics/functions/fnc_initializeTerrainExtension.sqf @@ -3,10 +3,10 @@ * Initializes the advanced ballistics dll extension with terrain data * * Arguments: - * Nothing + * None * * Return Value: - * Nothing + * None * * Public: No */ @@ -22,9 +22,9 @@ _initStartTime = ACE_time; _mapSize = getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize"); if (("ace_advanced_ballistics" callExtension format["init:%1:%2", worldName, _mapSize]) == "Terrain already initialized") exitWith { - if (GVAR(initMessageEnabled)) then { + #ifdef DEBUG_MODE_FULL systemChat "AdvancedBallistics: Terrain already initialized"; - }; + #endIf }; _mapGrids = ceil(_mapSize / 50) + 1; @@ -33,19 +33,16 @@ _gridCells = _mapGrids * _mapGrids; GVAR(currentGrid) = 0; [{ - private ["_args", "_mapGrids", "_gridCells", "_initStartTime"]; - _args = _this select 0; - _mapGrids = _args select 0; - _gridCells = _args select 1; - _initStartTime = _args select 2; - + params ["_args","_idPFH"]; + _args params ["_mapGrids", "_gridCells", "_initStartTime"]; + if (GVAR(currentGrid) >= _gridCells) exitWith { - if (GVAR(initMessageEnabled)) then { + #ifdef DEBUG_MODE_FULL systemChat format["AdvancedBallistics: Finished terrain initialization in %1 seconds", ceil(ACE_time - _initStartTime)]; - }; - [_this select 1] call cba_fnc_removePerFrameHandler; + #endif + [_idPFH] call cba_fnc_removePerFrameHandler; }; - + for "_i" from 1 to 50 do { _x = floor(GVAR(currentGrid) / _mapGrids) * 50; _y = (GVAR(currentGrid) - floor(GVAR(currentGrid) / _mapGrids) * _mapGrids) * 50; @@ -57,5 +54,5 @@ GVAR(currentGrid) = 0; GVAR(currentGrid) = GVAR(currentGrid) + 1; if (GVAR(currentGrid) >= _gridCells) exitWith {}; }; - + }, 0, [_mapGrids, _gridCells, _initStartTime]] call CBA_fnc_addPerFrameHandler diff --git a/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf b/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf index 10e7e60df2..9839c1dcc3 100644 --- a/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf +++ b/addons/advanced_ballistics/functions/fnc_readAmmoDataFromConfig.sqf @@ -4,61 +4,53 @@ * Reads the ammo class config and updates the config cache * * Arguments: - * 0: ammo - classname + * ammo - classname * * Return Value: - * 0: [_airFriction, _caliber, _bulletLength, _bulletMass, _transonicStabilityCoef, _dragModel, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _ammoTempMuzzleVelocityShifts, _muzzleVelocityTable, _barrelLengthTable] + * 0: _airFriction + * 1: _caliber + * 2: _bulletLength + * 3: _bulletMass + * 4: _transonicStabilityCoef + * 5: _dragModel + * 6: _ballisticCoefficients + * 7: _velocityBoundaries + * 8: _atmosphereModel + * 9: _ammoTempMuzzleVelocityShifts + * 10: _muzzleVelocityTable + * 11: _barrelLengthTable * - * Return value: - * None + * Public: No */ #include "script_component.hpp" private ["_ammo", "_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable", "_result"]; -_ammo = _this; +_ammoConfig = configFile >> "CfgAmmo" >> _this; -_airFriction = getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction"); -_caliber = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_caliber"); -_bulletLength = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_bulletLength"); -_bulletMass = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_bulletMass"); -_transonicStabilityCoef = 0.5; -if (isNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_transonicStabilityCoef")) then { - _transonicStabilityCoef = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_transonicStabilityCoef"); +_airFriction = getNumber(_ammoConfig >> "airFriction"); +_caliber = getNumber(_ammoConfig >> "ACE_caliber"); +_bulletLength = getNumber(_ammoConfig >> "ACE_bulletLength"); +_bulletMass = getNumber(_ammoConfig >> "ACE_bulletMass"); +_transonicStabilityCoef = getNumber(_ammoConfig >> "ACE_transonicStabilityCoef"); +if (_transonicStabilityCoef == 0) then { + _transonicStabilityCoef = 0.5; }; -_dragModel = 1; -_ballisticCoefficients = []; -_velocityBoundaries = []; -_atmosphereModel = "ICAO"; -if (isNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_dragModel")) then { - _dragModel = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_dragModel"); - if (!(_dragModel in [1, 2, 5, 6, 7, 8])) then { - _dragModel = 1; - }; +_dragModel = getNumber(_ammoConfig >> "ACE_dragModel"); +if (_dragModel == 0 || !(_dragModel in [1, 2, 5, 6, 7, 8])) then { + _dragModel = 1; }; -if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_ballisticCoefficients")) then { - _ballisticCoefficients = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_ballisticCoefficients"); -}; -if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_velocityBoundaries")) then { - _velocityBoundaries = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_velocityBoundaries"); -}; -if (isText(configFile >> "CfgAmmo" >> _ammo >> "ACE_standardAtmosphere")) then { - _atmosphereModel = getText(configFile >> "CfgAmmo" >> _ammo >> "ACE_standardAtmosphere"); -}; -_ammoTempMuzzleVelocityShifts = []; -if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_ammoTempMuzzleVelocityShifts")) then { - _ammoTempMuzzleVelocityShifts = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_ammoTempMuzzleVelocityShifts"); -}; -_muzzleVelocityTable = []; -_barrelLengthTable = []; -if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_muzzleVelocities")) then { - _muzzleVelocityTable = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_muzzleVelocities"); -}; -if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_barrelLengths")) then { - _barrelLengthTable = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_barrelLengths"); +_ballisticCoefficients = getArray(_ammoConfig >> "ACE_ballisticCoefficients"); +_velocityBoundaries = getArray(_ammoConfig >> "ACE_velocityBoundaries"); +_atmosphereModel = getText(_ammoConfig >> "ACE_standardAtmosphere"); +if (_atmosphereModel isEqualTo "") then { + _atmosphereModel = "ICAO"; }; +_ammoTempMuzzleVelocityShifts = getArray(_ammoConfig >> "ACE_ammoTempMuzzleVelocityShifts"); +_muzzleVelocityTable = getArray(_ammoConfig >> "ACE_muzzleVelocities"); +_barrelLengthTable = getArray(_ammoConfig >> "ACE_barrelLengths"); _result = [_airFriction, _caliber, _bulletLength, _bulletMass, _transonicStabilityCoef, _dragModel, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _ammoTempMuzzleVelocityShifts, _muzzleVelocityTable, _barrelLengthTable]; -uiNamespace setVariable [format[QGVAR(%1), _ammo], _result]; +uiNamespace setVariable [format[QGVAR(%1), _this], _result]; _result diff --git a/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf b/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf index 8a1a29f7b0..8e13dc04dc 100644 --- a/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf +++ b/addons/advanced_ballistics/functions/fnc_readWeaponDataFromConfig.sqf @@ -4,28 +4,28 @@ * Reads the weapon class config and updates the config cache * * Arguments: - * 0: weapon - classname + * weapon - classname * * Return Value: - * 0: [_barrelTwist, _twistDirection, _barrelLength] + * 0: _barrelTwist + * 1: _twistDirection + * 2: _barrelLength * - * Return value: - * None + * Public: No */ #include "script_component.hpp" -private ["_weapon", "_barrelTwist", "_twistDirection", "_barrelLength", "_result"]; -_weapon = _this; +private ["_weaponConfig", "_barrelTwist", "_twistDirection", "_barrelLength", "_result"]; +_weaponConfig = (configFile >> "CfgWeapons" >> _this); -_barrelTwist = getNumber(configFile >> "CfgWeapons" >> _weapon >> "ACE_barrelTwist"); +_barrelTwist = getNumber(_weaponConfig >> "ACE_barrelTwist"); _twistDirection = 1; -if (isNumber(configFile >> "CfgWeapons" >> _weapon >> "ACE_twistDirection")) then { - _twistDirection = getNumber(configFile >> "CfgWeapons" >> _weapon >> "ACE_twistDirection"); - if (_twistDirection != -1 && _twistDirection != 0 && _twistDirection != 1) then { - _twistDirection = 1; - }; +_twistDirection = getNumber(_weaponConfig >> "ACE_twistDirection"); +if !(_twistDirection in [-1, 0, 1]) then { + _twistDirection = 1; }; -_barrelLength = getNumber(configFile >> "CfgWeapons" >> _weapon >> "ACE_barrelLength"); + +_barrelLength = getNumber(_weaponConfig >> "ACE_barrelLength"); _result = [_barrelTwist, _twistDirection, _barrelLength]; diff --git a/addons/aircraft/README.md b/addons/aircraft/README.md index 1049493f45..3db71ca51a 100644 --- a/addons/aircraft/README.md +++ b/addons/aircraft/README.md @@ -1,9 +1,10 @@ ace_aircraft ============ -Changes to air weaponry, flightmodels and HUDs. +Changes to air weaponry, flight models and HUDs. + +- Contributions by Kimi (geraldbolso1899) for HUD updates -* Contributations by Kimi (geraldbolso1899) for HUD updates ## Maintainers @@ -11,4 +12,4 @@ The people responsible for merging changes to this component or answering potent - [KoffeinFlummi](https://github.com/KoffeinFlummi) - [commy2](https://github.com/commy2) -- [jaynus](https://github.com/walterpearce) \ No newline at end of file +- [jaynus](https://github.com/walterpearce) diff --git a/addons/apl/README.md b/addons/apl/README.md new file mode 100644 index 0000000000..13b5f9d268 --- /dev/null +++ b/addons/apl/README.md @@ -0,0 +1,11 @@ +ace_apl +============ + +Assets licensed under Arma Public License (APL). + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- None diff --git a/addons/atragmx/README.md b/addons/atragmx/README.md index f68b38c4a3..1b68573051 100644 --- a/addons/atragmx/README.md +++ b/addons/atragmx/README.md @@ -3,8 +3,9 @@ ace_atragmx ATragMX - Handheld ballistics calculator + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/attach/CfgEventHandlers.hpp b/addons/attach/CfgEventHandlers.hpp index 3daad1425a..c050fbd1c7 100644 --- a/addons/attach/CfgEventHandlers.hpp +++ b/addons/attach/CfgEventHandlers.hpp @@ -8,3 +8,24 @@ class Extended_PostInit_EventHandlers { clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); }; }; +class Extended_GetIn_EventHandlers { + class All { + class ADDON { + getIn = QUOTE(_this call FUNC(handleGetIn)); + }; + }; +}; +class Extended_GetOut_EventHandlers { + class All { + class ADDON { + getOut = QUOTE(_this call FUNC(handleGetOut)); + }; + }; +}; +class Extended_Killed_EventHandlers { + class All { + class ADDON { + killed = QUOTE(_this call FUNC(handleKilled)); + }; + }; +}; diff --git a/addons/attach/README.md b/addons/attach/README.md index 5fb73d0645..3bce88839c 100644 --- a/addons/attach/README.md +++ b/addons/attach/README.md @@ -2,7 +2,9 @@ ace_attach ========== Introducing the ability to attach various throwables to yourself or vehicles, to mark your position and assist in IFF. -Adds item `ACE_IR_Strobe_Item`. + +#### Items Added: +`ACE_IR_Strobe_Item` ## Maintainers diff --git a/addons/attach/XEH_preInit.sqf b/addons/attach/XEH_preInit.sqf index 06c6ed1b01..17b8490a77 100644 --- a/addons/attach/XEH_preInit.sqf +++ b/addons/attach/XEH_preInit.sqf @@ -7,6 +7,9 @@ PREP(canAttach); PREP(canDetach); PREP(detach); PREP(getChildrenAttachActions); +PREP(handleGetIn); +PREP(handleGetOut); +PREP(handleKilled); PREP(placeApprove); ADDON = true; diff --git a/addons/attach/functions/fnc_attach.sqf b/addons/attach/functions/fnc_attach.sqf index bd363b1307..6362edb33c 100644 --- a/addons/attach/functions/fnc_attach.sqf +++ b/addons/attach/functions/fnc_attach.sqf @@ -17,15 +17,14 @@ */ #include "script_component.hpp" -private ["_itemVehClass", "_onAtachText", "_selfAttachPosition", "_attachedItem", "_tempObject", "_actionID", "_model"]; -params ["_attachToVehicle","_unit","_args"]; +params ["_attachToVehicle","_unit","_args", ["_silentScripted", false]]; _args params [["_itemClassname","", [""]]]; -TRACE_3("params",_attachToVehicle,_unit,_itemClassname); +TRACE_4("params",_attachToVehicle,_unit,_itemClassname,_silentScripted); + +private ["_itemVehClass", "_onAtachText", "_selfAttachPosition", "_attachedItem", "_tempObject", "_actionID", "_model"]; //Sanity Check (_unit has item in inventory, not over attach limit) -if ((_itemClassname == "") || {!(_this call FUNC(canAttach))}) exitWith {ERROR("Tried to attach, but check failed");}; - -_selfAttachPosition = [_unit, [-0.05, 0, 0.12], "rightshoulder"]; +if ((_itemClassname == "") || {(!_silentScripted) && {!(_this call FUNC(canAttach))}}) exitWith {ERROR("Tried to attach, but check failed");}; _itemVehClass = getText (configFile >> "CfgWeapons" >> _itemClassname >> "ACE_Attachable"); _onAtachText = getText (configFile >> "CfgWeapons" >> _itemClassname >> "displayName"); @@ -40,12 +39,13 @@ if (_itemVehClass == "") exitWith {ERROR("no ACE_Attachable for Item");}; _onAtachText = format [localize LSTRING(Item_Attached), _onAtachText]; if (_unit == _attachToVehicle) then { //Self Attachment - _unit removeItem _itemClassname; // Remove item _attachedItem = _itemVehClass createVehicle [0,0,0]; - _attachedItem attachTo _selfAttachPosition; - [_onAtachText] call EFUNC(common,displayTextStructured); - _attachToVehicle setVariable [QGVAR(Objects), [_attachedItem], true]; - _attachToVehicle setVariable [QGVAR(ItemNames), [_itemClassname], true]; + _attachedItem attachTo [_unit, [-0.05, 0, 0.12], "rightshoulder"]; + if (!_silentScripted) then { + _unit removeItem _itemClassname; // Remove item + [_onAtachText] call EFUNC(common,displayTextStructured); + }; + _unit setVariable [QGVAR(attached), [[_attachedItem, _itemClassname]], true]; } else { GVAR(placeAction) = PLACE_WAITING; diff --git a/addons/attach/functions/fnc_canAttach.sqf b/addons/attach/functions/fnc_canAttach.sqf index 20a49c09be..37d92e8908 100644 --- a/addons/attach/functions/fnc_canAttach.sqf +++ b/addons/attach/functions/fnc_canAttach.sqf @@ -17,14 +17,17 @@ */ #include "script_component.hpp" -private ["_attachLimit", "_attachedObjects","_playerPos"]; params ["_attachToVehicle","_player","_args"]; _args params [["_itemClassname","", [""]]]; -TRACE_3("params",_attachToVehicle,_unit,_itemClassname); +TRACE_3("params",_attachToVehicle,_player,_itemClassname); + +private ["_attachLimit", "_attachedObjects"]; _attachLimit = [6, 1] select (_player == _attachToVehicle); -_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; +_attachedObjects = _attachToVehicle getVariable [QGVAR(attached), []]; -_playerPos = (ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot")); - -(canStand _player) && {(_attachToVehicle distance _player) < 7} && {alive _attachToVehicle} && {(count _attachedObjects) < _attachLimit} && {_itemClassname in ((itemsWithMagazines _player) + [""])}; +((_player == _attachToVehicle) || {canStand _player}) && +{(_attachToVehicle distance _player) < 7} && +{alive _attachToVehicle} && +{(count _attachedObjects) < _attachLimit} && +{_itemClassname in ((itemsWithMagazines _player) + [""])}; diff --git a/addons/attach/functions/fnc_canDetach.sqf b/addons/attach/functions/fnc_canDetach.sqf index ba3182ddea..915295e6c9 100644 --- a/addons/attach/functions/fnc_canDetach.sqf +++ b/addons/attach/functions/fnc_canDetach.sqf @@ -16,25 +16,25 @@ */ #include "script_component.hpp" -private ["_attachedObjects", "_inRange"]; params ["_attachToVehicle", "_unit"]; TRACE_2("params",_attachToVehicle,_unit); -_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; +_attachedList = _attachToVehicle getVariable [QGVAR(attached), []]; +if ((count _attachedList) == 0) exitWith {false}; + +private ["_inRange"]; _inRange = false; -if (_unit == _attachToVehicle) then { - _inRange = count _attachedObjects > 0; -} else { - //Scan if unit is within range (using 2d distance) - private ["_unitPos", "_objectPos"]; - _unitPos = getPos _unit; - _unitPos set [2,0]; - { - _objectPos = getPos _x; - _objectPos set [2, 0]; - if (_objectPos distance _unitPos < 4) exitWith {_inRange = true}; - } forEach _attachedObjects; -}; +{ + _x params ["_xObject"]; + if (isNull _xObject) exitWith { + TRACE_1("Null attached",_x); + _attachedList deleteAt _forEachIndex; + _attachToVehicle setVariable [QGVAR(attached), _attachedList, true]; + }; + if (((getPos _unit) distance2d (getPos _xObject)) < 4) exitWith {_inRange = true}; +} forEach _attachedList; -canStand _unit && {_inRange} && {alive _attachToVehicle} +_inRange && +{(_unit == _attachToVehicle) || {canStand _unit}} && +{alive _attachToVehicle} diff --git a/addons/attach/functions/fnc_detach.sqf b/addons/attach/functions/fnc_detach.sqf index 98f482f17b..05c625b374 100644 --- a/addons/attach/functions/fnc_detach.sqf +++ b/addons/attach/functions/fnc_detach.sqf @@ -16,15 +16,12 @@ */ #include "script_component.hpp" -private ["_attachedObjects", "_attachedItems", "_itemDisplayName", - "_attachedObject", "_attachedIndex", "_itemName", "_minDistance", - "_unitPos", "_objectPos" -]; params ["_attachToVehicle","_unit"], TRACE_2("params",_attachToVehicle,_unit); -_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; -_attachedItems = _attachToVehicle getVariable [QGVAR(ItemNames), []]; +private ["_attachedList", "_itemDisplayName", "_attachedObject", "_attachedIndex", "_itemName", "_minDistance"]; + +_attachedList = _attachToVehicle getVariable [QGVAR(attached), []]; _attachedObject = objNull; _attachedIndex = -1; @@ -32,18 +29,17 @@ _itemName = ""; //Find closest attached object _minDistance = 1000; -_unitPos = getPos _unit; -_unitPos set [2,0]; + { - _objectPos = getPos _x; - _objectPos set [2, 0]; - if (_objectPos distance _unitPos < _minDistance) then { - _minDistance = _objectPos distance _unitPos; - _attachedObject = _x; - _itemName = _attachedItems select _forEachIndex; + _x params ["_xObject", "_xItemName"]; + + if (((getPos _unit) distance2d (getPos _xObject)) < _minDistance) then { + _minDistance = ((getPos _unit) distance2d (getPos _xObject)); + _attachedObject = _xObject; + _itemName = _xItemName; _attachedIndex = _forEachIndex; }; -} forEach _attachedObjects; +} forEach _attachedList; // Check if unit has an attached item if (isNull _attachedObject || {_itemName == ""}) exitWith {ERROR("Could not find attached object")}; @@ -68,10 +64,8 @@ if (toLower _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) then }; // Reset unit variables -_attachedObjects deleteAt _attachedIndex; -_attachedItems deleteAt _attachedIndex; -_attachToVehicle setVariable [QGVAR(Objects), _attachedObjects, true]; -_attachToVehicle setVariable [QGVAR(ItemNames), _attachedItems, true]; +_attachedList deleteAt _attachedIndex; +_attachToVehicle setVariable [QGVAR(attached), _attachedList, true]; // Display message _itemDisplayName = getText (configFile >> "CfgWeapons" >> _itemName >> "displayName"); diff --git a/addons/attach/functions/fnc_handleGetIn.sqf b/addons/attach/functions/fnc_handleGetIn.sqf new file mode 100644 index 0000000000..b7b2997081 --- /dev/null +++ b/addons/attach/functions/fnc_handleGetIn.sqf @@ -0,0 +1,38 @@ +/* + * Author: PabstMirror + * Handles when a unit gets in to a vehicle. + * + * Arguments: + * 0: vehicle + * 1: dunno + * 2: unit + * + * Return Value: + * None + * + * Example: + * [car2, x, player] call ACE_attach_fnc_handleGetIn + * + * Public: No + */ +#include "script_component.hpp" + +if (!isServer) exitWith {}; + +params ["", "", "_unit"]; +TRACE_1("params",_unit); + +private ["_attachedList"]; + +_attachedList = _unit getVariable [QGVAR(attached), []]; +if ((count _attachedList) == 0) exitWith {}; + +(_attachedList select 0) params ["_xObject"]; +if (!isNull _xObject) then { + detach _xObject; + _xObject setPos ((getPos _unit) vectorAdd [0, 0, -1000]); + [{deleteVehicle (_this select 0)}, [_xObject], 2] call EFUNC(common,waitAndExecute); + (_attachedList select 0) set [0, objNull]; +}; + +_unit setVariable [QGVAR(attached), _attachedList, true]; diff --git a/addons/attach/functions/fnc_handleGetOut.sqf b/addons/attach/functions/fnc_handleGetOut.sqf new file mode 100644 index 0000000000..57fb69cf15 --- /dev/null +++ b/addons/attach/functions/fnc_handleGetOut.sqf @@ -0,0 +1,35 @@ +/* + * Author: PabstMirror + * Handles when a unit gets in to a vehicle. + * + * Arguments: + * 0: vehicle + * 1: dunno + * 2: unit + * + * Return Value: + * None + * + * Example: + * [car2, x, player] call ACE_attach_fnc_handleGetOut + * + * Public: No + */ +#include "script_component.hpp" + +if (!isServer) exitWith {}; + +params ["", "", "_unit"]; +TRACE_1("params",_unit); + +private ["_attachedList"]; + +_attachedList = _unit getVariable [QGVAR(attached), []]; +if ((count _attachedList) == 0) exitWith {}; + +(_attachedList select 0) params ["_xObject", "_xItemName"]; +if (isNull _xObject) then { + TRACE_1("null attached when exiting vehicle, scripted reattach",_xItemName); + _unit setVariable [QGVAR(attached), [], true]; + [_unit, _unit, _xItemName, true] call FUNC(attach); +}; diff --git a/addons/attach/functions/fnc_handleKilled.sqf b/addons/attach/functions/fnc_handleKilled.sqf new file mode 100644 index 0000000000..06c5473c88 --- /dev/null +++ b/addons/attach/functions/fnc_handleKilled.sqf @@ -0,0 +1,39 @@ +/* + * Author: PabstMirror + * Handles when vehicle or man is killed. + * Note: Runs where unit is local. + * + * Arguments: + * 0: DeadVehicle + * + * Return Value: + * None + * + * Example: + * [bob1] call ACE_attach_fnc_handleKilled + * + * Public: No + */ +#include "script_component.hpp" + +params ["_deadUnit"]; +TRACE_1("params",_deadUnit); + +private ["_attachedList"]; + +_attachedList = _deadUnit getVariable [QGVAR(attached), []]; + +if ((count _attachedList) == 0) exitWith {}; + +{ + _x params ["_xObject"]; + TRACE_2("detaching",_xObject,_deadUnit); + detach _xObject; + //If it's a vehicle, also delete the attached + if (!(_deadUnit isKindOf "CAManBase")) then { + _xObject setPos ((getPos _deadUnit) vectorAdd [0, 0, -1000]); + [{deleteVehicle (_this select 0)}, [_xObject], 2] call EFUNC(common,waitAndExecute); + }; +} forEach _attachedList; + +_deadUnit setVariable [QGVAR(attached), nil, true]; diff --git a/addons/attach/functions/fnc_placeApprove.sqf b/addons/attach/functions/fnc_placeApprove.sqf index 0656e7880f..b8e2cc17fb 100644 --- a/addons/attach/functions/fnc_placeApprove.sqf +++ b/addons/attach/functions/fnc_placeApprove.sqf @@ -25,7 +25,7 @@ */ #include "script_component.hpp" -private ["_startingOffset", "_startDistanceFromCenter", "_closeInUnitVector", "_closeInMax", "_closeInMin", "_closeInDistance", "_endPosTestOffset", "_endPosTest", "_doesIntersect", "_startingPosShifted", "_startASL", "_endPosShifted", "_endASL", "_attachedObject", "_currentObjects", "_currentItemNames"]; +private ["_startingOffset", "_startDistanceFromCenter", "_closeInUnitVector", "_closeInMax", "_closeInMin", "_closeInDistance", "_endPosTestOffset", "_endPosTest", "_doesIntersect", "_startingPosShifted", "_startASL", "_endPosShifted", "_endASL", "_attachedObject", "_attachList"]; params ["_unit", "_attachToVehicle", "_itemClassname", "_itemVehClass", "_onAtachText", "_startingPosition"]; TRACE_6("params",_unit,_attachToVehicle,_itemClassname,_itemVehClass,_onAtachText,_startingPosition); @@ -87,12 +87,9 @@ _attachedObject attachTo [_attachToVehicle, _endPosTestOffset]; //Remove Item from inventory _unit removeItem _itemClassname; -//Add Object to ACE_AttachedObjects and ACE_AttachedItemNames -_currentObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; -_currentObjects pushBack _attachedObject; -_attachToVehicle setVariable [QGVAR(Objects), _currentObjects, true]; -_currentItemNames = _attachToVehicle getVariable [QGVAR(ItemNames), []]; -_currentItemNames pushBack _itemClassname; -_attachToVehicle setVariable [QGVAR(ItemNames), _currentItemNames, true]; +//Add Object to attached array +_attachList = _attachToVehicle getVariable [QGVAR(attached), []]; +_attachList pushBack [_attachedObject, _itemClassname]; +_attachToVehicle setVariable [QGVAR(attached), _attachList, true]; [_onAtachText] call EFUNC(common,displayTextStructured); diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index 299a1575ac..cfbebd33ab 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -5,7 +5,7 @@ Attach item >> Gegenstand befestigen >> Acoplar objeto >> - Przyczep przedmiot >> + Przyczep >> Attacher l'objet >> Připnout předmět >> Fixar item >> @@ -185,7 +185,7 @@ %1<br/>Attached %1<br/>befestigt %1<br/>acoplada - %1<br/>przyczepiono + Przyczepiono<br/>%1 %1<br/>attachée %1<br/>Připnutý %1<br/>Fixada @@ -197,7 +197,7 @@ %1<br/>Detached %1<br/>entfernt %1<br/>quitada - %1<br/>odczepiono + Odczepiono<br/>%1 %1<br/>détachée %1<br/>Odepnutý %1<br/>Separada @@ -206,4 +206,4 @@ %1<br/>отсоединен(-а) - + \ No newline at end of file diff --git a/addons/backpacks/README.md b/addons/backpacks/README.md index 6fa54a9897..64e37f337b 100644 --- a/addons/backpacks/README.md +++ b/addons/backpacks/README.md @@ -1,7 +1,8 @@ ace_backpacks ================= -Adds indication when someone else opens your backpack (soundeffect / camShake). +Adds indication when someone else opens your backpack (sound effect and camera shake). + ## Maintainers diff --git a/addons/ballistics/README.md b/addons/ballistics/README.md index ac727f83c6..18d81bceb3 100644 --- a/addons/ballistics/README.md +++ b/addons/ballistics/README.md @@ -3,10 +3,11 @@ ace_ballistics Changes to weapon, magazine and ammunition values. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) +- [Ruthberg](http://github.com/Ulteq) - [KoffeinFlummi](https://github.com/KoffeinFlummi) - [commy2](https://github.com/commy2) diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index aa64e85e22..161fcce9a4 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -18,6 +18,11 @@ class CfgMovesBasic { default = "ACE_AmovPercMstpSsurWnonDnon"; PutDown = ""; }; + class ACE_CivilHandCuffedFFVActions: ACE_CivilStandHandcuffedActions { + stop = "ACE_HandcuffedFFV"; + StopRelaxed = "ACE_HandcuffedFFV"; + default = "ACE_HandcuffedFFV"; + }; }; }; @@ -55,6 +60,14 @@ class CfgMovesMaleSdr: CfgMovesBasic { InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; }; + //Handcuffed-FFV: + class ACE_HandcuffedFFV: ACE_AmovPercMstpScapWnonDnon { + file = "\A3\cargoposes_F_heli\anim\passenger_flatground_3idleunarmed.rtm"; + actions = "ACE_CivilHandCuffedFFVActions"; + ConnectTo[] = {}; + }; + + //Surrender Anims: class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon: CutSceneAnimationBase { actions = "ACE_CivilStandSurrenderActions"; diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 774ecf87e3..afda86cfda 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -12,17 +12,17 @@ class CfgVehicles { exceptions[] = {}; icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); }; - class ACE_RemoveHandcuffs { - displayName = CSTRING(ReleaseCaptive); - selection = "righthand"; - distance = 2; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); - exceptions[] = {}; - icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); - }; class ACE_MainActions { + class ACE_RemoveHandcuffs { + displayName = CSTRING(ReleaseCaptive); + selection = "righthand"; + distance = 2; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); + exceptions[] = {}; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); + }; class ACE_EscortCaptive { displayName = CSTRING(EscortCaptive); distance = 4; @@ -97,7 +97,7 @@ class CfgVehicles { }; }; -#define MACRO_LOADUNLOADCAPTIVE \ +#define MACRO_LOADCAPTIVE \ class ACE_Actions { \ class ACE_MainActions { \ class GVAR(LoadCaptive) { \ @@ -113,27 +113,27 @@ class CfgVehicles { class LandVehicle; class Car: LandVehicle { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Tank: LandVehicle { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Air; class Helicopter: Air { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Plane: Air { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Ship; class Ship_F: Ship { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class StaticWeapon: LandVehicle { - MACRO_LOADUNLOADCAPTIVE + MACRO_LOADCAPTIVE }; class Box_NATO_Support_F; diff --git a/addons/captives/README.md b/addons/captives/README.md index 3938720f08..37c26db159 100644 --- a/addons/captives/README.md +++ b/addons/captives/README.md @@ -1,10 +1,10 @@ ace_captives ============ -Allows taking people captive/handcuffed +Adds ability to handcuff and surrender. -####Items: -`ACE_CableTie` - adds ability to take someone captive +#### Items Added: +`ACE_CableTie` ## Maintainers diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index da2192d3d6..1372b4e10a 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -6,12 +6,11 @@ if (isServer) then { addMissionEventHandler ["HandleDisconnect", { - PARAMS_1(_disconnectedPlayer); + params ["_disconnectedPlayer"]; private "_escortedUnit"; _escortedUnit = _disconnectedPlayer getVariable [QGVAR(escortedUnit), objNull]; if ((!isNull _escortedUnit) && {(attachedTo _escortedUnit) == _disconnectedPlayer}) then { detach _escortedUnit; - //systemChat "debug: DC detach"; }; if (_disconnectedPlayer getVariable [QGVAR(isEscorting), false]) then { _disconnectedPlayer setVariable [QGVAR(isEscorting), false, true]; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 31bcbe8e02..d2b5b615bb 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -16,6 +16,7 @@ PREP(doFriskPerson); PREP(doLoadCaptive); PREP(doRemoveHandcuffs); PREP(doUnloadCaptive); +PREP(findEmptyNonFFVCargoSeat); PREP(handleGetIn); PREP(handleGetOut); PREP(handleKilled); diff --git a/addons/captives/functions/fnc_canLoadCaptive.sqf b/addons/captives/functions/fnc_canLoadCaptive.sqf index 0e028ac1ec..a59c2e3be6 100644 --- a/addons/captives/functions/fnc_canLoadCaptive.sqf +++ b/addons/captives/functions/fnc_canLoadCaptive.sqf @@ -11,28 +11,36 @@ * The return value * * Example: - * [player, bob] call ACE_captives_fnc_canLoadCaptive + * [player, bob, car] call ACE_captives_fnc_canLoadCaptive * * Public: No */ #include "script_component.hpp" -private ["_objects"]; params ["_unit", "_target","_vehicle"]; -if (isNull _target) then { - _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); - if ((count _objects) > 0) then {_target = _objects select 0;}; +if ((isNull _target) && {_unit getVariable [QGVAR(isEscorting), false]}) then { + //Looking at a vehicle while escorting, get target from attached objects: + { + if (_x getVariable [QGVAR(isHandcuffed), false]) exitWith { + _target = _x; + }; + } forEach (attachedObjects _unit); }; +if ((isNull _target) || {(vehicle _target) != _target} || {!(_target getVariable [QGVAR(isHandcuffed), false])}) exitWith {false}; if (isNull _vehicle) then { - _objects = nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]; - if ((count _objects) > 0) then {_vehicle = _objects select 0;}; + //Looking at a captive unit, search for nearby vehicles with valid seats: + { + if ((_x emptyPositions "cargo") > 0) exitWith { + _vehicle = _x; + }; + } forEach (nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]); +} else { + //We have a vehicle picked, make sure it has empty seats: + if ((_vehicle emptyPositions "cargo") == 0) then { + _vehicle = objNull; + }; }; -(!isNull _target) -&& {!isNull _vehicle} -&& {_unit getVariable [QGVAR(isEscorting), false]} -&& {_target getVariable [QGVAR(isHandcuffed), false]} -&& {_vehicle emptyPositions "cargo" > 0} +(!isNull _vehicle) diff --git a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf index e8bbe3b50e..e36ba5cd5b 100644 --- a/addons/captives/functions/fnc_canRemoveHandcuffs.sqf +++ b/addons/captives/functions/fnc_canRemoveHandcuffs.sqf @@ -20,4 +20,5 @@ params ["_unit", "_target"]; //Unit is handcuffed and not currently being escorted _target getVariable [QGVAR(isHandcuffed), false] && -{isNull (attachedTo _target)} +{isNull (attachedTo _target)} && +{(vehicle _target) == _target} diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index bb070b057a..08b64195f3 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -35,7 +35,9 @@ if (_state) then { nil, 20, false, true, "", QUOTE(!isNull (GETVAR(_target,QGVAR(escortedUnit),objNull)))]; [{ - EXPLODE_3_PVT((_this select 0),_unit,_target,_actionID); + params ["_args", "_pfID"]; + _args params ["_unit", "_target", "_actionID"]; + if (_unit getVariable [QGVAR(isEscorting), false]) then { if (!alive _target || {!alive _unit} || {!canStand _target} || {!canStand _unit} || {_target getVariable ["ACE_isUnconscious", false]} || {_unit getVariable ["ACE_isUnconscious", false]} || {!isNull (attachedTo _unit)}) then { _unit setVariable [QGVAR(isEscorting), false, true]; diff --git a/addons/captives/functions/fnc_doFriskPerson.sqf b/addons/captives/functions/fnc_doFriskPerson.sqf index e14025b88f..9a8a423dc3 100644 --- a/addons/captives/functions/fnc_doFriskPerson.sqf +++ b/addons/captives/functions/fnc_doFriskPerson.sqf @@ -18,7 +18,6 @@ private ["_weapon", "_listedItemClasses", "_actions", "_allGear"]; -PARAMS_2(_player,_unit); params ["_player", "_unit"]; _weapon = currentWeapon _player; diff --git a/addons/captives/functions/fnc_doLoadCaptive.sqf b/addons/captives/functions/fnc_doLoadCaptive.sqf index d7df42eb0a..a4d7df8892 100644 --- a/addons/captives/functions/fnc_doLoadCaptive.sqf +++ b/addons/captives/functions/fnc_doLoadCaptive.sqf @@ -1,6 +1,6 @@ /* * Author: commy2 - * Unit loads the target object into a vehicle. + * Unit loads the target object into a vehicle. (logic same as canLoadCaptive) * * Arguments: * 0: Unit that wants to load a captive @@ -17,24 +17,34 @@ */ #include "script_component.hpp" -private "_objects"; - params ["_unit", "_target","_vehicle"]; -if (isNull _target) then { - _objects = attachedObjects _unit; - _objects = [_objects, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); - if ((count _objects) > 0) then {_target = _objects select 0;}; +if ((isNull _target) && {_unit getVariable [QGVAR(isEscorting), false]}) then { + //Looking at a vehicle while escorting, get target from attached objects: + { + if (_x getVariable [QGVAR(isHandcuffed), false]) exitWith { + _target = _x; + }; + } forEach (attachedObjects _unit); }; -if (isNull _target) exitWith {}; +if ((isNull _target) || {(vehicle _target) != _target} || {!(_target getVariable [QGVAR(isHandcuffed), false])}) exitWith {ERROR("");}; if (isNull _vehicle) then { - _objects = nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]; - if ((count _objects) > 0) then {_vehicle = _objects select 0;}; + //Looking at a captive unit, search for nearby vehicles with valid seats: + { + // if (([_x] call FUNC(findEmptyNonFFVCargoSeat)) != -1) exitWith { + if ((_x emptyPositions "cargo") > 0) exitWith { + _vehicle = _x; + }; + } forEach (nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]); +} else { + // if (([_vehicle] call FUNC(findEmptyNonFFVCargoSeat)) == -1) then { + if ((_vehicle emptyPositions "cargo") == 0) then { + _vehicle = objNull; + }; }; -if (isNull _vehicle) exitWith {}; -if ((!isNil "_target") && {!isNil "_vehicle"}) then { - _unit setVariable [QGVAR(isEscorting), false, true]; - ["MoveInCaptive", [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); -}; +if (isNull _vehicle) exitWith {ERROR("");}; + +_unit setVariable [QGVAR(isEscorting), false, true]; +["MoveInCaptive", [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); diff --git a/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf new file mode 100644 index 0000000000..cf67614f91 --- /dev/null +++ b/addons/captives/functions/fnc_findEmptyNonFFVCargoSeat.sqf @@ -0,0 +1,67 @@ +/* + * Author: PabstMirror + * Finds a free cargo seat, searching non FFV first + * + * Arguments: + * 0: The Vehicle + * + * Return Value: + * ARRAY [seat index , is FFV ] + * + * Example: + * [car1] call ACE_captives_fnc_findEmptyNonFFVCargoSeat + * + * Public: No + */ +#include "script_component.hpp" + +params ["_vehicle"]; +TRACE_1("params", _vehicle); + +_vehicleConfig = configFile >> "CfgVehicles" >> (typeOf _vehicle); + +_proxyOrder = getArray (_vehicleConfig >> "getInProxyOrder"); +_transportSoldier = getNumber (_vehicleConfig >> "transportSoldier"); +_realCargoCount = if (isArray (_vehicleConfig >> "getInProxyOrder")) then {count _proxyOrder} else {_transportSoldier}; + +//Find FFV turrets: +_ffvCargoIndexes = []; +{ + _turretConfig = [_vehicleConfig, _x] call EFUNC(common,getTurretConfigPath); + _isCargoProxy = ((getText (_turretConfig >> "proxyType")) == "CPCargo") && {isNumber (_turretConfig >> "proxyIndex")}; + + if (_isCargoProxy) then { + _proxyCargoIndex = getNumber (_turretConfig >> "proxyIndex"); + _cargoIndex = _proxyOrder find _proxyCargoIndex; + _ffvCargoIndexes pushBack _cargoIndex; + }; +} forEach (allTurrets [_vehicle, true]); + +//Find Empty Seats: +_occupiedSeats = []; +{ + _x params ["", "", "_xIndex"]; + if (_xIndex > -1) then {_occupiedSeats pushBack _xIndex;}; +} forEach (fullCrew _vehicle); + +TRACE_3("Searching for empty seat",_realCargoCount,_ffvCargoIndexes,_occupiedSeats); + +_emptyCargoSeatReturn = [-1, false]; + +//First seach for non-ffv seats: +for "_index" from 0 to (_realCargoCount - 1) do { + if ((!(_index in _ffvCargoIndexes)) && {!(_index in _occupiedSeats)}) exitWith { + _emptyCargoSeatReturn = [_index, false]; + }; +}; + +//Only use FFV if none found: +if (_emptyCargoSeatReturn isEqualTo [-1, false]) then { + for "_index" from 0 to (_realCargoCount - 1) do { + if (!(_index in _occupiedSeats)) exitWith { + _emptyCargoSeatReturn = [_index, true]; + }; + }; +}; + +_emptyCargoSeatReturn diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf index 487e7d4179..5476073b38 100644 --- a/addons/captives/functions/fnc_handleGetIn.sqf +++ b/addons/captives/functions/fnc_handleGetIn.sqf @@ -4,8 +4,8 @@ * * Arguments: * 0: _vehicle - * 2: dunno - * 1: _unit + * 1: dunno + * 2: _unit * * Return Value: * The return value @@ -17,7 +17,8 @@ */ #include "script_component.hpp" -params ["_vehicle", "_dontcare","_unit"]; +params ["_vehicle", "","_unit"]; +TRACE_2("params",_vehicle,_unit); if (local _unit) then { if (_unit getVariable [QGVAR(isEscorting), false]) then { @@ -27,4 +28,18 @@ if (local _unit) then { if (_unit getVariable [QGVAR(isSurrendering), false]) then { [_unit, false] call FUNC(setSurrender); }; + + if (_unit getVariable [QGVAR(isHandcuffed), false]) then { + //Need to force animation for FFV turrets + _turretPath = []; + { + _x params ["_xUnit", "", "", "_xTurretPath"]; + if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; + } forEach (fullCrew (vehicle _unit)); + if (!(_turretPath isEqualTo [])) then { + TRACE_1("Setting FFV Handcuffed Animation",_turretPath); + [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); + }; + }; }; diff --git a/addons/captives/functions/fnc_handleGetOut.sqf b/addons/captives/functions/fnc_handleGetOut.sqf index daf88b7e34..dea97eb600 100644 --- a/addons/captives/functions/fnc_handleGetOut.sqf +++ b/addons/captives/functions/fnc_handleGetOut.sqf @@ -4,8 +4,8 @@ * * Arguments: * 0: _vehicle - * 2: dunno - * 1: _unit + * 1: dunno + * 2: _unit * * Return Value: * The return value @@ -17,17 +17,21 @@ */ #include "script_component.hpp" -params ["_vehicle", "_dontcare","_unit"]; +params ["_vehicle", "", "_unit"]; +TRACE_2("params",_vehicle,_unit); if ((local _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]}) then { private ["_cargoIndex"]; _cargoIndex = _unit getVariable [QGVAR(CargoIndex), -1]; - //If captive was not "unloaded", then move them back into the vehicle. - if (_cargoIndex != -1) exitWith { + if (_cargoIndex != -1) then { + //If captive was not "unloaded", then move them back into the vehicle. + TRACE_1("forcing back into vehicle",_cargoIndex); _unit moveInCargo [_vehicle, _cargoIndex]; + } else { + //Getting out of vehicle: + [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; - - [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); }; diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index 66cbcff794..52957acd68 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -18,7 +18,7 @@ params ["_unit"]; // prevent players from throwing grenades (added to all units) -[_unit, "Throw", {((_this select 1) getVariable [QGVAR(isHandcuffed), false]) || {(_this select 1) getVariable [QGVAR(isSurrendering), false]}}, {}] call EFUNC(common,addActionEventhandler); +// [_unit, "Throw", {systemChat "a"; ((_this select 1) getVariable [QGVAR(isHandcuffed), false]) || {(_this select 1) getVariable [QGVAR(isSurrendering), false]}; true}, {systemChat "b";}] call EFUNC(common,addActionEventhandler); if (local _unit) then { // reset status on mission start diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 64c80af35c..bdb0f7c1b5 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -26,11 +26,11 @@ if (!_activated) exitWith {}; if (local _logic) then { //Modules run before postInit can instal the event handler, so we need to wait a little bit [{ - PARAMS_1(_units); + params ["_units"]; { ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); } forEach _units; - }, [_units], 0.05, 0.05]call EFUNC(common,waitAndExecute); + }, [_units], 0.05]call EFUNC(common,waitAndExecute); deleteVehicle _logic; }; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 9bde3b399d..a8c8e02fd4 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -17,6 +17,7 @@ #include "script_component.hpp" params ["_unit","_state"]; +TRACE_2("params",_unit,_state); if (!local _unit) exitwith { ERROR("running setHandcuffed on remote unit"); @@ -43,24 +44,47 @@ if (_state) then { // fix anim on mission start (should work on dedicated servers) [{ params ["_unit"]; - if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { + if (!(_unit getVariable [QGVAR(isHandcuffed), false])) exitWith {}; + + if ((vehicle _unit) == _unit) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + } else { + [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); + }; - //Adds an animation changed eh - //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) - private "_animChangedEHID"; - _animChangedEHID = _unit addEventHandler ["AnimChanged", { - PARAMS_2(_unit,_newAnimation); + //Adds an animation changed eh + //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) + private "_animChangedEHID"; + + _animChangedEHID = _unit addEventHandler ["AnimChanged", { + params ["_unit", "_newAnimation"]; + TRACE_2("AnimChanged",_unit,_newAnimation); + if (_unit == (vehicle _unit)) then { if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { TRACE_1("Handcuff animation interrupted",_newAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; - }]; - _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; + } else { - }; - }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); + _turretPath = []; + { + _x params ["_xUnit", "", "", "_xTurretPath"]; + if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath}; + } forEach (fullCrew (vehicle _unit)); + TRACE_1("turret Path",_turretPath); + if (_turretPath isEqualTo []) exitWith {}; + + TRACE_1("Handcuff (FFV) animation interrupted",_newAnimation); + [_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation); + [_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation); + }; + }]; + TRACE_2("Adding animChangedEH",_unit,_animChangedEHID); + _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; + + }, [_unit], 0.01] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isHandcuffed), false, true]; [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus); @@ -68,6 +92,7 @@ if (_state) then { //remove AnimChanged EH private "_animChangedEHID"; _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1]; + TRACE_1("removing animChanged EH",_animChangedEHID); _unit removeEventHandler ["AnimChanged", _animChangedEHID]; _unit setVariable [QGVAR(handcuffAnimEHID), -1]; diff --git a/addons/captives/functions/fnc_setSurrendered.sqf b/addons/captives/functions/fnc_setSurrendered.sqf index 4fad2d3853..dd9ac417c5 100644 --- a/addons/captives/functions/fnc_setSurrendered.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -17,6 +17,7 @@ #include "script_component.hpp" params ["_unit","_state"]; +TRACE_2("params",_unit,_state); if (!local _unit) exitwith { ERROR("running surrender on remote unit"); @@ -43,13 +44,13 @@ if (_state) then { // fix anim on mission start (should work on dedicated servers) [{ - PARAMS_1(_unit); + params ["_unit"]; if (_unit getVariable [QGVAR(isSurrendering), false] && {(vehicle _unit) == _unit}) then { //Adds an animation changed eh //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) private "_animChangedEHID"; _animChangedEHID = _unit addEventHandler ["AnimChanged", { - PARAMS_2(_unit,_newAnimation); + params ["_unit", "_newAnimation"]; if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { TRACE_1("Surrender animation interrupted",_newAnimation); [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); @@ -57,7 +58,7 @@ if (_state) then { }]; _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; }; - }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); + }, [_unit], 0.01] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isSurrendering), false, true]; [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); @@ -85,8 +86,8 @@ if (_state) then { //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter "hands up" //Handles long animation chains [{ - PARAMS_2(_args,_pfID); - EXPLODE_2_PVT(_args,_unit,_maxTime); + params ["_args", "_pfID"]; + _args params ["_unit", "_maxTime"]; //If waited long enough or they re-surrendered or they are unconscious, exit loop if ((ACE_time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]} || {_unit getVariable ["ACE_isUnconscious", false]}) exitWith { [_pfID] call CBA_fnc_removePerFrameHandler; diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf index 7e30fe4af4..0839c61ea1 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveIn.sqf @@ -16,11 +16,17 @@ */ #include "script_component.hpp" +params ["_target","_vehicle"]; +TRACE_2("params",_target,_vehicle); + private ["_cargoIndex"]; -params ["_target","_vehicle"]; +_getSeat = [_vehicle] call FUNC(findEmptyNonFFVCargoSeat); +TRACE_1("free cargo seat",_getSeat); +_cargoIndex = _getSeat select 0; +if (_cargoIndex == -1) exitWith {ERROR("cargo index -1");}; + +_target moveInCargo [_vehicle, _cargoIndex]; +_target assignAsCargoIndex [_vehicle, _cargoIndex]; -_target moveInCargo _vehicle; -_target assignAsCargo _vehicle; -_cargoIndex = _vehicle getCargoIndex _target; _target setVariable [QGVAR(CargoIndex), _cargoIndex, true]; diff --git a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf index 000d5ef568..ce44b5926f 100644 --- a/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf +++ b/addons/captives/functions/fnc_vehicleCaptiveMoveOut.sqf @@ -16,8 +16,11 @@ #include "script_component.hpp" params ["_unit"]; +TRACE_1("params",_unit); + _unit setVariable [QGVAR(CargoIndex), -1, true]; moveOut _unit; [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); +[_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); unassignVehicle _unit; diff --git a/addons/captives/script_component.hpp b/addons/captives/script_component.hpp index e68eb19d2f..375c956129 100644 --- a/addons/captives/script_component.hpp +++ b/addons/captives/script_component.hpp @@ -1,6 +1,8 @@ #define COMPONENT captives #include "\z\ace\addons\main\script_mod.hpp" +// #define DEBUG_MODE_FULL + #ifdef DEBUG_ENABLED_CAPTIVES #define DEBUG_MODE_FULL #endif diff --git a/addons/cargo/ACE_Settings.hpp b/addons/cargo/ACE_Settings.hpp index c8865f2097..574000155e 100644 --- a/addons/cargo/ACE_Settings.hpp +++ b/addons/cargo/ACE_Settings.hpp @@ -4,6 +4,6 @@ class ACE_Settings { description = CSTRING(ModuleSettings_enable_Description); typeName = "BOOL"; value = 1; - category = CSTRING(settingsCategory); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; }; diff --git a/addons/cargo/CfgEventHandlers.hpp b/addons/cargo/CfgEventHandlers.hpp index f80fefa3aa..15aaaadad6 100644 --- a/addons/cargo/CfgEventHandlers.hpp +++ b/addons/cargo/CfgEventHandlers.hpp @@ -4,6 +4,12 @@ class Extended_PreInit_EventHandlers { }; }; +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; + class Extended_Killed_EventHandlers { class All { init = QUOTE(call FUNC(handleDestroyed)); @@ -76,4 +82,22 @@ class Extended_Init_EventHandlers { init = QUOTE(_this call DFUNC(initVehicle)); }; }; + + class ACE_RepairItem_Base { + class ADDON { + init = QUOTE(_this call DFUNC(initObject)); + }; + }; + + class ACE_bodyBagObject { + class ADDON { + init = QUOTE(_this call DFUNC(initObject)); + }; + }; + + class ACE_ConcertinaWireCoil { + class ADDON { + init = QUOTE(_this call DFUNC(initObject)); + }; + }; }; diff --git a/addons/cargo/CfgVehicles.hpp b/addons/cargo/CfgVehicles.hpp index d5572741da..25bd441b90 100644 --- a/addons/cargo/CfgVehicles.hpp +++ b/addons/cargo/CfgVehicles.hpp @@ -4,7 +4,7 @@ class CfgVehicles { scope = 2; displayName = CSTRING(SettingsModule_DisplayName); icon = QUOTE(PATHTOF(UI\Icon_Module_Cargo_ca.paa)); - category = "ACE"; + category = "ACE_Logistics"; function = QFUNC(moduleSettings); functionPriority = 1; isGlobal = 1; diff --git a/addons/cargo/README.md b/addons/cargo/README.md new file mode 100644 index 0000000000..eda7079b7b --- /dev/null +++ b/addons/cargo/README.md @@ -0,0 +1,12 @@ +ace_cargo +============ + +Adds cargo menu to vehicles and allows loading and unloading of cargo items. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [commy2](https://github.com/commy2) +- [Glowbal](https://github.com/Glowbal) diff --git a/addons/cargo/XEH_postInit.sqf b/addons/cargo/XEH_postInit.sqf new file mode 100644 index 0000000000..6501044c9d --- /dev/null +++ b/addons/cargo/XEH_postInit.sqf @@ -0,0 +1,5 @@ +#include "script_component.hpp" + +["LoadCargo", {_this call FUNC(loadItem)}] call EFUNC(common,addEventHandler); +["UnloadCargo", {_this call FUNC(unloadItem)}] call EFUNC(common,addEventHandler); +["AddCargoByClass", {_this call FUNC(addCargoItem)}] call EFUNC(common,addEventHandler); diff --git a/addons/cargo/XEH_preInit.sqf b/addons/cargo/XEH_preInit.sqf index 9cc90501c1..8924cacfd5 100644 --- a/addons/cargo/XEH_preInit.sqf +++ b/addons/cargo/XEH_preInit.sqf @@ -2,6 +2,7 @@ ADDON = false; +PREP(addCargoItem); PREP(canLoad); PREP(canLoadItemIn); PREP(canUnloadItem); @@ -21,8 +22,4 @@ PREP(validateCargoSpace); GVAR(initializedItemClasses) = []; -if (isServer) then { - ["cargo_hideItem", {params ["_object", "_status"]; _object hideObjectGlobal _status;}] call EFUNC(common,addEventHandler); -}; - ADDON = true; diff --git a/addons/cargo/functions/fnc_addCargoItem.sqf b/addons/cargo/functions/fnc_addCargoItem.sqf new file mode 100644 index 0000000000..1233d0228d --- /dev/null +++ b/addons/cargo/functions/fnc_addCargoItem.sqf @@ -0,0 +1,38 @@ +/* + * Author: Glowbal, Jonpas + * Adds a cargo item to the vehicle. + * + * Arguments: + * 0: Item Classname + * 1: Vehicle + * 2: Amount (default: 1) + * + * Return Value: + * None + * + * Example: + * ["item", vehicle] call ace_cargo_fnc_addCargoItem + * + * Public: No + */ +#include "script_component.hpp" + +private ["_position", "_item", "_i"]; +params ["_itemClass", "_vehicle", ["_amount", 1]]; +TRACE_3("params",_itemClass,_vehicle,_amount); + +_position = getPos _vehicle; +_position set [1, (_position select 1) + 1]; +_position set [2, (_position select 2) + 7.5]; + +for "_i" from 1 to _amount do { + _item = createVehicle [_itemClass, _position, [], 0, "CAN_COLLIDE"]; + + // Load item or delete it if no space left + if !([_item, _vehicle] call FUNC(loadItem)) exitWith { + deleteVehicle _item; + }; + + // Invoke listenable event + ["cargoAddedByClass", [_itemClass, _vehicle, _amount]] call EFUNC(common,globalEvent); +}; diff --git a/addons/cargo/functions/fnc_canLoad.sqf b/addons/cargo/functions/fnc_canLoad.sqf index da41d93358..f5d1304a95 100644 --- a/addons/cargo/functions/fnc_canLoad.sqf +++ b/addons/cargo/functions/fnc_canLoad.sqf @@ -18,6 +18,8 @@ params ["_player", "_object"]; +if (!([_player, _object, []] call EFUNC(common,canInteractWith))) exitWith {false}; + private ["_nearestVehicle"]; _nearestVehicle = [_player] call FUNC(findNearestVehicle); diff --git a/addons/cargo/functions/fnc_getSizeItem.sqf b/addons/cargo/functions/fnc_getSizeItem.sqf index a3556c8a25..dacd6a4982 100644 --- a/addons/cargo/functions/fnc_getSizeItem.sqf +++ b/addons/cargo/functions/fnc_getSizeItem.sqf @@ -19,7 +19,7 @@ private "_config"; params ["_item"]; -_config = (configFile >> "CfgVehicles" >> typeof _item >> QGVAR(size)); +_config = (configFile >> "CfgVehicles" >> typeOf _item >> QGVAR(size)); if (isNumber (_config)) exitWith { _item getVariable [QGVAR(size), getNumber (_config)] diff --git a/addons/cargo/functions/fnc_initVehicle.sqf b/addons/cargo/functions/fnc_initVehicle.sqf index 8449a316b2..b817688336 100644 --- a/addons/cargo/functions/fnc_initVehicle.sqf +++ b/addons/cargo/functions/fnc_initVehicle.sqf @@ -1,6 +1,6 @@ /* * Author: Glowbal - * Initializes vehicle, adds open caro menu action if available. + * Initializes vehicle, adds open cargo menu action if available. * * Arguments: * 0: Vehicle @@ -25,20 +25,8 @@ _initializedClasses = GETMVAR(GVAR(initializedClasses),[]); if (isServer) then { { if (isClass _x) then { - private ["_className", "_amount","_position","_object"]; - _className = getText (_x >> "type"); - _amount = getNumber (_x >> "amount"); - _position = getPos _vehicle; - _position set [1, (_position select 1) + 1]; - _position set [2, (_position select 2) + 7.5]; - for "_i" from 1 to _amount do { - _object = createVehicle [_className, _position, [], 0, "CAN_COLLIDE"]; - if !([_object, _vehicle] call FUNC(loadItem)) exitWith { - deleteVehicle _object; - }; - }; + ["AddCargoByClass", [getText (_x >> "type"), _vehicle, getNumber (_x >> "amount")]] call EFUNC(common,localEvent); }; - nil } count ("true" configClasses (configFile >> "CfgVehicles" >> _type >> "ACE_Cargo" >> "Cargo")); }; @@ -51,7 +39,10 @@ SETMVAR(GVAR(initializedClasses),_initializedClasses); if (getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(hasCargo)) != 1) exitWith {}; private ["_text", "_condition", "_statement", "_icon", "_action"]; -_condition = {GVAR(enable)}; +_condition = { + params ["_target", "_player"]; + GVAR(enable) && {[_player, _target, []] call EFUNC(common,canInteractWith)} +}; _text = localize LSTRING(openMenu); _statement = {GVAR(interactionVehicle) = _target; createDialog QGVAR(menu);}; _icon = ""; diff --git a/addons/cargo/functions/fnc_loadItem.sqf b/addons/cargo/functions/fnc_loadItem.sqf index f8816f3b8f..cf81bdbe6c 100644 --- a/addons/cargo/functions/fnc_loadItem.sqf +++ b/addons/cargo/functions/fnc_loadItem.sqf @@ -32,6 +32,9 @@ _vehicle setVariable [QGVAR(space), _space - _itemSize, true]; detach _item; _item attachTo [_vehicle,[0,0,100]]; -["cargo_hideItem", [_item, true]] call EFUNC(common,serverEvent); +["hideObjectGlobal", [_item, true]] call EFUNC(common,serverEvent); + +// Invoke listenable event +["cargoLoaded", [_item, _vehicle]] call EFUNC(common,globalEvent); true diff --git a/addons/cargo/functions/fnc_unloadItem.sqf b/addons/cargo/functions/fnc_unloadItem.sqf index f6d70591df..1390a8c20d 100644 --- a/addons/cargo/functions/fnc_unloadItem.sqf +++ b/addons/cargo/functions/fnc_unloadItem.sqf @@ -58,8 +58,11 @@ _vehicle setVariable [QGVAR(space), (_space + _itemSize), true]; detach _item; _item setPosASL (_emptyPos call EFUNC(common,PositiontoASL)); -["cargo_hideItem", [_item, false]] call EFUNC(common,serverEvent); +["hideObjectGlobal", [_item, false]] call EFUNC(common,serverEvent); // TOOO maybe drag/carry the unloaded item? +// Invoke listenable event +["cargoUnloaded", [_item, _vehicle]] call EFUNC(common,globalEvent); + true diff --git a/addons/cargo/stringtable.xml b/addons/cargo/stringtable.xml index 57ee916156..a39fb16f6f 100644 --- a/addons/cargo/stringtable.xml +++ b/addons/cargo/stringtable.xml @@ -3,33 +3,39 @@ Load + Załaduj Unload + Wyładuj Cargo + Ładunek Cargo Menu + Menu ładunku Cargo space left: %1 - - - Cargo + Pozostałe miejsce: %1 Enable Cargo + Aktywuj cargo Enable the load in cargo module + Aktywuj możliwość załadunku skrzyń i przedmiotów do pojazdów. Cargo Settings + Ustawienia cargo Configure the cargo module settings + Skonfiguruj ustawienia modułu cargo. - + \ No newline at end of file diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 0dbbff04ec..bbb1302218 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -111,6 +111,7 @@ if(!isServer) then { if (isServer) then { [FUNC(syncedEventPFH), 0.5, []] call CBA_fnc_addPerFrameHandler; }; + call FUNC(checkFiles); @@ -203,10 +204,11 @@ GVAR(OldCameraView) = cameraView; GVAR(OldPlayerVehicle) = vehicle ACE_player; GVAR(OldPlayerTurret) = [ACE_player] call FUNC(getTurretIndex); GVAR(OldPlayerWeapon) = currentWeapon ACE_player; +GVAR(OldVisibleMap) = false; // PFH to raise varios events [{ - private ["_newCameraView", "_newInventoryDisplayIsOpen", "_newPlayerInventory", "_newPlayerTurret", "_newPlayerVehicle", "_newPlayerVisionMode", "_newPlayerWeapon", "_newZeusDisplayIsOpen"]; + private ["_newCameraView", "_newInventoryDisplayIsOpen", "_newPlayerInventory", "_newPlayerTurret", "_newPlayerVehicle", "_newPlayerVisionMode", "_newPlayerWeapon", "_newZeusDisplayIsOpen", "_newVisibleMap"]; // "playerInventoryChanged" event _newPlayerInventory = [ACE_player] call FUNC(getAllGear); if !(_newPlayerInventory isEqualTo GVAR(OldPlayerInventory)) then { @@ -270,7 +272,15 @@ GVAR(OldPlayerWeapon) = currentWeapon ACE_player; GVAR(OldPlayerWeapon) = _newPlayerWeapon; ["playerWeaponChanged", [ACE_player, _newPlayerWeapon]] call FUNC(localEvent); }; - + + // "visibleMapChanged" event + _newVisibleMap = visibleMap; + if (!_newVisibleMap isEqualTo GVAR(OldVisibleMap)) then { + // Raise ACE event locally + GVAR(OldVisibleMap) = _newVisibleMap; + ["visibleMapChanged", [ACE_player, _newVisibleMap]] call FUNC(localEvent); + }; + }, 0, []] call CBA_fnc_addPerFrameHandler; @@ -317,7 +327,7 @@ GVAR(OldIsCamera) = false; // Lastly, do JIP events // JIP Detection and event trigger. Run this at the very end, just in case anything uses it -if(isMultiplayer && { ACE_time > 0 || isNull player } ) then { +if (didJip) then { // We are jipping! Get ready and wait, and throw the event [{ if(!(isNull player)) then { diff --git a/addons/common/functions/fnc_disableUserInput.sqf b/addons/common/functions/fnc_disableUserInput.sqf index 520e4131b2..d9485b11e7 100644 --- a/addons/common/functions/fnc_disableUserInput.sqf +++ b/addons/common/functions/fnc_disableUserInput.sqf @@ -84,7 +84,7 @@ if (_state) then { openMap true; }; - if (serverCommandAvailable "#missions" || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then { + if (isServer || {serverCommandAvailable "#kick"} || {player getVariable ["ACE_isUnconscious", false] && {(call FUNC(player)) getVariable [QEGVAR(medical,AllowChatWhileUnconscious), missionNamespace getVariable [QEGVAR(medical,AllowChatWhileUnconscious), false]]}}) then { if (!(_key in (actionKeys "DefaultAction" + actionKeys "Throw")) && {_key in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) then { _key = 0; }; diff --git a/addons/common/functions/fnc_isFeatureCameraActive.sqf b/addons/common/functions/fnc_isFeatureCameraActive.sqf index 250beaa3ca..0b91b19e55 100644 --- a/addons/common/functions/fnc_isFeatureCameraActive.sqf +++ b/addons/common/functions/fnc_isFeatureCameraActive.sqf @@ -1,31 +1,35 @@ /* * Author: Sniperwolf572 + * Checks if one of the following common feature cameras is active: * - * Checks if one of the following BI feature cameras are active: - * - * - Classic camera (BIS_fnc_cameraOld) - * - Splendid camera (BIS_fnc_camera) + * - Curator + * - ACE Spectator * - Arsenal camera (BIS_fnc_arsenal) - * - Animation viewer (BIS_fnc_animViewer) * - Establishing shot (BIS_fnc_establishingShot) + * - Splendid camera (BIS_fnc_camera) + * - Animation viewer (BIS_fnc_animViewer) + * - Classic camera (BIS_fnc_cameraOld) * * Arguments: - * None + * 0: None * - * Return value: - * Is BI feature camera active (bool) + * Return Value: + * A feature camera is active * * Example: - * call ace_common_fnc_isFeatureCameraActive; + * [] call ace_common_fnc_isFeatureCameraActive * + * Public: No */ #include "script_component.hpp" -( - !isNull (missionNamespace getVariable ["BIS_DEBUG_CAM", objNull]) || // Classic camera - {!isNull (missionNamespace getVariable ["BIS_fnc_camera_cam", objNull])} || // Splendid camera - {!isNull (uiNamespace getVariable ["BIS_fnc_arsenal_cam", objNull])} || // Arsenal camera - {!isNull (uiNamespace getVariable ["BIS_fnc_animViewer_cam", objNull])} || // Animation viewer camera - {!isNull (missionNamespace getVariable ["BIS_fnc_establishingShot_fakeUAV", objNull])} // Establishing shot camera -) \ No newline at end of file +!( + isNull curatorCamera && // Curator + {isNull (GETMVAR(EGVAR(spectator,camera),objNull))} && // ACE Spectator + {isNull (GETUVAR(BIS_fnc_arsenal_cam, objNull))} && // Arsenal camera + {isNull (GETMVAR(BIS_fnc_establishingShot_fakeUAV, objNull))} && // Establishing shot camera + {isNull (GETMVAR(BIS_fnc_camera_cam, objNull))} && // Splendid camera + {isNull (GETUVAR(BIS_fnc_animViewer_cam, objNull))} && // Animation viewer camera + {isNull (GETMVAR(BIS_DEBUG_CAM, objNull))} // Classic camera +) diff --git a/addons/concertina_wire/CfgVehicles.hpp b/addons/concertina_wire/CfgVehicles.hpp index cf1be40487..81304da853 100644 --- a/addons/concertina_wire/CfgVehicles.hpp +++ b/addons/concertina_wire/CfgVehicles.hpp @@ -3,7 +3,7 @@ class CfgVehicles { class Fence; class thingX; class NonStrategic; - + class ACE_ConcertinaWireNoGeo: Fence { XEH_ENABLED; scope = 1; @@ -48,7 +48,7 @@ class CfgVehicles { class wire_16: wire_2{}; class wire_17: wire_2{}; class wire_18: wire_2{}; - + class wire_2_1: wire_2 { animPeriod = 8; }; @@ -67,13 +67,14 @@ class CfgVehicles { class wire_15_1: wire_2_1 {}; class wire_16_1: wire_2_1 {}; class wire_17_1: wire_2_1 {}; - class wire_18_1: wire_2_1 {}; + class wire_18_1: wire_2_1 {}; }; }; class ACE_ConcertinaWire: ACE_ConcertinaWireNoGeo { scope = 2; displayName = $STR_ACE_CONCERTINA_WIRE; model = PATHTOF(data\ACE_ConcertinaWire.p3d); + EGVAR(logistics_wirecutter,isFence) = 1; class ACE_Actions { class ACE_MainActions { selection = ""; @@ -113,6 +114,8 @@ class CfgVehicles { EGVAR(dragging,canDrag) = 1; EGVAR(dragging,dragPosition[]) = {0,0.5,0.5}; EGVAR(dragging,dragDirection) = 0; + EGVAR(cargo,size) = 1; + EGVAR(cargo,canLoad) = 1; class ACE_Actions { class ACE_MainActions { selection = ""; @@ -133,7 +136,7 @@ class CfgVehicles { }; }; }; - + class Land_Razorwire_F: NonStrategic { XEH_ENABLED; }; diff --git a/addons/concertina_wire/README.md b/addons/concertina_wire/README.md index ab62458de9..e1e6530f5b 100644 --- a/addons/concertina_wire/README.md +++ b/addons/concertina_wire/README.md @@ -3,8 +3,9 @@ ace_concertina_wire Adds concertina wire. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/dagr/README.md b/addons/dagr/README.md index 33d095dca4..eb502e7a24 100644 --- a/addons/dagr/README.md +++ b/addons/dagr/README.md @@ -1,10 +1,11 @@ ace_dagr =============== -Defense Advanced GPS Receiver +Adds Defense Advanced GPS Receiver. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/disposable/README.md b/addons/disposable/README.md index 73418cd49d..82281a3c52 100644 --- a/addons/disposable/README.md +++ b/addons/disposable/README.md @@ -1,7 +1,7 @@ ace_disposable ============== -Makes the NLAW a disposable one-shot weapon. +Makes the NLAW a disposable one-shot weapon and provides disposable launchers framework for use by other mods. ## Maintainers diff --git a/addons/dragging/README.md b/addons/dragging/README.md new file mode 100644 index 0000000000..b69484eccf --- /dev/null +++ b/addons/dragging/README.md @@ -0,0 +1,12 @@ +ace_dragging +============== + +Adds ability to drag and carry objects. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Garth "L-H" de Wet](https://github.com/CorruptedHeart) +- [commy2](https://github.com/commy2) diff --git a/addons/dragging/XEH_clientInit.sqf b/addons/dragging/XEH_clientInit.sqf index 21d699c688..e80d63cfde 100644 --- a/addons/dragging/XEH_clientInit.sqf +++ b/addons/dragging/XEH_clientInit.sqf @@ -1,7 +1,7 @@ // by PabstMirror, commy2 #include "script_component.hpp" -[{_this call DFUNC(handleScrollWheel)}] call EFUNC(common,addScrollWheelEventHandler); +[DFUNC(handleScrollWheel)] call EFUNC(common,addScrollWheelEventHandler); if (isNil "ACE_maxWeightDrag") then { ACE_maxWeightDrag = 800; @@ -15,11 +15,11 @@ if (isNil "ACE_maxWeightCarry") then { ["isNotCarrying", {!((_this select 0) getVariable [QGVAR(isCarrying), false])}] call EFUNC(common,addCanInteractWithCondition); // release object on player change. This does work when returning to lobby, but not when hard disconnecting. -["playerChanged", {_this call DFUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); +["playerChanged", DFUNC(handlePlayerChanged)] call EFUNC(common,addEventhandler); ["playerVehicleChanged", {[ACE_player, objNull] call DFUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); -["playerWeaponChanged", {_this call DFUNC(handlePlayerWeaponChanged)}] call EFUNC(common,addEventhandler); +["playerWeaponChanged", DFUNC(handlePlayerWeaponChanged)] call EFUNC(common,addEventhandler); // handle waking up dragged unit and falling unconscious while dragging -["medical_onUnconscious", {_this call DFUNC(handleUnconscious)}] call EFUNC(common,addEventhandler); +["medical_onUnconscious", DFUNC(handleUnconscious)] call EFUNC(common,addEventhandler); //@todo Captivity? diff --git a/addons/dragging/XEH_serverInit.sqf b/addons/dragging/XEH_serverInit.sqf index f6c231d275..01d78ef4e3 100644 --- a/addons/dragging/XEH_serverInit.sqf +++ b/addons/dragging/XEH_serverInit.sqf @@ -2,4 +2,4 @@ #include "script_component.hpp" // release object on hard disconnection. Function is identical to killed -addMissionEventHandler ["HandleDisconnect", {_this call DFUNC(handleKilled)}]; +addMissionEventHandler ["HandleDisconnect", DFUNC(handleKilled)]; diff --git a/addons/dragging/config.cpp b/addons/dragging/config.cpp index cc843d4a68..0c9cfb3c43 100644 --- a/addons/dragging/config.cpp +++ b/addons/dragging/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; - author[] = {"Garth 'L-H' de Wet","commy2"}; + author[] = {"Garth 'L-H' de Wet", "commy2"}; authorUrl = "https://github.com/commy2/"; VERSION_CONFIG; }; diff --git a/addons/dragging/functions/fnc_canCarry.sqf b/addons/dragging/functions/fnc_canCarry.sqf index 6472124aef..a6b8fed5ab 100644 --- a/addons/dragging/functions/fnc_canCarry.sqf +++ b/addons/dragging/functions/fnc_canCarry.sqf @@ -3,19 +3,18 @@ * * Check if unit can carry the object. Doesn't check weight. * - * Argument: - * 0: Unit that should do the carrying (Object) - * 1: Object to carry (Object) + * Arguments: + * 0: Unit that should do the carrying + * 1: Object to carry * - * Return value: - * Can the unit carry the object? (Bool) + * Return Value: + * Can the unit carry the object? + * + * Public: No */ #include "script_component.hpp" -private ["_unit", "_target"]; - -_unit = _this select 0; -_target = _this select 1; +params ["_unit", "_target"]; if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/dragging/functions/fnc_canDrag.sqf b/addons/dragging/functions/fnc_canDrag.sqf index 7eedfce179..4ab3562ba2 100644 --- a/addons/dragging/functions/fnc_canDrag.sqf +++ b/addons/dragging/functions/fnc_canDrag.sqf @@ -3,12 +3,14 @@ * * Check if unit can drag the object. Doesn't check weight. * - * Argument: - * 0: Unit that should do the dragging (Object) - * 1: Object to drag (Object) + * Arguments: + * 0: Unit that should do the dragging + * 1: Object to drag * - * Return value: - * Can the unit drag the object? (Bool) + * Return Value: + * Can the unit drag the object? + * + * Public: No */ #include "script_component.hpp" @@ -22,4 +24,4 @@ if !([_unit, _target, []] call EFUNC(common,canInteractWith)) exitWith {false}; // a static weapon has to be empty for dragging if ((typeOf _target) isKindOf "StaticWeapon" && {count crew _target > 0}) exitWith {false}; -alive _target && {vehicle _target == _target} && {_target getVariable [QGVAR(canDrag), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})}; \ No newline at end of file +alive _target && {vehicle _target == _target} && {_target getVariable [QGVAR(canDrag), false]} && {animationState _target in ["", "unconscious"] || (_target getvariable ["ACE_isUnconscious", false]) || (_target isKindOf "CAManBase" && {(_target getHitPointDamage "HitLegs") > 0.4})}; diff --git a/addons/dragging/functions/fnc_canDrop.sqf b/addons/dragging/functions/fnc_canDrop.sqf index df75b9540f..58c02cab07 100644 --- a/addons/dragging/functions/fnc_canDrop.sqf +++ b/addons/dragging/functions/fnc_canDrop.sqf @@ -3,19 +3,18 @@ * * Check if unit can drop the object. * - * Argument: - * 0: Unit that currently drags a object (Object) - * 1: Object that is dragged (Object) + * Arguments: + * 0: Unit that currently drags a object + * 1: Object that is dragged * - * Return value: - * Can the unit drop the object? (Bool) + * Return Value: + * Can the unit drop the object? + * + * Public: No */ #include "script_component.hpp" -private ["_unit", "_target"]; - -_unit = _this select 0; -_target = _this select 1; +params ["_unit", "_target"]; if !([_unit, _target, ["isNotDragging"]] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/dragging/functions/fnc_canDrop_carry.sqf b/addons/dragging/functions/fnc_canDrop_carry.sqf index 9efbbe9b0f..430b12c642 100644 --- a/addons/dragging/functions/fnc_canDrop_carry.sqf +++ b/addons/dragging/functions/fnc_canDrop_carry.sqf @@ -3,19 +3,18 @@ * * Check if unit can drop the carried object. * - * Argument: - * 0: Unit that currently carries a object (Object) - * 1: Object that is carried (Object) + * Arguments: + * 0: Unit that currently carries a object + * 1: Object that is carried * - * Return value: - * Can the unit drop the object? (Bool) + * Return Value: + * Can the unit drop the object? + * + * Public: No */ #include "script_component.hpp" -private ["_unit", "_target"]; - -_unit = _this select 0; -_target = _this select 1; +params ["_unit", "_target"]; if !([_unit, _target, ["isNotCarrying"]] call EFUNC(common,canInteractWith)) exitWith {false}; diff --git a/addons/dragging/functions/fnc_carryObject.sqf b/addons/dragging/functions/fnc_carryObject.sqf index bb413d8240..7f70b2bdc5 100644 --- a/addons/dragging/functions/fnc_carryObject.sqf +++ b/addons/dragging/functions/fnc_carryObject.sqf @@ -3,19 +3,18 @@ * * Carry an object. * - * Argument: - * 0: Unit that should do the carrying (Object) - * 1: Object to carry (Object) + * Arguments: + * 0: Unit that should do the carrying + * 1: Object to carry * - * Return value: - * NONE. + * Return Value: + * None + * + * Public: No */ #include "script_component.hpp" -private ["_unit", "_target"]; - -_unit = _this select 0; -_target = _this select 1; +params ["_unit", "_target"]; // get attachTo offset and direction. private ["_position", "_direction"]; diff --git a/addons/dragging/functions/fnc_carryObjectPFH.sqf b/addons/dragging/functions/fnc_carryObjectPFH.sqf index 3ad1f89f77..d0eb7fda17 100644 --- a/addons/dragging/functions/fnc_carryObjectPFH.sqf +++ b/addons/dragging/functions/fnc_carryObjectPFH.sqf @@ -1,21 +1,31 @@ -// by commy2 +/* + * Author: commy2 + * + * PFH for Carry Object + * + * Arguments: + * ? + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" #ifdef DEBUG_ENABLED_DRAGGING systemChat format ["%1 carryObjectPFH running", ACE_time]; #endif -private ["_unit", "_target"]; - -_unit = _this select 0 select 0; -_target = _this select 0 select 1; +params ["_args", "_idPFH"]; +_args params ["_unit","_target"]; if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; // drop if the crate is destroyed OR (target moved away from carrier (weapon disasembled)) if ((!([_target] call EFUNC(common,isAlive))) || {(_unit distance _target) > 10}) then { [_unit, _target] call FUNC(dropObject_carry); - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/dragging/functions/fnc_dragObject.sqf b/addons/dragging/functions/fnc_dragObject.sqf index e4b200c4dd..d12a98213a 100644 --- a/addons/dragging/functions/fnc_dragObject.sqf +++ b/addons/dragging/functions/fnc_dragObject.sqf @@ -3,28 +3,25 @@ * * Drag an object. Called from ace_dragging_fnc_startDrag * - * Argument: - * 0: Unit that should do the dragging (Object) - * 1: Object to drag (Object) + * Arguments: + * 0: Unit that should do the dragging + * 1: Object to drag * - * Return value: - * NONE. + * Return Value: + * None + * + * Public: No */ #include "script_component.hpp" -private ["_unit", "_target"]; - -_unit = _this select 0; -_target = _this select 1; +private ["_position", "_direction", "_offset", "_actionID"]; +params ["_unit", "_target"]; // get attachTo offset and direction. -private ["_position", "_direction"]; - _position = _target getVariable [QGVAR(dragPosition), [0, 0, 0]]; _direction = _target getVariable [QGVAR(dragDirection), 0]; // add height offset of model -private "_offset"; _offset = (_target modelToWorldVisual [0, 0, 0] select 2) - (_unit modelToWorldVisual [0, 0, 0] select 2); _position = _position vectorAdd [0, 0, _offset]; @@ -41,7 +38,6 @@ _unit setVariable [QGVAR(isDragging), true, true]; _unit setVariable [QGVAR(draggedObject), _target, true]; // add scrollwheel action to release object -private "_actionID"; _actionID = _unit getVariable [QGVAR(ReleaseActionID), -1]; if (_actionID != -1) then { diff --git a/addons/dragging/functions/fnc_dragObjectPFH.sqf b/addons/dragging/functions/fnc_dragObjectPFH.sqf index 465107af39..dea8897b27 100644 --- a/addons/dragging/functions/fnc_dragObjectPFH.sqf +++ b/addons/dragging/functions/fnc_dragObjectPFH.sqf @@ -1,21 +1,31 @@ -// by commy2 +/* + * Author: commy2 + * + * PFH for Drag Object + * + * Arguments: + * ? + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" #ifdef DEBUG_ENABLED_DRAGGING systemChat format ["%1 dragObjectPFH running", ACE_time]; #endif -private ["_unit", "_target"]; - -_unit = _this select 0 select 0; -_target = _this select 0 select 1; +params ["_args", "_idPFH"]; +_args params ["_unit", "_target"]; if !(_unit getVariable [QGVAR(isDragging), false]) exitWith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; // drop if the crate is destroyed OR (target moved away from carrier (weapon disasembled)) if ((!([_target] call EFUNC(common,isAlive))) || {(_unit distance _target) > 10}) then { [_unit, _target] call FUNC(dropObject); - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/dragging/functions/fnc_dropObject.sqf b/addons/dragging/functions/fnc_dropObject.sqf index 9589457dbe..2ae07be091 100644 --- a/addons/dragging/functions/fnc_dropObject.sqf +++ b/addons/dragging/functions/fnc_dropObject.sqf @@ -3,19 +3,18 @@ * * Drop a dragged object. * - * Argument: - * 0: Unit that drags the other object (Object) - * 1: Dragged object to drop (Object) + * Arguments: + * 0: Unit that drags the other object + * 1: Dragged object to drop * - * Return value: - * NONE. + * Return Value: + * None + * + * Public: No */ #include "script_component.hpp" -private ["_unit", "_target"]; - -_unit = _this select 0; -_target = _this select 1; +params ["_unit", "_target"]; // remove scroll wheel action _unit removeAction (_unit getVariable [QGVAR(ReleaseActionID), -1]); diff --git a/addons/dragging/functions/fnc_dropObject_carry.sqf b/addons/dragging/functions/fnc_dropObject_carry.sqf index b6dfe9fc45..86009ac867 100644 --- a/addons/dragging/functions/fnc_dropObject_carry.sqf +++ b/addons/dragging/functions/fnc_dropObject_carry.sqf @@ -3,19 +3,18 @@ * * Drop a carried object. * - * Argument: - * 0: Unit that carries the other object (Object) - * 1: Carried object to drop (Object) + * Arguments: + * 0: Unit that carries the other object + * 1: Carried object to drop * - * Return value: - * NONE. + * Return Value: + * None + * + * Public: No */ #include "script_component.hpp" -private ["_unit", "_target"]; - -_unit = _this select 0; -_target = _this select 1; +params ["_unit", "_target"]; // remove scroll wheel action _unit removeAction (_unit getVariable [QGVAR(ReleaseActionID), -1]); diff --git a/addons/dragging/functions/fnc_getWeight.sqf b/addons/dragging/functions/fnc_getWeight.sqf index 871c49db89..dcdcbbf3fe 100644 --- a/addons/dragging/functions/fnc_getWeight.sqf +++ b/addons/dragging/functions/fnc_getWeight.sqf @@ -1,54 +1,45 @@ /* - Name: AGM_Drag_fnc_GetWeight - - Author(s): - L-H, edited by commy2 - - Description: - Returns the weight of a crate. - - Parameters: - 0: OBJECT - Crate to get weight of - - Returns: - NUMBER - Weight - - Example: - _weight = Crate1 call AGM_Drag_fnc_GetWeight; + * Author: L-H, edited by commy2, rewritten by joko // Jonas + * + * Returns the weight of a crate. + * + * Arguments: + * 0: Crate to get weight of + * + * Return Value: + * Total Weight + * + * Example: + * _weight = Crate1 call ace_dragging_fnc_getweight; + * + * Public: No */ #include "script_component.hpp" -private "_object"; - -_object = _this select 0; - -private ["_totalWeight", "_fnc","_fnc_Extra"]; +private "_totalWeight"; +params ["_object"]; +// Initialize the total weight. _totalWeight = 0; -_fnc_Extra = { - private ["_weight", "_items"]; - _items = _this select 0; - _weight = 0; - { - _weight = _weight + (getNumber (ConfigFile >> (_this select 1) >> _x >> (_this select 2) >> "mass") * ((_items select 1) select _foreachIndex)); - } foreach (_items select 0); - - _weight -}; -_fnc = { - private ["_weight", "_items"]; - _items = _this select 0; - _weight = 0; - { - _weight = _weight + (getNumber (ConfigFile >> (_this select 1) >> _x >> "mass") * ((_items select 1) select _foreachIndex)); - } foreach (_items select 0); - - _weight -}; -_totalWeight = ([getMagazineCargo _object, "CfgMagazines"] call _fnc); -_totalWeight = _totalWeight + ([getItemCargo _object, "CfgWeapons", "ItemInfo"] call _fnc_Extra); -_totalWeight = _totalWeight + ([getWeaponCargo _object, "CfgWeapons", "WeaponSlotsInfo"] call _fnc_Extra); -_totalWeight = _totalWeight + ([getBackpackCargo _object, "CfgVehicles"] call _fnc); -_totalWeight = _totalWeight * 0.5; // Mass in Arma isn't an exact amount but rather a volume/weight value. This attempts to work around that by making it a usable value. (sort of). +// Cycle through all item types with their assigned config paths. +{ + _x params["_items","_getConfigCode"]; + _items params ["_item", "_count"]; + // Cycle through all items and read their mass out of the config. + { + // Multiply mass with amount of items and add the mass to the total weight. + _totalWeight = _totalWeight + (getNumber ((call _getConfigCode) >> "mass") * (_count select _forEachIndex)); + } forEach _item; + true +} count [ + [getMagazineCargo _object, {configFile >> "CfgMagazines" >> _x}], + [getBackpackCargo _object, {configFile >> "CfgVehicles" >> _x}], + [getItemCargo _object, {configFile >> "CfgWeapons" >> _x >> "ItemInfo"}], + [getWeaponCargo _object, {configFile >> "CfgWeapons" >> _x >> "WeaponSlotsInfo"}] +]; -_totalWeight +// add Weight of create to totalWeight +_totalWeight = _totalWeight + (getNumber (configFile >> "CfgVehicles" >> typeof _object >> "mass")); + +// Mass in Arma isn't an exact amount but rather a volume/weight value. This attempts to work around that by making it a usable value. (sort of). +_totalWeight * 0.5 diff --git a/addons/dragging/functions/fnc_handleAnimChanged.sqf b/addons/dragging/functions/fnc_handleAnimChanged.sqf index 14b2eff611..0694687ca4 100644 --- a/addons/dragging/functions/fnc_handleAnimChanged.sqf +++ b/addons/dragging/functions/fnc_handleAnimChanged.sqf @@ -1,4 +1,20 @@ -// by commy2 +/* + * Author: commy2 + * + * Handle the animaion for a Unit for Dragging Module + * + * Arguments: + * 0: Unit + * 1: animaion + * + * Return Value: + * None + * + * Example: + * [_unit, "amovpercmstpsnonwnondnon"] call ace_dragging_fnc_handleAnimChanged; + * + * Public: No +*/ #include "script_component.hpp" private ["_unit", "_anim"]; diff --git a/addons/dragging/functions/fnc_handleKilled.sqf b/addons/dragging/functions/fnc_handleKilled.sqf index 4dcfc77fcd..2d0923d624 100644 --- a/addons/dragging/functions/fnc_handleKilled.sqf +++ b/addons/dragging/functions/fnc_handleKilled.sqf @@ -1,9 +1,22 @@ -// by commy2 +/* + * Author: commy2 + * + * Handle death of the dragger + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [_unit] call ace_dragging_fnc_handleKilled; + * + * Public: No +*/ #include "script_component.hpp" -private "_unit"; - -_unit = _this select 0; +params ["_unit"]; if (_unit getVariable [QGVAR(isDragging), false]) then { private "_draggedObject"; diff --git a/addons/dragging/functions/fnc_handlePlayerChanged.sqf b/addons/dragging/functions/fnc_handlePlayerChanged.sqf index e2dd41021b..41c9091c72 100644 --- a/addons/dragging/functions/fnc_handlePlayerChanged.sqf +++ b/addons/dragging/functions/fnc_handlePlayerChanged.sqf @@ -1,10 +1,23 @@ -// by commy2 +/* + * Author: commy2 + * + * Handle player changes. + * + * Arguments: + * 0: New Player Unit + * 1: Old Player Unit + * + * Return Value: + * None + * + * Example: + * [_unitNew, _unitOld] call ace_dragging_fnc_handlePlayerChanged; + * + * Public: No +*/ #include "script_component.hpp" -private ["_newPlayer", "_oldPlayer"]; - -_newPlayer = _this select 0; -_oldPlayer = _this select 1; +params ["_newPlayer", "_oldPlayer"]; { if (_x getVariable [QGVAR(isDragging), false]) then { diff --git a/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf b/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf index a7f9be7681..e0f1b2a8e4 100644 --- a/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf +++ b/addons/dragging/functions/fnc_handlePlayerWeaponChanged.sqf @@ -1,10 +1,23 @@ -// by commy2 +/* + * Author: commy2 + * + * Handle the Weapon Changed Event + * + * Arguments: + * 0: Unit + * 1: Weapon + * + * Return Value: + * None + * + * Example: + * [_unit, _currentWeapon] call ace_dragging_fnc_handlePlayerWeaponChanged; + * + * Public: No +*/ #include "script_component.hpp" -private ["_unit", "_weapon"]; - -_unit = _this select 0; -_weapon = _this select 1; +params ["_unit", "_weapon"]; if (_unit getVariable [QGVAR(isDragging), false]) then { diff --git a/addons/dragging/functions/fnc_handleScrollWheel.sqf b/addons/dragging/functions/fnc_handleScrollWheel.sqf index 96f46413bc..cd613316ec 100644 --- a/addons/dragging/functions/fnc_handleScrollWheel.sqf +++ b/addons/dragging/functions/fnc_handleScrollWheel.sqf @@ -3,38 +3,38 @@ * * Handles raising and lowering the dragged weapon to be able to place it on top of objects. * - * Argument: - * 0: Scroll amount (Number) + * Arguments: + * 0: Scroll amount * - * Return value: - * Handled or not. (Bool) + * Return Value: + * Handled or not. + * + * Public: No */ #include "script_component.hpp" -// requires modifier key to be hold down -if (GETMVAR(ACE_Modifier,0) == 0) exitWith {false}; +private ["_unit", "_carriedItem", "_position", "_maxHeight"]; + +params ["_scrollAmount"]; + +// requires modifier key to be hold down +if (missionNamespace getVariable ["ACE_Modifier", 0] == 0) exitWith {false}; -private "_unit"; _unit = ACE_player; // EH is always assigned. Exit and don't overwrite input if not carrying if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith {false}; -private "_scrollAmount"; -_scrollAmount = _this select 0; // move carried item 15 cm per scroll interval _scrollAmount = _scrollAmount * 0.15; -private "_carriedItem"; _carriedItem = _unit getVariable [QGVAR(carriedObject), objNull]; //disabled for persons if (_carriedItem isKindOf "CAManBase") exitWith {false}; -private ["_position", "_maxHeight"]; - _position = getPosATL _carriedItem; _maxHeight = (_unit modelToWorldVisual [0,0,0]) select 2; diff --git a/addons/dragging/functions/fnc_handleUnconscious.sqf b/addons/dragging/functions/fnc_handleUnconscious.sqf index 31c703f37b..b87e36b92d 100644 --- a/addons/dragging/functions/fnc_handleUnconscious.sqf +++ b/addons/dragging/functions/fnc_handleUnconscious.sqf @@ -1,17 +1,29 @@ -// by commy2 +/* + * Author: commy2 + * + * Handle the Unconscious of a Unit while Dragging + * + * Arguments: + * 0: Unit + * + * Return Value: + * None + * + * Example: + * [_unit] call ace_dragging_fnc_handleUnconscious; + * + * Public: No +*/ #include "script_component.hpp" -private ["_unit", "_isUnconscious"]; +private ["_player", "_draggedObject", "_carriedObject"]; -_unit = _this select 0; -_isUnconscious = _this select 1; +params ["_unit"]; -private "_player"; _player = ACE_player; if (_player getVariable [QGVAR(isDragging), false]) then { - private "_draggedObject"; _draggedObject = _player getVariable [QGVAR(draggedObject), objNull]; // handle falling unconscious @@ -28,7 +40,6 @@ if (_player getVariable [QGVAR(isDragging), false]) then { if (_player getVariable [QGVAR(isCarrying), false]) then { - private "_carriedObject"; _carriedObject = _player getVariable [QGVAR(carriedObject), objNull]; // handle falling unconscious diff --git a/addons/dragging/functions/fnc_initObject.sqf b/addons/dragging/functions/fnc_initObject.sqf index 65866bd028..0dd36568bc 100644 --- a/addons/dragging/functions/fnc_initObject.sqf +++ b/addons/dragging/functions/fnc_initObject.sqf @@ -4,23 +4,22 @@ * Initialize variables for drag or carryable objects. Called from init EH. * * Argument: - * 0: Any object (Object) + * 0: Any object * - * Return value: - * NONE. + * Return Value: + * None + * + * Public: No */ #include "script_component.hpp" -private "_object"; +private ["_position", "_direction", "_config"]; -_object = _this select 0; +params ["_object"]; -private "_config"; _config = configFile >> "CfgVehicles" >> typeOf _object; if (getNumber (_config >> QGVAR(canDrag)) == 1) then { - private ["_position", "_direction"]; - _position = getArray (_config >> QGVAR(dragPosition)); _direction = getNumber (_config >> QGVAR(dragDirection)); @@ -28,8 +27,6 @@ if (getNumber (_config >> QGVAR(canDrag)) == 1) then { }; if (getNumber (_config >> QGVAR(canCarry)) == 1) then { - private ["_position", "_direction"]; - _position = getArray (_config >> QGVAR(carryPosition)); _direction = getNumber (_config >> QGVAR(carryDirection)); diff --git a/addons/dragging/functions/fnc_initPerson.sqf b/addons/dragging/functions/fnc_initPerson.sqf index 0dc2af1389..c0a951771c 100644 --- a/addons/dragging/functions/fnc_initPerson.sqf +++ b/addons/dragging/functions/fnc_initPerson.sqf @@ -4,16 +4,16 @@ * Initialize variables for drag or carryable persons. Called from init EH. * * Argument: - * 0: Any Unit (Object) + * 0: Unit * * Return value: - * NONE. + * None + * + * Public: No */ #include "script_component.hpp" -private "_unit"; - -_unit = _this select 0; +params ["_unit"]; [_unit, true, [0,1.1,0.092], 180] call FUNC(setDraggable); [_unit, true, [0.4,-0.1,-1.25], 195] call FUNC(setCarryable); // hard-coded selection: "LeftShoulder" diff --git a/addons/dragging/functions/fnc_isObjectOnObject.sqf b/addons/dragging/functions/fnc_isObjectOnObject.sqf index 0a8624820e..e8ab5f307a 100644 --- a/addons/dragging/functions/fnc_isObjectOnObject.sqf +++ b/addons/dragging/functions/fnc_isObjectOnObject.sqf @@ -1,6 +1,16 @@ -// by commy2 - -private "_object"; -_object = _this select 0; +/* + * Author: commy2 + * + * Check if Object is Overlapping + * + * Argument: + * 0: Object + * + * Return value: + * + * + * Public: No + */ +params ["_object"]; (getPosATL _object select 2) - (getPos _object select 2) > 1E-5 diff --git a/addons/dragging/functions/fnc_setCarryable.sqf b/addons/dragging/functions/fnc_setCarryable.sqf index 52c6e5643a..6bf05e5fde 100644 --- a/addons/dragging/functions/fnc_setCarryable.sqf +++ b/addons/dragging/functions/fnc_setCarryable.sqf @@ -4,25 +4,21 @@ * Enable the object to be carried. * * Argument: - * 0: Any object (Object) - * 1: true to enable carrying, false to disable (Bool) - * 2: Position offset for attachTo command (Array, optinal; default: [0,1,1]) - * 3: Direction in degree to rotate the object after attachTo (Number, optional; default: 0) + * 0: Any object + * 1: true to enable carrying, false to disable + * 2: Position offset for attachTo command (default: [0,1,1]) + * 3: Direction in degree to rotate the object after attachTo (default: 0) * - * Return value: - * NONE. + * Return Value: + * None + * + * Public: Yes */ #include "script_component.hpp" -private ["_carryAction", "_dropAction", "_object", "_enableCarry", "_position", "_direction"]; -//IGNORE_PRIVATE_WARNING("_player", "_target"); +private ["_carryAction", "_dropAction", "_type", "_initializedClasses"]; -_this resize 4; - -_object = _this select 0; -_enableCarry = _this select 1; -_position = _this select 2; -_direction = _this select 3; +params ["_object", "_enableCarry", "_position", "_direction"]; if (isNil "_position") then { _position = _object getVariable [QGVAR(carryPosition), [0,1,1]]; @@ -38,8 +34,6 @@ _object setVariable [QGVAR(carryPosition), _position]; _object setVariable [QGVAR(carryDirection), _direction]; // add action to class if it is not already present -private ["_type", "_initializedClasses"]; - _type = typeOf _object; _initializedClasses = GETGVAR(initializedClasses_carry,[]); diff --git a/addons/dragging/functions/fnc_setDraggable.sqf b/addons/dragging/functions/fnc_setDraggable.sqf index 7745bd2d3e..bbfca9d868 100644 --- a/addons/dragging/functions/fnc_setDraggable.sqf +++ b/addons/dragging/functions/fnc_setDraggable.sqf @@ -10,19 +10,15 @@ * 3: Direction in degree to rotate the object after attachTo (Number, optional; default: 0) * * Return value: - * NONE. + * None + * + * Public: Yes */ #include "script_component.hpp" -private ["_dragAction", "_dropAction", "_object", "_enableDrag", "_position", "_direction"]; +private ["_dragAction", "_dropAction", "_type", "_initializedClasses"]; //IGNORE_PRIVATE_WARNING("_player", "_target"); - -_this resize 4; - -_object = _this select 0; -_enableDrag = _this select 1; -_position = _this select 2; -_direction = _this select 3; +params ["_object", "_enableDrag", "_position", "_direction"]; if (isNil "_position") then { _position = _object getVariable [QGVAR(dragPosition), [0,0,0]]; @@ -38,8 +34,6 @@ _object setVariable [QGVAR(dragPosition), _position]; _object setVariable [QGVAR(dragDirection), _direction]; // add action to class if it is not already present -private ["_type", "_initializedClasses"]; - _type = typeOf _object; _initializedClasses = GETGVAR(initializedClasses,[]); diff --git a/addons/dragging/functions/fnc_startCarry.sqf b/addons/dragging/functions/fnc_startCarry.sqf index 5521bec375..a95a8f9fb4 100644 --- a/addons/dragging/functions/fnc_startCarry.sqf +++ b/addons/dragging/functions/fnc_startCarry.sqf @@ -3,29 +3,28 @@ * * Start the carrying process. * - * Argument: - * 0: Unit that should do the carrying (Object) - * 1: Object to carry (Object) + * Arguments: + * 0: Unit that should do the carrying + * 1: Object to carry * - * Return value: - * NONE. + * Return Value: + * None + * + * Public: No */ #include "script_component.hpp" -private ["_unit", "_target"]; +private ["_weight", "_timer"]; -_unit = _this select 0; -_target = _this select 1; +params ["_unit", "_target"]; // check weight -private "_weight"; _weight = [_target] call FUNC(getWeight); -if (_weight > GETMVAR(ACE_maxWeightCarry,1E11)) exitWith { +if (_weight > missionNamespace getVariable ["ACE_maxWeightCarry", 1E11]) exitWith { [localize LSTRING(UnableToDrag)] call EFUNC(common,displayTextStructured); }; -private "_timer"; _timer = ACE_time + 5; // handle objects vs persons diff --git a/addons/dragging/functions/fnc_startCarryPFH.sqf b/addons/dragging/functions/fnc_startCarryPFH.sqf index 47824a8e76..ae5ad17978 100644 --- a/addons/dragging/functions/fnc_startCarryPFH.sqf +++ b/addons/dragging/functions/fnc_startCarryPFH.sqf @@ -1,25 +1,34 @@ -// by commy2 +/* + * Author: commy2 + * + * Carry PFH + * + * Arguments: + * ? + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" #ifdef DEBUG_ENABLED_DRAGGING systemChat format ["%1 startCarryPFH running", ACE_time]; #endif -private ["_unit", "_target", "_timeOut"]; - -_unit = _this select 0 select 0; -_target = _this select 0 select 1; -_timeOut = _this select 0 select 2; +params ["_args", "_idPFH"]; +_args params ["_unit", "_target", "_timeOut"]; // handle aborting carry if !(_unit getVariable [QGVAR(isCarrying), false]) exitWith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; // same as dragObjectPFH, checks if object is deleted or dead OR (target moved away from carrier (weapon disasembled)) if ((!([_target] call EFUNC(common,isAlive))) || {(_unit distance _target) > 10}) then { [_unit, _target] call FUNC(dropObject); - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; // handle persons vs objects @@ -27,11 +36,11 @@ if (_target isKindOf "CAManBase") then { if (ACE_time > _timeOut) exitWith { [_unit, _target] call FUNC(carryObject); - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; } else { if (ACE_time > _timeOut) exitWith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; // drop if in timeout private "_draggedObject"; @@ -43,7 +52,7 @@ if (_target isKindOf "CAManBase") then { if (stance _unit == "STAND") exitWith { [_unit, _target] call FUNC(carryObject); - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; }; diff --git a/addons/dragging/functions/fnc_startDrag.sqf b/addons/dragging/functions/fnc_startDrag.sqf index 1d4eb9a158..d3e55bdaea 100644 --- a/addons/dragging/functions/fnc_startDrag.sqf +++ b/addons/dragging/functions/fnc_startDrag.sqf @@ -4,24 +4,21 @@ * Start the dragging process. * * Argument: - * 0: Unit that should do the dragging (Object) - * 1: Object to drag (Object) + * 0: Unit that should do the dragging + * 1: Object to drag * * Return value: - * NONE. + * None */ #include "script_component.hpp" -private ["_unit", "_target"]; - -_unit = _this select 0; -_target = _this select 1; +params ["_unit", "_target"]; // check weight private "_weight"; _weight = [_target] call FUNC(getWeight); -if (_weight > GETMVAR(ACE_maxWeightDrag,1E11)) exitWith { +if (_weight > missionNamespace getVariable ["ACE_maxWeightDrag", 1E11]) exitWith { [localize LSTRING(UnableToDrag)] call EFUNC(common,displayTextStructured); }; diff --git a/addons/dragging/functions/fnc_startDragPFH.sqf b/addons/dragging/functions/fnc_startDragPFH.sqf index 65cf0a2431..f527cda7d8 100644 --- a/addons/dragging/functions/fnc_startDragPFH.sqf +++ b/addons/dragging/functions/fnc_startDragPFH.sqf @@ -1,30 +1,39 @@ -// by commy2 +/* + * Author: commy2 + * + * Drag PFH + * + * Arguments: + * ? + * + * Return Value: + * None + * + * Public: No + */ #include "script_component.hpp" #ifdef DEBUG_ENABLED_DRAGGING systemChat format ["%1 startDragPFH running", ACE_time]; #endif -private ["_unit", "_target", "_timeOut"]; - -_unit = _this select 0 select 0; -_target = _this select 0 select 1; -_timeOut = _this select 0 select 2; +params ["_args", "_idPFH"]; +_args params ["_unit", "_target", "_timeOut"]; // handle aborting drag if !(_unit getVariable [QGVAR(isDragging), false]) exitWith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; // same as dragObjectPFH, checks if object is deleted or dead OR (target moved away from carrier (weapon disasembled)) if ((!([_target] call EFUNC(common,isAlive))) || {(_unit distance _target) > 10}) then { [_unit, _target] call FUNC(dropObject); - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; // timeout. Do nothing. Quit. ACE_time, because anim length is linked to ingame ACE_time. if (ACE_time > _timeOut) exitWith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; // drop if in timeout private "_draggedObject"; @@ -36,5 +45,5 @@ if (ACE_time > _timeOut) exitWith { if (animationState _unit in DRAG_ANIMATIONS) exitWith { [_unit, _target] call FUNC(dragObject); - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; diff --git a/addons/explosives/ACE_Triggers.hpp b/addons/explosives/ACE_Triggers.hpp index 5df3d005bc..952f360f22 100644 --- a/addons/explosives/ACE_Triggers.hpp +++ b/addons/explosives/ACE_Triggers.hpp @@ -1,5 +1,5 @@ class ACE_Triggers { -/* onPlace parameters: + /* onPlace parameters: 0: OBJECT - unit placing 1: OBJECT - Placed explosive 2: STRING - Magazine classname @@ -7,46 +7,54 @@ class ACE_Triggers { Last Index: ACE_Triggers config of trigger type. onSetup parameters: 0: STRING - Magazine Classname -*/ + */ class Command { + isAttachable = 1; displayName = CSTRING(clacker_displayName); picture = PATHTOF(Data\UI\Clacker.paa); onPlace = QUOTE(_this call FUNC(AddClacker);false); requires[] = {"ACE_Clacker"}; }; class MK16_Transmitter:Command { + isAttachable = 1; displayName = CSTRING(MK16_displayName); picture = PATHTOF(Data\UI\MK16_Reciever_ca.paa); requires[] = {"ACE_M26_Clacker"}; }; class DeadManSwitch:Command { + isAttachable = 1; displayName = CSTRING(DeadManSwitch_displayName); picture = PATHTOF(Data\UI\DeadmanSwitch.paa); requires[] = {"ACE_DeadManSwitch"}; }; class Cellphone:Command { + isAttachable = 1; displayName = CSTRING(cellphone_displayName); picture = PATHTOF(Data\UI\Cellphone_UI.paa); onPlace = QUOTE(_this call FUNC(addCellphoneIED);false); requires[] = {"ACE_Cellphone"}; }; class PressurePlate { + isAttachable = 0; displayName = CSTRING(PressurePlate); picture = PATHTOF(Data\UI\PressurePlate.paa); - onPlace = "_dist=GetNumber(ConfigFile >> 'CfgMagazines' >> (_this select 2) >> 'ACE_Triggers' >> 'PressurePlate' >> 'digDistance');_ex=_this select 1;_ex setPosATL ((getPosATL _ex) vectorDiff ((VectorUp _ex) vectorCrossProduct [0,0,_dist]));false"; + onPlace = QUOTE(false); }; class IRSensor { + isAttachable = 0; displayName = CSTRING(IRSensor); picture = PATHTOF(Data\UI\PressurePlate.paa); onPlace = "false"; }; class Timer { + isAttachable = 1; displayName = CSTRING(timerName); picture = PATHTOF(data\UI\Timer.paa); onPlace = QUOTE([ARR_2(_this select 1,(_this select 3) select 0)] call FUNC(startTimer);false); onSetup = QUOTE(_this call FUNC(openTimerSetUI);true); }; class Tripwire { + isAttachable = 0; displayName = CSTRING(TripWire); picture = PATHTOF(Data\UI\Tripwire.paa); onPlace = "false"; diff --git a/addons/explosives/CfgEventHandlers.hpp b/addons/explosives/CfgEventHandlers.hpp index 89e3017e8a..e7bf74e414 100644 --- a/addons/explosives/CfgEventHandlers.hpp +++ b/addons/explosives/CfgEventHandlers.hpp @@ -11,7 +11,7 @@ class Extended_PostInit_EventHandlers { class Extended_Killed_EventHandlers { class CAManBase { - GVAR(killedHandler) = QUOTE(_this call FUNC(onKilled)); + GVAR(killedHandler) = QUOTE(_this call FUNC(onIncapacitated)); }; }; diff --git a/addons/explosives/CfgMagazines.hpp b/addons/explosives/CfgMagazines.hpp index 39d08917c3..686dd83ee8 100644 --- a/addons/explosives/CfgMagazines.hpp +++ b/addons/explosives/CfgMagazines.hpp @@ -8,7 +8,7 @@ class CfgMagazines { class ACE_Triggers { SupportedTriggers[] = {"PressurePlate"}; class PressurePlate { - digDistance = 0.1; + digDistance = 0.06; }; }; }; @@ -17,7 +17,7 @@ class CfgMagazines { class ACE_Triggers { SupportedTriggers[] = {"PressurePlate"}; class PressurePlate { - digDistance = 0.075; + digDistance = 0.08; }; }; }; @@ -26,7 +26,7 @@ class CfgMagazines { class ACE_Triggers { SupportedTriggers[] = {"PressurePlate"}; class PressurePlate { - digDistance = 0.05; + digDistance = 0.02; }; }; }; @@ -96,7 +96,7 @@ class CfgMagazines { }; }; }; - + class IEDUrbanBig_Remote_Mag: DemoCharge_Remote_Mag { ACE_SetupObject = "ACE_Explosives_Place_IEDUrbanBig"; class ACE_Triggers { @@ -113,9 +113,9 @@ class CfgMagazines { ammo = "IEDUrbanBig_Range_Ammo"; pitch = 0; }; - }; + }; }; - + class IEDLandBig_Remote_Mag: IEDUrbanBig_Remote_Mag { ACE_SetupObject = "ACE_Explosives_Place_IEDLandBig"; class ACE_Triggers: ACE_Triggers { diff --git a/addons/explosives/GUI_VirtualAmmo.hpp b/addons/explosives/GUI_VirtualAmmo.hpp new file mode 100644 index 0000000000..96e5b452ee --- /dev/null +++ b/addons/explosives/GUI_VirtualAmmo.hpp @@ -0,0 +1,30 @@ +class RscTitles { + class GVAR(virtualAmmo) { + idd = -1; + movingEnable = 1; + duration = 9999999; + fadein = 0; + fadeout = 0; + onLoad = "uiNamespace setVariable ['ACE_explosives_virtualAmmoDisplay', (_this select 0)];"; + class controls {}; + class objects { + class TheObject { + idc = 800851; + type = 82; + model = "\a3\weapons_f\Ammo\Handgrenade.p3d"; //dummy value, cannot be "" !!! + scale = 1; + direction[] = {0, 0, 1}; + up[] = {0, 1, 0}; + x = 0.5; + y = 0.5; + z = 1; + xBack = 0.5; + yBack = 0.5; + zBack = 0.5; + inBack = 0; + enableZoom = 0; + zoomDuration = 1; + }; + }; + }; +}; diff --git a/addons/explosives/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf index 27a4703906..5216db8215 100644 --- a/addons/explosives/XEH_postInit.sqf +++ b/addons/explosives/XEH_postInit.sqf @@ -15,20 +15,37 @@ */ #include "script_component.hpp" -if !(hasInterface) exitWith {}; +//Event for setting explosive placement angle/pitch: +[QGVAR(place), {_this call FUNC(setPosition)}] call EFUNC(common,addEventHandler); -["interactMenuOpened", {_this call FUNC(interactEH)}] call EFUNC(common,addEventHandler); +//When getting knocked out in medical, trigger deadman explosives: +//Event is global, only run on server (ref: ace_medical_fnc_setUnconscious) +if (isServer) then { + ["medical_onUnconscious", { + params ["_unit", "_isUnconscious"]; + if (!_isUnconscious) exitWith {}; + TRACE_1("Knocked Out, Doing Deadman", _unit); + [_unit] call FUNC(onIncapacitated); + }] call EFUNC(common,addEventHandler); +}; + +if !(hasInterface) exitWith {}; GVAR(PlacedCount) = 0; GVAR(Setup) = objNull; GVAR(pfeh_running) = false; GVAR(CurrentSpeedDial) = 0; -//Cancel placement if interact menu opened + ["interactMenuOpened", { - if (GVAR(pfeh_running) && {!isNull (GVAR(Setup))}) then { - call FUNC(place_Cancel) + //Cancel placement if interact menu opened + if (GVAR(pfeh_running)) then { + GVAR(placeAction) = PLACE_CANCEL; }; + + //Show defuse actions on cfgAmmos (allMines): + _this call FUNC(interactEH); + }] call EFUNC(common,addEventHandler); -[{(_this select 0) call FUNC(handleScrollWheel);}] call EFUNC(Common,addScrollWheelEventHandler); +[{(_this select 0) call FUNC(handleScrollWheel);}] call EFUNC(common,addScrollWheelEventHandler); diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index b3888e1535..470cae661d 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -44,15 +44,11 @@ PREP(getSpeedDialExplosive); PREP(module); +PREP(onIncapacitated); PREP(onInventoryChanged); -PREP(onKilled); -PREP(onLanded); PREP(openTimerSetUI); -PREP(place_Approve); -PREP(place_Cancel); - PREP(placeExplosive); PREP(removeFromSpeedDial); diff --git a/addons/explosives/config.cpp b/addons/explosives/config.cpp index 873c4e0dc3..99544213d3 100644 --- a/addons/explosives/config.cpp +++ b/addons/explosives/config.cpp @@ -12,6 +12,8 @@ class CfgPatches { }; }; +#include "ACE_Settings.hpp" + #include "CfgEventHandlers.hpp" #include "CfgAmmo.hpp" @@ -21,6 +23,7 @@ class CfgPatches { #include "ACE_Triggers.hpp" #include "ExplosivesUI.hpp" +#include "GUI_VirtualAmmo.hpp" class CfgActions { class None; @@ -39,5 +42,3 @@ class CfgMineTriggers { mineTriggerRange = 1; }; }; - -#include "ACE_Settings.hpp" diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf index 953476861b..24d254ac04 100644 --- a/addons/explosives/functions/fnc_addCellphoneIED.sqf +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -18,7 +18,8 @@ */ #include "script_component.hpp" -EXPLODE_4_PVT(_this,_unit,_explosive,_magazineClass,_extra); +params ["_unit", "_explosive", "_magazineClass", "_extra"]; +TRACE_4("params",_unit,_explosive,_magazineClass,_extra); private["_config", "_detonators", "_hasRequired", "_requiredItems", "_code", "_count", "_codeSet"]; @@ -50,6 +51,9 @@ if (isNil QGVAR(CellphoneIEDs)) then { _count = GVAR(CellphoneIEDs) pushBack [_explosive,_code,GetNumber(ConfigFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> "Cellphone" >> "FuseTime")]; _count = _count + 1; publicVariable QGVAR(CellphoneIEDs); -_unit sideChat format ["IED %1 code: %2", _count,_code]; + +//display IED number message: +[format ["IED %1 code: %2", _count,_code]] call EFUNC(common,displayTextStructured); + if !(_hasRequired) exitWith {}; [format ["IED %1", _count],_code] call FUNC(addToSpeedDial); diff --git a/addons/explosives/functions/fnc_addClacker.sqf b/addons/explosives/functions/fnc_addClacker.sqf index d22b15eef4..f8301f73fb 100644 --- a/addons/explosives/functions/fnc_addClacker.sqf +++ b/addons/explosives/functions/fnc_addClacker.sqf @@ -17,8 +17,12 @@ * Public: Yes */ #include "script_component.hpp" + +params ["_unit", "_explosive", "_magazineClass"]; +TRACE_3("params",_unit,_explosive,_magazineClass); + private ["_clacker", "_config", "_requiredItems", "_hasRequired", "_detonators"]; -EXPLODE_3_PVT(_this,_unit,_explosive,_magazineClass); + // Config is the last item in the list of passed in items. _config = (_this select 3) select (count (_this select 3) - 1); @@ -41,4 +45,6 @@ _clacker pushBack [_explosive, getNumber(_config >> "FuseTime"), format [localiz GVAR(PlacedCount)], _magazineClass, configName ((_this select 3) select (count (_this select 3) - 1))]; _unit setVariable [QGVAR(Clackers), _clacker, true]; -_unit sideChat format [localize LSTRING(DetonateCode), GVAR(PlacedCount)]; + +//display clacker code message: +[format [localize LSTRING(DetonateCode), GVAR(PlacedCount)]] call EFUNC(common,displayTextStructured); diff --git a/addons/explosives/functions/fnc_addDetonateActions.sqf b/addons/explosives/functions/fnc_addDetonateActions.sqf index 5c94649608..04e78f0f82 100644 --- a/addons/explosives/functions/fnc_addDetonateActions.sqf +++ b/addons/explosives/functions/fnc_addDetonateActions.sqf @@ -15,10 +15,13 @@ * Public: No */ #include "script_component.hpp" + +params ["_unit", "_detonator"]; +TRACE_2("params",_unit,_detonator); + private ["_result", "_item", "_children", "_range", "_required"]; -EXPLODE_2_PVT(_this,_unit,_detonator); -_range = GetNumber (ConfigFile >> "CfgWeapons" >> _detonator >> "ACE_Range"); +_range = getNumber (ConfigFile >> "CfgWeapons" >> _detonator >> "ACE_Range"); _result = [_unit] call FUNC(getPlacedExplosives); _children = []; @@ -44,6 +47,6 @@ _children = []; ]; }; }; -} foreach _result; +} forEach _result; _children diff --git a/addons/explosives/functions/fnc_addExplosiveActions.sqf b/addons/explosives/functions/fnc_addExplosiveActions.sqf index 214b41602c..764c0cd7b8 100644 --- a/addons/explosives/functions/fnc_addExplosiveActions.sqf +++ b/addons/explosives/functions/fnc_addExplosiveActions.sqf @@ -1,6 +1,6 @@ /* * Author: Garth 'L-H' de Wet and CAA-Picard - * + * Adds sub actions for all explosive magazines (from insertChildren) * * Arguments: * 0: Unit @@ -11,9 +11,11 @@ * Public: No */ #include "script_component.hpp" -private ["_mags", "_item", "_index", "_children", "_itemCount", "_list"]; -EXPLODE_1_PVT(_this,_unit); +params ["_unit"]; +TRACE_1("params",_unit); + +private ["_mags", "_item", "_index", "_children", "_itemCount", "_list"]; _mags = magazines _unit; _list = []; @@ -41,16 +43,16 @@ _children = []; [ [ format ["Explosive_%1", _forEachIndex], - format [_name + " (%1)", _itemCount select _foreachIndex], + format [_name + " (%1)", _itemCount select _forEachIndex], getText(_x >> "picture"), - {(_this select 2) call FUNC(setupExplosive);}, + {_this call FUNC(setupExplosive);}, {true}, {}, - [_unit, configName _x] + (configName _x) ] call EFUNC(interact_menu,createAction), [], _unit ]; -} foreach _list; +} forEach _list; _children diff --git a/addons/explosives/functions/fnc_addToSpeedDial.sqf b/addons/explosives/functions/fnc_addToSpeedDial.sqf index 4f0772e601..bf409d5462 100644 --- a/addons/explosives/functions/fnc_addToSpeedDial.sqf +++ b/addons/explosives/functions/fnc_addToSpeedDial.sqf @@ -15,13 +15,16 @@ * Public: Yes */ #include "script_component.hpp" + +params ["_name", "_code"]; +TRACE_2("params",_name,_code); + private ["_speedDial", "_found"]; + _speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; _found = false; -EXPLODE_2_PVT(_this,_name,_code); - -if ((_code) == "") ExitWith { +if ((_code) == "") exitWith { [_name] call FUNC(removeFromSpeedDial); }; { @@ -29,7 +32,7 @@ if ((_code) == "") ExitWith { _speedDial set [_foreachindex, _this]; _found = true; }; -} foreach _speedDial; +} forEach _speedDial; if (!_found) then { _speedDial pushBack _this; }; diff --git a/addons/explosives/functions/fnc_addTransmitterActions.sqf b/addons/explosives/functions/fnc_addTransmitterActions.sqf index abaa57decc..40ec8581d4 100644 --- a/addons/explosives/functions/fnc_addTransmitterActions.sqf +++ b/addons/explosives/functions/fnc_addTransmitterActions.sqf @@ -14,8 +14,12 @@ * Public: No */ #include "script_component.hpp" -private ["_unit", "_children", "_config", "_detonators"]; -_unit = _this select 0; + +params ["_unit"]; +TRACE_1("params",_unit); + +private ["_children", "_config", "_detonators"]; + _detonators = [_unit] call FUNC(getDetonators); _children = []; { @@ -34,6 +38,6 @@ _children = []; [], ACE_Player ]; -} foreach _detonators; +} forEach _detonators; _children diff --git a/addons/explosives/functions/fnc_addTriggerActions.sqf b/addons/explosives/functions/fnc_addTriggerActions.sqf index 6f4ece163c..ca444a4e31 100644 --- a/addons/explosives/functions/fnc_addTriggerActions.sqf +++ b/addons/explosives/functions/fnc_addTriggerActions.sqf @@ -15,10 +15,14 @@ * Public: No */ #include "script_component.hpp" -private ["_hasRequiredItems","_triggerTypes", "_children", "_detonators", "_required", "_magTriggers"]; -EXPLODE_2_PVT(_this,_magazine,_explosive); -_detonators = [ACE_player] call FUNC(getDetonators); +params ["_magazine", "_explosive"]; +TRACE_2("params",_magazine,_explosive); + +private ["_hasRequiredItems","_triggerTypes", "_children", "_detonators", "_required", "_magTriggers", "_isAttached"]; + +_isAttached = !isNull (attachedTo _explosive); +_detonators = [ACE_player] call FUNC(getDetonators); _triggerTypes = [_magazine] call FUNC(triggerType); _magTriggers = ConfigFile >> "CfgMagazines" >> _magazine >> "ACE_Triggers"; _children = []; @@ -30,7 +34,7 @@ _children = []; _hasRequiredItems = false; }; } count _required; - if (_hasRequiredItems) then { + if (_hasRequiredItems && {(!_isAttached) || {(getNumber (_x >> "isAttachable")) == 1}}) then { _children pushBack [ [ @@ -50,6 +54,6 @@ _children = []; ACE_Player ]; }; -} foreach _triggerTypes; +} forEach _triggerTypes; _children diff --git a/addons/explosives/functions/fnc_canDefuse.sqf b/addons/explosives/functions/fnc_canDefuse.sqf index ef4bd10a83..e69ac41dac 100644 --- a/addons/explosives/functions/fnc_canDefuse.sqf +++ b/addons/explosives/functions/fnc_canDefuse.sqf @@ -4,6 +4,7 @@ * * Arguments: * 0: Unit + * 0: Target * * Return Value: * Able to defuse @@ -14,8 +15,12 @@ * Public: Yes */ #include "script_component.hpp" + +params ["_unit", "_target"]; +TRACE_2("params",_unit,_target); + private ["_isSpecialist"]; -EXPLODE_2_PVT(_this,_unit,_target); + if (isNull(_target getVariable [QGVAR(Explosive),objNull])) exitWith { deleteVehicle _target; false diff --git a/addons/explosives/functions/fnc_canDetonate.sqf b/addons/explosives/functions/fnc_canDetonate.sqf index 0b96f66f27..73ca3c4e70 100644 --- a/addons/explosives/functions/fnc_canDetonate.sqf +++ b/addons/explosives/functions/fnc_canDetonate.sqf @@ -14,7 +14,7 @@ * Public: Yes */ #include "script_component.hpp" -private "_unit"; -_unit = _this select 0; -[_unit] call FUNC(hasPlacedExplosives) and {count ([_unit] call FUNC(getDetonators)) > 0} +params ["_unit"]; + +([_unit] call FUNC(hasPlacedExplosives)) && {(count ([_unit] call FUNC(getDetonators))) > 0} diff --git a/addons/explosives/functions/fnc_defuseExplosive.sqf b/addons/explosives/functions/fnc_defuseExplosive.sqf index e0c7f7c85d..0af28788b3 100644 --- a/addons/explosives/functions/fnc_defuseExplosive.sqf +++ b/addons/explosives/functions/fnc_defuseExplosive.sqf @@ -15,9 +15,12 @@ * Public: Yes */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_unit,_explosive); -if (GVAR(ExplodeOnDefuse) && (random 1.0) < getNumber(ConfigFile >> "CfgAmmo" >> typeOf _explosive >> "ACE_explodeOnDefuse")) exitWith { +params ["_unit", "_explosive"]; +TRACE_2("params",_unit,_explosive); + +if (GVAR(ExplodeOnDefuse) && {(random 1.0) < (getNumber (ConfigFile >> "CfgAmmo" >> typeOf _explosive >> "ACE_explodeOnDefuse"))}) exitWith { + TRACE_1("exploding on defuse",_explosive); [_unit, -1, [_explosive, 1], true] call FUNC(detonateExplosive); }; diff --git a/addons/explosives/functions/fnc_detonateExplosive.sqf b/addons/explosives/functions/fnc_detonateExplosive.sqf index bfdf4a4b92..373e72ac21 100644 --- a/addons/explosives/functions/fnc_detonateExplosive.sqf +++ b/addons/explosives/functions/fnc_detonateExplosive.sqf @@ -19,12 +19,16 @@ * Public: Yes */ #include "script_component.hpp" -private ["_result", "_ignoreRange", "_helpers", "_pos"]; -EXPLODE_3_PVT(_this,_unit,_range,_item); + +params ["_unit", "_range", "_item"]; +TRACE_3("params",_unit,_range,_item); + +private ["_result", "_ignoreRange", "_pos"]; + _ignoreRange = (_range == -1); _result = true; -if (!_ignoreRange && {(_unit distance (_item select 0)) > _range}) exitWith {false}; +if (!_ignoreRange && {(_unit distance (_item select 0)) > _range}) exitWith {TRACE_1("out of range",_range); false}; if (getNumber (ConfigFile >> "CfgAmmo" >> typeof (_item select 0) >> "TriggerWhenDestroyed") == 0) then { private ["_exp", "_previousExp"]; @@ -40,11 +44,11 @@ if (getNumber (ConfigFile >> "CfgAmmo" >> typeof (_item select 0) >> "TriggerWhe }; }; [{ - private ["_explosive"]; - _explosive = _this; + params ["_explosive"]; + TRACE_1("exploding",_explosive); if (!isNull _explosive) then { _explosive setDamage 1; }; -}, _item select 0, _item select 1, 0] call EFUNC(common,waitAndExecute); +}, [_item select 0], (_item select 1)] call EFUNC(common,waitAndExecute); _result diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index aa163b027f..44addcda9f 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -15,8 +15,12 @@ * Public: Yes */ #include "script_component.hpp" + +params ["_unit", "_code"]; +TRACE_2("params",_unit,_code); + private ["_arr", "_ran", "_i"]; -EXPLODE_2_PVT(_this,_unit,_code); + if (_unit getVariable [QGVAR(Dialing),false]) exitWith {}; if !(alive _unit) exitWith {}; _unit setVariable [QGVAR(Dialing), true, true]; @@ -36,7 +40,7 @@ if (_unit == ace_player) then { [{ playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_this select 1),3.16228,1,75]; (_this select 0) setVariable [QGVAR(Dialing), false, true]; - }, [_unit,_explosive select 0], 0.25 * (count _arr - 4), 0] call EFUNC(common,waitAndExecute); + }, [_unit,_explosive select 0], 0.25 * (count _arr - 4)] call EFUNC(common,waitAndExecute); [_explosive select 0,(0.25 * (count _arr - 1)) + (_explosive select 2)] call FUNC(startTimer); }; }; diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index fa992a9cac..cb9d7f5450 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -17,7 +17,10 @@ * Public: No */ #include "script_component.hpp" -EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); + +params ["_args", "_pfID"]; +_args params ["_unit", "_i", "_arr", "_code"]; + if ((_i mod 4) == 0) then { playSound3D [QUOTE(PATHTO_R(Data\Audio\DialTone.wss)), objNull, false, (_unit modelToWorldVisual [0,0.2,2]), 15,1,2.5]; }; @@ -27,7 +30,7 @@ private "_explosive"; _explosive = [_code] call FUNC(getSpeedDialExplosive); if (_i >= (count _arr + 2)) then { - [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); + [_pfID] call CALLSTACK(cba_fnc_removePerFrameHandler); if ((count _explosive) > 0) then { [_unit, -1, [_explosive select 0, _explosive select 2]] call FUNC(detonateExplosive); }; @@ -41,4 +44,4 @@ if (_i == (count _arr)) then { playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_explosive select 0),3.16228,1,75]; }; }; -(_this select 0) set [1, _i + 1]; +_args set [1, _i + 1]; diff --git a/addons/explosives/functions/fnc_getDetonators.sqf b/addons/explosives/functions/fnc_getDetonators.sqf index da0bdc93d2..54c942e9de 100644 --- a/addons/explosives/functions/fnc_getDetonators.sqf +++ b/addons/explosives/functions/fnc_getDetonators.sqf @@ -16,8 +16,11 @@ #include "script_component.hpp" // IGNORE_PRIVATE_WARNING(_detonators); -private ["_unit", "_items", "_result", "_config"]; -_unit = _this select 0; +params ["_unit"]; +TRACE_1("params",_unit); + +private ["_items", "_result", "_config"]; + _items = (items _unit); _result = []; diff --git a/addons/explosives/functions/fnc_getPlacedExplosives.sqf b/addons/explosives/functions/fnc_getPlacedExplosives.sqf index 0c2080923a..56334af65b 100644 --- a/addons/explosives/functions/fnc_getPlacedExplosives.sqf +++ b/addons/explosives/functions/fnc_getPlacedExplosives.sqf @@ -18,8 +18,11 @@ #include "script_component.hpp" // IGNORE_PRIVATE_WARNING(_allExplosives,_deadmanExplosives); -private ["_unit", "_clackerList", "_adjustedList", "_list", "_filter"]; -_unit = _this select 0; +params ["_unit"]; +TRACE_1("params",_unit); + +private ["_clackerList", "_adjustedList", "_list", "_filter"]; + _filter = nil; if (count _this > 1) then { _filter = ConfigFile >> "ACE_Triggers" >> (_this select 1); @@ -30,14 +33,14 @@ _clackerList = _unit getVariable [QGVAR(Clackers), []]; _list = []; { if (isNull (_x select 0)) then { - _clackerList set [_foreachIndex, "X"]; + _clackerList set [_forEachIndex, "X"]; _adjustedList = true; } else { if (isNil "_filter" || {(ConfigFile >> "ACE_Triggers" >> (_x select 4)) == _filter}) then { _list pushBack _x; }; }; -} foreach _clackerList; +} forEach _clackerList; if (_adjustedList) then { _clackerList = _clackerList - ["X"]; if (count _clackerList == 0) then { diff --git a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf index b57f4f9f16..b6bd9b6e6f 100644 --- a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf +++ b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf @@ -14,8 +14,12 @@ * Public: Yes */ #include "script_component.hpp" -EXPLODE_1_PVT(_this,_code); + +params ["_code"]; +TRACE_1("params",_code); + private ["_explosive"]; + if (isNil QGVAR(CellphoneIEDs)) exitWith {[]}; _explosive = []; { @@ -24,4 +28,5 @@ _explosive = []; }; false } count GVAR(CellphoneIEDs); + _explosive diff --git a/addons/explosives/functions/fnc_handleScrollWheel.sqf b/addons/explosives/functions/fnc_handleScrollWheel.sqf index 3bef53e196..0d5fdd2aba 100644 --- a/addons/explosives/functions/fnc_handleScrollWheel.sqf +++ b/addons/explosives/functions/fnc_handleScrollWheel.sqf @@ -14,9 +14,9 @@ * Public: No */ #include "script_component.hpp" -if (isNull(GVAR(Setup)) || {ACE_Modifier == 0} || !GVAR(pfeh_running)) exitWith {false}; -_this = _this * 5; -GVAR(Setup) setDir ((getDir GVAR(Setup)) + _this); -GVAR(TweakedAngle) = GVAR(TweakedAngle) + _this; + +if ((!GVAR(pfeh_running)) || {ACE_Modifier == 0}) exitWith {false}; + +GVAR(TweakedAngle) = ((GVAR(TweakedAngle) + 7.2 * _this) + 360) % 360; true diff --git a/addons/explosives/functions/fnc_hasExplosives.sqf b/addons/explosives/functions/fnc_hasExplosives.sqf index bd790bd12f..4a626e9c63 100644 --- a/addons/explosives/functions/fnc_hasExplosives.sqf +++ b/addons/explosives/functions/fnc_hasExplosives.sqf @@ -9,16 +9,18 @@ * The unit has explosives * * Example: - * _hasExplosives = [player] call ACE_Explosives_fnc_hasExplosives; + * hasExplosives = [player] call ACE_Explosives_fnc_hasExplosives; * * Public: Yes */ #include "script_component.hpp" -// IGNORE_PRIVATE_WARNING(_hasExplosives); -private ["_unit", "_result", "_magazines"]; +params ["_unit"]; +TRACE_1("params",_unit); + +private ["_result", "_magazines"]; + _result = false; -_unit = _this select 0; _magazines = magazines _unit; { if (getNumber (ConfigFile >> "CfgMagazines" >> _x >> "ACE_Placeable") == 1) exitWith { diff --git a/addons/explosives/functions/fnc_interactEH.sqf b/addons/explosives/functions/fnc_interactEH.sqf index 4e916edb82..9be7568530 100644 --- a/addons/explosives/functions/fnc_interactEH.sqf +++ b/addons/explosives/functions/fnc_interactEH.sqf @@ -16,7 +16,8 @@ */ #include "script_component.hpp" -PARAMS_1(_interactionType); +params ["_interactionType"]; +TRACE_1("params",_interactionType); //Ignore self-interaction menu if (_interactionType != 0) exitWith {}; @@ -26,8 +27,8 @@ if ((vehicle ACE_player) != ACE_player) exitWith {}; if (!("ACE_DefusalKit" in (items ACE_player))) exitWith {}; [{ - PARAMS_2(_args,_pfID); - EXPLODE_3_PVT(_args,_setPosition,_addedDefuseHelpers,_minesHelped); + params ["_args", "_pfID"]; + _args params ["_setPosition", "_addedDefuseHelpers", "_minesHelped"]; if (!EGVAR(interact_menu,keyDown)) then { TRACE_1("Cleaning Defuse Helpers",(count _addedDefuseHelpers)); diff --git a/addons/explosives/functions/fnc_module.sqf b/addons/explosives/functions/fnc_module.sqf index 56225d8ca8..c74c73e679 100644 --- a/addons/explosives/functions/fnc_module.sqf +++ b/addons/explosives/functions/fnc_module.sqf @@ -14,20 +14,13 @@ * Public: No */ #include "script_component.hpp" + if !(isServer) exitWith {}; -private["_activated", "_logic"]; +params ["_logic"]; -_logic = _this select 0; -_activated = _this select 2; - -if !(_activated) exitWith {}; - -[_logic, QGVAR(RequireSpecialist), "RequireSpecialist"] - call EFUNC(Common,readSettingFromModule); -[_logic, QGVAR(PunishNonSpecialists),"PunishNonSpecialists"] - call EFUNC(Common,readSettingFromModule); -[_logic, QGVAR(ExplodeOnDefuse),"ExplodeOnDefuse"] - call EFUNC(Common,readSettingFromModule); +[_logic, QGVAR(RequireSpecialist), "RequireSpecialist"] call EFUNC(Common,readSettingFromModule); +[_logic, QGVAR(PunishNonSpecialists),"PunishNonSpecialists"] call EFUNC(Common,readSettingFromModule); +[_logic, QGVAR(ExplodeOnDefuse),"ExplodeOnDefuse"] call EFUNC(Common,readSettingFromModule); diag_log text "[ACE]: Explosive Module Initialized."; diff --git a/addons/explosives/functions/fnc_onKilled.sqf b/addons/explosives/functions/fnc_onIncapacitated.sqf similarity index 74% rename from addons/explosives/functions/fnc_onKilled.sqf rename to addons/explosives/functions/fnc_onIncapacitated.sqf index 74775b2e66..963f106979 100644 --- a/addons/explosives/functions/fnc_onKilled.sqf +++ b/addons/explosives/functions/fnc_onIncapacitated.sqf @@ -14,13 +14,14 @@ * Public: No */ #include "script_component.hpp" + +//NOTE: Extended_Killed_EventHandlers runs only where _unit is local +params ["_unit"]; +TRACE_1("params",_unit); + private ["_deadman"]; -_unit = _this select 0; -if (_unit == ACE_player) then { - call FUNC(place_Cancel); -}; -if (!isServer) exitWith{}; + _deadman = [_unit, "DeadManSwitch"] call FUNC(getPlacedExplosives); { [_unit, -1, _x, true] call FUNC(detonateExplosive); -} foreach _deadman; +} forEach _deadman; diff --git a/addons/explosives/functions/fnc_onInventoryChanged.sqf b/addons/explosives/functions/fnc_onInventoryChanged.sqf index 53ebb2464d..3e3e1b96d3 100644 --- a/addons/explosives/functions/fnc_onInventoryChanged.sqf +++ b/addons/explosives/functions/fnc_onInventoryChanged.sqf @@ -17,8 +17,11 @@ * Public: No */ #include "script_component.hpp" + +params ["_receiver", "_giver", "_item"]; +TRACE_3("params",_receiver,_giver,_item); + private ["_config", "_detonators"]; -PARAMS_3(_receiver,_giver,_item); if (_receiver != ace_player) exitWith {}; diff --git a/addons/explosives/functions/fnc_onLanded.sqf b/addons/explosives/functions/fnc_onLanded.sqf deleted file mode 100644 index f2ed729b1a..0000000000 --- a/addons/explosives/functions/fnc_onLanded.sqf +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Author: Garth 'L-H' de Wet - * Handles the "EpeContactStart" event when placing the explosive. - * - * Arguments: - * 0: Explosive Placing Object - * 1: Colliding Object - * - * Return Value: - * None - * - * Example: - * object addEventHandler ["EpeContactStart", ACE_explosive_fnc_onLanded]; - * - * Public: No - */ -#include "script_component.hpp" -EXPLODE_2_PVT(_this,_explosive,_hitTarget); - -TRACE_2("Explosive EpeContactStart",_explosive,_hitTarget); - -if ((_explosive getVariable [QGVAR(Handled), false])) exitWith {}; - -_explosive setVariable [QGVAR(Handled), true]; -if (!isNull _hitTarget && {_hitTarget isKindOf "AllVehicles"}) then { - TRACE_1("Attaching to",_hitTarget); - _explosive attachTo [_hitTarget]; - private "_dir"; - _dir = _explosive getVariable [QGVAR(Direction), 0]; - _dir = _dir - (getDir _hitTarget); - [[_explosive, _dir, 0], QFUNC(setPosition)] call EFUNC(common,execRemoteFnc); -} else { - [{ - EXPLODE_2_PVT(_this,_player,_explosive); - private "_pos"; - _pos = getPosASL _explosive; - if (surfaceIsWater _pos) then { - _pos = getPosASL _explosive; - _explosive setPosASL _pos; - }else{ - _pos = getPosATL _explosive; - _explosive setPosATL _pos; - }; - }, [ACE_player, _explosive], 0.5, 0.1] call EFUNC(common,waitAndExecute); -}; diff --git a/addons/explosives/functions/fnc_openTimerSetUI.sqf b/addons/explosives/functions/fnc_openTimerSetUI.sqf index d08d7444dd..7175f425d4 100644 --- a/addons/explosives/functions/fnc_openTimerSetUI.sqf +++ b/addons/explosives/functions/fnc_openTimerSetUI.sqf @@ -15,7 +15,10 @@ * Public: No */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_explosive,_mag); + +params ["_explosive", "_mag"]; +TRACE_2("params",_explosive,_mag); + createDialog "RscACE_SelectTimeUI"; sliderSetRange [8845, 5, 900]; // 5seconds - 15minutes sliderSetPosition [8845, 30]; diff --git a/addons/explosives/functions/fnc_placeExplosive.sqf b/addons/explosives/functions/fnc_placeExplosive.sqf index 68580c2ba0..544566b4c6 100644 --- a/addons/explosives/functions/fnc_placeExplosive.sqf +++ b/addons/explosives/functions/fnc_placeExplosive.sqf @@ -21,9 +21,11 @@ * Public: Yes */ #include "script_component.hpp" -private ["_ammo", "_explosive", "_attachedTo", "_expPos", "_magazineTrigger"]; -EXPLODE_6_PVT(_this,_unit,_pos,_dir,_magazineClass,_triggerConfig,_triggerSpecificVars); -DEFAULT_PARAM(6,_setupPlaceholderObject,objNull); + +params ["_unit", "_pos", "_dir", "_magazineClass", "_triggerConfig", "_triggerSpecificVars", ["_setupPlaceholderObject", objNull]]; +TRACE_7("params",_unit,_pos,_dir,_magazineClass,_triggerConfig,_triggerSpecificVars,_setupPlaceholderObject); + +private ["_ammo", "_explosive", "_attachedTo", "_magazineTrigger", "_pitch", "_digDistance", "_canDigDown", "_soundEnviron", "_surfaceType"]; _unit playActionNow "PutDown"; @@ -52,6 +54,28 @@ if (isText(_magazineTrigger >> "ammo")) then { }; _triggerSpecificVars pushBack _triggerConfig; +//Dig the explosive down into the ground (usually on "pressurePlate") +if (isNumber (_magazineTrigger >> "digDistance")) then { + _digDistance = getNumber (_magazineTrigger >> "digDistance"); + + //Get Surface Type: + _canDigDown = true; + _surfaceType = surfaceType _pos; + if ((_surfaceType select [0,1]) == "#") then {_surfaceType = _surfaceType select [1, 99];}; + if ((_surfaceType != "") || {isClass (configfile >> "CfgSurfaces" >> _surfaceType >> "soundEnviron")}) then { + _soundEnviron = getText (configfile >> "CfgSurfaces" >> _surfaceType >> "soundEnviron"); + TRACE_2("Dig Down Surface",_surfaceType,_soundEnviron); + _canDigDown = !(_soundEnviron in ["road", "tarmac", "concrete", "concrete_int", "int_concrete", "concrete_ext"]); + }; + //Don't dig down if pos ATL is high (in a building or A2 road) + if (_canDigDown && {(_pos select 2) < 0.1}) then { + TRACE_2("Can Dig Down",_digDistance,_pos); + _pos = _pos vectorAdd [0,0, (-1 * _digDistance)]; + } else { + TRACE_2("Can NOT Dig Down",_digDistance,_pos); + }; +}; + _explosive = createVehicle [_ammo, _pos, [], 0, "NONE"]; _explosive setPosATL _pos; @@ -60,7 +84,17 @@ if (!isNull _attachedTo) then { _explosive attachTo [_attachedTo]; }; -if (isText(_triggerConfig >> "onPlace") && {[_unit,_explosive,_magazineClass,_triggerSpecificVars] - call compile (getText (_triggerConfig >> "onPlace"))}) exitWith {_explosive}; -[[_explosive, _dir, getNumber (_magazineTrigger >> "pitch")], QFUNC(setPosition)] call EFUNC(common,execRemoteFnc); +//If trigger has "onPlace" and it returns true, just exitWith the explosive +if (isText(_triggerConfig >> "onPlace") && {[_unit,_explosive,_magazineClass,_triggerSpecificVars] call compile (getText (_triggerConfig >> "onPlace"))}) exitWith { + TRACE_1("onPlace returns true",_explosive); + _explosive +}; + +//TODO: placing explosives on hills looks funny + +_pitch = getNumber (_magazineTrigger >> "pitch"); + +//Globaly set the position angle: +[QGVAR(place), [_explosive, _dir, _pitch]] call EFUNC(common,globalEvent); + _explosive diff --git a/addons/explosives/functions/fnc_place_Approve.sqf b/addons/explosives/functions/fnc_place_Approve.sqf deleted file mode 100644 index 0604045f65..0000000000 --- a/addons/explosives/functions/fnc_place_Approve.sqf +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Author: Garth 'L-H' de Wet - * Approves placement of the explosive, releases the placement object for it - * to settle in a location suitable for the explosive to be created. - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ACE_Explosives_fnc_place_Approve; - * - * Public: No - */ -#include "script_component.hpp" -if (GVAR(pfeh_running)) then { - [QGVAR(Placement),"OnEachFrame"] call CALLSTACK(BIS_fnc_removeStackedEventHandler); - GVAR(pfeh_running) = false; -}; -private ["_setup", "_player", "_dir"]; -_setup = GVAR(Setup); -GVAR(Setup) = objNull; -[GVAR(placer), "ACE_Explosives", false] call EFUNC(Common,setForceWalkStatus); -[ACE_player, "DefaultAction", ACE_player getVariable [QGVAR(Place), -1]] call EFUNC(Common,removeActionEventHandler); -[ACE_player, "zoomtemp", ACE_player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler); -GVAR(placer) = objNull; -_player = ACE_player; -call EFUNC(interaction,hideMouseHint); -if ((_setup getVariable [QGVAR(Class), ""]) == "") exitWith { - deleteVehicle _setup; -}; -_dir = (getDir _setup); -if (_dir > 180) then { - _dir = _dir - 180; -} else { - _dir = 180 + _dir; -}; -_setup setVariable [QGVAR(Direction), _dir, true]; -_player setVariable [QGVAR(PlantingExplosive), true]; -[{_this setVariable [QGVAR(PlantingExplosive), false]}, _player, 1.5, 0.5] call EFUNC(common,waitAndExecute); -_setup addEventHandler ["EpeContactStart", FUNC(onLanded)]; -_setup enableSimulationGlobal true; -_player playActionNow "PutDown"; -_player removeMagazine (_setup getVariable [QGVAR(Class), ""]); diff --git a/addons/explosives/functions/fnc_place_Cancel.sqf b/addons/explosives/functions/fnc_place_Cancel.sqf deleted file mode 100644 index 78d718e283..0000000000 --- a/addons/explosives/functions/fnc_place_Cancel.sqf +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Author: Garth 'L-H' de Wet - * Cancels placement of the explosive - * - * Arguments: - * None - * - * Return Value: - * None - * - * Example: - * call ACE_Explosives_fnc_place_Cancel; - * - * Public: Yes - */ -#include "script_component.hpp" -if (GVAR(pfeh_running)) then { - [QGVAR(Placement),"OnEachFrame"] call CALLSTACK(BIS_fnc_removeStackedEventHandler); - GVAR(pfeh_running) = false; -}; -if (!isNull (GVAR(Setup))) then { - deleteVehicle GVAR(Setup); -}; -GVAR(Setup) = objNull; -if (isNil {GVAR(placer)}) then { - GVAR(placer) = objNull; -}; -[GVAR(placer), "ACE_Explosives", false] call EFUNC(Common,setForceWalkStatus); -GVAR(placer) = objNull; -call EFUNC(interaction,hideMouseHint); -[ACE_player, "DefaultAction", ACE_player getVariable [QGVAR(Place), -1]] call EFUNC(Common,removeActionEventHandler); -[ACE_player, "zoomtemp", ACE_player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler); diff --git a/addons/explosives/functions/fnc_removeFromSpeedDial.sqf b/addons/explosives/functions/fnc_removeFromSpeedDial.sqf index c67313966c..00b1cbba2a 100644 --- a/addons/explosives/functions/fnc_removeFromSpeedDial.sqf +++ b/addons/explosives/functions/fnc_removeFromSpeedDial.sqf @@ -14,13 +14,15 @@ * Public: Yes */ #include "script_component.hpp" + private "_speedDial"; + _speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; if (count _speedDial == 0) exitWith {}; { if ((_x select 0) == (_this select 0)) exitWith { - _speedDial set [_foreachIndex, "x"]; + _speedDial set [_forEachIndex, "x"]; _speedDial = _speedDial - ["x"]; ace_player setVariable [QGVAR(SpeedDial),_speedDial]; }; -} foreach _speedDial; +} forEach _speedDial; diff --git a/addons/explosives/functions/fnc_selectTrigger.sqf b/addons/explosives/functions/fnc_selectTrigger.sqf index 53bc8b66cb..203bfaf606 100644 --- a/addons/explosives/functions/fnc_selectTrigger.sqf +++ b/addons/explosives/functions/fnc_selectTrigger.sqf @@ -16,12 +16,17 @@ * Public: No */ #include "script_component.hpp" + +params ["_explosive", "_magazine", "_trigger"]; +TRACE_3("params",_explosive,_magazine,_trigger); + private ["_config"]; -EXPLODE_3_PVT(_this,_explosive,_magazine,_trigger); _config = ConfigFile >> "ACE_Triggers" >> _trigger; // If the onSetup function returns true, it is handled elsewhere -if (isText(_config >> "onSetup") && {[_explosive,_magazine] call compile getText (_config >> "onSetup")}) exitWith {}; +if (isText(_config >> "onSetup") && {[_explosive,_magazine] call compile getText (_config >> "onSetup")}) exitWith { + TRACE_2("onSetup returned true",_explosive,_trigger); +}; -[ACE_player, getPosATL _explosive, _explosive getVariable [QGVAR(Direction), 0],_magazine, _trigger, [], _explosive] call ACE_Explosives_fnc_placeExplosive; +[ACE_player, getPosATL _explosive, _explosive getVariable [QGVAR(Direction), 0],_magazine, _trigger, [], _explosive] call FUNC(placeExplosive); diff --git a/addons/explosives/functions/fnc_setPosition.sqf b/addons/explosives/functions/fnc_setPosition.sqf index dcf2537776..b19e63ff5a 100644 --- a/addons/explosives/functions/fnc_setPosition.sqf +++ b/addons/explosives/functions/fnc_setPosition.sqf @@ -11,13 +11,21 @@ * None * * Example: - * [_explosive, 150, 90] call ACE_Explosives_fnc_SetPos; + * [_explosive, 150, 90] call ACE_Explosives_fnc_setPosition; * - * Public: Yes + * Public: No */ #include "script_component.hpp" -EXPLODE_3_PVT(_this,_explosive,_direction,_pitch); -_explosive setDir _direction; -if (_pitch != 0) then { - [_explosive, _pitch, 0] call CALLSTACK(BIS_fnc_setPitchBank); + +params ["_explosive", "_direction", "_pitch"]; +TRACE_3("params",_explosive,_direction,_pitch); + +if (isNull (attachedTo _explosive)) then { + _explosive setDir _direction; + if (_pitch != 0) then { + [_explosive, _pitch, 0] call CALLSTACK(BIS_fnc_setPitchBank); + }; +} else { + //Attaching to a vehicle (dirAndUp based on vehicle) + _explosive setVectorDirAndUp [[0,0,1],[(sin _direction),(cos _direction),0]]; }; diff --git a/addons/explosives/functions/fnc_setSpeedDial.sqf b/addons/explosives/functions/fnc_setSpeedDial.sqf index adb2e6af03..9013c812cc 100644 --- a/addons/explosives/functions/fnc_setSpeedDial.sqf +++ b/addons/explosives/functions/fnc_setSpeedDial.sqf @@ -15,7 +15,9 @@ * Public: No */ #include "script_component.hpp" + private ["_speedDial", "_amount"]; + _speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; if (count _speedDial == 0) exitWith {}; _amount = if((_this select 0))then{1}else{-1}; diff --git a/addons/explosives/functions/fnc_setupExplosive.sqf b/addons/explosives/functions/fnc_setupExplosive.sqf index 566ab9c281..b104761fac 100644 --- a/addons/explosives/functions/fnc_setupExplosive.sqf +++ b/addons/explosives/functions/fnc_setupExplosive.sqf @@ -3,8 +3,9 @@ * Starts the setup process for the passed explosive. Player only. * * Arguments: - * 0: Unit - * 1: Classname of explosive to place. (CfgMagazine class) + * 0: Vehicle + * 1: Player Unit + * 2: Classname of explosive to place. (CfgMagazine class) * * Return Value: * None @@ -14,36 +15,203 @@ * * Public: Yes */ +// #define ENABLE_PERFORMANCE_COUNTERS #include "script_component.hpp" -closeDialog 0; -EXPLODE_2_PVT(_this,_unit,_class); -GVAR(placer) = _unit; -// TODO: check MP performance and MP compatible. -GVAR(Setup) = createVehicle [getText(ConfigFile >> "CfgMagazines" >> _class >> "ACE_SetupObject"),[0,0,-10000],[], 0, "NONE"]; -GVAR(Setup) enableSimulationGlobal false; -GVAR(Setup) setVariable [QGVAR(class), _class, true]; +#define PLACE_RANGE_MAX 1 +#define PLACE_RANGE_MIN 0.025 + +params ["_vehicle", "_unit", "_magClassname"]; +TRACE_3("params",_vehicle,_unit,_magClassname); + +private["_isAttachable", "_setupObjectClass", "_supportedTriggers", "_p3dModel"]; + +//Get setup object vehicle and model: +_setupObjectClass = getText(ConfigFile >> "CfgMagazines" >> _magClassname >> "ACE_SetupObject"); +if (!isClass (configFile >> "CfgVehicles" >> _setupObjectClass)) exitWith {ERROR("Bad Vehicle");}; +_p3dModel = getText (configFile >> "CfgVehicles" >> _setupObjectClass >> "model"); +if (_p3dModel == "") exitWith {ERROR("No Model");}; //"" - will crash game! [_unit, "ACE_Explosives", true] call EFUNC(common,setForceWalkStatus); -GVAR(TweakedAngle) = 180; -[QGVAR(Placement),"OnEachFrame", { - private ["_player", "_pos"]; - _player = ACE_player; - if (GVAR(placer) != _player) exitWith { - call FUNC(place_Cancel); - }; - GVAR(pfeh_running) = true; - _pos = (ASLtoATL eyePos _player) vectorAdd (positionCameraToWorld [0,0,1] vectorDiff positionCameraToWorld [0,0,0]); - GVAR(Setup) setPosATL _pos; - if (ACE_Modifier == 0) then { - GVAR(Setup) setDir (GVAR(TweakedAngle) + getDir _player); - }; -}] call CALLSTACK(BIS_fnc_addStackedEventHandler); +//Show mouse buttons: +[localize LSTRING(PlaceAction), localize LSTRING(CancelAction), localize LSTRING(ScrollAction)] call EFUNC(interaction,showMouseHint); +_unit setVariable [QGVAR(placeActionEH), [_unit, "DefaultAction", {true}, {GVAR(placeAction) = PLACE_APPROVE;}] call EFUNC(common,AddActionEventHandler)]; +_unit setVariable [QGVAR(cancelActionEH), [_unit, "zoomtemp", {true}, {GVAR(placeAction) = PLACE_CANCEL;}] call EFUNC(common,AddActionEventHandler)]; -[localize LSTRING(PlaceAction), localize LSTRING(CancelAction), - localize LSTRING(ScrollAction)] call EFUNC(interaction,showMouseHint); -_unit setVariable [QGVAR(Place), [_unit, "DefaultAction", - {GVAR(pfeh_running) AND !isNull (GVAR(Setup))}, {call FUNC(place_Approve);}] call EFUNC(common,AddActionEventHandler)]; -_unit setVariable [QGVAR(Cancel), [_unit, "zoomtemp", - {GVAR(pfeh_running) AND !isNull (GVAR(Setup))}, {call FUNC(place_Cancel);}] call EFUNC(common,AddActionEventHandler)]; +//Display to show virtual object: +(QGVAR(virtualAmmo) call BIS_fnc_rscLayer) cutRsc [QGVAR(virtualAmmo), "PLAIN", 0, false]; +((uiNamespace getVariable [QGVAR(virtualAmmoDisplay), displayNull]) displayCtrl 800851) ctrlSetModel _p3dModel; + +//Make sure it has a trigger that works when attached (eg, no tripwires that only do pressurePlate) +_isAttachable = false; +_supportedTriggers = getArray (configFile >> "CfgMagazines" >> _magClassname >> "ACE_Triggers" >> "SupportedTriggers"); +{ + if ((getNumber (configFile >> "ACE_Triggers" >> _x >> "isAttachable")) == 1) exitWith {_isAttachable = true;}; +} forEach _supportedTriggers; + + +GVAR(pfeh_running) = true; +GVAR(placeAction) = PLACE_WAITING; +GVAR(TweakedAngle) = 0; + + +[{ + BEGIN_COUNTER(pfeh); + + params ["_args", "_pfID"]; + _args params ["_unit", "_magClassname", "_setupObjectClass", "_isAttachable"]; + + private["_angle", "_attachVehicle", "_badPosition", "_basePosASL", "_cameraAngle", "_distanceFromBase", "_expSetupVehicle", "_index", "_intersectsWith", "_lookDirVector", "_max", "_min", "_modelDir", "_modelOffset", "_modelUp", "_placeAngle", "_realDistance", "_return", "_screenPos", "_testBase", "_testPos", "_testPositionIsValid", "_virtualPosASL"]; + + _lookDirVector = ((positionCameraToWorld [0,0,0]) call EFUNC(common,positionToASL)) vectorFromTo ((positionCameraToWorld [0,0,10]) call EFUNC(common,positionToASL)); + _basePosASL = (eyePos _unit); + if (cameraView == "EXTERNAL") then { //If external, show explosive over the right shoulder + _basePosASL = _basePosASL vectorAdd ((positionCameraToWorld [0.3,0,0]) vectorDiff (positionCameraToWorld [0,0,0])); + }; + if ((stance _unit) == "PRONE") then { + //If prone, lower base and increase up angle of look - Makes it much easier to attach to underside of vehicles + _basePosASL set [2, ((_basePosASL select 2) - 0.3)]; + _lookDirVector = ((positionCameraToWorld [0,0,0]) call EFUNC(common,positionToASL)) vectorFromTo ((positionCameraToWorld [0,3,10]) call EFUNC(common,positionToASL)); + }; + _cameraAngle = (_lookDirVector select 0) atan2 (_lookDirVector select 1); + + _testPositionIsValid = { + _testBase = _basePosASL vectorAdd (_lookDirVector vectorMultiply (_this select 0)); + _return = true; + { + _testPos = _testBase vectorAdd [0.1 * (_x select 0) * (cos _cameraAngle), 0.1 * (_x select 0) * (sin _cameraAngle), 0.1 * (_x select 1)]; + #ifdef DEBUG_MODE_FULL + drawLine3d [(eyePos _unit) call EFUNC(common,ASLToPosition), (_testPos) call EFUNC(common,ASLToPosition), [1,0,0,1]]; + #endif + if (lineIntersects [eyePos _unit, _testPos, _unit]) exitWith {_return = false;}; + } forEach [[0,0], [-1,-1], [1,-1], [-1,1], [1,1]]; + _return + }; + + _distanceFromBase = PLACE_RANGE_MAX; + _badPosition = !([_distanceFromBase] call _testPositionIsValid); + _attachVehicle = objNull; + + if (_isAttachable && _badPosition) then { + _attachVehicle = objNull; + _testBase = _basePosASL vectorAdd _lookDirVector; + { + _testPos = _testBase vectorAdd [0.1 * (_x select 0) * (cos _cameraAngle), 0.1 * (_x select 0) * (sin _cameraAngle), 0.1 * (_x select 1)]; + _intersectsWith = lineIntersectsWith [eyePos _unit, _testPos, _unit]; + if (count _intersectsWith == 1) exitWith {_attachVehicle = (_intersectsWith select 0);}; + } forEach [[0,0], [-1,-1], [1,-1], [-1,1], [1,1]]; + if ((!isNull _attachVehicle) && {[PLACE_RANGE_MIN] call _testPositionIsValid} && + {(_attachVehicle isKindOf "Car") || {_attachVehicle isKindOf "Tank"} || {_attachVehicle isKindOf "Air"} || {_attachVehicle isKindOf "Ship"}}) then { + _min = PLACE_RANGE_MIN; + _max = PLACE_RANGE_MAX; + for "_index" from 0 to 6 do { + _distanceFromBase = (_min + _max) / 2; + if ([_distanceFromBase] call _testPositionIsValid) then { + _min = _distanceFromBase; + } else { + _max = _distanceFromBase; + }; + }; + _badPosition = false; + _distanceFromBase = ((_min + _max) / 2 + 0.075) min 1; + } else { + _attachVehicle = objNull; + }; + }; + + _virtualPosASL = _basePosASL vectorAdd (_lookDirVector vectorMultiply _distanceFromBase); + + //Update mouse hint: + if (_badPosition) then { + ((uiNamespace getVariable ["ACE_Helper_Display", objNull]) displayCtrl 1000) ctrlSetText localize LSTRING(BlockedAction); + } else { + if (isNull _attachVehicle) then { + ((uiNamespace getVariable ["ACE_Helper_Display", objNull]) displayCtrl 1000) ctrlSetText localize LSTRING(PlaceAction); + } else { + ((uiNamespace getVariable ["ACE_Helper_Display", objNull]) displayCtrl 1000) ctrlSetText localize LSTRING(AttachAction); + }; + }; + + //Don't allow Placing bellow terrain + if ((getTerrainHeightASL _virtualPosASL) > (_virtualPosASL select 2)) then { + _virtualPosASL set [2, (getTerrainHeightASL _virtualPosASL)]; + }; + + //Don't allow placing in a bad position: + if (_badPosition && {GVAR(placeAction) == PLACE_APPROVE}) then {GVAR(placeAction) = PLACE_WAITING;}; + + if (((inputAction "zoomTemp") > 0) || //Cancel on RMB, For some reason this works (when held) but AddActionEventHandler doesn't + {_unit != ACE_player} || + {!([_unit, objNull, ["isNotSwimming"]] call EFUNC(common,canInteractWith))} || + {!(_magClassname in (magazines _unit))}) then { + GVAR(placeAction) = PLACE_CANCEL; + }; + + if (GVAR(placeAction) != PLACE_WAITING) then { + [_pfID] call CBA_fnc_removePerFrameHandler; + GVAR(pfeh_running) = false; + + [_unit, "ACE_Explosives", false] call EFUNC(common,setForceWalkStatus); + [] call EFUNC(interaction,hideMouseHint); + [_unit, "DefaultAction", (_unit getVariable [QGVAR(placeActionEH), -1])] call EFUNC(common,removeActionEventHandler); + [_unit, "zoomtemp", (_unit getVariable [QGVAR(cancelActionEH), -1])] call EFUNC(common,removeActionEventHandler); + + (QGVAR(virtualAmmo) call BIS_fnc_rscLayer) cutText ["", "PLAIN"]; + + if (GVAR(placeAction) == PLACE_APPROVE) then { + _placeAngle = 0; + _expSetupVehicle = _setupObjectClass createVehicle (_virtualPosASL call EFUNC(common,ASLToPosition)); + + TRACE_1("Planting Mass", (getMass _expSetupVehicle)); + //If the object is too heavy, it can kill a player if it colides + if ((getMass _expSetupVehicle) > 5) then {_expSetupVehicle setMass 5;}; + + if (isNull _attachVehicle) then { + _placeAngle = _cameraAngle - GVAR(TweakedAngle) + 180; + _expSetupVehicle setPosAsl _virtualPosASL; + _expSetupVehicle setDir _placeAngle; + _placeAngle = _placeAngle + 180; //CfgAmmos seem to be 180 for some reason + } else { + _modelOffset = _attachVehicle worldToModel (_virtualPosASL call EFUNC(common,ASLToPosition)); + _placeAngle = _cameraAngle - (getDir _attachVehicle) + 180; + _expSetupVehicle attachTo [_attachVehicle, _modelOffset]; + _expSetupVehicle setVectorDirAndUp [[0,0,-1],[(sin _placeAngle),(cos _placeAngle),0]]; + }; + + TRACE_1("Place angel",_placeAngle); + + _expSetupVehicle setVariable [QGVAR(class), _magClassname, true]; + _expSetupVehicle setVariable [QGVAR(Direction), _placeAngle, true]; + + _unit removeMagazine _magClassname; + _unit playActionNow "PutDown"; + _unit setVariable [QGVAR(PlantingExplosive), true]; + [{_this setVariable [QGVAR(PlantingExplosive), false]}, _unit, 1.5] call EFUNC(common,waitAndExecute); + + }; + } else { + _screenPos = worldToScreen (_virtualPosASL call EFUNC(common,ASLToPosition)); + if (_badPosition || {_screenPos isEqualTo []}) then { + ((uiNamespace getVariable [QGVAR(virtualAmmoDisplay), displayNull]) displayCtrl 800851) ctrlShow false; + } else { + //Show the model on the hud in aprox the same size/location as it will be placed: + ((uiNamespace getVariable [QGVAR(virtualAmmoDisplay), displayNull]) displayCtrl 800851) ctrlShow true; + + _realDistance = ((_virtualPosASL call EFUNC(common,ASLToPosition)) distance (positionCameraToWorld [0,0,0])) / ((call CBA_fnc_getFov) select 1); + _screenPos = [(_screenPos select 0), _realDistance, (_screenPos select 1)]; + ((uiNamespace getVariable [QGVAR(virtualAmmoDisplay), displayNull]) displayCtrl 800851) ctrlSetPosition _screenPos; + + _modelDir = [0,0,-1]; + _modelUp = [0,-1,0]; + if (isNull _attachVehicle) then { + _angle = acos (_lookDirVector select 2); + _modelUp = [0, (cos _angle), (sin _angle)]; + _modelDir = [cos GVAR(TweakedAngle), sin GVAR(TweakedAngle), 0] vectorCrossProduct _modelUp; + }; + ((uiNamespace getVariable [QGVAR(virtualAmmoDisplay), displayNull]) displayCtrl 800851) ctrlSetModelDirAndUp [_modelDir, _modelUp]; + }; + }; + + END_COUNTER(pfeh); +}, 0, [_unit, _magClassname, _setupObjectClass, _isAttachable]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/explosives/functions/fnc_startDefuse.sqf b/addons/explosives/functions/fnc_startDefuse.sqf index 251e1e213d..2c394a997a 100644 --- a/addons/explosives/functions/fnc_startDefuse.sqf +++ b/addons/explosives/functions/fnc_startDefuse.sqf @@ -15,14 +15,17 @@ * Public: Yes */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_unit,_target); + +params ["_unit", "_target"]; +TRACE_2("params",_unit,_target); private["_actionToPlay", "_defuseTime", "_isEOD"]; _target = attachedTo (_target); _fnc_DefuseTime = { - EXPLODE_2_PVT(_this,_specialist,_target); + params ["_specialist", "_target"]; + TRACE_2("defuseTime",_specialist,_target); private ["_defuseTime"]; _defuseTime = 5; if (isNumber(ConfigFile >> "CfgAmmo" >> typeOf (_target) >> "ACE_DefuseTime")) then { @@ -48,11 +51,12 @@ if (ACE_player != _unit) then { _unit disableAI "TARGET"; _defuseTime = [[_unit] call EFUNC(Common,isEOD), _target] call _fnc_DefuseTime; [{ - PARAMS_2(_unit,_target); + params ["_unit", "_target"]; + TRACE_2("defuse finished",_unit,_target); [_unit, _target] call FUNC(defuseExplosive); _unit enableAI "MOVE"; _unit enableAI "TARGET"; - }, [_unit, _target], _defuseTime, 0] call EFUNC(common,waitAndExecute); + }, [_unit, _target], _defuseTime] call EFUNC(common,waitAndExecute); }; } else { _unit playActionNow _actionToPlay; diff --git a/addons/explosives/functions/fnc_startTimer.sqf b/addons/explosives/functions/fnc_startTimer.sqf index 9d2ca0aee4..ca219ed13c 100644 --- a/addons/explosives/functions/fnc_startTimer.sqf +++ b/addons/explosives/functions/fnc_startTimer.sqf @@ -16,12 +16,13 @@ */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_explosive,_delay); +params ["_explosive", "_delay"]; +TRACE_2("params",_explosive,_delay); [{ - private ["_explosive"]; - _explosive = _this; + params ["_explosive"]; + TRACE_1("Explosive Going Boom",_explosive); if (!isNull _explosive) then { [_explosive, -1, [_explosive, 0]] call FUNC(detonateExplosive); }; -}, _explosive, _delay, 0] call EFUNC(common,waitAndExecute); +}, [_explosive], _delay] call EFUNC(common,waitAndExecute); diff --git a/addons/explosives/functions/fnc_triggerType.sqf b/addons/explosives/functions/fnc_triggerType.sqf index f9d8790a56..0fc29e34ad 100644 --- a/addons/explosives/functions/fnc_triggerType.sqf +++ b/addons/explosives/functions/fnc_triggerType.sqf @@ -9,17 +9,19 @@ * Supported triggers as ACE_Triggers config entries * * Example: - * _supports = ["SatchelCharge_Remote_Mag"] call ACE_Explosives_fnc_TriggerType + * ["SatchelCharge_Remote_Mag"] call ACE_Explosives_fnc_TriggerType * * Public: Yes */ #include "script_component.hpp" -private["_result", "_config", "_count", "_index", "_supports"]; -// IGNORE_PRIVATE_WARNING(_supports); +params ["_magazineClassname"]; +TRACE_1("params",_magazineClassname); + +private["_result", "_config", "_count", "_index"]; _result = []; -_config = getArray (ConfigFile >> "CfgMagazines" >> (_this select 0) >> "ACE_Triggers" >> "SupportedTriggers"); +_config = getArray (ConfigFile >> "CfgMagazines" >> _magazineClassname >> "ACE_Triggers" >> "SupportedTriggers"); _count = count _config; for "_index" from 0 to (_count - 1) do { diff --git a/addons/explosives/script_component.hpp b/addons/explosives/script_component.hpp index 5ff12b8ba3..17de3516a5 100644 --- a/addons/explosives/script_component.hpp +++ b/addons/explosives/script_component.hpp @@ -12,3 +12,7 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + +#define PLACE_WAITING -1 +#define PLACE_CANCEL 0 +#define PLACE_APPROVE 1 diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index a985b428c1..e1255d962f 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -5,7 +5,7 @@ Explosives Sprengstoffe Explosivos - Ładunki wybuchowe + Mat. wybuchowe Explosifs Výbušniny Esplosivi @@ -61,6 +61,22 @@ Colocar Установить + + Attach + Befestigen + Acoplar + Przyczep + Attacher + Připnout + Fixar + Attacca + Hozzácsatolás + Прикрепить + + + Blocked + Obstruido + Cancel Abbrechen diff --git a/addons/fcs/README.md b/addons/fcs/README.md index dfe9b8d8e9..c4abbe3253 100644 --- a/addons/fcs/README.md +++ b/addons/fcs/README.md @@ -1,7 +1,7 @@ ace_fcs ======= -Adds a fire control system to armoured vehicles and helicoters, allowing the precise engagement of stationary and moving targets. +Adds a fire control system to armoured vehicles and helicopters, allowing precise engagement of stationary and moving targets. ## Maintainers diff --git a/addons/flashlights/$PBOPREFIX$ b/addons/flashlights/$PBOPREFIX$ new file mode 100644 index 0000000000..674d0d255c --- /dev/null +++ b/addons/flashlights/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\flashlights \ No newline at end of file diff --git a/addons/flashlights/CfgEventHandlers.hpp b/addons/flashlights/CfgEventHandlers.hpp new file mode 100644 index 0000000000..d5f49bd5c3 --- /dev/null +++ b/addons/flashlights/CfgEventHandlers.hpp @@ -0,0 +1,5 @@ +class Extended_PostInit_EventHandlers { + class ADDON { + clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient) ); + }; +}; diff --git a/addons/flashlights/CfgSounds.hpp b/addons/flashlights/CfgSounds.hpp new file mode 100644 index 0000000000..f0fabe3a39 --- /dev/null +++ b/addons/flashlights/CfgSounds.hpp @@ -0,0 +1,7 @@ +class CfgSounds { + class ACE_flashlights_flashlightClick { + name = "ACE_flashlights_flashlightClick"; + sound[] = {"\a3\sounds_f\weapons\Other\dry4.wss", 0.2, 2}; + titles[] = {}; + }; +}; \ No newline at end of file diff --git a/addons/flashlights/CfgVehicles.hpp b/addons/flashlights/CfgVehicles.hpp new file mode 100644 index 0000000000..fa766ad87b --- /dev/null +++ b/addons/flashlights/CfgVehicles.hpp @@ -0,0 +1,89 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + //todo: add flashlight attach actions + }; + }; + + class Item_Base_F; + + class ACE_Flashlight_MX991Item: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(MX991_DisplayName); + author = ECSTRING(common,ACETeam); + vehicleClass = "WeaponAccessories"; + class TransportItems { + class ACE_Flashlight_MX991 { + name = "ACE_Flashlight_MX991"; + count = 1; + }; + }; + }; + + class ACE_Flashlight_KSF1Item: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(KSF1_DisplayName); + author = ECSTRING(common,ACETeam); + vehicleClass = "WeaponAccessories"; + class TransportItems { + class ACE_Flashlight_KSF1 { + name = "ACE_Flashlight_KSF1"; + count = 1; + }; + }; + }; + + class ACE_Flashlight_XL50Item: Item_Base_F { + scope = 2; + scopeCurator = 2; + displayName = CSTRING(XL50_DisplayName); + author = ECSTRING(common,ACETeam); + vehicleClass = "WeaponAccessories"; + class TransportItems { + class ACE_Flashlight_XL50 { + name = "ACE_Flashlight_XL50"; + count = 1; + }; + }; + }; + + class NATO_Box_Base; + class EAST_Box_Base; + class IND_Box_Base; + class FIA_Box_Base_F; + + class Box_NATO_Support_F: NATO_Box_Base { + class TransportItems { + MACRO_ADDITEM(ACE_Flashlight_MX991,12); + }; + }; + + class Box_East_Support_F: EAST_Box_Base { + class TransportItems { + MACRO_ADDITEM(ACE_Flashlight_KSF1,12); + }; + }; + + class Box_IND_Support_F: IND_Box_Base { + class TransportItems { + MACRO_ADDITEM(ACE_Flashlight_XL50,12); + }; + }; + + class Box_FIA_Support_F: FIA_Box_Base_F { + class TransportItems { + MACRO_ADDITEM(ACE_Flashlight_MX991,12); + }; + }; + + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_Flashlight_MX991,12); + MACRO_ADDITEM(ACE_Flashlight_KSF1,12); + MACRO_ADDITEM(ACE_Flashlight_XL50,12); + }; + }; +}; \ No newline at end of file diff --git a/addons/flashlights/CfgWeapons.hpp b/addons/flashlights/CfgWeapons.hpp new file mode 100644 index 0000000000..09fe70d764 --- /dev/null +++ b/addons/flashlights/CfgWeapons.hpp @@ -0,0 +1,61 @@ +class CfgWeapons { + + class ItemCore; + class ACE_ItemCore; + class InventoryItem_Base_F; + class InventoryFlashlightItem_Base_F; + + class acc_flashlight: ItemCore { + class ItemInfo: InventoryFlashlightItem_Base_F { + class Flashlight { + ACE_Flashlight_Colour = "white"; + ACE_Flashlight_Size = 2.75; + }; + }; + }; + + class ACE_Flashlight_MX991: ACE_ItemCore { + displayName = CSTRING(MX991_DisplayName); + descriptionShort = CSTRING(MX991_Description); + model = QUOTE(PATHTOF(data\MX_991.p3d)); + picture = PATHTOF(UI\mx991_ca.paa); + scope = 2; + class ItemInfo: InventoryItem_Base_F { + mass = 1; + class FlashLight { + ACE_Flashlight_Colour = "red"; + ACE_Flashlight_Size = 1.75; + }; + }; + }; + + class ACE_Flashlight_KSF1: ACE_ItemCore { + displayName = CSTRING(KSF1_DisplayName); + descriptionShort = CSTRING(KSF1_Description); + model = QUOTE(PATHTOF(data\KSF_1.p3d)); + picture = PATHTOF(UI\ksf1_ca.paa); + scope = 2; + class ItemInfo: InventoryItem_Base_F { + mass = 1; + class FlashLight { + ACE_Flashlight_Colour = "red"; + ACE_Flashlight_Size = 1.5; + }; + }; + }; + + class ACE_Flashlight_XL50: ACE_ItemCore { + displayName = CSTRING(XL50_DisplayName); + descriptionShort = CSTRING(XL50_Description); + model = QUOTE(PATHTOF(data\Maglight.p3d)); + picture = PATHTOF(UI\xl50_ca.paa); + scope = 2; + class ItemInfo: InventoryItem_Base_F { + mass = 1; + class FlashLight { + ACE_Flashlight_Colour = "white"; + ACE_Flashlight_Size = 2.15; + }; + }; + }; +}; \ No newline at end of file diff --git a/addons/flashlights/README.md b/addons/flashlights/README.md new file mode 100644 index 0000000000..6a04b78091 --- /dev/null +++ b/addons/flashlights/README.md @@ -0,0 +1,11 @@ +ace_flashlights +======= + +Flashlights for use on map and to attach to player. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [voiper](https://github.com/voiperr) diff --git a/addons/flashlights/UI/Flashlight_Beam_blue_ca.paa b/addons/flashlights/UI/Flashlight_Beam_blue_ca.paa new file mode 100644 index 0000000000..737780d1c8 Binary files /dev/null and b/addons/flashlights/UI/Flashlight_Beam_blue_ca.paa differ diff --git a/addons/flashlights/UI/Flashlight_Beam_green_ca.paa b/addons/flashlights/UI/Flashlight_Beam_green_ca.paa new file mode 100644 index 0000000000..b075990ba6 Binary files /dev/null and b/addons/flashlights/UI/Flashlight_Beam_green_ca.paa differ diff --git a/addons/flashlights/UI/Flashlight_Beam_red_ca.paa b/addons/flashlights/UI/Flashlight_Beam_red_ca.paa new file mode 100644 index 0000000000..5afd4e66d5 Binary files /dev/null and b/addons/flashlights/UI/Flashlight_Beam_red_ca.paa differ diff --git a/addons/flashlights/UI/Flashlight_Beam_white_ca.paa b/addons/flashlights/UI/Flashlight_Beam_white_ca.paa new file mode 100644 index 0000000000..08460e9a9c Binary files /dev/null and b/addons/flashlights/UI/Flashlight_Beam_white_ca.paa differ diff --git a/addons/flashlights/UI/Flashlight_Beam_yellow_ca.paa b/addons/flashlights/UI/Flashlight_Beam_yellow_ca.paa new file mode 100644 index 0000000000..8593ac8706 Binary files /dev/null and b/addons/flashlights/UI/Flashlight_Beam_yellow_ca.paa differ diff --git a/addons/flashlights/UI/KSF1_ca.paa b/addons/flashlights/UI/KSF1_ca.paa new file mode 100644 index 0000000000..5a89051c05 Binary files /dev/null and b/addons/flashlights/UI/KSF1_ca.paa differ diff --git a/addons/flashlights/UI/mx991_ca.paa b/addons/flashlights/UI/mx991_ca.paa new file mode 100644 index 0000000000..9385ec675a Binary files /dev/null and b/addons/flashlights/UI/mx991_ca.paa differ diff --git a/addons/flashlights/UI/xl50_ca.paa b/addons/flashlights/UI/xl50_ca.paa new file mode 100644 index 0000000000..55aaa0cbcd Binary files /dev/null and b/addons/flashlights/UI/xl50_ca.paa differ diff --git a/addons/flashlights/XEH_postInitClient.sqf b/addons/flashlights/XEH_postInitClient.sqf new file mode 100644 index 0000000000..09cdcdd1f2 --- /dev/null +++ b/addons/flashlights/XEH_postInitClient.sqf @@ -0,0 +1,8 @@ +#include "script_component.hpp" + +// Exit on Headless as well +if !(hasInterface) exitWith {}; + +LOG(MSG_INIT); + +//todo: make flashlights attachable to players \ No newline at end of file diff --git a/addons/flashlights/config.cpp b/addons/flashlights/config.cpp new file mode 100644 index 0000000000..b34c4b8000 --- /dev/null +++ b/addons/flashlights/config.cpp @@ -0,0 +1,18 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {"ACE_Flashlight_MX991", "ACE_Flashlight_KSF1", "ACE_Flashlight_XL50"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_interaction"}; + author[] = {"voiper"}; + authorUrl = "https://github.com/voiperr/"; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" +#include "CfgSounds.hpp" diff --git a/addons/flashlights/data/KSF_1.p3d b/addons/flashlights/data/KSF_1.p3d new file mode 100644 index 0000000000..0ec2fd23c6 Binary files /dev/null and b/addons/flashlights/data/KSF_1.p3d differ diff --git a/addons/flashlights/data/KSF_1.rvmat b/addons/flashlights/data/KSF_1.rvmat new file mode 100644 index 0000000000..113fe0cc14 --- /dev/null +++ b/addons/flashlights/data/KSF_1.rvmat @@ -0,0 +1,79 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.6,0.6,0.6,1}; //amount of glossiness - the higher the number, the higher the glossiness +specularPower=700; //area of glossiness - the higher the number, the smaller the area +PixelShaderID="Super"; +VertexShaderID="Super"; + +class Stage1 { + texture="z\ace\addons\flashlights\data\KSF_1_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,dt)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,mc)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 { + texture="#(argb,8,8,3)color(1,1,1,1,as)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,1}; + }; +}; +class Stage5 { + texture="z\ace\addons\flashlights\data\KSF_1_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture="#(ai,64,64,1)fresnel(4.7,1.2)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_ca.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/flashlights/data/KSF_1_co.paa b/addons/flashlights/data/KSF_1_co.paa new file mode 100644 index 0000000000..bb31888863 Binary files /dev/null and b/addons/flashlights/data/KSF_1_co.paa differ diff --git a/addons/flashlights/data/KSF_1_nohq.paa b/addons/flashlights/data/KSF_1_nohq.paa new file mode 100644 index 0000000000..8c5ada23c8 Binary files /dev/null and b/addons/flashlights/data/KSF_1_nohq.paa differ diff --git a/addons/flashlights/data/KSF_1_smdi.paa b/addons/flashlights/data/KSF_1_smdi.paa new file mode 100644 index 0000000000..b12f26e5f4 Binary files /dev/null and b/addons/flashlights/data/KSF_1_smdi.paa differ diff --git a/addons/flashlights/data/MX_991.p3d b/addons/flashlights/data/MX_991.p3d new file mode 100644 index 0000000000..c79c330ea3 Binary files /dev/null and b/addons/flashlights/data/MX_991.p3d differ diff --git a/addons/flashlights/data/MX_991.rvmat b/addons/flashlights/data/MX_991.rvmat new file mode 100644 index 0000000000..0268d4903c --- /dev/null +++ b/addons/flashlights/data/MX_991.rvmat @@ -0,0 +1,79 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.6,0.6,0.6,1}; //amount of glossiness - the higher the number, the higher the glossiness +specularPower=700; //area of glossiness - the higher the number, the smaller the area +PixelShaderID="Super"; +VertexShaderID="Super"; + +class Stage1 { + texture="z\ace\addons\flashlights\data\MX_991_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,dt)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,mc)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 { + texture="#(argb,8,8,3)color(1,1,1,1,as)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,1}; + }; +}; +class Stage5 { + texture="#(rgb,1,1,1)color(0.2,0.2,1,1)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture="#(ai,64,64,1)fresnel(4.7,1.2)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_ca.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/flashlights/data/MX_991_co.paa b/addons/flashlights/data/MX_991_co.paa new file mode 100644 index 0000000000..598dda174b Binary files /dev/null and b/addons/flashlights/data/MX_991_co.paa differ diff --git a/addons/flashlights/data/MX_991_nohq.paa b/addons/flashlights/data/MX_991_nohq.paa new file mode 100644 index 0000000000..565df542e1 Binary files /dev/null and b/addons/flashlights/data/MX_991_nohq.paa differ diff --git a/addons/flashlights/data/Maglight.p3d b/addons/flashlights/data/Maglight.p3d new file mode 100644 index 0000000000..6ce3b9fcd4 Binary files /dev/null and b/addons/flashlights/data/Maglight.p3d differ diff --git a/addons/flashlights/data/Maglite.rvmat b/addons/flashlights/data/Maglite.rvmat new file mode 100644 index 0000000000..960599813b --- /dev/null +++ b/addons/flashlights/data/Maglite.rvmat @@ -0,0 +1,79 @@ +ambient[]={1,1,1,1}; +diffuse[]={1,1,1,1}; +forcedDiffuse[]={0,0,0,0}; +emmisive[]={0,0,0,1}; +specular[]={0.6,0.6,0.6,1}; //amount of glossiness - the higher the number, the higher the glossiness +specularPower=700; //area of glossiness - the higher the number, the smaller the area +PixelShaderID="Super"; +VertexShaderID="Super"; + +class Stage1 { + texture="z\ace\addons\flashlights\data\Maglite_nohq.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage2 { + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,dt)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage3 { + texture="#(argb,8,8,3)color(0,0,0,0,mc)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage4 { + texture="#(argb,8,8,3)color(1,1,1,1,as)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,1}; + }; +}; +class Stage5 { + texture="z\ace\addons\flashlights\data\Maglite_smdi.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,0}; + pos[]={0,0,0}; + }; +}; +class Stage6 { + texture="#(ai,64,64,1)fresnel(4.7,1.2)"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; +class Stage7 { + texture="a3\data_f\env_land_ca.paa"; + uvSource="tex"; + class uvTransform { + aside[]={1,0,0}; + up[]={0,1,0}; + dir[]={0,0,1}; + pos[]={0,0,0}; + }; +}; diff --git a/addons/flashlights/data/Maglite_co.paa b/addons/flashlights/data/Maglite_co.paa new file mode 100644 index 0000000000..8a399b25cc Binary files /dev/null and b/addons/flashlights/data/Maglite_co.paa differ diff --git a/addons/flashlights/data/Maglite_nohq.paa b/addons/flashlights/data/Maglite_nohq.paa new file mode 100644 index 0000000000..43282a963b Binary files /dev/null and b/addons/flashlights/data/Maglite_nohq.paa differ diff --git a/addons/flashlights/data/Maglite_smdi.paa b/addons/flashlights/data/Maglite_smdi.paa new file mode 100644 index 0000000000..093d83e145 Binary files /dev/null and b/addons/flashlights/data/Maglite_smdi.paa differ diff --git a/addons/flashlights/script_component.hpp b/addons/flashlights/script_component.hpp new file mode 100644 index 0000000000..ba740c22fc --- /dev/null +++ b/addons/flashlights/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT flashlights +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_FLASHLIGHTS + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_FLASHLIGHTS + #define DEBUG_SETTINGS DEBUG_SETTINGS_FLASHLIGHTS +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/flashlights/stringtable.xml b/addons/flashlights/stringtable.xml new file mode 100644 index 0000000000..e871360bf3 --- /dev/null +++ b/addons/flashlights/stringtable.xml @@ -0,0 +1,29 @@ + + + + + Fulton MX-991 + Fulton MX-991 + + + Flashlight with red filter. For use on map. + Latarka z czerwonym filtrem. Używana do podświetlania mapy. + + + Maglite XL50 + Maglite XL50 + + + White mini flashlight. For use on map. + Mini latarka. Światło białe. Używana do podświetlania mapy. + + + KSF-1 + KSF-1 + + + Flashlight with red filter. For use on map. + Latarka z czerwonym filtrem. Używana do podświetlania mapy. + + + \ No newline at end of file diff --git a/addons/fonts/README.md b/addons/fonts/README.md new file mode 100644 index 0000000000..7e6f704d67 --- /dev/null +++ b/addons/fonts/README.md @@ -0,0 +1,11 @@ +ace_fonts +======== + +Custom fonts including fixed-width font. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [jaynus](https://github.com/jaynus/) diff --git a/addons/hearing/ACE_Settings.hpp b/addons/hearing/ACE_Settings.hpp index 867914b857..262c3edc34 100644 --- a/addons/hearing/ACE_Settings.hpp +++ b/addons/hearing/ACE_Settings.hpp @@ -19,4 +19,10 @@ class ACE_Settings { isClientSettable = 1; displayName = CSTRING(DisableEarRinging); }; + class GVAR(enabledForZeusUnits) { + value = 1; + typeName = "BOOL"; + displayName = CSTRING(enabledForZeusUnits_DisplayName); + description = CSTRING(enabledForZeusUnits_Description); + }; }; diff --git a/addons/hearing/CfgVehicles.hpp b/addons/hearing/CfgVehicles.hpp index 44ea8f734f..2273653c3a 100644 --- a/addons/hearing/CfgVehicles.hpp +++ b/addons/hearing/CfgVehicles.hpp @@ -130,6 +130,12 @@ class CfgVehicles { }; }; }; + class enabledForZeusUnits { + displayName = CSTRING(enabledForZeusUnits_DisplayName); + description = CSTRING(enabledForZeusUnits_Description); + typeName = "BOOL"; + defaultValue = 1; + }; }; class ModuleDescription { description = CSTRING(Module_Description); diff --git a/addons/hearing/CfgWeapons.hpp b/addons/hearing/CfgWeapons.hpp index 2806ef9970..7c21baaed2 100644 --- a/addons/hearing/CfgWeapons.hpp +++ b/addons/hearing/CfgWeapons.hpp @@ -47,5 +47,16 @@ class CfgWeapons { GVAR(lowerVolume) = 0.60; }; class H_Cap_marshal: H_Cap_headphones {}; -}; + class H_HelmetB_light: H_HelmetB { + GVAR(protection) = 0.8; + GVAR(lowerVolume) = 0.20; + }; + + class H_HelmetB_plain_mcamo; + class H_HelmetSpecB: H_HelmetB_plain_mcamo { + GVAR(protection) = 0.8; + GVAR(lowerVolume) = 0.20; + }; + +}; diff --git a/addons/hearing/functions/fnc_earRinging.sqf b/addons/hearing/functions/fnc_earRinging.sqf index 6a896c1820..de70c4f860 100644 --- a/addons/hearing/functions/fnc_earRinging.sqf +++ b/addons/hearing/functions/fnc_earRinging.sqf @@ -21,6 +21,7 @@ PARAMS_2(_unit,_strength); if (_unit != ACE_player) exitWith {}; if (_strength < 0.05) exitWith {}; if (!isNull curatorCamera) exitWith {}; +if ((!GVAR(enabledForZeusUnits)) && {player != ACE_player}) exitWith {}; if (_unit getVariable ["ACE_hasEarPlugsin", false]) then { _strength = _strength / 4; diff --git a/addons/hearing/functions/fnc_moduleHearing.sqf b/addons/hearing/functions/fnc_moduleHearing.sqf index 6ec0af0231..fed6335c07 100644 --- a/addons/hearing/functions/fnc_moduleHearing.sqf +++ b/addons/hearing/functions/fnc_moduleHearing.sqf @@ -21,4 +21,6 @@ if ((_logic getVariable "DisableEarRinging") != -1) then { [_logic, QGVAR(DisableEarRinging), "DisableEarRinging"] call EFUNC(common,readSettingFromModule); }; +[_logic, QGVAR(enabledForZeusUnits), "enabledForZeusUnits"] call EFUNC(common,readSettingFromModule); + diag_log text "[ACE]: Hearing Module Initialized."; diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml index a3af102580..403434cf4f 100644 --- a/addons/hearing/stringtable.xml +++ b/addons/hearing/stringtable.xml @@ -118,7 +118,7 @@ Audição - Enable combat deafness? + Combat Deafness Wł. głuchotę bojową ¿Habilitar sordera de combate? Aktiviere Taubheit im Gefecht? @@ -140,5 +140,11 @@ Ztráta sluchu je možná ve chvíly, kdy se v bezprostřední blízkosti střílí z velkorážní zbraně nebo při bombardování a osoba je bez ochrany sluchu (např. špunty). Tento modul umožňuje tuto věc povolit nebo zakázat. Este módulo ativa / desativa surdez em combate. Quando ativado, os jogadores podem ficar surdos quando uma arma é disparada ao seu redor ou uma explosão ocorre sem proteção auditiva. + + Effect Zeus RC + + + Allow zeus remote controlled units to be able to take hearing damage. + \ No newline at end of file diff --git a/addons/hitreactions/README.md b/addons/hitreactions/README.md new file mode 100644 index 0000000000..f770470e44 --- /dev/null +++ b/addons/hitreactions/README.md @@ -0,0 +1,11 @@ +ace_hitreactions +=========== + +Adds reactions when getting shot. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [commy2](https://github.com/commy2) diff --git a/addons/huntir/README.md b/addons/huntir/README.md new file mode 100644 index 0000000000..b6c8128cbc --- /dev/null +++ b/addons/huntir/README.md @@ -0,0 +1,11 @@ +ace_huntir +=========== + +Adds High-altitude Unit Navigated Tactical Imaging Round and its Monitor. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/huntir/functions/fnc_cam.sqf b/addons/huntir/functions/fnc_cam.sqf index bcc553fff0..9eb22b9fb5 100644 --- a/addons/huntir/functions/fnc_cam.sqf +++ b/addons/huntir/functions/fnc_cam.sqf @@ -7,13 +7,13 @@ * 0: HuntIR * * Return Value: - * Nothing + * None * * Public: No */ #include "script_component.hpp" -PARAMS_1(_huntIR); +params ["_huntIR"]; GVAR(huntIR) = _huntIR; GVAR(pos) = getPosVisual GVAR(huntIR); @@ -73,7 +73,8 @@ GVAR(no_cams) sort true; if (((getPosVisual _x) select 2) > 20 && {!(_x in GVAR(no_cams))} && {_x getHitPointDamage "HitCamera" < 0.25}) then { GVAR(no_cams) pushBack _x; }; - } forEach GVAR(nearHuntIRs); + true + } count GVAR(nearHuntIRs); { if (((getPosVisual _x) select 2) <= 20 || {!(_x in GVAR(nearHuntIRs))} || {_x getHitPointDamage "HitCamera" >= 0.25}) then { GVAR(no_cams) deleteAt _forEachIndex; @@ -82,19 +83,19 @@ GVAR(no_cams) sort true; }; }; } forEach GVAR(no_cams); - + GVAR(cur_cam) = 0 max GVAR(cur_cam) min ((count GVAR(no_cams)) - 1); if (count GVAR(no_cams) > 0) then { GVAR(huntIR) = GVAR(no_cams) select GVAR(cur_cam); }; - + GVAR(pos) = getPosVisual GVAR(huntIR); - + if ((!dialog) || (count GVAR(no_cams) == 0) || ((GVAR(pos) select 2) <= 20)) exitWith { [_this select 1] call cba_fnc_removePerFrameHandler; - + GVAR(stop) = true; - + GVAR(pphandle) ppEffectEnable true; ppEffectDestroy GVAR(pphandle); @@ -108,7 +109,7 @@ GVAR(no_cams) sort true; deleteVehicle GVAR(logic); if (player != ACE_player) then { player remoteControl ACE_player; - }; + }; }; switch (GVAR(ZOOM)) do { @@ -131,7 +132,7 @@ GVAR(no_cams) sort true; }; private ["_cam_coord_y", "_cam_coord_x", "_cam_time", "_cam_pos"]; - + GVAR(logic) setPosATL (GVAR(pos) vectorAdd [0, 0, -5]); GVAR(logic) setDir GVAR(ROTATE); GVAR(logic) setVectorUp [0.0001, 0.0001, 1]; diff --git a/addons/huntir/functions/fnc_handleFired.sqf b/addons/huntir/functions/fnc_handleFired.sqf index 121cd9fd12..1919b4547c 100644 --- a/addons/huntir/functions/fnc_handleFired.sqf +++ b/addons/huntir/functions/fnc_handleFired.sqf @@ -13,19 +13,19 @@ * 6: projectile - Object of the projectile that was shot * * Return Value: - * Nothing + * None * * Public: No */ #include "script_component.hpp" -PARAMS_7(_unit,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); +params ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile"]; if (_ammo != "F_HuntIR") exitWith {}; [{ - PARAMS_1(_projectile); - + params ["_projectile"]; + //If null (deleted or hit water) exit: if (isNull _projectile) exitWith {}; //If it's not spinning (hit ground), bail: @@ -33,15 +33,16 @@ if (_ammo != "F_HuntIR") exitWith {}; "ACE_HuntIR_Propell" createVehicle (getPosATL _projectile); [{ - PARAMS_1(_position); private ["_huntir"]; + params ["_position"]; _huntir = createVehicle ["ACE_HuntIR", _position, [], 0, "FLY"]; _huntir setPosATL _position; _huntir setVariable [QGVAR(startTime), ACE_time, true]; [{ - EXPLODE_1_PVT(_this select 0,_huntir); + params ["_args", "_idPFH"]; + _args params ["_huntir"]; if (isNull _huntir) exitWith { - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; private ["_parachuteDamage", "_velocity"]; _parachuteDamage = _huntir getHitPointDamage "HitParachute"; diff --git a/addons/huntir/functions/fnc_huntir.sqf b/addons/huntir/functions/fnc_huntir.sqf index 27fd5e280b..b1c269533d 100644 --- a/addons/huntir/functions/fnc_huntir.sqf +++ b/addons/huntir/functions/fnc_huntir.sqf @@ -4,10 +4,10 @@ * HuntIR monitor system * * Arguments: - * Nothing + * None * * Return Value: - * Nothing + * None * * Public: No */ @@ -35,21 +35,21 @@ createDialog "ace_huntir_cam_dialog_off"; GVAR(connectionDelay) = 5; GVAR(state) = "searching"; GVAR(message) = []; - GVAR(messageSearching) = toArray "Searching....."; + GVAR(messageSearching) = toArray "Searching....."; GVAR(messageConnecting) = toArray "Connecting....."; [{ //Close monitor if we no longer have item: if ((!([ACE_player, "ACE_HuntIR_monitor"] call EFUNC(common,hasItem))) && {!isNull (uiNameSpace getVariable ["ace_huntir_monitor", displayNull])}) then { closeDialog 0; }; - + private ["_elapsedTime", "_nearestHuntIRs"]; _elapsedTime = ACE_time - GVAR(startTime); _nearestHuntIRs = ACE_player nearEntities ["ACE_HuntIR", HUNTIR_MAX_TRANSMISSION_RANGE]; - + if ((!dialog) || GVAR(done)) exitWith { [_this select 1] call cba_fnc_removePerFrameHandler; - + if (dialog && GVAR(state) == "connected") then { [_nearestHuntIRs select 0] call FUNC(cam); } else { diff --git a/addons/huntir/functions/fnc_huntirCompass.sqf b/addons/huntir/functions/fnc_huntirCompass.sqf index 30fcf45900..ff06b47df3 100644 --- a/addons/huntir/functions/fnc_huntirCompass.sqf +++ b/addons/huntir/functions/fnc_huntirCompass.sqf @@ -4,10 +4,10 @@ * HuntIR monitor compass * * Arguments: - * Nothing + * None * * Return Value: - * Nothing + * None * * Public: No */ @@ -32,7 +32,7 @@ disableSerialization; private ["_fnc_correctIt"]; _fnc_correctIt = { - PARAMS_2(_pos,_dir); + params ["_pos", "_dir"]; if (_dir >= 270 || {_dir <= 90}) then { _pos set [1, (_pos select 1) + __OFFSET_Y] }; @@ -51,16 +51,17 @@ _fnc_correctIt = { HUNTIR_CAM_ROSE_LAYER_ID cutRsc ["ace_huntir_cam_rose", "PLAIN"]; [{ - EXPLODE_1_PVT(_this select 0,_fnc_correctIt); - + params ["_args", "_idPFH"]; + _args params ["_fnc_correctIt"]; + if (GVAR(stop)) exitWith { HUNTIR_CAM_ROSE_LAYER_ID cutText ["", "PLAIN"]; - [_this select 1] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; }; - + private ["_dir", "_x1", "_y1", "_pos"]; _dir = getDir GVAR(cam); // direction player; - + _x1 = __CENTER_X - (__RADIUS * sin(_dir)); _y1 = __CENTER_Y - (__RADIUS * cos(_dir)); _pos = [[_x1, _y1], _dir] call _fnc_correctIt; @@ -84,5 +85,5 @@ HUNTIR_CAM_ROSE_LAYER_ID cutRsc ["ace_huntir_cam_rose", "PLAIN"]; _pos = [[_x1, _y1], _dir] call _fnc_correctIt; __CHAR_E ctrlSetPosition [_pos select 0, _pos select 1, __WIDTH, __HEIGHT]; __CHAR_E ctrlCommit 0; - + }, 0.01, [_fnc_correctIt]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/interact_menu/README.md b/addons/interact_menu/README.md new file mode 100644 index 0000000000..77ac2d814a --- /dev/null +++ b/addons/interact_menu/README.md @@ -0,0 +1,12 @@ +ace_interact_menu +=========== + +Base framework for interaction menu. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [NouberNou](https://github.com/NouberNou) +- [esteldunedain](https://github.com/esteldunedain) diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 910b8893c6..f486b3ee58 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -71,7 +71,7 @@ _recurseFnc = { _statement, _condition, _insertChildren, - {}, + [], [0,0,0], 10, //distace [_showDisabled,_enableInside,_canCollapse,_runOnHover, true], diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 997974d2e3..d2cef4c9ef 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -501,8 +501,8 @@ class CfgVehicles { class ACE_Push { displayName = CSTRING(Push); distance = 6; - condition = QUOTE(getMass _target < 1000 && {alive _target}); - statement = QUOTE([ARR_2(_target, [ARR_3(2 * (vectorDir _player select 0), 2 * (vectorDir _player select 1), 0.5)])] call DFUNC(push);); + condition = QUOTE(((getMass _target) <= 2600) && {alive _target} && {(vectorMagnitude (velocity _target)) < 3}); + statement = QUOTE(_this call FUNC(push)); showDisabled = 0; priority = -1; }; diff --git a/addons/interaction/README.md b/addons/interaction/README.md index 8e841e9a58..92401b2547 100644 --- a/addons/interaction/README.md +++ b/addons/interaction/README.md @@ -3,6 +3,7 @@ ace_interaction Provides interaction options between units. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. diff --git a/addons/interaction/XEH_postInit.sqf b/addons/interaction/XEH_postInit.sqf index 7fe151dac1..8db2d34ad1 100644 --- a/addons/interaction/XEH_postInit.sqf +++ b/addons/interaction/XEH_postInit.sqf @@ -10,6 +10,13 @@ ACE_Modifier = 0; _group selectLeader _leader; }] call EFUNC(common,addEventHandler); +//Pushing boats from FUNC(push) +[QGVAR(pushBoat), { + params ["_boat", "_newVelocity"]; + _boat setVelocity _newVelocity; +}] call EFUNC(common,addEventHandler); + + if (!hasInterface) exitWith {}; GVAR(isOpeningDoor) = false; diff --git a/addons/interaction/functions/fnc_push.sqf b/addons/interaction/functions/fnc_push.sqf index 946a5118be..86ad673d9c 100644 --- a/addons/interaction/functions/fnc_push.sqf +++ b/addons/interaction/functions/fnc_push.sqf @@ -4,23 +4,23 @@ * * Arguments: * 0: Boat - * 1: Velocity + * 1: Player * * Return Value: * None * * Example: - * [target, [vector]] call ace_interaction_fnc_push + * [Boats, Jose] call ace_interaction_fnc_push * * Public: No */ - + #include "script_component.hpp" -PARAMS_2(_boat,_velocity); +params ["_boat", "_player"]; -if !(local _boat) exitWith { - [_this, QUOTE(FUNC(push)), _boat] call EFUNC(common,execRemoteFnc); -}; +private ["_newVelocity"]; -_boat setVelocity _velocity; +_newVelocity = [2 * (vectorDir _player select 0), 2 * (vectorDir _player select 1), 0.5]; + +[QGVAR(pushBoat), [_boat], [_boat, _newVelocity]] call EFUNC(common,targetEvent); diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 4f1df733b7..ff9990f77d 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -1,811 +1,811 @@ - - - - - Interactions - Interaktionen - Interacciones - Interakce - Interakcje - Interactions - Взаимодействия - Cselekvések - Interazioni - Interaçãoes - - - Torso - Torse - Torso - Torso - Trup - Tors - Торс - Testtörzs - Torso - Torso - - - Head - Tête - Kopf - Cabeza - Hlava - Głowa - Голова - Fej - Testa - Cabeça - - - Left Arm - Bras gauche - Linker Arm - Brazo izquierdo - Levá paže - Lewe ramię - Левая рука - Bal kar - Braccio sinistro - Braço Esquerdo - - - Right Arm - Rechter Arm - Brazo derecho - Pravá paže - Prawe ramię - Bras droit - Правая рука - Jobb kar - Braccio destro - Braço Direito - - - Left Leg - Linkes Bein - Pierna izquierda - Levá noha - Lewa noga - Jambe gauche - Левая нога - Bal láb - Gamba sinistra - Perna Esquerda - - - Right Leg - Rechtes Bein - Pierna derecha - Pravá noha - Prawa noga - Jambe droite - Правая нога - Jobb láb - Gamba destra - Perna Direita - - - Weapon - Arme - Waffe - Arma - Zbraň - Broń - Оружие - Fegyver - Arma - Arma - - - Interaction Menu - Interaktionsmenü - Menú de interacción - Menu interakcji - Menu interakce - Menu d'interaction - Меню взаимодействия - Cselekvő menü - Menu de Interação - Menù interazione - - - Interaction Menu (Self) - Interaktionsmenü (selbst) - Menú de interacción (Propio) - Menu interakcji (własne) - Menu interakce (vlastní) - Menu d'interaction (Perso) - Меню взаимодействия (с собой) - Cselekvő menü (saját) - Menu de Interação (Individual) - Menù interazione (individuale) - - - Open / Close Door - Tür öffnen / schließen - Abrir / Cerrar puerta - Otwórz / Zamknij drzwi - Otevřít / Zavřít dveře - Ouvrir / Fermer Portes - Открыть / Закрыть двери - Ajtó nyitása / zárása - Abrir / Fechar Porta - Apri / Chiudi la porta - - - Lock Door - Tür sperren - Bloquear puerta - Verrouiller Porte - Blocca la porta - Заблокировать дверь - Trancar Porta - Ajtó bezárása - Zablokuj drzwi - Zamknout dveře - - - Unlock Door - Tür entsperren - Desbloquear puerta - Déverrouiller Porte - Sblocca la porta - Разблокировать дверь - Destrancar Porta - Zár kinyitása - Odblokuj drzwi - Odemknout dveře - - - Locked Door - Tür gesperrt - Puerta bloqueada - Porte Verrouillée - Porta bloccata - Дверь заблокирована - Porta Trancada - Zárt ajtó - Zablokowano drzwi - Zamčené dveře - - - Unlocked Door - Tür entsperrt - Puerta desbloqueada - Porte Déverrouillée - Porta sbloccata - Дверь разблокирована - Porta Destrancada - Nyitott ajtó - Odblokowano drzwi - Odemčené dveře - - - Join group - Gruppe beitreten - Unirse al grupo - Dołącz do grupy - Přidat se do skupiny - Rejoindre Groupe - Вступить в группу - Csatlakozás a csoporthoz - Unir-se ao grupo - Unisciti alla squadra - - - Leave Group - Gruppe verlassen - Dejar grupo - Opuść grupę - Opustit skupinu - Quitter Groupe - Выйти из группы - Csoport elhagyása - Deixar grupo - Lascia la squadra - - - Become Leader - Grp.-führung übern. - Asumir el liderazgo - Przejmij dowodzenie - Stát se velitelem - Devenir Chef de groupe - Стать лидером - Vezetés átvétele - Tornar-se Líder - Prendi il comando - - - DANCE! - TANZEN! - BAILAR! - TAŃCZ! - TANČIT! - Danse! - ТАНЦЕВАТЬ! - TÁNC! - DANCE! - DANZA! - - - Stop Dancing - Tanzen abbrechen - Dejar de bailar - Przestań tańczyć - Přestat tancovat - Arrêter de danser - Прекратить танцевать - Tánc abbahagyása - Parar de dançar - Smetti di ballare - - - << Back - << Zurück - << Atrás - << Wstecz - << Zpět - << Retour - << Назад - << Vissza - << Voltar - << Indietro - - - Gestures - Gesten - Gestos - Gesty - Posunky - Signaux - Жесты - Kézjelek - Gestos - Gesti - - - Attack - Angreifen - Atacar - Do ataku - Zaútočit - Attaquer - Атаковать - Támadás - Atacar - Attaccare - - - Advance - Vordringen - Avanzar - Naprzód - Postoupit - Avancer - Продвигаться - Előre - Avançar - Avanzare - - - Go - Los - Adelante - Szybko - Jít - Aller - Идти - Mozgás - Mover-se - Muoversi - - - Follow - Folgen - Seguirme - Za mną - Následovat - Suivre - Следовать - Utánam - Seguir - Seguire - - - Point - Zeigen - Señalar - Wskazać - Ukázat - Pointer - Точка - Mutat - Apontar - Puntare a - - - Up - Aufstehen - Arriba - Do góry - Vztyk - Debout - Вверх - Fel - Acima - Alzarsi - - - Cover - Deckung - Cubrirse - Do osłony - Krýt se - A couvert - Укрыться - Fedezékbe - Proteger-se - Copertura - - - Cease Fire - Feuer einstellen - Alto el fuego - Wstrzymać ogień - Zastavit palbu - Halte au feu - Прекратить огонь - Tüzet szüntess - Cessar Fogo - Cessare il Fuoco - - - Freeze - Keine Bewegung - Alto - Stać - Stát - Halte - Замереть - Állj - Alto - Fermi - - - Hi - Hallo - Hola - Witaj - Ahoj - Salut - Привет - Helló - Olá - Ciao - - - Put weapon on back - Waffe wegstecken - Arma a la espalda - Umieść broń na plecach - Dát zbraň na záda - Arme à la bretelle - Повесить оружие на спину - Fegyvert hátra - Colocar arma nas costas - Metti l'arma in spalla - - - Tap Shoulder - Auf Schulter klopfen - Tocar el hombro - Klepnij w ramię - Poklepat na rameno - Taper sur l'épaule - Похлопать по плечу - Vállveregetés - Tocar ombro - Dai un colpetto - - - You were tapped on the RIGHT shoulder - Te tocaron el hombro DERECHO - Dir wurde auf die rechte Schulter geklopft - On te tape sur l'épaule droite - Zostałeś klepnięty w prawe ramię - Megveregették a JOBB válladat. - Někdo tě poklepal na PRAVÉ rameno - Вас похлопали по ПРАВОМУ плечу - Você foi tocado no ombro - Ti è stato dato un colpetto sulla spalla destra - - - You were tapped on the LEFT shoulder. - Te tocaron el hombro IZQUIERDO. - Dir wurde auf die linke Schulter geklopft - On te tape sur l'épaule gauche - Zostałeś klepnięty w lewe ramię - Megveregették a BAL válladat. - Někdo tě poklepal na LEVÉ rameno - Вас похлопали по ЛЕВОМУ плечу - Você foi tocado no ombro. - Ti è stato dato un colpetto sulla spalla sinistra - - - Cancel - Abbrechen - Cancelar - Anuluj - Annuler - Zrušit - Annulla - Отменить - Cancelar - Mégse - - - Select - Wählen - Seleccionar - Wybierz - Sélectionner - Zvolit - Seleziona - Выбрать - Selecionar - Kiválaszt - - - Go Away! - Geh Weg! - Aléjate! - Odejdź! - Jděte pryč! - Allez-vous-en! - Уходите отсюда! - Tűnés! - Vá Embora! - Via di qui! - - - Get Down! - Auf den Boden! - Al suelo! - Padnij! - K zemi! - A terre! - A földre! - Ложись! - Abaixe-se! - A terra! - - - Team Management - Gruppenverwaltung - Gestión de equipo - Gestion d'équipe - Zarządzanie oddziałem - Správa týmu - Управление группой - Gerenciamento de Equipe - Organizzazione Squadra - Csapat kezelése - - - Red - Rot - Rojo - Rouge - Czerwonych - Červený - Красный - Vermelha - Rosso - Piros - - - Green - Grün - Verde - Vert - Zielonych - Zelený - Зеленый - Verde - Verde - Zöld - - - Blue - Blau - Azul - Bleu - Niebieskich - Modrý - Синий - Azul - Blu - Kék - - - Yellow - Gelb - Amarillo - Jaune - Żółtych - Žlutý - Жёлтый - Amarela - Giallo - Sárga - - - Assign Red - Rot zuweisen - Asignar a rojo - Przydziel do czerwonych - Atribuir Vermelho - Hozzávonás a Piroshoz - Přiřadit k červeným - Назначить в Красную группу - Assigner à rouge - Assegna al team rosso - - - Assign Green - Grün zuweisen - Asignar a verde - Przydziel do zielonych - Atribuir Verde - Hozzávonás a Zöldhöz - Přiřadit k zeleným - Назначить в Зеленую группу - Assigner à vert - Assegna al team verde - - - Assign Blue - Blau zuweisen - Asignar a azul - Przydziel do niebieskich - Atribuir Azul - Hozzávonás a Kékhez - Přiřadit k modrým - Назначить в Синюю группу - Assigner à bleu - Assegna al team blu - - - Assign Yellow - Gelb zuweisen - Asignar a amarillo - Przydziel do żółtych - Atribuir Amarelo - Hozzávonás a Sárgához - Přiřadit ke žlutým - Назначить в Желтую группу - Assigner à jaune - Assegna al team giallo - - - Join Red - Rot beitreten - Unirse a rojo - Dołącz do czerwonych - Entrar em Vermelho - Belépés a Pirosba - Připojit k červeným - Присоединиться к Красной группе - Rejoindre rouge - Unirsi al team rosso - - - Join Green - Grün beitreten - Unirse a verde - Dołącz do zielonych - Entrar em Verde - Belépés a Zöldbe - Připojit k zeleným - Присоединиться к Зеленой группе - Rejoindre vert - Unirsi al team verde - - - Join Blue - Blau beitreten - Unirse a azul - Dołącz do niebieskich - Entrar em Azul - Belépés a Kékbe - Připojit k modrým - Присоединиться к Синей группе - Rejoindre bleu - Unirsi al team blu - - - Join Yellow - Gelb beitreten - Unirse a amarillo - Dołącz do żółtych - Entrar em Amarelo - Belépés a Sárgába - Připojit ke žlutým - Присоединиться к Жёлтой группе - Rejoindre jaune - Unirsi al team giallo - - - You joined Team %1 - Du bist Gruppe %1 beigetreten - Te has unido al equipo %1 - Tu as rejoint l'équipe %1 - Dołączyłeś do %1 - Připojil ses do %1 týmu - Вы присоединились к группе %1 - Você uniu-se à Equipe %1 - Sei entrato nel team %1 - Csatlakoztál a %1 csapathoz - - - Leave Team - Gruppe verlassen - Dejar equipo - Quitter l'équipe - Opuść drużynę - Opustit tým - Покинуть группу - Deixar Equipe - Lascia il team - Csapat elhagyása - - - You left the Team - Du hast die Gruppe verlassen - Has dejado el equipo - Tu as quitté l'équipe - Opuściłeś drużynę - Opustil jsi tým - Вы покинули группу - Você deixou a Equipe - Hai lasciato il team - Elhagytad a csapatot - - - Pardon - Begnadigen - Perdonar - Przebacz - Pardon - Pardon - Извините - Perdão - Perdona - Megbocsátás - - - Scroll - Scrollen - Przewiń - Défilement - Desplazar - Пролистать - Rolar - Scorri - Görgetés - Otáčení - - - Modifier Key - Modifikator-Taste - Modyfikator - Modifier la touche - Tecla modificadora - Клавиша-модификатор - Tecla Modificadora - Tasto modifica - Módosító billentyű - Modifikátor - - - Not in Range - Außer Reichweite - Hors de portée. - Fuera de rango - Слишком далеко - Fora do Alcançe - Hatótávolságon kívül - Poza zasięgiem - Mimo dosah - Fuori limite - - - Equipment - Ausrüstung - Equipamiento - Équipement - Ekwipunek - Vybavení - Felszerelés - Снаряжение - Equipaggiamento - Equipamento - - - Push - Schieben - Empujar - Pousser - Pchnij - Odstrčit - Tolás - Толкать - Empurrar - Spingere - - - Interact - Interagir - Interagiere - Interakce - Взаимодействовать - Interakcja - Interactuar - Cselekvés - Interagire - Interagir - - - Passengers - Insassen - Pasajeros - Пассажиры - Pasažéři - Pasażerowie - Passagers - Utasok - Passeggeri - Passageiros - - - Open - Otwórz - Otevřít - Abrir - - - Interaction System - System interakcji - Sistema de interacción - Interaktionssystem - Systém interakce - Sistema de interação - - - Enable Team Management - Wł. zarządzanie drużyną - Habilitar gestión de equipos - Aktiviere Gruppenverwaltung - Povolit správu týmu - Habilitar gestão de equipes - - - Should players be allowed to use the Team Management Menu? Default: Yes - Czy gracze mogą korzystać z menu zarządzania drużyną? Domyślnie: Tak - ¿Deben tener permitido los jugadores el uso del menu de gestión de equipos? Por defecto: Si - Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja - Mohou hráči použít menu správy týmu? Výchozí: Ano - Devem os jogadores ter permissão de usar o menu de gestão de equipes? Padrão: Sim - - - Team management allows color allocation for team members, taking team command and joining/leaving teams. - Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn. - Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. - Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. - O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. - La gestión del equipo permite la asignación de colores para los miembros del equipo, tomando el mando del equipo y uniendo/dejando equipos. - - + + + + + Interactions + Interaktionen + Interacciones + Interakce + Interakcje + Interactions + Взаимодействия + Cselekvések + Interazioni + Interaçãoes + + + Torso + Torse + Torso + Torso + Trup + Tors + Торс + Testtörzs + Torso + Torso + + + Head + Tête + Kopf + Cabeza + Hlava + Głowa + Голова + Fej + Testa + Cabeça + + + Left Arm + Bras gauche + Linker Arm + Brazo izquierdo + Levá paže + Lewe ramię + Левая рука + Bal kar + Braccio sinistro + Braço Esquerdo + + + Right Arm + Rechter Arm + Brazo derecho + Pravá paže + Prawe ramię + Bras droit + Правая рука + Jobb kar + Braccio destro + Braço Direito + + + Left Leg + Linkes Bein + Pierna izquierda + Levá noha + Lewa noga + Jambe gauche + Левая нога + Bal láb + Gamba sinistra + Perna Esquerda + + + Right Leg + Rechtes Bein + Pierna derecha + Pravá noha + Prawa noga + Jambe droite + Правая нога + Jobb láb + Gamba destra + Perna Direita + + + Weapon + Arme + Waffe + Arma + Zbraň + Broń + Оружие + Fegyver + Arma + Arma + + + Interaction Menu + Interaktionsmenü + Menú de interacción + Menu interakcji + Menu interakce + Menu d'interaction + Меню взаимодействия + Cselekvő menü + Menu de Interação + Menù interazione + + + Interaction Menu (Self) + Interaktionsmenü (selbst) + Menú de interacción (Propio) + Menu interakcji (własne) + Menu interakce (vlastní) + Menu d'interaction (Perso) + Меню взаимодействия (с собой) + Cselekvő menü (saját) + Menu de Interação (Individual) + Menù interazione (individuale) + + + Open / Close Door + Tür öffnen / schließen + Abrir / Cerrar puerta + Otwórz / Zamknij drzwi + Otevřít / Zavřít dveře + Ouvrir / Fermer Portes + Открыть / Закрыть двери + Ajtó nyitása / zárása + Abrir / Fechar Porta + Apri / Chiudi la porta + + + Lock Door + Tür sperren + Bloquear puerta + Verrouiller Porte + Blocca la porta + Заблокировать дверь + Trancar Porta + Ajtó bezárása + Zablokuj drzwi + Zamknout dveře + + + Unlock Door + Tür entsperren + Desbloquear puerta + Déverrouiller Porte + Sblocca la porta + Разблокировать дверь + Destrancar Porta + Zár kinyitása + Odblokuj drzwi + Odemknout dveře + + + Locked Door + Tür gesperrt + Puerta bloqueada + Porte Verrouillée + Porta bloccata + Дверь заблокирована + Porta Trancada + Zárt ajtó + Zablokowano drzwi + Zamčené dveře + + + Unlocked Door + Tür entsperrt + Puerta desbloqueada + Porte Déverrouillée + Porta sbloccata + Дверь разблокирована + Porta Destrancada + Nyitott ajtó + Odblokowano drzwi + Odemčené dveře + + + Join group + Gruppe beitreten + Unirse al grupo + Dołącz do grupy + Přidat se do skupiny + Rejoindre Groupe + Вступить в группу + Csatlakozás a csoporthoz + Unir-se ao grupo + Unisciti alla squadra + + + Leave Group + Gruppe verlassen + Dejar grupo + Opuść grupę + Opustit skupinu + Quitter Groupe + Выйти из группы + Csoport elhagyása + Deixar grupo + Lascia la squadra + + + Become Leader + Grp.-führung übern. + Asumir el liderazgo + Przejmij dowodzenie + Stát se velitelem + Devenir Chef de groupe + Стать лидером + Vezetés átvétele + Tornar-se Líder + Prendi il comando + + + DANCE! + TANZEN! + BAILAR! + TAŃCZ! + TANČIT! + Danse! + ТАНЦЕВАТЬ! + TÁNC! + DANCE! + DANZA! + + + Stop Dancing + Tanzen abbrechen + Dejar de bailar + Przestań tańczyć + Přestat tancovat + Arrêter de danser + Прекратить танцевать + Tánc abbahagyása + Parar de dançar + Smetti di ballare + + + << Back + << Zurück + << Atrás + << Wstecz + << Zpět + << Retour + << Назад + << Vissza + << Voltar + << Indietro + + + Gestures + Gesten + Gestos + Gesty + Posunky + Signaux + Жесты + Kézjelek + Gestos + Gesti + + + Attack + Angreifen + Atacar + Do ataku + Zaútočit + Attaquer + Атаковать + Támadás + Atacar + Attaccare + + + Advance + Vordringen + Avanzar + Naprzód + Postoupit + Avancer + Продвигаться + Előre + Avançar + Avanzare + + + Go + Los + Adelante + Szybko + Jít + Aller + Идти + Mozgás + Mover-se + Muoversi + + + Follow + Folgen + Seguirme + Za mną + Následovat + Suivre + Следовать + Utánam + Seguir + Seguire + + + Point + Zeigen + Señalar + Wskazać + Ukázat + Pointer + Точка + Mutat + Apontar + Puntare a + + + Up + Aufstehen + Arriba + Do góry + Vztyk + Debout + Вверх + Fel + Acima + Alzarsi + + + Cover + Deckung + Cubrirse + Do osłony + Krýt se + A couvert + Укрыться + Fedezékbe + Proteger-se + Copertura + + + Cease Fire + Feuer einstellen + Alto el fuego + Wstrzymać ogień + Zastavit palbu + Halte au feu + Прекратить огонь + Tüzet szüntess + Cessar Fogo + Cessare il Fuoco + + + Freeze + Keine Bewegung + Alto + Stać + Stát + Halte + Замереть + Állj + Alto + Fermi + + + Hi + Hallo + Hola + Witaj + Ahoj + Salut + Привет + Helló + Olá + Ciao + + + Put weapon on back + Waffe wegstecken + Arma a la espalda + Umieść broń na plecach + Dát zbraň na záda + Arme à la bretelle + Повесить оружие на спину + Fegyvert hátra + Colocar arma nas costas + Metti l'arma in spalla + + + Tap Shoulder + Auf Schulter klopfen + Tocar el hombro + Klepnij w ramię + Poklepat na rameno + Taper sur l'épaule + Похлопать по плечу + Vállveregetés + Tocar ombro + Dai un colpetto + + + You were tapped on the RIGHT shoulder + Te tocaron el hombro DERECHO + Dir wurde auf die rechte Schulter geklopft + On te tape sur l'épaule droite + Zostałeś klepnięty w prawe ramię. + Megveregették a JOBB válladat. + Někdo tě poklepal na PRAVÉ rameno + Вас похлопали по ПРАВОМУ плечу + Você foi tocado no ombro + Ti è stato dato un colpetto sulla spalla destra + + + You were tapped on the LEFT shoulder. + Te tocaron el hombro IZQUIERDO. + Dir wurde auf die linke Schulter geklopft + On te tape sur l'épaule gauche + Zostałeś klepnięty w lewe ramię. + Megveregették a BAL válladat. + Někdo tě poklepal na LEVÉ rameno + Вас похлопали по ЛЕВОМУ плечу + Você foi tocado no ombro. + Ti è stato dato un colpetto sulla spalla sinistra + + + Cancel + Abbrechen + Cancelar + Anuluj + Annuler + Zrušit + Annulla + Отменить + Cancelar + Mégse + + + Select + Wählen + Seleccionar + Wybierz + Sélectionner + Zvolit + Seleziona + Выбрать + Selecionar + Kiválaszt + + + Go Away! + Geh Weg! + Aléjate! + Odejdź! + Jděte pryč! + Allez-vous-en! + Уходите отсюда! + Tűnés! + Vá Embora! + Via di qui! + + + Get Down! + Auf den Boden! + Al suelo! + Padnij! + K zemi! + A terre! + A földre! + Ложись! + Abaixe-se! + A terra! + + + Team Management + Gruppenverwaltung + Gestión de equipo + Gestion d'équipe + Drużyna + Správa týmu + Управление группой + Gerenciamento de Equipe + Organizzazione Squadra + Csapat kezelése + + + Red + Rot + Rojo + Rouge + Czerwonych + Červený + Красный + Vermelha + Rosso + Piros + + + Green + Grün + Verde + Vert + Zielonych + Zelený + Зеленый + Verde + Verde + Zöld + + + Blue + Blau + Azul + Bleu + Niebieskich + Modrý + Синий + Azul + Blu + Kék + + + Yellow + Gelb + Amarillo + Jaune + Żółtych + Žlutý + Жёлтый + Amarela + Giallo + Sárga + + + Assign Red + Rot zuweisen + Asignar a rojo + Przydziel do czerwonych + Atribuir Vermelho + Hozzávonás a Piroshoz + Přiřadit k červeným + Назначить в Красную группу + Assigner à rouge + Assegna al team rosso + + + Assign Green + Grün zuweisen + Asignar a verde + Przydziel do zielonych + Atribuir Verde + Hozzávonás a Zöldhöz + Přiřadit k zeleným + Назначить в Зеленую группу + Assigner à vert + Assegna al team verde + + + Assign Blue + Blau zuweisen + Asignar a azul + Przydziel do niebieskich + Atribuir Azul + Hozzávonás a Kékhez + Přiřadit k modrým + Назначить в Синюю группу + Assigner à bleu + Assegna al team blu + + + Assign Yellow + Gelb zuweisen + Asignar a amarillo + Przydziel do żółtych + Atribuir Amarelo + Hozzávonás a Sárgához + Přiřadit ke žlutým + Назначить в Желтую группу + Assigner à jaune + Assegna al team giallo + + + Join Red + Rot beitreten + Unirse a rojo + Dołącz do czerwonych + Entrar em Vermelho + Belépés a Pirosba + Připojit k červeným + Присоединиться к Красной группе + Rejoindre rouge + Unirsi al team rosso + + + Join Green + Grün beitreten + Unirse a verde + Dołącz do zielonych + Entrar em Verde + Belépés a Zöldbe + Připojit k zeleným + Присоединиться к Зеленой группе + Rejoindre vert + Unirsi al team verde + + + Join Blue + Blau beitreten + Unirse a azul + Dołącz do niebieskich + Entrar em Azul + Belépés a Kékbe + Připojit k modrým + Присоединиться к Синей группе + Rejoindre bleu + Unirsi al team blu + + + Join Yellow + Gelb beitreten + Unirse a amarillo + Dołącz do żółtych + Entrar em Amarelo + Belépés a Sárgába + Připojit ke žlutým + Присоединиться к Жёлтой группе + Rejoindre jaune + Unirsi al team giallo + + + You joined Team %1 + Du bist Gruppe %1 beigetreten + Te has unido al equipo %1 + Tu as rejoint l'équipe %1 + Dołączyłeś do %1 + Připojil ses do %1 týmu + Вы присоединились к группе %1 + Você uniu-se à Equipe %1 + Sei entrato nel team %1 + Csatlakoztál a %1 csapathoz + + + Leave Team + Gruppe verlassen + Dejar equipo + Quitter l'équipe + Opuść drużynę + Opustit tým + Покинуть группу + Deixar Equipe + Lascia il team + Csapat elhagyása + + + You left the Team + Du hast die Gruppe verlassen + Has dejado el equipo + Tu as quitté l'équipe + Opuściłeś drużynę + Opustil jsi tým + Вы покинули группу + Você deixou a Equipe + Hai lasciato il team + Elhagytad a csapatot + + + Pardon + Begnadigen + Perdonar + Przebacz + Pardon + Pardon + Извините + Perdão + Perdona + Megbocsátás + + + Scroll + Scrollen + Przewiń + Défilement + Desplazar + Пролистать + Rolar + Scorri + Görgetés + Otáčení + + + Modifier Key + Modifikator-Taste + Modyfikator + Modifier la touche + Tecla modificadora + Клавиша-модификатор + Tecla Modificadora + Tasto modifica + Módosító billentyű + Modifikátor + + + Not in Range + Außer Reichweite + Hors de portée. + Fuera de rango + Слишком далеко + Fora do Alcançe + Hatótávolságon kívül + Poza zasięgiem + Mimo dosah + Fuori limite + + + Equipment + Ausrüstung + Equipamiento + Équipement + Ekwipunek + Vybavení + Felszerelés + Снаряжение + Equipaggiamento + Equipamento + + + Push + Schieben + Empujar + Pousser + Pchnij + Odstrčit + Tolás + Толкать + Empurrar + Spingere + + + Interact + Interagir + Interagiere + Interakce + Взаимодействовать + Interakcja + Interactuar + Cselekvés + Interagire + Interagir + + + Passengers + Insassen + Pasajeros + Пассажиры + Pasažéři + Pasażerowie + Passagers + Utasok + Passeggeri + Passageiros + + + Open + Otwórz + Otevřít + Abrir + + + Interaction System + System interakcji + Sistema de interacción + Interaktionssystem + Systém interakce + Sistema de interação + + + Enable Team Management + Wł. zarządzanie drużyną + Habilitar gestión de equipos + Aktiviere Gruppenverwaltung + Povolit správu týmu + Habilitar gestão de equipes + + + Should players be allowed to use the Team Management Menu? Default: Yes + Czy gracze mogą korzystać z menu zarządzania drużyną? Domyślnie: Tak + ¿Deben tener permitido los jugadores el uso del menu de gestión de equipos? Por defecto: Si + Sollen Spieler das Gruppenverwaltungsmenü verwenden dürfen? Standard: Ja + Mohou hráči použít menu správy týmu? Výchozí: Ano + Devem os jogadores ter permissão de usar o menu de gestão de equipes? Padrão: Sim + + + Team management allows color allocation for team members, taking team command and joining/leaving teams. + Na zarządzanie drużyną składa się: przydział kolorów dla członków drużyny, przejmowanie dowodzenia, dołączanie/opuszczanie drużyn. + Die Gruppenverwaltung erlaubt die Zuweisung von Farben für Einheiten, die Kommandierung und das Beitreten/Verlassen einer Gruppe. + Správa týmu se skládá z: přidělení barev pro členy týmu, převzetí velení, připojení/odpojení. + O módulo de gestão de equipe é composto por: a atribuição de cores para os membros da equipe, comando das equipes, juntando-se / deixando equipes. + La gestión del equipo permite la asignación de colores para los miembros del equipo, tomando el mando del equipo y uniendo/dejando equipos. + + \ No newline at end of file diff --git a/addons/inventory/README.md b/addons/inventory/README.md index 1e41aa4a8b..7d644143cf 100644 --- a/addons/inventory/README.md +++ b/addons/inventory/README.md @@ -1,7 +1,7 @@ ace_inventory ============= -Increases the size of the inventory dialog. +Adds options to increase the size of the inventory dialog. ## Maintainers diff --git a/addons/kestrel4500/README.md b/addons/kestrel4500/README.md index 36a324beb9..c0b50a3555 100644 --- a/addons/kestrel4500/README.md +++ b/addons/kestrel4500/README.md @@ -1,10 +1,11 @@ ace_kestrel4500 =============== -Kestrel 4500 Pocket Weather Tracker +Adds Kestrel 4500 Pocket Weather Tracker. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/laserpointer/CfgJointRails.hpp b/addons/laserpointer/CfgJointRails.hpp new file mode 100644 index 0000000000..7583bd03b5 --- /dev/null +++ b/addons/laserpointer/CfgJointRails.hpp @@ -0,0 +1,8 @@ +class asdg_SlotInfo; +class asdg_FrontSideRail: asdg_SlotInfo { + class compatibleItems { + ACE_acc_pointer_red = 1; + ACE_acc_pointer_green = 1; + ACE_acc_pointer_green_IR = 1; + }; +}; diff --git a/addons/laserpointer/XEH_postInit.sqf b/addons/laserpointer/XEH_postInit.sqf index 133931578a..6e9d402529 100644 --- a/addons/laserpointer/XEH_postInit.sqf +++ b/addons/laserpointer/XEH_postInit.sqf @@ -4,12 +4,6 @@ // fixes laser when being captured. Needed, because the selectionPosition of the right hand is used ["SetHandcuffed", {if (_this select 1) then {(_this select 0) action ["GunLightOff", _this select 0]};}] call EFUNC(common,addEventHandler); -//If user has ASDG JR without the compat patch, then ace's' laser pointers won't be compatible with anything -if ((isClass (configFile >> "CfgPatches" >> "asdg_jointrails")) && {!(isClass (configFile >> "CfgPatches" >> "ace_asdg_comp"))}) then { - diag_log text format ["[ACE_laserpointer] - ASDG Joint Rails but no ace_asdg_comp"]; -}; - - if !(hasInterface) exitWith {}; GVAR(nearUnits) = []; @@ -32,7 +26,7 @@ GVAR(nearUnits) = []; } forEach nearestObjects [positionCameraToWorld [0,0,0], ["AllVehicles"], 50]; // when moving this, search also for units inside vehicles. currently breaks the laser in FFV GVAR(nearUnits) = _nearUnits; - + } , 5, []] call CBA_fnc_addPerFrameHandler; addMissionEventHandler ["Draw3D", { diff --git a/addons/laserpointer/config.cpp b/addons/laserpointer/config.cpp index d368512257..cbb3105696 100644 --- a/addons/laserpointer/config.cpp +++ b/addons/laserpointer/config.cpp @@ -16,3 +16,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "CfgJointRails.hpp" diff --git a/addons/logistics_uavbattery/README.md b/addons/logistics_uavbattery/README.md index 8c89913459..d32175cb44 100644 --- a/addons/logistics_uavbattery/README.md +++ b/addons/logistics_uavbattery/README.md @@ -1,7 +1,10 @@ ace_logistics_uavbattery =========== -Adds an item `ACE_UAVBattery` that allows refueling/recharging of the "Dartar" quadcopter UAVs. +Adds an item that allows refueling/recharging of the Darter quadcopter UAVs. + +#### Items Added: +`ACE_UAVBattery` ## Maintainers diff --git a/addons/logistics_wirecutter/CfgVehicles.hpp b/addons/logistics_wirecutter/CfgVehicles.hpp index a31d9c0d99..0b584409d3 100644 --- a/addons/logistics_wirecutter/CfgVehicles.hpp +++ b/addons/logistics_wirecutter/CfgVehicles.hpp @@ -5,4 +5,22 @@ class CfgVehicles { MACRO_ADDITEM(ACE_wirecutter,4); }; }; + + class Wall_F; + class NonStrategic; + + class Land_Net_Fence_4m_F: Wall_F { GVAR(isFence) = 1; }; + class Land_Net_Fence_8m_F: Wall_F { GVAR(isFence) = 1; }; + class Land_Net_FenceD_8m_F: Wall_F { GVAR(isFence) = 1; }; + class Land_New_WiredFence_5m_F: Wall_F { GVAR(isFence) = 1; }; + class Land_New_WiredFence_10m_Dam_F: Wall_F { GVAR(isFence) = 1; }; + class Land_New_WiredFence_10m_F: Wall_F { GVAR(isFence) = 1; }; + class Land_Pipe_fence_4m_F: Wall_F { GVAR(isFence) = 1; }; + class Land_Pipe_fence_4mNoLC_F: Wall_F { GVAR(isFence) = 1; }; + class Land_SportGround_fence_F: Wall_F { GVAR(isFence) = 1; }; + class Land_Wired_Fence_4m_F: Wall_F { GVAR(isFence) = 1; }; + class Land_Wired_Fence_4mD_F: Wall_F { GVAR(isFence) = 1; }; + class Land_Wired_Fence_8m_F: Wall_F { GVAR(isFence) = 1; }; + class Land_Wired_Fence_8mD_F: Wall_F { GVAR(isFence) = 1; }; + class Land_Razorwire_F: NonStrategic { GVAR(isFence) = 1; }; }; diff --git a/addons/logistics_wirecutter/CfgWeapons.hpp b/addons/logistics_wirecutter/CfgWeapons.hpp index 4297cb3b83..2b365cc8e6 100644 --- a/addons/logistics_wirecutter/CfgWeapons.hpp +++ b/addons/logistics_wirecutter/CfgWeapons.hpp @@ -10,7 +10,7 @@ class CfgWeapons { picture = QUOTE(PATHTOF(ui\item_wirecutter_ca.paa)); scope = 2; class ItemInfo: InventoryItem_Base_F { - mass = 100; + mass = 65; }; }; }; diff --git a/addons/logistics_wirecutter/README.md b/addons/logistics_wirecutter/README.md index e0bef0bed6..89d42c419f 100644 --- a/addons/logistics_wirecutter/README.md +++ b/addons/logistics_wirecutter/README.md @@ -1,7 +1,10 @@ ace_logistics_wirecutter =========== -Adds an item `ACE_wirecutter` that allows cutting of fences in A3 and AiA maps. +Adds an item that allows cutting of fences in Aarma 3 and AiA/CUP maps. + +#### Items Added: +`ACE_wirecutter` ## Maintainers diff --git a/addons/logistics_wirecutter/XEH_preInit.sqf b/addons/logistics_wirecutter/XEH_preInit.sqf index 44eb941c16..39620bf35c 100644 --- a/addons/logistics_wirecutter/XEH_preInit.sqf +++ b/addons/logistics_wirecutter/XEH_preInit.sqf @@ -3,9 +3,6 @@ ADDON = false; PREP(cutDownFence); -PREP(cutDownFenceAbort); -PREP(cutDownFenceCallback); -PREP(getNearestFence); PREP(interactEH); PREP(isFence); diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf index f45f0c1511..2bf807975f 100644 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_cutDownFence.sqf @@ -16,21 +16,35 @@ */ #include "script_component.hpp" -#define SOUND_CLIP_TIME_SPACEING 1.5 -private ["_timeToCut", "_progressCheck"]; +params ["_unit", "_fenceObject"]; +TRACE_2("params",_unit,_fenceObject); + +private ["_timeToCut", "_progressCheck", "_onCompletion", "_onFail"]; -PARAMS_2(_unit,_fenceObject); if (_unit != ACE_player) exitWith {}; _timeToCut = if ([ACE_player] call EFUNC(common,isEngineer)) then {7.5} else {11}; [ACE_player, "AinvPknlMstpSnonWnonDr_medic5", 0] call EFUNC(common,doAnimation); +_onCompletion = { + TRACE_1("_onCompletion",_this); + (_this select 0) params ["_fenceObject", "", "_unit"]; + _fenceObject setdamage 1; + [_unit, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); +}; + +_onFail = { + TRACE_1("_onFail", _this); + (_this select 0) params ["", "", "_unit"]; + [_unit, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); +}; + _progressCheck = { - PARAMS_2(_args,_passedTime); - EXPLODE_2_PVT(_args,_fenceObject,_lastSoundEffectTime); + params ["_args", "_passedTime"]; + _args params ["_fenceObject", "_lastSoundEffectTime"]; + if (_passedTime > (_lastSoundEffectTime + SOUND_CLIP_TIME_SPACEING)) then { - // playSound "ACE_wirecutter_sound"; playSound3D [QUOTE(PATHTO_R(sound\wirecut.ogg)), objNull, false, (getPosASL ACE_player), 3, 1, 10]; _args set [1, _passedTime]; }; @@ -38,4 +52,4 @@ _progressCheck = { ((!isNull _fenceObject) && {(damage _fenceObject) < 1} && {("ACE_wirecutter" in (items ACE_player))}) }; -[_timeToCut, [_fenceObject,0], {(_this select 0) call FUNC(cutDownFenceCallback)}, {(_this select 0) call FUNC(cutDownFenceAbort)}, localize LSTRING(CuttingFence), _progressCheck] call EFUNC(common,progressBar); +[_timeToCut, [_fenceObject,0,_unit], _onCompletion, _onFail, localize LSTRING(CuttingFence), _progressCheck] call EFUNC(common,progressBar); diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFenceAbort.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFenceAbort.sqf deleted file mode 100644 index 20cb092131..0000000000 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFenceAbort.sqf +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Author: commy2 - * Stops cutting down fence (reset animation) - * - * Arguments: - * Nothing - * - * Return Value: - * Nothing - * - * Example: - * [] call ace_logistics_wirecutter_fnc_cutDownFenceAbort - * - * Public: No - */ -#include "script_component.hpp" - -[ACE_player, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); diff --git a/addons/logistics_wirecutter/functions/fnc_cutDownFenceCallback.sqf b/addons/logistics_wirecutter/functions/fnc_cutDownFenceCallback.sqf deleted file mode 100644 index 57495a2a03..0000000000 --- a/addons/logistics_wirecutter/functions/fnc_cutDownFenceCallback.sqf +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Author: PabstMirror - * Once progressbar is done: Fence is cutdown - * - * Arguments: - * 0: Fence Object - * - * Return Value: - * Nothing - * - * Example: - * [aFence] call ace_logistics_wirecutter_fnc_cutDownFenceCallback - * - * Public: No - */ -#include "script_component.hpp" - -PARAMS_1(_fenceObject); - -_fenceObject setdamage 1; -// [localize LSTRING(FenceCut)] call EFUNC(common,displayTextStructured); -[ACE_player, "AmovPknlMstpSrasWrflDnon", 1] call EFUNC(common,doAnimation); diff --git a/addons/logistics_wirecutter/functions/fnc_getNearestFence.sqf b/addons/logistics_wirecutter/functions/fnc_getNearestFence.sqf deleted file mode 100644 index 15bfbdb8ef..0000000000 --- a/addons/logistics_wirecutter/functions/fnc_getNearestFence.sqf +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Author: PabstMirror - * Gets nearest fence object (not actully used, left for utility) - * - * Arguments: - * 0: Unit - * - * Return Value: - * The return value - * - * Example: - * [player] call ace_logistics_wirecutter_fnc_getNearestFence - * - * Public: Yes - */ -#include "script_component.hpp" - -private "_nearestFence"; -PARAMS_1(_unit); - -_nearestFence = objNull; -{ - if ((isNull _nearestFence) && {[_x] call FUNC(isFence)}) then { - _nearestFence = _x; - }; -} forEach nearestObjects [_unit, [], 15]; - -_nearestFence diff --git a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf index 05c47c4454..e93296e44a 100644 --- a/addons/logistics_wirecutter/functions/fnc_interactEH.sqf +++ b/addons/logistics_wirecutter/functions/fnc_interactEH.sqf @@ -15,22 +15,24 @@ */ #include "script_component.hpp" -PARAMS_1(_interactionType); +params ["_interactionType"]; -//Ignore self-interaction menu -if (_interactionType != 0) exitWith {}; +//Ignore self-interaction menu or mounted vehicle interaction +if ((_interactionType != 0) || {(vehicle ACE_player) != ACE_player}) exitWith {}; //for performance only do stuff it they have a wirecutter item //(if they somehow get one durring keydown they'll just have to reopen) if (!("ACE_wirecutter" in (items ace_player))) exitWith {}; +TRACE_1("Starting wire-cut action PFEH",_interactionType); + [{ private ["_fncStatement", "_attachedFence", "_fncCondition", "_helper", "_action"]; - PARAMS_2(_args,_pfID); - EXPLODE_3_PVT(_args,_setPosition,_addedHelpers,_fencesHelped); + params ["_args", "_pfID"]; + _args params ["_setPosition", "_addedHelpers", "_fencesHelped"]; if (!EGVAR(interact_menu,keyDown)) then { - {deleteVehicle _x;} forEach _addedHelpers; + {deleteVehicle _x; nil} count _addedHelpers; [_pfID] call CBA_fnc_removePerFrameHandler; } else { // Prevent Rare Error when ending mission with interact key down: @@ -40,11 +42,12 @@ if (!("ACE_wirecutter" in (items ace_player))) exitWith {}; if (((getPosASL ace_player) distance _setPosition) > 5) then { _fncStatement = { - PARAMS_3(_dummyTarget,_player,_attachedFence); + params ["", "_player", "_attachedFence"]; [_player, _attachedFence] call FUNC(cutDownFence); }; _fncCondition = { - PARAMS_3(_dummyTarget,_player,_attachedFence); + params ["", "_player", "_attachedFence"]; + if (!([_player, _attachedFence, []] call EFUNC(common,canInteractWith))) exitWith {false}; ((!isNull _attachedFence) && {(damage _attachedFence) < 1} && {("ACE_wirecutter" in (items _player))}) }; @@ -52,15 +55,15 @@ if (!("ACE_wirecutter" in (items ace_player))) exitWith {}; if (!(_x in _fencesHelped)) then { if ([_x] call FUNC(isFence)) then { _fencesHelped pushBack _x; - _helper = "Sign_Sphere25cm_F" createVehicleLocal (getpos _x); + _helper = "ACE_LogicDummy" createVehicleLocal (getpos _x); _action = [QGVAR(helperCutFence), (localize LSTRING(CutFence)), QUOTE(PATHTOF(ui\wirecutter_ca.paa)), _fncStatement, _fncCondition, {}, _x, [0,0,0], 5] call EFUNC(interact_menu,createAction); [_helper, 0, [],_action] call EFUNC(interact_menu,addActionToObject); _helper setPosASL ((getPosASL _x) vectorAdd [0,0,1.25]); - _helper hideObject true; _addedHelpers pushBack _helper; }; }; - } forEach nearestObjects [ace_player, [], 15]; + nil + } count nearestObjects [ace_player, [], 15]; _args set [0, (getPosASL ace_player)]; }; diff --git a/addons/logistics_wirecutter/functions/fnc_isFence.sqf b/addons/logistics_wirecutter/functions/fnc_isFence.sqf index 4c247b268a..c1e30a7e6f 100644 --- a/addons/logistics_wirecutter/functions/fnc_isFence.sqf +++ b/addons/logistics_wirecutter/functions/fnc_isFence.sqf @@ -16,27 +16,26 @@ */ #include "script_component.hpp" -//find is case sensitive, so keep everything lowercase -#define FENCE_TYPENAMES ["land_net_fence_4m_f", "land_net_fence_8m_f", "land_net_fenced_8m_f", "land_new_wiredfence_5m_f", "land_new_wiredfence_10m_dam_f", "land_new_wiredfence_10m_f", "land_pipe_fence_4m_f", "land_pipe_fence_4mnolc_f", "land_sportground_fence_f", "land_wired_fence_4m_f", "land_wired_fence_4md_f", "land_wired_fence_8m_f", "land_wired_fence_8md_f", "land_razorwire_f", "ace_concertinawire"] - -#define FENCE_P3DS ["mil_wiredfence_f.p3d","wall_indfnc_3.p3d", "wall_indfnc_9.p3d", "wall_indfnc_corner.p3d", "pletivo_wired.p3d", "wall_fen1_5.p3d"] +params ["_object"]; +TRACE_1("params",_object); private ["_typeOf", "_returnValue"]; -PARAMS_1(_object); -_typeOf = toLower (typeOf _object); +_typeOf = typeOf _object; _returnValue = false; if (_typeOf != "") then { //If the fence has configEntry we can check it directly - _returnValue = _typeOf in FENCE_TYPENAMES; + _returnValue = (1 == (getNumber (configFile >> "CfgVehicles" >> _typeOf >> QGVAR(isFence)))); } else { + //TODO: 1.50 use getModelInfo _typeOf = toLower (str _object); //something like "123201: wall_indfnc_9.p3d" { if ((_typeOf find _x) != -1) exitWith { _returnValue = true; }; - } forEach FENCE_P3DS; + nil + } count FENCE_P3DS; }; _returnValue diff --git a/addons/logistics_wirecutter/script_component.hpp b/addons/logistics_wirecutter/script_component.hpp index 6dae60dfd2..a86ace1592 100644 --- a/addons/logistics_wirecutter/script_component.hpp +++ b/addons/logistics_wirecutter/script_component.hpp @@ -1,6 +1,8 @@ #define COMPONENT logistics_wirecutter #include "\z\ace\addons\main\script_mod.hpp" +// #define DEBUG_MODE_FULL + #ifdef DEBUG_ENABLED_LOGISTICS_WIRECUTTER #define DEBUG_MODE_FULL #endif @@ -10,3 +12,9 @@ #endif #include "\z\ace\addons\main\script_macros.hpp" + + +//find is case sensitive, so keep everything lowercase +#define FENCE_P3DS ["mil_wiredfence_f.p3d","wall_indfnc_3.p3d", "wall_indfnc_9.p3d", "wall_indfnc_corner.p3d", "pletivo_wired.p3d", "wall_fen1_5.p3d"] + +#define SOUND_CLIP_TIME_SPACEING 1.5 diff --git a/addons/magazinerepack/README.md b/addons/magazinerepack/README.md index 28b7c3115a..e86adcd976 100644 --- a/addons/magazinerepack/README.md +++ b/addons/magazinerepack/README.md @@ -1,7 +1,8 @@ ace_magazinerepack ================== -Adds the ability to consolidate multiple half-empty magazines. +Adds the ability to consolidate multiple unfull magazines. + ## Maintainers diff --git a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf index fbd07cf31a..34e369199f 100644 --- a/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf +++ b/addons/magazinerepack/functions/fnc_getMagazineChildren.sqf @@ -7,7 +7,7 @@ * 1: Player * * Return value: - * ChildActiosn + * ChildActions * * Example: * [player, player] call ace_magazinerepack_fnc_getMagazineChildren @@ -16,15 +16,17 @@ */ #include "script_component.hpp" -private ["_unitMagazines", "_unitMagCounts", "_xFullMagazineCount", "_index", "_actions", "_displayName", "_picture", "_action"]; +private ["_unitMagazines", "_unitMagCounts", "_index", "_actions", "_displayName", "_picture", "_action"]; -PARAMS_2(_target,_player); +params ["_target", "_player"]; // get all mags and ammo count _unitMagazines = []; _unitMagCounts = []; { - EXPLODE_4_PVT(_x,_xClassname,_xCount,_xLoaded,_xType); + private "_xFullMagazineCount"; + _x params ["_xClassname", "_xCount", "_xLoaded", "_xType"]; + _xFullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _xClassname >> "count"); //for every partial magazine, that is either in inventory or can be moved there diff --git a/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf index 1f5be8f72a..ab380cb1ed 100644 --- a/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf +++ b/addons/magazinerepack/functions/fnc_magazineRepackFinish.sqf @@ -10,7 +10,7 @@ * 3: Error Code * * Return Value: - * Nothing + * None * * Example: * (args from progressBar) call ace_magazinerepack_fnc_magazineRepackFinish @@ -21,8 +21,9 @@ private ["_structuredOutputText", "_picture", "_fullMags", "_partialMags", "_fullMagazineCount"]; -PARAMS_4(_args,_elapsedTime,_totalTime,_errorCode); -EXPLODE_2_PVT(_args,_magazineClassname,_lastAmmoCount); +params ["_args", "_elapsedTime", "_totalTime", "_errorCode"]; +_args params ["_magazineClassname", "_lastAmmoCount"]; + _fullMagazineCount = getNumber (configfile >> "CfgMagazines" >> _magazineClassname >> "count"); //Don't show anything if player can't interact: diff --git a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf index 64ce05d12d..c1bf5ebdab 100644 --- a/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf +++ b/addons/magazinerepack/functions/fnc_magazineRepackProgress.sqf @@ -20,17 +20,19 @@ private ["_currentAmmoCount", "_addedMagazines", "_missingAmmo", "_index", "_updateMagazinesOnPlayerFnc"]; -PARAMS_3(_args,_elapsedTime,_totalTime); -EXPLODE_3_PVT(_args,_magazineClassname,_lastAmmoCount,_simEvents); -if ((count _simEvents) == 0) exitWith {ERROR("No Event"); false}; -EXPLODE_3_PVT((_simEvents select 0),_nextEventTime,_nextEventIsBullet,_nextEventMags); +params ["_ars", "_elapsedTime", "_totalTime"]; +_args params ["_magazineClassname", "_lastAmmoCount", "_simEvents"]; -if (_nextEventTime > _elapsedTime) exitWith {true};//waiting on next event +if !((_simEvents select 0) params ["_nextEventTime", "_nextEventIsBullet", "_nextEventMags"]) exitWith { ERROR("No Event"); false }; + + + +if (_nextEventTime > _elapsedTime) exitWith { true };//waiting on next event //Verify we aren't missing any ammo _currentAmmoCount = []; { - EXPLODE_2_PVT(_x,_xClassname,_xCount); + _x params ["_xClassname", "_xCount"]; if (_xClassname == _magazineClassname) then { _currentAmmoCount pushBack _xCount; }; @@ -50,7 +52,7 @@ _missingAmmo = false; }; } forEach _lastAmmoCount; -if (_missingAmmo) exitWith {false}; //something removed ammo that was being repacked (could be other players or scripts) +if (_missingAmmo) exitWith { false }; //something removed ammo that was being repacked (could be other players or scripts) _updateMagazinesOnPlayerFnc = { ACE_player removeMagazines _magazineClassname; //remove inventory magazines @@ -75,4 +77,4 @@ if (_nextEventIsBullet) then { _simEvents deleteAt 0; //pop off the event -true; +true diff --git a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf index e57e569dc1..646bd880af 100644 --- a/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf +++ b/addons/magazinerepack/functions/fnc_simulateRepackEvents.sqf @@ -19,20 +19,20 @@ */ #include "script_component.hpp" -private ["_newMagFnc", "_time", "_events", "_swapAmmoFnc", "_ammoSwaped", "_lowIndex", "_highIndex", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded", "_swapProgress"]; +private ["_fnc_newMag", "_time", "_events", "_fnc_swapAmmo", "_ammoSwaped", "_lowIndex", "_highIndex", "_ammoToTransfer", "_ammoAvailable", "_ammoNeeded", "_swapProgress"]; -PARAMS_3(_fullMagazineCount,_arrayOfAmmoCounts,_isBelt); +params ["_fullMagazineCount", "_arrayOfAmmoCounts", "_isBelt"]; // Sort Ascending - Don't modify original _arrayOfAmmoCounts = +_arrayOfAmmoCounts; _arrayOfAmmoCounts sort true; -_newMagFnc = { +_fnc_newMag = { _time = _time + GVAR(TimePerMagazine); _events pushBack [_time, false, +_arrayOfAmmoCounts]; }; -_swapAmmoFnc = if (_isBelt) then { +_fnc_swapAmmo = if (_isBelt) then { { _time = _time + GVAR(TimePerBeltLink); _arrayOfAmmoCounts set [_lowIndex, ((_arrayOfAmmoCounts select _lowIndex) - _ammoSwaped)]; @@ -64,14 +64,14 @@ while {_lowIndex < _highIndex} do { if (_ammoAvailable == 0) then { _lowIndex = _lowIndex + 1; - call _newMagFnc; + call _fnc_newMag; } else { if (_ammoNeeded == 0) then { _highIndex = _highIndex - 1; - call _newMagFnc; + call _fnc_newMag; } else { _ammoSwaped = _ammoAvailable min _ammoNeeded; - call _swapAmmoFnc; + call _fnc_swapAmmo; }; }; }; diff --git a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf index e0621a41be..b11fc3697d 100644 --- a/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf +++ b/addons/magazinerepack/functions/fnc_startRepackingMagazine.sqf @@ -21,7 +21,7 @@ private ["_magazineCfg", "_fullMagazineCount", "_isBelt", "_startingAmmoCounts", "_simEvents", "_totalTime"]; -PARAMS_3(_target,_player,_magazineClassname); +params ["_target", "_player", "_magazineClassname"]; if (isNil "_magazineClassname" || {_magazineClassname == ""}) exitWith {ERROR("Bad Mag Classname");}; _magazineCfg = configfile >> "CfgMagazines" >> _magazineClassname; @@ -63,11 +63,11 @@ _simEvents = [_fullMagazineCount, _startingAmmoCounts, _isBelt] call FUNC(simula _totalTime = (_simEvents select ((count _simEvents) - 1) select 0); [ -_totalTime, -[_magazineClassname, _startingAmmoCounts, _simEvents], -{_this call FUNC(magazineRepackFinish)}, -{_this call FUNC(magazineRepackFinish)}, -(localize LSTRING(RepackingMagazine)), -{_this call FUNC(magazineRepackProgress)}, -["isNotInside", "isNotSitting"] + _totalTime, + [_magazineClassname, _startingAmmoCounts, _simEvents], + {_this call FUNC(magazineRepackFinish)}, + {_this call FUNC(magazineRepackFinish)}, + (localize LSTRING(RepackingMagazine)), + {_this call FUNC(magazineRepackProgress)}, + ["isNotInside", "isNotSitting"] ] call EFUNC(common,progressBar); diff --git a/addons/main/CfgModuleCategories.hpp b/addons/main/CfgModuleCategories.hpp index 5297ec1e99..a3dd65c544 100644 --- a/addons/main/CfgModuleCategories.hpp +++ b/addons/main/CfgModuleCategories.hpp @@ -5,4 +5,7 @@ class CfgFactionClasses { priority = 2; side = 7; }; + class ACE_Logistics: ACE { + displayName = CSTRING(Category_Logistics); + }; }; diff --git a/addons/main/CfgVehicleClasses.hpp b/addons/main/CfgVehicleClasses.hpp new file mode 100644 index 0000000000..9aa807f3f5 --- /dev/null +++ b/addons/main/CfgVehicleClasses.hpp @@ -0,0 +1,5 @@ +class CfgVehicleClasses { + class ACE_Logistics_Items { + displayName = CSTRING(Category_Logistics); + }; +}; diff --git a/addons/main/config.cpp b/addons/main/config.cpp index eb136f84cf..c44f9d1d46 100644 --- a/addons/main/config.cpp +++ b/addons/main/config.cpp @@ -1,4 +1,4 @@ -#include "script_component.hpp" +#include "script_component.hpp" class CfgPatches { class ADDON { @@ -541,7 +541,7 @@ class CfgPatches { "a3_weapons_f_vests", "a3data", "map_vr", - "extended_eventhandlers", "CBA_UI", "CBA_XEH", "CBA_XEH_A3" + "extended_eventhandlers", "cba_ui", "cba_xeh", "cba_xeh_a3", "cba_jr" }; author[] = {"ACE Team"}; authorUrl = ""; @@ -587,3 +587,4 @@ class CfgSettings { }; #include "CfgModuleCategories.hpp" +#include "CfgVehicleClasses.hpp" diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index e67c45e675..41514e4aaf 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -97,5 +97,87 @@ // Time functions for accuracy per frame #define ACE_tickTime (ACE_time + (diag_tickTime - ACE_diagTime)) +#define ACE_LOG(module,level,message) diag_log text ACE_LOGFORMAT(module,level,message) +#define ACE_LOGFORMAT(module,level,message) FORMAT_2(QUOTE([ACE] (module) %1: %2),level,message) -#include "script_debug.hpp" \ No newline at end of file +#define ACE_LOGERROR(message) ACE_LOG(COMPONENT,"ERROR",message) +#define ACE_LOGERROR_1(message,arg1) ACE_LOGERROR(FORMAT_1(message,arg1)) +#define ACE_LOGERROR_2(message,arg1,arg2) ACE_LOGERROR(FORMAT_2(message,arg1,arg2)) +#define ACE_LOGERROR_3(message,arg1,arg2,arg3) ACE_LOGERROR(FORMAT_3(message,arg1,arg2,arg3)) +#define ACE_LOGERROR_4(message,arg1,arg2,arg3,arg4) ACE_LOGERROR(FORMAT_4(message,arg1,arg2,arg3,arg4)) +#define ACE_LOGERROR_5(message,arg1,arg2,arg3,arg4,arg5) ACE_LOGERROR(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5)) +#define ACE_LOGERROR_6(message,arg1,arg2,arg3,arg4,arg5,arg6) ACE_LOGERROR(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6)) +#define ACE_LOGERROR_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) ACE_LOGERROR(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7)) +#define ACE_LOGERROR_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ACE_LOGERROR(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)) + +#define ACE_ERRORFORMAT(message) ACE_LOGFORMAT(COMPONENT,"ERROR",message) +#define ACE_ERRORFORMAT_1(message,arg1) ACE_ERRORFORMAT(FORMAT_1(message,arg1)) +#define ACE_ERRORFORMAT_2(message,arg1,arg2) ACE_ERRORFORMAT(FORMAT_2(message,arg1,arg2)) +#define ACE_ERRORFORMAT_3(message,arg1,arg2,arg3) ACE_ERRORFORMAT(FORMAT_3(message,arg1,arg2,arg3)) +#define ACE_ERRORFORMAT_4(message,arg1,arg2,arg3,arg4) ACE_ERRORFORMAT(FORMAT_4(message,arg1,arg2,arg3,arg4)) +#define ACE_ERRORFORMAT_5(message,arg1,arg2,arg3,arg4,arg5) ACE_ERRORFORMAT(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5)) +#define ACE_ERRORFORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6) ACE_ERRORFORMAT(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6)) +#define ACE_ERRORFORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) ACE_ERRORFORMAT(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7)) +#define ACE_ERRORFORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ACE_ERRORFORMAT(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)) + +#define ACE_LOGWARNING(message) ACE_LOG(COMPONENT,"WARNING",message) +#define ACE_LOGWARNING_1(message,arg1) ACE_LOGWARNING(FORMAT_1(message,arg1)) +#define ACE_LOGWARNING_2(message,arg1,arg2) ACE_LOGWARNING(FORMAT_2(message,arg1,arg2)) +#define ACE_LOGWARNING_3(message,arg1,arg2,arg3) ACE_LOGWARNING(FORMAT_3(message,arg1,arg2,arg3)) +#define ACE_LOGWARNING_4(message,arg1,arg2,arg3,arg4) ACE_LOGWARNING(FORMAT_4(message,arg1,arg2,arg3,arg4)) +#define ACE_LOGWARNING_5(message,arg1,arg2,arg3,arg4,arg5) ACE_LOGWARNING(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5)) +#define ACE_LOGWARNING_6(message,arg1,arg2,arg3,arg4,arg5,arg6) ACE_LOGWARNING(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6)) +#define ACE_LOGWARNING_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) ACE_LOGWARNING(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7)) +#define ACE_LOGWARNING_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ACE_LOGWARNING(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)) + +#define ACE_WARNINGFORMAT(message) ACE_LOGFORMAT(COMPONENT,"WARNING",message) +#define ACE_WARNINGFORMAT_1(message,arg1) ACE_WARNINGFORMAT(FORMAT_1(message,arg1)) +#define ACE_WARNINGFORMAT_2(message,arg1,arg2) ACE_WARNINGFORMAT(FORMAT_2(message,arg1,arg2)) +#define ACE_WARNINGFORMAT_3(message,arg1,arg2,arg3) ACE_WARNINGFORMAT(FORMAT_3(message,arg1,arg2,arg3)) +#define ACE_WARNINGFORMAT_4(message,arg1,arg2,arg3,arg4) ACE_WARNINGFORMAT(FORMAT_4(message,arg1,arg2,arg3,arg4)) +#define ACE_WARNINGFORMAT_5(message,arg1,arg2,arg3,arg4,arg5) ACE_WARNINGFORMAT(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5)) +#define ACE_WARNINGFORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6) ACE_WARNINGFORMAT(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6)) +#define ACE_WARNINGFORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) ACE_WARNINGFORMAT(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7)) +#define ACE_WARNINGFORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ACE_WARNINGFORMAT(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)) + +#define ACE_LOGINFO(message) ACE_LOG(COMPONENT,"INFO",message) +#define ACE_LOGINFO_1(message,arg1) ACE_LOGINFO(FORMAT_1(message,arg1)) +#define ACE_LOGINFO_2(message,arg1,arg2) ACE_LOGINFO(FORMAT_2(message,arg1,arg2)) +#define ACE_LOGINFO_3(message,arg1,arg2,arg3) ACE_LOGINFO(FORMAT_3(message,arg1,arg2,arg3)) +#define ACE_LOGINFO_4(message,arg1,arg2,arg3,arg4) ACE_LOGINFO(FORMAT_4(message,arg1,arg2,arg3,arg4)) +#define ACE_LOGINFO_5(message,arg1,arg2,arg3,arg4,arg5) ACE_LOGINFO(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5)) +#define ACE_LOGINFO_6(message,arg1,arg2,arg3,arg4,arg5,arg6) ACE_LOGINFO(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6)) +#define ACE_LOGINFO_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) ACE_LOGINFO(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7)) +#define ACE_LOGINFO_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ACE_LOGINFO(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)) + +#define ACE_INFOFORMAT(message) ACE_LOGFORMAT(COMPONENT,"INFO",message) +#define ACE_INFOFORMAT_1(message,arg1) ACE_INFOFORMAT(FORMAT_1(message,arg1)) +#define ACE_INFOFORMAT_2(message,arg1,arg2) ACE_INFOFORMAT(FORMAT_2(message,arg1,arg2)) +#define ACE_INFOFORMAT_3(message,arg1,arg2,arg3) ACE_INFOFORMAT(FORMAT_3(message,arg1,arg2,arg3)) +#define ACE_INFOFORMAT_4(message,arg1,arg2,arg3,arg4) ACE_INFOFORMAT(FORMAT_4(message,arg1,arg2,arg3,arg4)) +#define ACE_INFOFORMAT_5(message,arg1,arg2,arg3,arg4,arg5) ACE_INFOFORMAT(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5)) +#define ACE_INFOFORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6) ACE_INFOFORMAT(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6)) +#define ACE_INFOFORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) ACE_INFOFORMAT(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7)) +#define ACE_INFOFORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ACE_INFOFORMAT(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)) + +#define ACE_LOGDEBUG(message) ACE_LOG(COMPONENT,"DEBUG",message) +#define ACE_LOGDEBUG_1(message,arg1) ACE_LOGDEBUG(FORMAT_1(message,arg1)) +#define ACE_LOGDEBUG_2(message,arg1,arg2) ACE_LOGDEBUG(FORMAT_2(message,arg1,arg2)) +#define ACE_LOGDEBUG_3(message,arg1,arg2,arg3) ACE_LOGDEBUG(FORMAT_3(message,arg1,arg2,arg3)) +#define ACE_LOGDEBUG_4(message,arg1,arg2,arg3,arg4) ACE_LOGDEBUG(FORMAT_4(message,arg1,arg2,arg3,arg4)) +#define ACE_LOGDEBUG_5(message,arg1,arg2,arg3,arg4,arg5) ACE_LOGDEBUG(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5)) +#define ACE_LOGDEBUG_6(message,arg1,arg2,arg3,arg4,arg5,arg6) ACE_LOGDEBUG(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6)) +#define ACE_LOGDEBUG_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) ACE_LOGDEBUG(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7)) +#define ACE_LOGDEBUG_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ACE_LOGDEBUG(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)) + +#define ACE_DEBUGFORMAT(message) ACE_LOGFORMAT(COMPONENT,"DEBUG",message) +#define ACE_DEBUGFORMAT_1(message,arg1) ACE_DEBUGFORMAT(FORMAT_1(message,arg1)) +#define ACE_DEBUGFORMAT_2(message,arg1,arg2) ACE_DEBUGFORMAT(FORMAT_2(message,arg1,arg2)) +#define ACE_DEBUGFORMAT_3(message,arg1,arg2,arg3) ACE_DEBUGFORMAT(FORMAT_3(message,arg1,arg2,arg3)) +#define ACE_DEBUGFORMAT_4(message,arg1,arg2,arg3,arg4) ACE_DEBUGFORMAT(FORMAT_4(message,arg1,arg2,arg3,arg4)) +#define ACE_DEBUGFORMAT_5(message,arg1,arg2,arg3,arg4,arg5) ACE_DEBUGFORMAT(FORMAT_5(message,arg1,arg2,arg3,arg4,arg5)) +#define ACE_DEBUGFORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6) ACE_DEBUGFORMAT(FORMAT_6(message,arg1,arg2,arg3,arg4,arg5,arg6)) +#define ACE_DEBUGFORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7) ACE_DEBUGFORMAT(FORMAT_7(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7)) +#define ACE_DEBUGFORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8) ACE_DEBUGFORMAT(FORMAT_8(message,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)) + +#include "script_debug.hpp" diff --git a/addons/main/stringtable.xml b/addons/main/stringtable.xml new file mode 100644 index 0000000000..266e21bf40 --- /dev/null +++ b/addons/main/stringtable.xml @@ -0,0 +1,9 @@ + + + + + ACE Logistics + ACE Logistyka + + + \ No newline at end of file diff --git a/addons/map/ACE_Settings.hpp b/addons/map/ACE_Settings.hpp index 15e2a174e4..4e2a5d5706 100644 --- a/addons/map/ACE_Settings.hpp +++ b/addons/map/ACE_Settings.hpp @@ -15,6 +15,10 @@ class ACE_Settings { value = 1; typeName = "BOOL"; }; + class GVAR(mapGlow) { + value = 1; + typeName = "BOOL"; + }; class GVAR(mapShake) { value = 1; typeName = "BOOL"; diff --git a/addons/map/CfgAmmo.hpp b/addons/map/CfgAmmo.hpp new file mode 100644 index 0000000000..805e7b3627 --- /dev/null +++ b/addons/map/CfgAmmo.hpp @@ -0,0 +1,48 @@ +class CfgAmmo { + + class FlareCore; + + class FlareBase: FlareCore {}; + class F_20mm_White: FlareBase {}; + + class ACE_FlashlightProxy_White: F_20mm_White { + model = ""; + effectFlare = "FlareShell"; + + triggerTime = 0; + intensity = 0.5; + flareSize = 1; + timeToLive = 10e10; + + lightColor[] = {1,1,1,1}; + + grenadeBurningSound[] = {}; + grenadeFireSound[] = {}; + soundTrigger[] = {}; + SmokeShellSoundHit1[] = {}; + SmokeShellSoundHit2[] = {}; + SmokeShellSoundHit3[] = {}; + SmokeShellSoundLoop1[] = {}; + SmokeShellSoundLoop2[] = {}; + }; + + class ACE_FlashlightProxy_Red: ACE_FlashlightProxy_White { + intensity = 1; + lightColor[] = {1,0,0,1}; + }; + + class ACE_FlashlightProxy_Green: ACE_FlashlightProxy_White { + intensity = 1; + lightColor[] = {0,1,0,1}; + }; + + class ACE_FlashlightProxy_Blue: ACE_FlashlightProxy_White { + intensity = 1.5; + lightColor[] = {0.25,0.25,1,1}; + }; + + class ACE_FlashlightProxy_Yellow: ACE_FlashlightProxy_White { + intensity = 1; + lightColor[] = {1,1,0.5,1}; + }; +}; \ No newline at end of file diff --git a/addons/map/CfgSounds.hpp b/addons/map/CfgSounds.hpp new file mode 100644 index 0000000000..ede59914a7 --- /dev/null +++ b/addons/map/CfgSounds.hpp @@ -0,0 +1,7 @@ +class CfgSounds { + class ACE_map_flashlightClick { + name = "ACE_map_flashlightClick"; + sound[] = {"\a3\sounds_f\weapons\Other\dry4.wss", 0.2, 2}; + titles[] = {}; + }; +}; \ No newline at end of file diff --git a/addons/map/CfgVehicles.hpp b/addons/map/CfgVehicles.hpp index 30cae96ef6..3b203c1f62 100644 --- a/addons/map/CfgVehicles.hpp +++ b/addons/map/CfgVehicles.hpp @@ -1,4 +1,20 @@ class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_MapFlashlight { + displayName = CSTRING(Action_Flashlights); + icon = QUOTE(\a3\ui_f\data\IGUI\Cfg\VehicleToggles\lightsiconon_ca.paa); + condition = QUOTE(GVAR(mapIllumination) && visibleMap && (count ([ACE_player] call FUNC(getUnitFlashlights)) > 0)); + statement = "true"; + exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; + insertChildren = QUOTE(_this call DFUNC(compileFlashlightMenu)); + showDisabled = 0; + priority = 99; + }; + }; + }; + class ACE_Module; class ACE_ModuleMap: ACE_Module { author = ECSTRING(common,ACETeam); @@ -15,6 +31,12 @@ class CfgVehicles { typeName = "BOOL"; defaultValue = 1; }; + class MapGlow { + displayName = CSTRING(MapGlow_DisplayName); + description = CSTRING(MapGlow_Description); + typeName = "BOOL"; + defaultValue = 1; + }; class MapShake { displayName = CSTRING(MapShake_DisplayName); description = CSTRING(MapShake_Description); @@ -45,7 +67,7 @@ class CfgVehicles { displayName = CSTRING(BFT_Module_DisplayName); function = QFUNC(blueForceTrackingModule); scope = 2; - isGlobal = 0; + isGlobal = 1; icon = PATHTOF(UI\Icon_Module_BFTracking_ca.paa); class Arguments { class Enabled { @@ -71,4 +93,4 @@ class CfgVehicles { description = CSTRING(BFT_Module_Description); }; }; -}; +}; \ No newline at end of file diff --git a/addons/map/README.md b/addons/map/README.md index 6544d0f236..7567986ba5 100644 --- a/addons/map/README.md +++ b/addons/map/README.md @@ -1,12 +1,12 @@ ace_map ======= -Various tweaks to the in-game map. Including: +Various tweaks to the in-game map, including: - Better map styling (countours, legend, hiding bushes and trees, etc). - Max zoom level (optional) - Map shaking while walking (optional) - Map illumination (optional) -- Blufor tracker (optional) +- Blue Force Tracker (optional) ## Maintainers diff --git a/addons/map/XEH_postInitClient.sqf b/addons/map/XEH_postInitClient.sqf index 95f42db431..ef528d5233 100644 --- a/addons/map/XEH_postInitClient.sqf +++ b/addons/map/XEH_postInitClient.sqf @@ -1,23 +1,24 @@ #include "script_component.hpp" // Exit on Headless as well -if !(hasInterface) exitWith {}; +if (!hasInterface) exitWith {}; LOG(MSG_INIT); // Calculate the maximum zoom allowed for this map call FUNC(determineZoom); -// This spawn is probably worth keeping, as pfh don't work natively on the briefing screen and IDK how reliable the hack we implemented for them is. -// The thread dies as soon as the mission start, so it's not really compiting for scheduler space. -[] spawn { - // Wait until the map display is detected - waitUntil {(!isNull findDisplay 12)}; +[{ + if (isNull findDisplay 12) exitWith {}; GVAR(lastStillPosition) = ((findDisplay 12) displayCtrl 51) ctrlMapScreenToWorld [0.5, 0.5]; GVAR(lastStillTime) = ACE_time; GVAR(isShaking) = false; + //map sizes are multiples of 1280 + GVAR(worldSize) = worldSize / 1280; + GVAR(mousePos) = [0.5,0.5]; + //Allow panning the lastStillPosition while mapShake is active GVAR(rightMouseButtonLastPos) = []; ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["Draw", {[] call FUNC(updateMapEffects);}]; @@ -42,13 +43,59 @@ call FUNC(determineZoom); GVAR(rightMouseButtonLastPos) = []; }; }]; -}; + + //get mouse position on map + ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseMoving", { + GVAR(mousePos) = (_this select 0) ctrlMapScreenToWorld [_this select 1, _this select 2]; + }]; + ((findDisplay 12) displayCtrl 51) ctrlAddEventHandler ["MouseHolding", { + GVAR(mousePos) = (_this select 0) ctrlMapScreenToWorld [_this select 1, _this select 2]; + }]; + + [_this select 1] call CBA_fnc_removePerFrameHandler; +}, 0] call CBA_fnc_addPerFrameHandler; ["SettingsInitialized", { // Start Blue Force Tracking if Enabled if (GVAR(BFT_Enabled)) then { - diag_log text "[ACE] Blue Force Tracking Enabled (client)"; GVAR(BFT_markers) = []; [FUNC(blueForceTrackingUpdate), GVAR(BFT_Interval), []] call CBA_fnc_addPerFrameHandler; }; -}] call EFUNC(common,addEventHandler); + + //illumination settings + if (GVAR(mapIllumination)) then { + GVAR(flashlightInUse) = ""; + GVAR(glow) = objNull; + + ["playerInventoryChanged", { + _flashlights = [ACE_player] call FUNC(getUnitFlashlights); + if ((GVAR(flashlightInUse) != "") && !(GVAR(flashlightInUse) in _flashlights)) then { + GVAR(flashlightInUse) = ""; + }; + }] call EFUNC(common,addEventHandler); + + if (GVAR(mapGlow)) then { + ["visibleMapChanged", { + params ["_player", "_mapOn"]; + if (_mapOn) then { + if (!alive _player && !isNull GVAR(glow)) then { + GVAR(flashlightInUse) = ""; + }; + if (GVAR(flashlightInUse) != "") then { + if (isNull GVAR(glow)) then { + [GVAR(flashlightInUse)] call FUNC(flashlightGlow); + }; + } else { + if (!isNull GVAR(glow)) then { + [""] call FUNC(flashlightGlow); + }; + }; + } else { + if (!isNull GVAR(glow)) then { + [""] call FUNC(flashlightGlow); + }; + }; + }] call EFUNC(common,addEventHandler); + }; + }; +}] call EFUNC(common,addEventHandler); \ No newline at end of file diff --git a/addons/map/XEH_preInit.sqf b/addons/map/XEH_preInit.sqf index c5645a52e7..9e123a3877 100644 --- a/addons/map/XEH_preInit.sqf +++ b/addons/map/XEH_preInit.sqf @@ -5,10 +5,15 @@ LOG(MSG_INIT); PREP(blueForceTrackingModule); PREP(blueForceTrackingUpdate); +PREP(compileFlashlightMenu); PREP(determineMapLight); PREP(determineZoom); +PREP(flashlightGlow); +PREP(getUnitFlashlights); PREP(moduleMap); PREP(onDrawMap); +PREP(simulateMapLight); +PREP(switchFlashlight); PREP(updateMapEffects); ADDON = true; diff --git a/addons/map/config.cpp b/addons/map/config.cpp index 16cfd2bc31..6d6b4030ec 100644 --- a/addons/map/config.cpp +++ b/addons/map/config.cpp @@ -27,6 +27,8 @@ class RscEdit; #include "CfgEventHandlers.hpp" #include "CfgMarkers.hpp" #include "CfgVehicles.hpp" +#include "CfgAmmo.hpp" +#include "CfgSounds.hpp" class RscMapControl { maxSatelliteAlpha = 0.5; diff --git a/addons/map/functions/fnc_blueForceTrackingModule.sqf b/addons/map/functions/fnc_blueForceTrackingModule.sqf index 33049c38ca..bab776c9ab 100644 --- a/addons/map/functions/fnc_blueForceTrackingModule.sqf +++ b/addons/map/functions/fnc_blueForceTrackingModule.sqf @@ -12,12 +12,15 @@ #include "script_component.hpp" -if (!isServer) exitWith {}; +if !(hasInterface) exitWith {}; -PARAMS_1(_logic); +PARAMS_3(_logic,_units,_activated); + +if !(_activated) exitWith {}; [_logic, QGVAR(BFT_Enabled), "Enabled"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(BFT_Interval), "Interval"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(BFT_HideAiGroups), "HideAiGroups"] call EFUNC(common,readSettingFromModule); -diag_log text "[ACE]: Blue Force Tracking Module initialized. (server)"; +diag_log text "[ACE]: Blue Force Tracking Module initialized."; +TRACE_2("[ACE]: Blue Force Tracking Module initialized.", GVAR(BFT_Interval), GVAR(BFT_HideAiGroups)); diff --git a/addons/map/functions/fnc_compileFlashlightMenu.sqf b/addons/map/functions/fnc_compileFlashlightMenu.sqf new file mode 100644 index 0000000000..0d081bb57c --- /dev/null +++ b/addons/map/functions/fnc_compileFlashlightMenu.sqf @@ -0,0 +1,65 @@ +/* + * Author: voiper + * Compile list of flashlight classnames and add to the "Flashlight" parent menu. + * + * Arguments: + * 0: Vehicle + * 1: Player + * 3: Parameters + * + * Return value: + * None + * + * Example: + * [_player, _player, []] call ace_map_fnc_compileFlashlightMenu; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_vehicle", "_player", "_parameters"]; + +_actions = []; +_flashlights = [_player] call FUNC(getUnitFlashlights); + +//add all carried flashlight menus and on/off submenu actions +{ + _displayName = getText (configFile >> "CfgWeapons" >> _x >> "displayName"); + _icon = getText (configFile >> "CfgWeapons" >> _x >> "picture"); + + _children = { + params ["_vehicle", "_player", "_flashlight"]; + _actions = []; + + _onAction = [ + (_flashlight + "_On"), + "On", + "", + {[_this select 2] call FUNC(switchFlashlight)}, + {GVAR(flashlightInUse) != (_this select 2)}, + {}, + _flashlight + ] call EFUNC(interact_menu,createAction); + + _offAction = [ + (_flashlight + "_Off"), + "Off", + "", + {[""] call FUNC(switchFlashlight)}, + {GVAR(flashlightInUse) == (_this select 2)}, + {}, + _flashlight + ] call EFUNC(interact_menu,createAction); + + _actions pushBack [_onAction, [], _player]; + _actions pushBack [_offAction, [], _player]; + + _actions + }; + + _parentAction = [_x, _displayName, _icon, {true}, {true}, _children, _x] call EFUNC(interact_menu,createAction); + _actions pushBack [_parentAction, [], _player]; +} forEach _flashlights; + +_actions \ No newline at end of file diff --git a/addons/map/functions/fnc_determineMapLight.sqf b/addons/map/functions/fnc_determineMapLight.sqf index 9c205299e6..8204b4b7f8 100644 --- a/addons/map/functions/fnc_determineMapLight.sqf +++ b/addons/map/functions/fnc_determineMapLight.sqf @@ -55,11 +55,13 @@ _fnc_calcColor = { _lightLevel = 0.04 + (0.96 * call EFUNC(common,ambientBrightness)); +/* // check if player has NVG enabled if (currentVisionMode _unit == 1) exitWith { // stick to nvg color [true, [154/255,253/255,177/255,0.5]] }; +*/ // Do not obscure the map if the ambient light level is above 0.95 if (_lightLevel > 0.95) exitWith { @@ -122,4 +124,4 @@ if (_lightLevel > 0.95) exitWith { }; // Calculate resulting map color -[true, [_lightTint, _lightLevel] call _fnc_calcColor] +[true, [_lightTint, _lightLevel] call _fnc_calcColor] \ No newline at end of file diff --git a/addons/map/functions/fnc_flashlightGlow.sqf b/addons/map/functions/fnc_flashlightGlow.sqf new file mode 100644 index 0000000000..5e72a6c183 --- /dev/null +++ b/addons/map/functions/fnc_flashlightGlow.sqf @@ -0,0 +1,35 @@ +/* + * Author: voiper + * Add or remove global flashlight glow for when player is looking at map. + * + * Arguments: + * 0: Flashlight classname ("" for off) + * + * Return value: + * None + * + * Example: + * ["ACE_Flashlight_MX991"] call ace_map_fnc_flashlightGlow; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_flashlight"]; + +_light = GVAR(glow); +if (!isNull _light) then {deleteVehicle _light}; + +if (_flashlight != "") then { + _colour = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour"); + if !(_colour in ["white", "red", "green", "blue", "yellow"]) then {_colour = "white"}; + _class = format["ACE_FlashlightProxy_%1", _colour]; + + _light = _class createVehicle [0,0,0]; + _light attachTo [ACE_player, [0,0.5,-0.1], "head"]; +} else { + _light = objNull; +}; + +GVAR(glow) = _light; \ No newline at end of file diff --git a/addons/map/functions/fnc_getUnitFlashlights.sqf b/addons/map/functions/fnc_getUnitFlashlights.sqf new file mode 100644 index 0000000000..8fb8066374 --- /dev/null +++ b/addons/map/functions/fnc_getUnitFlashlights.sqf @@ -0,0 +1,29 @@ +/* + * Author: voiper + * Check a unit for any flashlights that can be used on map. + * + * Arguments: + * 0: Unit to check + * + * Return value: + * Flashlight classnames (empty for none) + * + * Example: + * [unit] call ace_map_fnc_getUnitFlashlights; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_unit"]; + +_flashlights = []; + +{ + if ((isText (configFile >> "CfgWeapons" >> _x >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour")) && !(_x in _flashlights)) then { + _flashlights pushBack _x; + }; +} forEach (items _unit); + +_flashlights \ No newline at end of file diff --git a/addons/map/functions/fnc_moduleMap.sqf b/addons/map/functions/fnc_moduleMap.sqf index 514d2af034..b763db7eea 100644 --- a/addons/map/functions/fnc_moduleMap.sqf +++ b/addons/map/functions/fnc_moduleMap.sqf @@ -8,15 +8,17 @@ * Return Value: * None */ + #include "script_component.hpp" if !(isServer) exitWith {}; -PARAMS_3(_logic,_units,_activated); +params ["_logic", "_units", "_activated"]; if !(_activated) exitWith {}; [_logic, QGVAR(mapIllumination), "MapIllumination" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(mapGlow), "MapGlow" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(mapShake), "MapShake" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(mapLimitZoom), "MapLimitZoom" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(mapShowCursorCoordinates), "MapShowCursorCoordinates"] call EFUNC(common,readSettingFromModule); diff --git a/addons/map/functions/fnc_simulateMapLight.sqf b/addons/map/functions/fnc_simulateMapLight.sqf new file mode 100644 index 0000000000..9554409e15 --- /dev/null +++ b/addons/map/functions/fnc_simulateMapLight.sqf @@ -0,0 +1,89 @@ +/* +* Author: voiper +* Draw nearby lighting and sexy flashlight beams on main map. +* +* Arguments: +* 0: Map control +* 1: Map zoom level +* 2: Current map centre +* 3: Light level from ace_map_fnc_determineMapLight +* +* Return Value: +* None +* +* Public: No +*/ + +#include "script_component.hpp" + +params ["_mapCtrl", "_mapScale", "_mapCentre", "_lightLevel"]; + +_hmd = hmd ACE_player; +_flashlight = GVAR(flashlightInUse); + +//map width (on screen) in pixels +_screenSize = 640 * safeZoneW; + +//resolution params (every frame in case resolution change) +getResolution params ["_resX", "_resY", "_viewPortX", "_viewPortY", "", "_uiScale"]; + +//engine rounds the viewport ratios, when they should be fractions; this can cause problems +_realViewPortY = _resY * _uiScale; +_realViewPortX = _realViewPortY * 4/3; + +//textures +_fillTex = "#(rgb,8,8,3)color(0,0,0,1)"; + +//colour/alpha +_lightLevel params ["_r", "_g", "_b", "_a"]; +_colourAlpha = (_r + _g + _b) min _a; +_shadeAlpha = _a; + +_colourList = [_r, _g, _b]; +_colourList sort false; +_maxColour = _colourList select 0; + +//ambient colour fill +_mapCtrl drawIcon [format["#(rgb,8,8,3)color(%1,%2,%3,1)", _r / _maxColour, _g / _maxColour, _b / _maxColour], [1,1,1,_colourAlpha], _mapCentre, _screenSize, _screenSize, 0, "", 0]; + +if (_flashlight == "") then { + //ambient shade fill + _mapCtrl drawIcon [_fillTex, [1,1,1,_shadeAlpha], _mapCentre, _screenSize, _screenSize, 0, "", 0]; +} else { + //mouse pos + _mousePos = GVAR(mousePos); + + //flashlight settings + _colour = getText (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Colour"); + if !(_colour in ["white", "red", "green", "blue", "yellow"]) then {_colour = "white"}; + _size = getNumber (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Size"); + _flashTex = format[QUOTE(PATHTOF_SYS(ace,flashlights,UI\Flashlight_Beam_%1_ca.paa)), _colour]; + _beamSize = _screenSize / _size; + + //after 5x zoom, it's simulated to be fixed (it actually gets bigger relative to zoom) + if (_mapScale < 0.2) then {_beamSize = _beamSize / (_mapScale * (1 / 0.2))}; + + //assign corrective ratio to fix sub-pixel gaps/overlaps (symptom of viewport * X/Y resolution rounding) + _viewPortRatioFixY = if (_realViewPortY != _viewPortY) then { + _realViewPortX / (_realViewPortY / _viewPortY * _viewPortX) + } else { + if (_realViewPortX != _viewPortX) then { + _realViewPortX / _viewPortX + } else { + 1 + }; + }; + + //offset the elements + _offsetX = _mapScale * GVAR(worldSize) * (_screenSize * 2 + _beamSize); + _offsetYDown = _mapScale * GVAR(worldSize) * (_screenSize + _beamSize) * _viewPortRatioFixY; + //up is bigger because of a potential exploit + _offsetYUp = _mapScale * GVAR(worldSize) * (_screenSize * 4 + _beamSize) * _viewPortRatioFixY; + + //draw the matrix /whoa + _mapCtrl drawIcon [_flashTex, [1,1,1,_shadeAlpha], _mousePos, _beamSize, _beamSize, 0, "", 0]; //centre beam + _mapCtrl drawIcon [_fillTex, [1,1,1,_shadeAlpha], [(_mousePos select 0) - _offsetX, (_mousePos select 1)], _screenSize * 2, _beamSize, 0, "", 0]; //left + _mapCtrl drawIcon [_fillTex, [1,1,1,_shadeAlpha], [(_mousePos select 0) + _offsetX, (_mousePos select 1)], _screenSize * 2, _beamSize, 0, "", 0]; //right + _mapCtrl drawIcon [_fillTex, [1,1,1,_shadeAlpha], [(_mousePos select 0), (_mousePos select 1) - _offsetYDown], _screenSize * 4, _screenSize, 0, "", 0]; //down + _mapCtrl drawIcon [_fillTex, [1,1,1,_shadeAlpha], [(_mousePos select 0), (_mousePos select 1) + _offsetYUp], _screenSize * 4, _screenSize * 4, 0, "", 0]; //up +}; \ No newline at end of file diff --git a/addons/map/functions/fnc_switchFlashlight.sqf b/addons/map/functions/fnc_switchFlashlight.sqf new file mode 100644 index 0000000000..e177f886fa --- /dev/null +++ b/addons/map/functions/fnc_switchFlashlight.sqf @@ -0,0 +1,25 @@ +/* + * Author: voioper + * Switch flashlight. + * + * Arguments: + * 0: Flashlight classname ("" for off) + * + * Return value: + * None + * + * Example: + * ["ACE_Flashlight_MX991"] call ace_map_fnc_switchFlashlight; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_flashlight"]; + +GVAR(flashlightInUse) = _flashlight; +if (GVAR(mapGlow)) then { + [GVAR(flashlightInUse)] call FUNC(flashlightGlow); +}; +playSound "ACE_map_flashlightClick"; \ No newline at end of file diff --git a/addons/map/functions/fnc_updateMapEffects.sqf b/addons/map/functions/fnc_updateMapEffects.sqf index 3550df517c..72f5d0cec1 100644 --- a/addons/map/functions/fnc_updateMapEffects.sqf +++ b/addons/map/functions/fnc_updateMapEffects.sqf @@ -10,23 +10,21 @@ * * Public: No */ + #include "script_component.hpp" -private ["_mapCtrl","_mapScale"]; - -_mapCtrl = ((findDisplay 12) displayCtrl 51); +_mapCtrl = findDisplay 12 displayCtrl 51; _mapScale = ctrlMapScale _mapCtrl; +_mapCentre = _mapCtrl ctrlMapScreenToWorld [0.5, 0.5]; if (GVAR(mapIllumination)) then { - private ["_data","_darkenFill"]; + //get nearby lighting + _light = [[ACE_player], FUNC(determineMapLight), missionNamespace, QGVAR(mapLight), 0.1] call EFUNC(common,cachedCall); - // Calculate map illumination - _data = [[ACE_player], FUNC(determineMapLight), missionNamespace, QGVAR(mapLight), 0.1] call EFUNC(common,cachedCall); + _light params ["_applyLighting", "_lightLevel"]; - EXPLODE_2_PVT(_data,_darkenMap,_darkenColor); - if (_darkenMap) then { - _darkenFill = format["#(rgb,1,1,1)color(%1,%2,%3,%4)",_darkenColor select 0, _darkenColor select 1, _darkenColor select 2, _darkenColor select 3]; - _mapCtrl drawRectangle [(getArray(configFile >> 'CfgWorlds' >> worldName >> 'centerPosition')),80000,80000,0,_darkenColor,_darkenFill]; + if (_applyLighting) then { + [_mapCtrl, _mapScale, _mapCentre, _lightLevel] call FUNC(simulateMapLight); }; }; @@ -63,7 +61,7 @@ if (GVAR(mapShake)) then { GVAR(isShaking) = false; } else { // The map is still, store state - GVAR(lastStillPosition) = _mapCtrl ctrlMapScreenToWorld [0.5, 0.5]; + GVAR(lastStillPosition) = _mapCentre; GVAR(lastStillTime) = ACE_time; }; }; @@ -72,7 +70,7 @@ if (GVAR(mapShake)) then { if (GVAR(mapLimitZoom)) then { if (GVAR(minMapSize) >= _mapScale) then { ctrlMapAnimClear _mapCtrl; - _mapCtrl ctrlMapAnimAdd [0, GVAR(minMapSize) + 0.001, (_mapCtrl ctrlMapScreenToWorld [0.5, 0.5])]; + _mapCtrl ctrlMapAnimAdd [0, GVAR(minMapSize) + 0.001, _mapCentre]; ctrlMapAnimCommit _mapCtrl; }; -}; +}; \ No newline at end of file diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index 3f2d312fae..69a5ce6941 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -18,12 +18,13 @@ Iluminação do mapa? - Calculate dynamic map illumination based on light conditions? - Oblicza dynamiczne oświetlenie mapy bazujące na warunkach oświetleniowych - Calcula la iluminación dinámica del mapa basandose en las condiciones de luz - Berechne die Kartenauslichtung anhand des Umgebungslichts? - Vypočítat dynamické osvětlení mapy na základně světelných podmínek? - Calcular a iluminação dinâmica do mapa de acordo com as condições de luz? + Simulate map lighting based on ambient lighting and player's items? + + + Map flashlight glow? + + + Add external glow to players who use flashlight on map? Map shake? @@ -83,7 +84,7 @@ Blue Force Tracking Blue Force Tracking - Blue Force Tracking + Seguimiento de fuerzas amigas Blue Force Tracking Blue Force Tracking Rastreio de forças azuis @@ -141,5 +142,29 @@ Umožňuje sledovat přátelské jednokty na mapě v rámci BFT. Permite que você acompanhe as posições no mapa das unidades aliadas com marcadores RFA. + + Flashlights + Latarki + + + NVG + Noktowizja + + + On + Włącz + + + Off + Wyłącz + + + Increase Brightness + Zwiększ czułość + + + Decrease Brightness + Zmniejsz czułość + \ No newline at end of file diff --git a/addons/maptools/README.md b/addons/maptools/README.md index 9248948efa..f03474b5c0 100644 --- a/addons/maptools/README.md +++ b/addons/maptools/README.md @@ -1,11 +1,12 @@ ace_maptools ============ -Map tools: +Adds the following map tools: - Roamer - Map drawing - Showing GPS on map + ## Maintainers The people responsible for merging changes to this component or answering potential questions. diff --git a/addons/markers/XEH_preInit.sqf b/addons/markers/XEH_preInit.sqf index b2b9ed5c00..e47514f4fa 100644 --- a/addons/markers/XEH_preInit.sqf +++ b/addons/markers/XEH_preInit.sqf @@ -46,7 +46,8 @@ if (isNil QGVAR(MarkerColorsCache)) then { _rgba set [_forEachIndex, call compile _x]; }; } forEach _rgba; - _icon = format ["#(argb,8,8,3)color(%1,%2,%3,%4)", _rgba select 0, _rgba select 1, _rgba select 2, _rgba select 3]; + _rgba params ["_red", "_green", "_blue", "_alpha"]; + _icon = format ["#(argb,8,8,3)color(%1,%2,%3,%4)", _red, _green, _blue, _alpha]; GVAR(MarkerColorsCache) pushBack [_name, _a, _icon]; }; diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index c55e07c360..07e2bc46c4 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -7,7 +7,7 @@ * 0: RscDisplayInsertMarker * * Return Value: - * Nothing + * None * * Example: * [onLoad] call ace_markers_fnc_initInsertMarker; @@ -19,11 +19,12 @@ #define BORDER 0.005 [{ - private ["_display", "_text", "_picture", "_channel", "_buttonOK", "_buttonCancel", "_description", "_title", "_descriptionChannel", "_sizeX", "_sizeY", "_aceShapeLB", "_aceColorLB", "_aceAngleSlider", "_aceAngleSliderText", "_mapIDD", "_pos", "_posX", "_posY", "_posW", "_posH", "_offsetButtons", "_buttonOk", "_curSelShape", "_curSelColor", "_curSelAngle"]; + private ["_text", "_picture", "_channel", "_buttonOK", "_buttonCancel", "_description", "_title", "_descriptionChannel", "_sizeX", "_sizeY", "_aceShapeLB", "_aceColorLB", "_aceAngleSlider", "_aceAngleSliderText", "_mapIDD", "_pos", "_offsetButtons", "_buttonOk", "_curSelShape", "_curSelColor", "_curSelAngle"]; disableserialization; - PARAMS_1(_display); - + params ["_display"]; + TRACE_1("params",_display); + //Can't place markers when can't interact if (!([ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith))) exitWith { _display closeDisplay 2; //emulate "Cancel" button @@ -76,10 +77,8 @@ //--- Background _pos = ctrlposition _text; - _posX = (_pos select 0) + 0.01; - _posY = _pos select 1; - _posW = _pos select 2; - _posH = _pos select 3; + _pos params ["_posX", "_posY", "_posW", "_posH"]; + _posX = _posX + 0.01; _posY = _posY min ((safeZoneH + safeZoneY) - (8 * _posH + 8 * BORDER)); //prevent buttons being placed below bottom edge of screen _pos set [0,_posX]; _pos set [1,_posY]; @@ -173,9 +172,10 @@ // init marker shape lb lbClear _aceShapeLB; { - _aceShapeLB lbAdd (_x select 0); - _aceShapeLB lbSetValue [_forEachIndex, _x select 1]; - _aceShapeLB lbSetPicture [_forEachIndex, _x select 2]; + _x params ["_add", "_set", "_pic"]; + _aceShapeLB lbAdd _add; + _aceShapeLB lbSetValue [_forEachIndex, _set]; + _aceShapeLB lbSetPicture [_forEachIndex, _pic]; } forEach GVAR(MarkersCache); _curSelShape = GETGVAR(curSelMarkerShape,0); _aceShapeLB lbSetCurSel _curSelShape; @@ -188,9 +188,10 @@ // init marker color lb lbClear _aceColorLB; { - _aceColorLB lbAdd (_x select 0); - _aceColorLB lbSetValue [_forEachIndex, _x select 1]; - _aceColorLB lbSetPicture [_forEachIndex, _x select 2]; + _x params ["_add", "_set", "_pic"]; + _aceColorLB lbAdd _add; + _aceColorLB lbSetValue [_forEachIndex, _set]; + _aceColorLB lbSetPicture [_forEachIndex, _pic]; } forEach GVAR(MarkerColorsCache); _curSelColor = GETGVAR(curSelMarkerColor,0); _aceColorLB lbSetCurSel _curSelColor; diff --git a/addons/markers/functions/fnc_mapDrawEH.sqf b/addons/markers/functions/fnc_mapDrawEH.sqf index 2e23dacec8..babdfbbb44 100644 --- a/addons/markers/functions/fnc_mapDrawEH.sqf +++ b/addons/markers/functions/fnc_mapDrawEH.sqf @@ -6,7 +6,7 @@ * 0: TheMap * * Return Value: - * Nothing + * None * * Example: * [theMapControl] call ace_markers_fnc_mapDrawEH; @@ -15,9 +15,10 @@ */ #include "script_component.hpp" -private ["_theMap", "_sizeX", "_sizeY", "_textureConfig", "_texture", "_markerSize", "_markerShadow", "_colorConfig", "_drawColor"]; +private ["_sizeX", "_sizeY", "_textureConfig", "_texture", "_markerSize", "_markerShadow", "_colorConfig", "_drawColor"]; -PARAMS_1(_theMap); +params ["_theMap"]; +// TRACE_1("params",_theMap); //Only show if marker place is open: if (isNull (findDisplay 54)) exitWith {}; diff --git a/addons/markers/functions/fnc_onLBSelChangedColor.sqf b/addons/markers/functions/fnc_onLBSelChangedColor.sqf index e089569761..0b9c5af209 100644 --- a/addons/markers/functions/fnc_onLBSelChangedColor.sqf +++ b/addons/markers/functions/fnc_onLBSelChangedColor.sqf @@ -7,7 +7,7 @@ * 1: Selected Index * * Return Value: - * Nothing + * None * * Example: * [ColorLB, 5] call ace_markers_fnc_onLBSelChangedColor; @@ -18,7 +18,9 @@ private ["_data", "_config"]; -PARAMS_2(_ctrl,_index); +params ["_ctrl", "_index"]; +TRACE_2("params",_ctrl,_index); + _data = _ctrl lbValue _index; GVAR(curSelMarkerColor) = _index; diff --git a/addons/markers/functions/fnc_onLBSelChangedShape.sqf b/addons/markers/functions/fnc_onLBSelChangedShape.sqf index ff067a467b..c8587e6205 100644 --- a/addons/markers/functions/fnc_onLBSelChangedShape.sqf +++ b/addons/markers/functions/fnc_onLBSelChangedShape.sqf @@ -7,7 +7,7 @@ * 1: Selected Index * * Return Value: - * Nothing + * None * * Example: * [ColorLB, 5] call ace_markers_fnc_onLBSelChangedShape; @@ -18,7 +18,9 @@ private ["_data", "_config"]; -PARAMS_2(_ctrl,_index); +params ["_ctrl", "_index"]; +TRACE_2("params",_ctrl,_index); + _data = _ctrl lbValue _index; GVAR(curSelMarkerShape) = _index; diff --git a/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf b/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf index 1210b8ce71..16c6acfad9 100644 --- a/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf +++ b/addons/markers/functions/fnc_onSliderPosChangedAngle.sqf @@ -7,7 +7,7 @@ * 1: Slider Data (angle: -180..180) * * Return Value: - * Nothing + * None * * Example: * [Slider, 2] call ace_markers_fnc_onSliderPosChangedAngle; @@ -18,7 +18,8 @@ private ["_direction"]; -PARAMS_2(_ctrl,_data); +params ["_ctrl", "_data"]; +TRACE_2("params",_ctrl,_data); _direction = round _data; if (_direction < 0) then { diff --git a/addons/markers/functions/fnc_placeMarker.sqf b/addons/markers/functions/fnc_placeMarker.sqf index fd584c1c99..36b61151ee 100644 --- a/addons/markers/functions/fnc_placeMarker.sqf +++ b/addons/markers/functions/fnc_placeMarker.sqf @@ -7,7 +7,7 @@ * 1: CloseNumber (1 = ButtonOk) * * Return Value: - * Nothing + * None * * Example: * [onUnloadEvent] call ace_markers_fnc_placeMarker; @@ -17,7 +17,8 @@ #include "script_component.hpp" disableserialization; -PARAMS_2(_display,_closeNum); +params ["_display", "_closeNum"]; +TRACE_2("params",_display,_closeNum); if (_closeNum == 1) then { diff --git a/addons/markers/functions/fnc_sendMarkersJIP.sqf b/addons/markers/functions/fnc_sendMarkersJIP.sqf index 99eea2f2d9..73a00519e3 100644 --- a/addons/markers/functions/fnc_sendMarkersJIP.sqf +++ b/addons/markers/functions/fnc_sendMarkersJIP.sqf @@ -6,7 +6,7 @@ * 0: Logic * * Return Value: - * Nothing + * None * * Example: * [onUnloadEvent] call ace_markers_fnc_sendMarkerJIP; @@ -15,11 +15,11 @@ */ #include "script_component.hpp" -PARAMS_1(_logic); +params ["_logic"]; +TRACE_1("params",_logic); -[QGVAR(setMarkerJIP), [_logic], [ -GETGVAR(allMapMarkers,[]), -GETGVAR(allMapMarkersProperties,[]), -_logic -] +[ + QGVAR(setMarkerJIP), + [_logic], + [GETGVAR(allMapMarkers,[]), GETGVAR(allMapMarkersProperties,[]), _logic] ] call EFUNC(common,targetEvent); diff --git a/addons/markers/functions/fnc_setMarkerJIP.sqf b/addons/markers/functions/fnc_setMarkerJIP.sqf index 0760cc6fe5..4e6b47b46b 100644 --- a/addons/markers/functions/fnc_setMarkerJIP.sqf +++ b/addons/markers/functions/fnc_setMarkerJIP.sqf @@ -8,7 +8,7 @@ * 2: Logic * * Return Value: - * Nothing + * None * * Example: * [[],[],dummyLogic] call ace_markers_fnc_setMarkerJIP; @@ -17,32 +17,34 @@ */ #include "script_component.hpp" -private ["_index", "_data", "_config"]; - -PARAMS_3(_allMapMarkers,_allMapMarkersProperties,_logic); +params ["_allMapMarkers", "_allMapMarkersProperties", "_logic"]; +TRACE_3("params",_allMapMarkers,_allMapMarkersProperties,_logic); { + private ["_index", "_data", "_config"]; + _index = _allMapMarkers find _x; if (_index != -1) then { _data = _allMapMarkersProperties select _index; + _data params ["_name", "_color", "_pos", "_dir"]; - _config = (configfile >> "CfgMarkers") >> (_data select 0); + _config = (configfile >> "CfgMarkers") >> _name; if (!isClass _config) then { WARNING("CfgMarker not found, changed to milDot"); _config == (configFile >> "CfgMarkers" >> "MilDot"); }; _x setMarkerTypeLocal (configName _config); - _config = (configfile >> "CfgMarkerColors") >> (_data select 1); + _config = (configfile >> "CfgMarkerColors") >> _color; if (!isClass _config) then { WARNING("CfgMarkerColors not found, changed to Default"); _config == (configFile >> "CfgMarkerColors" >> "Default"); }; _x setMarkerColorLocal (configName _config); - _x setMarkerPosLocal (_data select 2); - _x setMarkerDirLocal (_data select 3); + _x setMarkerPosLocal _pos; + _x setMarkerDirLocal _dir; }; } forEach allMapMarkers; diff --git a/addons/markers/functions/fnc_setMarkerNetwork.sqf b/addons/markers/functions/fnc_setMarkerNetwork.sqf index 457d5dac37..c56a1fb93c 100644 --- a/addons/markers/functions/fnc_setMarkerNetwork.sqf +++ b/addons/markers/functions/fnc_setMarkerNetwork.sqf @@ -8,7 +8,7 @@ * 1: Marker Data * * Return Value: - * Nothing + * None * * Example: * [[],[],dummyLogic] call ace_markers_fnc_setMarkerJIP; @@ -19,8 +19,10 @@ private ["_config"]; -PARAMS_2(_marker,_data); -EXPLODE_4_PVT(_data,_markerClassname,_colorClassname,_markerPos,_markerDir); +params ["_marker", "_data"]; +_data params ["_markerClassname", "_colorClassname", "_markerPos", "_markerDir"]; +TRACE_2("params",_marker,_data); + _config = (configfile >> "CfgMarkers") >> _markerClassname; if (!isClass _config) then { diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index d94ba333d2..96f5493aec 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -118,7 +118,7 @@ class ACE_Medical_Actions { // What is the level of medical skill required for this treatment action? 0 = all soldiers, 1 = medic, 2 = doctor requiredMedic = 0; // The time it takes for a treatment action to complete. Time is in seconds. - treatmentTime = 5; + treatmentTime = 8; // Item required for the action. Leave empty for no item required. items[] = {"ACE_fieldDressing"}; condition = ""; @@ -154,9 +154,9 @@ class ACE_Medical_Actions { class Tourniquet: fieldDressing { displayName = CSTRING(Apply_Tourniquet); displayNameProgress = CSTRING(Applying_Tourniquet); - allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r", "body"}; + allowedSelections[] = {"hand_l", "hand_r", "leg_l", "leg_r"}; items[] = {"ACE_tourniquet"}; - treatmentTime = 6; + treatmentTime = 4; callbackSuccess = QUOTE(DFUNC(treatmentTourniquet)); condition = QUOTE(!([ARR_2(_this select 1, _this select 2)] call FUNC(hasTourniquetAppliedTo))); litter[] = {}; @@ -234,7 +234,7 @@ class ACE_Medical_Actions { }; class SurgicalKit: fieldDressing { displayName = CSTRING(Use_SurgicalKit); - displayNameProgress = CSTRING(TreatmentAction); + displayNameProgress = CSTRING(Stitching); category = "advanced"; items[] = {"ACE_surgicalKit"}; treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; @@ -335,7 +335,7 @@ class ACE_Medical_Actions { category = "advanced"; treatmentLocations[] = {"All"}; requiredMedic = 0; - treatmentTime = 2; + treatmentTime = 15; items[] = {"ACE_bodyBag"}; condition = "!alive (_this select 1);"; callbackSuccess = QUOTE(DFUNC(actionPlaceInBodyBag)); diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index aef45b115d..350f83b3f7 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -697,6 +697,8 @@ class CfgVehicles { EGVAR(dragging,canDrag) = 1; EGVAR(dragging,dragPosition[]) = {0,1.2,0}; EGVAR(dragging,dragDirection) = 0; + EGVAR(cargo,size) = 1; + EGVAR(cargo,canLoad) = 1; class ACE_Actions { class ACE_MainActions { displayName = ECSTRING(interaction,MainAction); diff --git a/addons/medical/README.md b/addons/medical/README.md index b7a5fd2a3b..ecf8f5793e 100644 --- a/addons/medical/README.md +++ b/addons/medical/README.md @@ -3,6 +3,7 @@ ace_medical Provides a basic and advanced medical system. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. diff --git a/addons/medical/data/QuikClot.p3d b/addons/medical/data/QuikClot.p3d index 85ec2e9923..9fe747cb54 100644 Binary files a/addons/medical/data/QuikClot.p3d and b/addons/medical/data/QuikClot.p3d differ diff --git a/addons/medical/data/atropine.p3d b/addons/medical/data/atropine.p3d index 2b3ea52e61..fa9fb72c84 100644 Binary files a/addons/medical/data/atropine.p3d and b/addons/medical/data/atropine.p3d differ diff --git a/addons/medical/data/bandage.p3d b/addons/medical/data/bandage.p3d index 873d0feb8b..28c727e842 100644 Binary files a/addons/medical/data/bandage.p3d and b/addons/medical/data/bandage.p3d differ diff --git a/addons/medical/data/bodybagItem.p3d b/addons/medical/data/bodybagItem.p3d index 72c8fec886..73b3bfe404 100644 Binary files a/addons/medical/data/bodybagItem.p3d and b/addons/medical/data/bodybagItem.p3d differ diff --git a/addons/medical/data/epinephrine.p3d b/addons/medical/data/epinephrine.p3d index 47149c4eca..45f0aee1f7 100644 Binary files a/addons/medical/data/epinephrine.p3d and b/addons/medical/data/epinephrine.p3d differ diff --git a/addons/medical/data/littergeneric_Quikclot.p3d b/addons/medical/data/littergeneric_Quikclot.p3d index e309736148..e54e331721 100644 Binary files a/addons/medical/data/littergeneric_Quikclot.p3d and b/addons/medical/data/littergeneric_Quikclot.p3d differ diff --git a/addons/medical/data/littergeneric_atropine.p3d b/addons/medical/data/littergeneric_atropine.p3d index 141f7bd67f..4490a11c0e 100644 Binary files a/addons/medical/data/littergeneric_atropine.p3d and b/addons/medical/data/littergeneric_atropine.p3d differ diff --git a/addons/medical/data/littergeneric_epinephrine.p3d b/addons/medical/data/littergeneric_epinephrine.p3d index 33f2b19285..8246ef607e 100644 Binary files a/addons/medical/data/littergeneric_epinephrine.p3d and b/addons/medical/data/littergeneric_epinephrine.p3d differ diff --git a/addons/medical/data/littergeneric_gloves.p3d b/addons/medical/data/littergeneric_gloves.p3d index abc55ebcc9..ca92017688 100644 Binary files a/addons/medical/data/littergeneric_gloves.p3d and b/addons/medical/data/littergeneric_gloves.p3d differ diff --git a/addons/medical/data/littergeneric_morphine.p3d b/addons/medical/data/littergeneric_morphine.p3d index 754bce29a4..906280227c 100644 Binary files a/addons/medical/data/littergeneric_morphine.p3d and b/addons/medical/data/littergeneric_morphine.p3d differ diff --git a/addons/medical/data/littergeneric_packingbandage.p3d b/addons/medical/data/littergeneric_packingbandage.p3d index 73e86d92b4..185b8a73ff 100644 Binary files a/addons/medical/data/littergeneric_packingbandage.p3d and b/addons/medical/data/littergeneric_packingbandage.p3d differ diff --git a/addons/medical/data/morphine.p3d b/addons/medical/data/morphine.p3d index 8657b87c8a..3328630ac9 100644 Binary files a/addons/medical/data/morphine.p3d and b/addons/medical/data/morphine.p3d differ diff --git a/addons/medical/data/packingbandage.p3d b/addons/medical/data/packingbandage.p3d index 002c68ed13..0e083c4766 100644 Binary files a/addons/medical/data/packingbandage.p3d and b/addons/medical/data/packingbandage.p3d differ diff --git a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf index e8e03bb4c0..646e472f70 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressure.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressure.sqf @@ -14,7 +14,8 @@ #include "script_component.hpp" -private ["_caller","_target"]; +private ["_caller","_target","_selectionName"]; _caller = _this select 0; _target = _this select 1; -[[_caller, _target], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +_selectionName = _this select 2; +[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckBloodPressureLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf index 82edd1749f..92120a280c 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf @@ -14,9 +14,10 @@ #include "script_component.hpp" -private ["_caller","_target","_bloodPressure","_bloodPressureHigh","_bloodPressureLow", "_logOutPut", "_output"]; +private ["_caller","_target","_selectionName","_bloodPressure","_bloodPressureHigh","_bloodPressureLow", "_logOutPut", "_output"]; _caller = _this select 0; _target = _this select 1; +_selectionName = _this select 2; _bloodPressure = [_target] call FUNC(getBloodPressure); if (!alive _target) then { @@ -54,6 +55,11 @@ if ([_caller] call FUNC(isMedic)) then { }; }; +if (_selectionName in ["hand_l","hand_r"] && {[_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)}) then { + _output = LSTRING(Check_Bloodpressure_Output_6); + _logOutPut = ""; +}; + ["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)], 1.75, _caller]] call EFUNC(common,targetEvent); if (_logOutPut != "") then { diff --git a/addons/medical/functions/fnc_actionCheckPulse.sqf b/addons/medical/functions/fnc_actionCheckPulse.sqf index fd96321e8f..f615c69983 100644 --- a/addons/medical/functions/fnc_actionCheckPulse.sqf +++ b/addons/medical/functions/fnc_actionCheckPulse.sqf @@ -14,7 +14,8 @@ #include "script_component.hpp" -private ["_caller","_target"]; +private ["_caller","_target","_selectionName"]; _caller = _this select 0; _target = _this select 1; -[[_caller, _target], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ +_selectionName = _this select 2; +[[_caller, _target, _selectionName], QUOTE(DFUNC(actionCheckPulseLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index d759bf1bc8..f719aad2d8 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -14,10 +14,10 @@ #include "script_component.hpp" -private ["_caller", "_unit", "_heartRateOutput", "_heartRate", "_logOutPut"]; +private ["_caller", "_unit", "_selectionName", "_heartRateOutput", "_heartRate", "_logOutPut"]; _caller = _this select 0; _unit = _this select 1; - +_selectionName = _this select 2; _heartRate = _unit getvariable [QGVAR(heartRate), 80]; if (!alive _unit) then { @@ -46,6 +46,11 @@ if (_heartRate > 1.0) then { }; }; +if (_selectionName in ["hand_l","hand_r"] && {[_unit, _selectionName] call FUNC(hasTourniquetAppliedTo)}) then { + _heartRateOutput = LSTRING(Check_Pulse_Output_5); + _logOutPut = LSTRING(Check_Pulse_None); +}; + ["displayTextStructured", [_caller], [[_heartRateOutput, [_unit] call EFUNC(common,getName), round(_heartRate)], 1.5, _caller]] call EFUNC(common,targetEvent); if (_logOutPut != "") then { diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index cd61550152..e181328318 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -13,6 +13,7 @@ */ #include "script_component.hpp" +#define MAX_DISTANCE 10 // Exit for basic medical if (GVAR(level) < 2) exitWith {}; @@ -39,6 +40,11 @@ if (_show) then { if (GVAR(displayPatientInformationTarget) != _target || GVAR(currentSelectedSelectionN) != _selectionN) exitwith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; + if (ACE_player distance _target > MAX_DISTANCE) exitwith { + ("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; + [_this select 1] call CBA_fnc_removePerFrameHandler; + ["displayTextStructured", [ACE_player], [[LSTRING(DistanceToFar), [_target] call EFUNC(common,getName)], 1.75, ACE_player]] call EFUNC(common,targetEvent); + }; disableSerialization; _display = uiNamespace getvariable QGVAR(DisplayInformation); diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf index 9c218de540..a319d50440 100644 --- a/addons/medical/functions/fnc_treatment.sqf +++ b/addons/medical/functions/fnc_treatment.sqf @@ -176,8 +176,17 @@ if (vehicle _caller == _caller && {_callerAnim != ""}) then { _caller selectWeapon (primaryWeapon _caller); // unit always has a primary weapon here }; - if (stance _caller == "STAND") then { - _caller setvariable [QGVAR(treatmentPrevAnimCaller), "amovpknlmstpsraswrfldnon"]; + if (isWeaponDeployed _caller) then { + TRACE_1("Weapon Deployed, breaking out first",(stance _caller)); + [_caller, "", 0] call EFUNC(common,doAnimation); + }; + + if ((stance _caller) == "STAND") then { + switch (_wpn) do {//If standing, end in a crouched animation based on their current weapon + case ("rfl"): {_caller setvariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSrasWrflDnon"];}; + case ("pst"): {_caller setvariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSrasWpstDnon"];}; + case ("non"): {_caller setvariable [QGVAR(treatmentPrevAnimCaller), "AmovPknlMstpSnonWnonDnon"];}; + }; } else { _caller setvariable [QGVAR(treatmentPrevAnimCaller), animationState _caller]; }; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf index c3151f2c90..a7c8ea6744 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPRLocal.sqf @@ -18,20 +18,20 @@ private ["_caller","_target", "_reviveStartTime"]; _caller = _this select 0; _target = _this select 1; -if (_target getvariable [QGVAR(inReviveState), false]) exitwith { +if (_target getvariable [QGVAR(inReviveState), false]) then { _reviveStartTime = _target getvariable [QGVAR(reviveStartTime),0]; if (_reviveStartTime > 0) then { _target setvariable [QGVAR(reviveStartTime), (_reviveStartTime + random(20)) min ACE_time]; }; }; -if (random(1)>= 0.6) exitwith { +if ((random 1) >= 0.6) then { _target setvariable [QGVAR(inCardiacArrest), nil,true]; _target setvariable [QGVAR(heartRate), 40]; _target setvariable [QGVAR(bloodPressure), [50,70]]; }; -[_target, "activity", LSTRING(Activity_fullHeal), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); -[_target, "activity_view", LSTRING(Activity_fullHeal), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message +[_target, "activity", LSTRING(Activity_CPR), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); +[_target, "activity_view", LSTRING(Activity_CPR), [[_caller] call EFUNC(common,getName)]] call FUNC(addToLog); // TODO expand message true; diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 290690d442..3dfa42860a 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -762,7 +762,7 @@ Erhalte IV [%1ml] Reciviendo IV [%1ml] Принимается переливание [%1 мл] - Otrzymywanie IV [%1ml] + Otrzymywanie IV [pozostało %1ml] Transfusion en IV [%1ml] Přijímání transfúze [%1ml] Infúzióra kötve [%1ml] @@ -786,7 +786,7 @@ Для перевязки ран Utilizado para cubrir una herida Utilisé pour couvrir une blessure - Używany w celu przykrycia i ochrony miejsca zranienia + Używany w celu przykrycia i ochrony miejsca zranienia. Najczęściej stosowany bandaż na otarcia i draśnięcia. Verwendet um Wunden abzudecken Sebesülések befedésére alkalmas Usato per coprire una ferita @@ -823,7 +823,7 @@ Для тампонирования ран среднего и большого размера и остановки кровотечения. Se utiliza para vendar heridas medianas o grandes y detener el sangrado Utilisé pour couvrir des blessures de taille moyenne à grande. Arrête l'hémorragies - Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia. + Używany w celu opatrywania średnich i dużych ran oraz tamowania krwawienia. Dobrze radzi sobie z tamowaniem ran płatowych oraz postrzałowych. Közepestől nagyig terjedő sebek betakarására és vérzés elállítására használt kötszer Usato su ferite medie o larghe per fermare emorragie. Usado para o preenchimento de cavidades geradas por ferimentos médios e grandes e estancar o sangramento. @@ -859,7 +859,7 @@ Давящая повязка Kit de vendaje (Elástico) Bandage compressif élastique - Zestaw bandaży elastycznych. + Bandaż elastyczny służy do opatrywania ran ciętych oraz kłutych. Dobrze radzi sobie również ze zgniecieniami tkanek miękkich oraz rozerwaniami powierzchni skóry. Rugalmas kötszercsomag, "rögzítő" Kit di bendaggio, elastico Kit de Bandagem, Elástica @@ -894,7 +894,7 @@ Замедляет кровопотерю при кровотечении Reduce la velocidad de pérdida de sangre Ralentit le saignement - Zmniejsza ubytek krwi z kończyn w przypadku krwawienia. + Zmniejsza ubytek krwi z kończyn w przypadku krwawienia. Nie może być noszony zbyt długo ze względu na narastający ból z kończyny. Verringert den Blutverlust während einer Blutung Lelassítja a vérvesztést vérzés esetén Rallenta la perdita di sangue in caso di sanguinamento @@ -931,7 +931,7 @@ Для снятия средних и сильных болевых ощущений Usado para combatir los estados dolorosos de moderados a severos Utilisé pour réduire les douleurs modérées à sévères. - Morfina. Ma silne działanie przeciwbólowe. + Morfina. Ma silne działanie przeciwbólowe. Powoduje spowolnienie tętna oraz rozrzedzenie krwi, zwiększając tym samym ciśnienie tętnicze krwi. Działa przez ok. 15 minut. Mérsékelttől erős fájdalomig, ellene alkalmazandó termék Usato per combattere il dolore. Usado para combater dores moderadas e severas @@ -1002,7 +1002,7 @@ Стимулирует работу сердца и купирует аллергические реакции Aumenta la frecuencia cardiaca y contraresta los efectos de las reacciones alérgicas Augmente la fréquence cadiaque et annule les effets d'une réaction anaphylactique - Adrenalina. Zwiększa puls i przeciwdziała efektom wywołanym przez reakcje alergiczne + Adrenalina. Przyśpiesza tętno oraz zwiększa ciśnienie krwi a także przeciwdziała efektom wywołanym przez reakcje alergiczne. Steigert die Herzfrequenz und bekämpft Symptome von allergischen Reaktionen. Növeli a szívverést és ellenzi az allergiás reakciók hatásait Aumenta il battito cardiaco e combatte gli effetti di reazioni allergiche. @@ -1098,7 +1098,7 @@ Пакет крови для возмещения объёма потерянной крови (хранить в холодильнике) Sangre intravenosa, para restarurar el volumen sanguíneo (mantener frío) Cullot sanguin O- ,utiliser seulement lors de perte sanguine majeur afin de remplacer le volume sanguin perdu. Habituelment utiliser lors du transport ou dans un etablisement de soin. - Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych + Krew IV, używana do uzupełnienia krwi u pacjenta, trzymać w warunkach chłodniczych. Vér-infúzió, intravénás bejuttatásra egy páciensnek (hidegen tárolandó) Sangue usato per ripristinare pazienti in cui si è verificata una perdita di sangue (conservare al fresco) Blut IV, Bluthaushalt des Patienten wiederherstellen. (Kühl halten) @@ -1158,7 +1158,7 @@ Пакет физраствора для возмещения объёма потерянной крови Solución salina intravenosa, para restaurar el volumen sanguíneo Solution saline 0.9% IV, pour rétablir temporairement la tension artérielle - Sól fizjologiczna, podawana dożylnie (IV), używana w celu uzupełnienia krwi u pacjenta + Używany w medycynie w formie płynu infuzyjnego jako środek nawadniający i uzupełniający niedobór elektrolitów, podawany dożylnie (IV). 0,9%-os sósvíz-infúzió, a páciens vérmennyiségének helyreállítására Soluzione salina, usata per ripristinare sangue nei pazienti. Kochsalzlösung, ein medizinisches Volumenersatzmittel @@ -1206,7 +1206,7 @@ Первичный перевязочный пакет (QuikClot) Vendaje básico (QuickClot) Bandage basique (Hémostatique) - Podstawowy pakiet opatrunkowy (QuikClot) + Opatrunek QuikClot ACS Verbandpäckchen(Gerinnungsmittel) Általános zárókötszer (QuikClot) Bendaggio emostatico (QuikClot) @@ -1218,7 +1218,7 @@ Гемостатический пакет QuikClot Vendaje QuikClot Bandage hémostatique - Hemostatyczny pakiet QuikClot. Podstawowy opatrunek stosowany na rany. + Proszkowy opatrunek adsorbcyjny przeznaczony do tamowania zagrażających życiu krwawień średniej i dużej intensywności. Bandage mit Gerinnungsmittel QuikClot kötszer Bendaggio emostatico (QuikClot) @@ -1243,7 +1243,7 @@ Trousse de premiers soins Equipo de primeros auxilios Apteczka osobista - Persönliches Verbandpäckchen + Persönliches Erste-Hilfe-Set Elsősegélycsomag Pronto soccorso personale Kit De Primeiros Socorros Pessoal @@ -1254,7 +1254,7 @@ Содержит различные материалы и инструменты для зашивания ран и оказания специальной медпомощи. Incluye material médico para tratamientos avanzados Inclue du matériel medical pour les traitements avancés, tel les points de suture. - Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego + Zestaw środków medycznych do opatrywania ran i dodatkowego leczenia po-urazowego. Beinhaltet medizinisches Material für fortgeschrittene Behandlung und zum Nähen. Változatos segédfelszereléseket tartalmaz sebvarráshoz és haladó elsősegélynyújtáshoz Include vario materiale medico per trattamenti avanzati. @@ -1265,7 +1265,7 @@ Personal Aid Kit for in field stitching or advanced treatment W znacznym stopniu poprawia stan pacjenta Полевая аптчека для продвинутого лечения и зашивания ран - Persönliches Verbandspäckchen zum ambulanten Nähen und fortgeschrittener Behandlung. + Persönliches Erste-Hilfe-Set zum ambulanten Nähen und fortgeschrittener Behandlung. Trousse de premiers soins pour coudre sur le terrain et traitements avancés. Equipo de primeros auxilios para sutura de campaña o tratamientos avanzados Elsősegélycsomag, terepen való sebvarráshoz és haladó ellátáshoz @@ -1275,7 +1275,7 @@ Use Personal Aid Kit - Verbandpäckchen benutzen + Erste-Hilfe-Set benutzen Использовать аптечку Utiliser la Trousse de premier soins Użyj apteczki osobistej @@ -2043,7 +2043,7 @@ Colocando cuerpo en bolsa para cadáveres Упаковка тела ... Verstaue Körper in Leichensack - Pakowanie ciała do worka na zwłoki + Pakowanie ciała do worka na zwłoki ... Placement du corps dans la housse Test hullazsákba helyezése ... Stai mettendo il corpo nella sacca @@ -2055,7 +2055,7 @@ %1 has vendado al paciente %1 перевязал пациента %1 hat den Patienten verbunden - %1 zabandażował pacjenta + %1 założył bandaż %1 a pansé le patient %1 bekötözte a pácienst %1 ha bendato il paziente @@ -2098,6 +2098,10 @@ %1 aplicou um torniquete %1 použil škrtidlo + + %1 performed CPR + %1 wykonał cykl RKO + Heavily wounded Schwer verwundet: @@ -2706,7 +2710,7 @@ Treating ... Behandeln ... Ellátás ... - Leczenie ... + Opatrywanie ran ... Traitement ... Лечение ... Tratando ... @@ -2738,7 +2742,7 @@ Medical Settings [ACE] Настройки медицины [ACE] - Ustawienia medyczne [ACE] + Ustawienia medyczne Ajustes médicos [ACE] Medizinische Einstellungen [ACE] Lékařské nastavení [ACE] @@ -3012,7 +3016,7 @@ Advanced Medical Settings [ACE] Настройки усложненной медицины [ACE] - Zaawansowane ustawienia medyczne [ACE] + Zaawansowane ustawienia medyczne Ajustes médicos avanzados [ACE] Erweiterte medizinische Einstellungen [ACE] Pokročilé zdravotnické nastavení [ACE] @@ -3095,7 +3099,7 @@ Использование аптечки Ust. apteczek osobistych Permitir EPA - Erlaube Erstehilfekasten + Erlaube Erste-Hilfe-Set Povolit osobní lékárničky Permitir Kit de Primeiros Socorros @@ -3104,7 +3108,7 @@ Кому разрешено выполнять полное лечение с помощью аптечки? Kto może skorzystać z apteczki osobistej w celu pełnego uleczenia? ¿Quién puede utilizar el EPA para una cura completa? - Wer kann den Erstehilfekasten für eine Endheilung verwenden? + Wer kann das Erste-Hilfe-Set für eine Endheilung verwenden? Kdo může použít osobní lékárničku pro plné vyléčení? Quem pode usar o KPS para cura completa? @@ -3140,7 +3144,7 @@ Удалять аптечки после использования Usuń apteczkę po użyciu Eliminar EPA después del uso - Entferne Erstehilfekasten bei Verwendung + Entferne Erste-Hilfe-Set bei Verwendung Odebrat osobní lékárničku po použití Remover o KPS depois do uso @@ -3149,7 +3153,7 @@ Нужно ли удалять аптечки после использования? Czy apteczka osobista powinna zniknąć z ekwipunku po jej użyciu? El EPA será eliminado después de usarlo - Sollen Erstehilfekästen bei Verwendung entfernt werden? + Sollen Erste-Hilfe-Sets bei Verwendung entfernt werden? Má se osobní lékárnička odstranit po použití? Deve o KPS ser removido depois do uso? @@ -3158,7 +3162,7 @@ Место использования аптечки Ogr. apteczek osobistych Ubicacions del EPA - Orte für Erstehilfekasten + Orte für Erste-Hilfe-Set Lokace osobní lékárničky Localizações do KPS @@ -3167,7 +3171,7 @@ Где может использоваться аптечка? Gdzie można korzystać z apteczek osobistych? ¿Dónde se puede utilizar el equipo de primeros auxilios? - Wo kann der Erstehilfekasten verwendet werden? + Wo kann das Erste-Hilfe-Set verwendet werden? Kde může být použita osobní lékárnička? Onde o kit de primeiros socorros pode ser utilizado? @@ -3329,7 +3333,7 @@ Revive Settings [ACE] Настройки реанимации [ACE] - Ustawienia wskrzeszania [ACE] + Ustawienia wskrzeszania Sistema de resucitado [ACE] Wiederbelebungseinstellungen [ACE] Nastavení oživení [ACE] @@ -3401,7 +3405,7 @@ Set Medic Class [ACE] Сделать медиком [ACE] - Ustaw klasę medyka [ACE] + Ustaw klasę medyka Establecer case médica [ACE] Setze Sanitäterklassen [ACE] Určit třídu medika [ACE] @@ -3480,7 +3484,7 @@ Set Medical Vehicle [ACE] Сделать мед. транспортом [ACE] - Ustaw pojazd medyczny [ACE] + Ustaw pojazd medyczny Establecer vehículos médicos [ACE] Setze medizinisches Fahrzeug [ACE] Určit zdravotnické vozidlo [ACE] @@ -3516,7 +3520,7 @@ Whatever or not the objects in the list will be a medical vehicle. Будут ли объекты в списке считаться медицинским транспортом. - Czy pojazdy z tej listy są pojazdami medycznymi. + Czy pojazdy z tej listy są pojazdami medycznymi? Cualquiera de la lista o fuera de ella será un vehículo médico. Leg fest ob das Objekt in der Liste ein medizinisches Fahrzeug ist. Ať už jsou nebo nejsou objekty v seznamu budou zdravotnická vozidla. @@ -3534,7 +3538,7 @@ Set Medical Facility [ACE] Сделать госпиталем [ACE] - Ustaw budynek medyczny [ACE] + Ustaw budynek medyczny Establece el centro médico [ACE] Setze medizinische Einrichtung [ACE] Určit zdravotnické zařízení [ACE] @@ -3609,5 +3613,9 @@ Médico Orvosi + + Distance to %1 has become to far for treatment + %1 odszedł zbyt daleko, nie można kontynuować leczenia + - + \ No newline at end of file diff --git a/addons/medical_menu/README.md b/addons/medical_menu/README.md index 0755083712..86ae2039ea 100644 --- a/addons/medical_menu/README.md +++ b/addons/medical_menu/README.md @@ -3,6 +3,7 @@ ace_medical_menu Provides the CSE medical menu for the advanced medical system. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. diff --git a/addons/medical_menu/XEH_postInit.sqf b/addons/medical_menu/XEH_postInit.sqf index a72c1a8887..eaf356f608 100644 --- a/addons/medical_menu/XEH_postInit.sqf +++ b/addons/medical_menu/XEH_postInit.sqf @@ -26,9 +26,10 @@ if (!hasInterface) exitwith {}; false }, { - if (ACE_time - GVAR(lastOpenedOn) > 0.5) then { + if (ACE_time - GVAR(lastOpenedOn) > 0.5) exitWith { [ObjNull] call FUNC(openMenu); }; + false }, [35, [false, false, false]], false, 0] call CBA_fnc_addKeybind; diff --git a/addons/medical_menu/functions/fnc_canOpenMenu.sqf b/addons/medical_menu/functions/fnc_canOpenMenu.sqf index 2cfe7072ef..9b7c3bcbff 100644 --- a/addons/medical_menu/functions/fnc_canOpenMenu.sqf +++ b/addons/medical_menu/functions/fnc_canOpenMenu.sqf @@ -21,4 +21,4 @@ params ["_caller", "_target"]; if !(GVAR(allow) == 1 || (GVAR(allow) == 2 && {vehicle _caller != _caller || vehicle _target != _target} && {alive ACE_player})) exitwith {false}; if !(GVAR(useMenu) == 1 || (GVAR(useMenu) == 2 && {vehicle _caller != _caller || vehicle _target != _target} && {alive ACE_player})) exitwith {false}; -true; +true diff --git a/addons/medical_menu/functions/fnc_collectActions.sqf b/addons/medical_menu/functions/fnc_collectActions.sqf index 211de76202..ad189139ea 100644 --- a/addons/medical_menu/functions/fnc_collectActions.sqf +++ b/addons/medical_menu/functions/fnc_collectActions.sqf @@ -33,7 +33,7 @@ _fnc_compileActionsLevel = { _actions pushBack [_displayName, _category, compile _condition, compile _statement]; }; nil - }count ("true" configClasses _config); + } count ("true" configClasses _config); _actions // return }; diff --git a/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf b/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf index d795b0128c..c65aba5074 100644 --- a/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf +++ b/addons/medical_menu/functions/fnc_handleUI_DisplayOptions.sqf @@ -38,11 +38,11 @@ if (_name isEqualTo "toggle") exitwith { }; GVAR(INTERACTION_TARGET_PREVIOUS) = GVAR(INTERACTION_TARGET); - [_newTarget] spawn { - closeDialog 0; - sleep 0.1; + + closeDialog 0; + [{ [_this select 0] call FUNC(openMenu); - }; + }, [_newTarget], 0.1] call EFUNC(common,waitAndExecute); }; // Clean the dropdown options list from all actions @@ -77,7 +77,7 @@ if (_name isEqualTo "triage") exitwith { }; _triageCardTexts pushback format["%1x - %2 (%3m)", _amount, _message, round((ACE_time - _time) / 60)]; nil; - }count _log; + } count _log; if (count _triageCardTexts == 0) exitwith { lbAdd [212,(localize ELSTRING(medical,TriageCard_NoEntry))]; diff --git a/addons/medical_menu/functions/fnc_onMenuOpen.sqf b/addons/medical_menu/functions/fnc_onMenuOpen.sqf index 52a957ae93..164353fe73 100644 --- a/addons/medical_menu/functions/fnc_onMenuOpen.sqf +++ b/addons/medical_menu/functions/fnc_onMenuOpen.sqf @@ -14,6 +14,7 @@ * Public: No */ #include "script_component.hpp" +#define MAX_DISTANCE 10 private "_target"; @@ -60,8 +61,9 @@ disableSerialization; (_display displayCtrl 1) ctrlSetText format ["%1", [_target] call EFUNC(common,getName)]; setMousePosition [0.4, 0.4]; -[QGVAR(onMenuOpen), "onEachFrame", { - params ["_display"]; +GVAR(MenuPFHID) = [{ + + (_this select 0) params ["_display"]; if (isNull GVAR(INTERACTION_TARGET)) then { GVAR(INTERACTION_TARGET) = ACE_player; }; @@ -72,6 +74,12 @@ setMousePosition [0.4, 0.4]; _status = [GVAR(INTERACTION_TARGET)] call FUNC(getTriageStatus); (_display displayCtrl 2000) ctrlSetText (_status select 0); (_display displayCtrl 2000) ctrlSetBackgroundColor (_status select 2); - }, [_display]] call BIS_fnc_addStackedEventHandler; + + if (ACE_player distance _target > MAX_DISTANCE) exitwith { + closeDialog 314412; + ["displayTextStructured", [ACE_player], [[ELSTRING(medical,DistanceToFar), [_target] call EFUNC(common,getName)], 1.75, ACE_player]] call EFUNC(common,targetEvent); + }; + +}, 0, [_display]] call CBA_fnc_addPerFrameHandler; ["Medical_onMenuOpen", [ACE_player, _interactionTarget]] call EFUNC(common,localEvent); diff --git a/addons/medical_menu/functions/fnc_openMenu.sqf b/addons/medical_menu/functions/fnc_openMenu.sqf index 3bc67f0028..067e7bda13 100644 --- a/addons/medical_menu/functions/fnc_openMenu.sqf +++ b/addons/medical_menu/functions/fnc_openMenu.sqf @@ -6,7 +6,7 @@ * 0: Target * * Return Value: - * None + * If action was taken * * Example: * [some_player] call ace_medical_menu_openMenu @@ -18,16 +18,22 @@ params ["_interactionTarget"]; if (dialog || isNull _interactionTarget) exitwith { - disableSerialization; + disableSerialization; - private "_display"; - _display = uiNamespace getVariable QGVAR(medicalMenu); - if (!isNil "_display") then { - closeDialog 314412; - }; + private ["_display", "_handled"]; + _handled = false; + _display = uiNamespace getVariable QGVAR(medicalMenu); + if (!isNil "_display") then { + closeDialog 314412; + _handled = true; + }; + + _handled }; GVAR(INTERACTION_TARGET) = _interactionTarget; createDialog QGVAR(medicalMenu); GVAR(lastOpenedOn) = ACE_time; + +true diff --git a/addons/medical_menu/functions/fnc_updateInformationLists.sqf b/addons/medical_menu/functions/fnc_updateInformationLists.sqf index db7220065c..70903347b5 100644 --- a/addons/medical_menu/functions/fnc_updateInformationLists.sqf +++ b/addons/medical_menu/functions/fnc_updateInformationLists.sqf @@ -21,16 +21,18 @@ params ["_display", "_genericMessages", "_allInjuryTexts"]; _lbCtrl = _display displayCtrl 213; lbClear _lbCtrl; { - _lbCtrl lbAdd (_x select 0); - _lbCtrl lbSetColor [_forEachIndex, _x select 1]; + _x params ["_add", "_color"]; + _lbCtrl lbAdd _add; + _lbCtrl lbSetColor [_forEachIndex, _color]; } forEach _genericMessages; _amountOfGeneric = count _genericMessages; { - _lbCtrl lbAdd (_x select 0); - _lbCtrl lbSetColor [_forEachIndex + _amountOfGeneric, _x select 1]; + _x params ["_add", "_Color"]; + _lbCtrl lbAdd _add; + _lbCtrl lbSetColor [_forEachIndex + _amountOfGeneric, _color]; } forEach _allInjuryTexts; -if (count _allInjuryTexts == 0) then { +if !(_allInjuryTexts isEqualTo []) then { _lbCtrl lbAdd localize ELSTRING(medical,NoInjuriesBodypart); }; diff --git a/addons/medical_menu/stringtable.xml b/addons/medical_menu/stringtable.xml index f4cc40521a..0a4f1a5388 100644 --- a/addons/medical_menu/stringtable.xml +++ b/addons/medical_menu/stringtable.xml @@ -76,41 +76,6 @@ VUE RAPIDE SZYBKI PODGLĄD - - None - Не ранен - Ninguno - Aucun - Brak - - - Minor - Несрочная помощь - Menor - Mineur - Normalny - - - Delayed - Срочная помощь - Diferido - Urgent - Opóźniony - - - Immediate - Неотложная помощь - Inmediato - Immédiat - Natychmiastowy - - - Deceased - Морг - Fallecido - Décédé - Nie żyje - View triage Card Смотреть первичную карточку @@ -390,7 +355,6 @@ Torniquete [CAT] Canule Naseaupharyngée [NPA] Rurka nosowo-gardłowa [NPA] - Nasopharyngeal Tube [NPA] diff --git a/addons/medical_menu/ui/menu.hpp b/addons/medical_menu/ui/menu.hpp index c0c32cac8b..ab078d4c72 100644 --- a/addons/medical_menu/ui/menu.hpp +++ b/addons/medical_menu/ui/menu.hpp @@ -4,7 +4,7 @@ class GVAR(medicalMenu) { idd = 314412; movingEnable = true; onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(medicalMenu)), _this select 0)]; [ARR_2(QUOTE(QGVAR(id)), true)] call EFUNC(common,blurScreen); [_this select 0] call FUNC(onMenuOpen);); - onUnload = QUOTE([ARR_2(QUOTE(QGVAR(id)), false)] call EFUNC(common,blurScreen); [ARR_2(QUOTE(QGVAR(onMenuOpen)), 'onEachFrame')] call BIS_fnc_removeStackedEventHandler;); + onUnload = QUOTE([ARR_2(QUOTE(QGVAR(id)), false)] call EFUNC(common,blurScreen); [GVAR(MenuPFHID)] call CBA_fnc_removePerFrameHandler;); class controlsBackground { class HeaderBackground: ACE_gui_backgroundBase{ idc = -1; @@ -63,15 +63,15 @@ class GVAR(medicalMenu) { colorText[] = {1, 1, 1.0, 0.9}; colorBackground[] = {0,0,0,0}; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1.2)"; - text = $STR_ACE_Medical_Menu_EXAMINE_TREATMENT; + text = CSTRING(EXAMINE_TREATMENT); }; class CatagoryCenter: CatagoryLeft { x = "13.33 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = $STR_ACE_Medical_Menu_STATUS; + text = CSTRING(STATUS); }; class CatagoryRight: CatagoryCenter{ x = "25.66 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = $STR_ACE_Medical_Menu_OVERVIEW; + text = CSTRING(OVERVIEW); }; class Line: ACE_gui_backgroundBase { idc = -1; @@ -404,11 +404,11 @@ class GVAR(medicalMenu) { colorText[] = {0.6, 0.7, 1.0, 1}; colorBackground[] = {0,0,0,0}; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - text = $STR_ACE_Medical_Menu_ACTIVITY_LOG; + text = CSTRING(ACTIVITY_LOG); }; class QuickViewHeader: ActivityLogHeader { x = "19.5 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - text = $STR_ACE_Medical_Menu_QUICK_VIEW; + text = CSTRING(QUICK_VIEW); }; class LineBottomHeaders: Line { y = "19.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; @@ -481,7 +481,7 @@ class GVAR(medicalMenu) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Menu_TRIAGE_NONE; + text = ECSTRING(Medical,Triage_Status_None); style = ST_CENTER; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; @@ -500,7 +500,7 @@ class GVAR(medicalMenu) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Menu_TRIAGE_MINOR; + text = ECSTRING(Medical,Triage_Status_Minor); style = ST_CENTER; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; @@ -518,7 +518,7 @@ class GVAR(medicalMenu) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Menu_TRIAGE_DELAYED; + text = ECSTRING(Medical,Triage_Status_Delayed); style = ST_CENTER; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; @@ -536,7 +536,7 @@ class GVAR(medicalMenu) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Menu_TRIAGE_IMMEDIATE; + text = ECSTRING(Medical,Triage_Status_Immediate); style = ST_CENTER; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; @@ -554,7 +554,7 @@ class GVAR(medicalMenu) { y = 0; w = 0; h = 0; - text = $STR_ACE_Medical_Menu_TRIAGE_DECEASED; + text = ECSTRING(Medical,Triage_Status_Deceased); style = ST_CENTER; size = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; @@ -567,4 +567,4 @@ class GVAR(medicalMenu) { action = QUOTE([] call FUNC(handleUI_dropDownTriageCard); [ARR_2(GVAR(INTERACTION_TARGET),4)] call FUNC(setTriageStatus);); }; }; -}; \ No newline at end of file +}; diff --git a/addons/microdagr/CfgVehicles.hpp b/addons/microdagr/CfgVehicles.hpp index 49f7a0e65c..ee16870fe0 100644 --- a/addons/microdagr/CfgVehicles.hpp +++ b/addons/microdagr/CfgVehicles.hpp @@ -37,7 +37,7 @@ class CfgVehicles { displayName = CSTRING(Module_DisplayName); function = QFUNC(moduleMapFill); scope = 2; - isGlobal = 1; + isGlobal = 0; icon = QUOTE(PATHTOF(UI\Icon_Module_microDAGR_ca.paa)); functionPriority = 0; class Arguments { @@ -46,9 +46,9 @@ class CfgVehicles { description = CSTRING(MapDataAvailable_Description); typeName = "NUMBER"; class values { - class None {name = CSTRING(None); value = MAP_DETAIL_SAT; default = 1;}; - class Side {name = CSTRING(Side); value = MAP_DETAIL_TOPOROADS;}; - class Unique {name = CSTRING(Unique); value = MAP_DETAIL_NONE;}; + class Full {name = CSTRING(MapFill_Full); value = MAP_DETAIL_SAT; default = 1;}; + class Roads {name = CSTRING(MapFill_OnlyRoads); value = MAP_DETAIL_TOPOROADS;}; + class Disabled {name = CSTRING(MapFill_None); value = MAP_DETAIL_NONE;}; }; }; }; diff --git a/addons/microdagr/readme.md b/addons/microdagr/README.md similarity index 81% rename from addons/microdagr/readme.md rename to addons/microdagr/README.md index f2dc25a656..d7bcf01b40 100644 --- a/addons/microdagr/readme.md +++ b/addons/microdagr/README.md @@ -1,7 +1,7 @@ ace_microdagr =============== -Adds a microDAGR infentry GPS device. +Adds a MicroDAGR infantry GPS device. Press home to open. Then home again to toggle an interactive version. Press CTRL+Home to close. Info/Compass/Minimap modes are selectable by the bottom buttons. Tap the top bar to open the menu and access Mark/Waypoints/Connect To/Settings modes. Tap the minimap button again to toggle map modes (if available). @@ -9,13 +9,14 @@ Enter waypoints from the menu or double tapping on the minimap. Can interface with the `ace_vector`. Hold Azimuth+Range and release (see page 14 of vector's manual) #### Items Added: - `ACE_microDAGR` + ## For Mission Makers: #### Modules: -* MicroDAGR Map Fill - Controls the amount of map data avaialbe for the minimap. Can limit to just roads/topographical or disable entirely. +- MicroDAGR Map Fill - Controls the amount of map data available for the minimap. Can limit to just roads/topographical or disable entirely. + ## Maintainers diff --git a/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf b/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf index 0822bdf310..86ace87b3e 100644 --- a/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf +++ b/addons/microdagr/functions/fnc_appMarkKeypadEntry.sqf @@ -6,7 +6,7 @@ * 0: String version of Keypad entry ["ok","del","1",...] * * Return Value: - * Nothing + * None * * Example: * ["ok"] call ace_microdagr_fnc_appMarkKeypadEntry @@ -16,15 +16,12 @@ #include "script_component.hpp" private ["_display", "_editText", "_actualPos"]; -PARAMS_1(_keypadButton); + +params ["_keypadButton"]; disableSerialization; -_display = displayNull; -if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { - _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); -} else { - _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); -}; +_display = uiNamespace getVariable [[QGVAR(RscTitleDisplay), QGVAR(DialogDisplay)] select (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG), displayNull]; + if (isNull _display) exitWith {ERROR("No Display");}; if (GVAR(currentApplicationPage) != APP_MODE_MARK) exitWith {}; diff --git a/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf b/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf index 1cf81963f5..589ec096fb 100644 --- a/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf +++ b/addons/microdagr/functions/fnc_appMenuButtonConnectRangefinder.sqf @@ -3,18 +3,18 @@ * Handles the "Connect To" button from the menu application * * Arguments: - * Nothing + * None * * Return Value: - * Nothing + * None * * Example: - * [] call ace_microdagr_fnc_appMenuButtonConnectRangefinder + * call ace_microdagr_fnc_appMenuButtonConnectRangefinder * * Public: No */ #include "script_component.hpp" -GVAR(currentWaypoint) = if (GVAR(currentWaypoint) == -2) then {-1} else {-2}; +GVAR(currentWaypoint) = [-2, -1] select (GVAR(currentWaypoint) == -2); GVAR(rangeFinderPositionASL) = []; [APP_MODE_INFODISPLAY] call FUNC(saveCurrentAndSetNewMode); diff --git a/addons/microdagr/functions/fnc_appSettingsLBClick.sqf b/addons/microdagr/functions/fnc_appSettingsLBClick.sqf index bc6779c10a..9e808559b2 100644 --- a/addons/microdagr/functions/fnc_appSettingsLBClick.sqf +++ b/addons/microdagr/functions/fnc_appSettingsLBClick.sqf @@ -7,7 +7,7 @@ * 1: Index * * Return Value: - * Nothing + * None * * Example: * [settingList, 1] call ace_microdagr_fnc_appSettingsLBClick @@ -17,7 +17,7 @@ #include "script_component.hpp" disableSerialization; -PARAMS_2(_control,_itemClicked); +params ["", "_itemClicked"]; switch (_itemClicked) do { case (0): { GVAR(settingUseMils) = ! GVAR(settingUseMils)}; diff --git a/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf b/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf index 1acd936370..956e24c5ba 100644 --- a/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf +++ b/addons/microdagr/functions/fnc_appWaypointsButtonDeleteWP.sqf @@ -3,13 +3,13 @@ * Handles clicking the delete button from the waypoint application * * Arguments: - * Nothing + * None * * Return Value: - * Nothing + * None * * Example: - * [] call ace_microdagr_fnc_appWaypointsButtonDeleteWP + * call ace_microdagr_fnc_appWaypointsButtonDeleteWP * * Public: No */ @@ -18,12 +18,8 @@ private ["_display", "_wpIndex"]; disableSerialization; -_display = displayNull; -if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { - _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); -} else { - _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); -}; +_display = uiNamespace getVariable [[QGVAR(RscTitleDisplay), QGVAR(DialogDisplay)] select GVAR(currentShowMode) == DISPLAY_MODE_DIALOG, displayNull]; + if (isNull _display) exitWith {ERROR("No Display");}; _wpIndex = lbCurSel (_display displayCtrl IDC_MODEWAYPOINTS_LISTOFWAYPOINTS); diff --git a/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf b/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf index 881c0b3b5d..d2b3b0e20c 100644 --- a/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf +++ b/addons/microdagr/functions/fnc_appWaypointsButtonSetWP.sqf @@ -6,10 +6,10 @@ * The "SetWP" button * * Return Value: - * Nothing + * None * * Example: - * [] call ace_microdagr_fnc_appWaypointsButtonSetWP + * [1234] call ace_microdagr_fnc_appWaypointsButtonSetWP * * Public: No */ @@ -18,7 +18,7 @@ private ["_wpListBox", "_newWpIndex", "_waypoints"]; disableSerialization; -PARAMS_1(_wpButton); +params ["_wpButton"]; _wpListBox = (ctrlParent _wpButton) displayCtrl 144501; _newWpIndex = lbCurSel _wpListBox; diff --git a/addons/microdagr/functions/fnc_canShow.sqf b/addons/microdagr/functions/fnc_canShow.sqf index 9e54f927e0..70e8989031 100644 --- a/addons/microdagr/functions/fnc_canShow.sqf +++ b/addons/microdagr/functions/fnc_canShow.sqf @@ -6,32 +6,31 @@ * The display mode to test showing * * Return Value: - * Nothing + * None * * Example: - * [mode] call ace_microdagr_fnc_canShow + * [1] call ace_microdagr_fnc_canShow * * Public: No */ #include "script_component.hpp" - -PARAMS_1(_showType); +params ["_showType"]; private ["_returnValue"]; _returnValue = false; -switch (_showType) do { -case (DISPLAY_MODE_CLOSED): {_returnValue = true}; //Can always close -case (DISPLAY_MODE_HIDDEN): {_returnValue = true}; //Can always hide - -case (DISPLAY_MODE_DIALOG): { - _returnValue = ("ACE_microDAGR" in (items ACE_player)) && {[ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)}; +_returnValue = switch (_showType) do { + case (DISPLAY_MODE_CLOSED): { true }; //Can always close + case (DISPLAY_MODE_HIDDEN): { true }; //Can always hide + case (DISPLAY_MODE_DIALOG): { + ("ACE_microDAGR" in (items ACE_player)) && {[ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)} }; -case (DISPLAY_MODE_DISPLAY): { + case (DISPLAY_MODE_DISPLAY): { //Can't have minimap up while zoomed in - _returnValue = (cameraview != "GUNNER") && {"ACE_microDAGR" in (items ACE_player)} && {[ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)}; + (cameraview != "GUNNER") && {"ACE_microDAGR" in (items ACE_player)} && {[ACE_player, objNull, ["notOnMap", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)} }; + default { false }; }; _returnValue diff --git a/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf b/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf index c383d0a95e..f99ec78354 100644 --- a/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf +++ b/addons/microdagr/functions/fnc_deviceAddWaypoint.sqf @@ -8,7 +8,7 @@ * 1: Waypoint Position ASL * * Return Value: - * Nothing + * None * * Example: * ["Hill 55", [41,324, 12]] call ace_microdagr_fnc_deviceAddWaypoint @@ -17,10 +17,11 @@ */ #include "script_component.hpp" -PARAMS_2(_waypointName,_waypointPosASL); - private "_waypoints"; +params ["_waypointName","_waypointPosASL"]; -_waypoints = ace_player getVariable [QGVAR(waypoints), []]; + + +_waypoints = ACE_player getVariable [QGVAR(waypoints), []]; _waypoints pushBack [_waypointName, _waypointPosASL]; -ace_player setVariable [QGVAR(waypoints), _waypoints]; +ACE_player setVariable [QGVAR(waypoints), _waypoints]; diff --git a/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf b/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf index 62ca5a222a..d3681466b4 100644 --- a/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf +++ b/addons/microdagr/functions/fnc_deviceDeleteWaypoint.sqf @@ -7,7 +7,7 @@ * 0: Waypoint Index * * Return Value: - * Nothing + * None * * Example: * ["Hill 55", [41,324, 12]] call ace_microdagr_fnc_deviceDeleteWaypoint @@ -16,13 +16,12 @@ */ #include "script_component.hpp" -PARAMS_1(_wpIndex); - private "_waypoints"; +params ["_wpIndex"]; -_waypoints = ace_player getVariable [QGVAR(waypoints), []]; +_waypoints = ACE_player getVariable [QGVAR(waypoints), []]; if ((_wpIndex < 0) || (_wpIndex > ((count _waypoints) - 1))) exitWith {ERROR("out of bounds wp");}; _waypoints deleteAt _wpIndex; -ace_player setVariable [QGVAR(waypoints), _waypoints]; +ACE_player setVariable [QGVAR(waypoints), _waypoints]; diff --git a/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf b/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf index f90ecb06be..da3484ceb0 100644 --- a/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf +++ b/addons/microdagr/functions/fnc_deviceGetWaypoints.sqf @@ -4,7 +4,7 @@ * Device saving not implemented yet, just save to player object * * Arguments: - * Nothing + * None * * Return Value: * Waypoints @@ -16,4 +16,4 @@ */ #include "script_component.hpp" -(ace_player getVariable [QGVAR(waypoints), []]) +(ACE_player getVariable [QGVAR(waypoints), []]) diff --git a/addons/microdagr/functions/fnc_dialogClosedEH.sqf b/addons/microdagr/functions/fnc_dialogClosedEH.sqf index 0a7e5e5115..5180734644 100644 --- a/addons/microdagr/functions/fnc_dialogClosedEH.sqf +++ b/addons/microdagr/functions/fnc_dialogClosedEH.sqf @@ -3,13 +3,13 @@ * Handles the dialog closeing, switches back to display mode * * Arguments: - * Nothing + * None * * Return Value: - * Nothing + * None * * Example: - * [] call ace_microdagr_fnc_dialogClosedEH + * call ace_microdagr_fnc_dialogClosedEH * * Public: No */ diff --git a/addons/microdagr/functions/fnc_mapButtonDownEH.sqf b/addons/microdagr/functions/fnc_mapButtonDownEH.sqf index e7d2618160..566f08dc66 100644 --- a/addons/microdagr/functions/fnc_mapButtonDownEH.sqf +++ b/addons/microdagr/functions/fnc_mapButtonDownEH.sqf @@ -10,7 +10,7 @@ * 3: MousePosY * * Return Value: - * Nothing + * None * * Example: * [minimap,0,0.5,0.5] call ace_microdagr_fnc_mapButtonDownEH @@ -19,7 +19,7 @@ */ #include "script_component.hpp" -PARAMS_4(_theMap,_mouseButton,_xPos,_yPos); +params ["", "_mouseButton"]; //Only handle RMB if (_mouseButton != 1) exitWith {}; diff --git a/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf b/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf index 21a164ff2e..2226011215 100644 --- a/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf +++ b/addons/microdagr/functions/fnc_mapDoubleTapEH.sqf @@ -9,7 +9,7 @@ * 3: MousePosY * * Return Value: - * Nothing + * None * * Example: * [minimap,0,0.5,0.5] call ace_microdagr_fnc_mapDoubleTapEH @@ -18,7 +18,7 @@ */ #include "script_component.hpp" -PARAMS_4(_theMap,_mouseButton,_xPos,_yPos); +params ["_theMap", "_mouseButton", "_xPos", "_yPos"]; private ["_worldPos"]; @@ -26,7 +26,7 @@ private ["_worldPos"]; if (_mouseButton != 0) exitWith {}; _worldPos = _theMap ctrlMapScreenToWorld [_xPos, _yPos]; -_worldPos set [2, (getTerrainHeightASL _worldPos)]; +_worldPos pushBack (getTerrainHeightASL _worldPos); GVAR(newWaypointPosition) = _worldPos; [APP_MODE_MARK] call FUNC(saveCurrentAndSetNewMode); diff --git a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf index 644064d069..a74255601c 100644 --- a/addons/microdagr/functions/fnc_mapOnDrawEH.sqf +++ b/addons/microdagr/functions/fnc_mapOnDrawEH.sqf @@ -6,7 +6,7 @@ * 0: The Map * * Return Value: - * Nothing + * None * * Example: * [compassMap] call ace_microdagr_fnc_mapOnDrawEH @@ -15,10 +15,10 @@ */ #include "script_component.hpp" -PARAMS_1(_theMap); - private ["_mapSize", "_waypoints", "_size", "_targetPos", "_relBearing", "_wpName", "_wpPos", "_alpha"]; +params ["_theMap"]; + _mapSize = (ctrlPosition _theMap) select 3; _waypoints = [] call FUNC(deviceGetWaypoints); @@ -27,7 +27,7 @@ if (GVAR(currentApplicationPage) == 1) then { _theMap ctrlMapAnimAdd [0, DUMMY_ZOOM, DUMMY_POS]; ctrlMapAnimCommit _theMap; _size = 412 * _mapSize; - _theMap drawIcon [QUOTE(PATHTO_R(images\compass_starInverted.paa)), [1,1,1,1], DUMMY_POS, _size, _size, (-1 * (getDir ace_player)), '', 0 ]; + _theMap drawIcon [QUOTE(PATHTO_R(images\compass_starInverted.paa)), [1,1,1,1], DUMMY_POS, _size, _size, (-1 * (getDir ACE_player)), '', 0 ]; _theMap drawIcon [QUOTE(PATHTO_R(images\compass_needle.paa)), [0.533,0.769,0.76,1], DUMMY_POS, _size, _size, 0, '', 0 ]; if (GVAR(currentWaypoint) != -1) then { @@ -42,23 +42,23 @@ if (GVAR(currentApplicationPage) == 1) then { }; }; if ((count _targetPos) == 3) then { - _relBearing = [ace_player, _targetPos] call BIS_fnc_relativeDirTo; + _relBearing = [ACE_player, _targetPos] call BIS_fnc_relativeDirTo; _theMap drawIcon [QUOTE(PATHTO_R(images\compass_needle.paa)), [1,0.564,0.564,1], DUMMY_POS, _size, _size, _relBearing, '', 0 ]; }; }; } else { //Map Mode: if (GVAR(mapAutoTrackPosition)) then { - _theMap ctrlMapAnimAdd [0, (GVAR(mapZoom)/_mapSize), (getPosASL ace_player)]; + _theMap ctrlMapAnimAdd [0, (GVAR(mapZoom)/_mapSize), (getPosASL ACE_player)]; ctrlMapAnimCommit _theMap; }; _size = 48 * _mapSize; - _theMap drawIcon [QUOTE(PATHTO_R(images\icon_self.paa)), [0.533,0.769,0.76,0.75], (getPosASL ace_player), _size, _size, (getDir ace_player), '', 0 ]; + _theMap drawIcon [QUOTE(PATHTO_R(images\icon_self.paa)), [0.533,0.769,0.76,0.75], (getPosASL ACE_player), _size, _size, (getDir ACE_player), '', 0 ]; if (GVAR(settingShowAllWaypointsOnMap)) then { _size = 32 * _mapSize; { - EXPLODE_2_PVT(_x,_wpName,_wpPos); + _x params ["_wpName", "_wpPos"]; _alpha = if (_forEachIndex == GVAR(currentWaypoint)) then {1} else {0.5}; _theMap drawIcon [QUOTE(PATHTO_R(images\icon_mapWaypoints.paa)), [1,1,1,_alpha], _wpPos, _size, _size, 0, '', 0 ]; } forEach _waypoints; diff --git a/addons/microdagr/functions/fnc_modeMapButtons.sqf b/addons/microdagr/functions/fnc_modeMapButtons.sqf index 5de4bf9ca7..a0d74bec49 100644 --- a/addons/microdagr/functions/fnc_modeMapButtons.sqf +++ b/addons/microdagr/functions/fnc_modeMapButtons.sqf @@ -6,7 +6,7 @@ * 0: String of the map button pressed * * Return Value: - * Nothing + * None * * Example: * ["autotrack"] call ace_microdagr_fnc_modeMapButtons @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -PARAMS_1(_mode); +params ["_mode"]; [-1] call FUNC(saveCurrentAndSetNewMode); //backup current draw pos/zoom diff --git a/addons/microdagr/functions/fnc_moduleMapFill.sqf b/addons/microdagr/functions/fnc_moduleMapFill.sqf index d07b0bc518..03089a4ff4 100644 --- a/addons/microdagr/functions/fnc_moduleMapFill.sqf +++ b/addons/microdagr/functions/fnc_moduleMapFill.sqf @@ -4,23 +4,18 @@ * * Arguments: * 0: logic - * 1: synced units-not used - * 2: Module Activated * * Return Value: - * Nothing + * None * * Example: - * [module, [], true] call ace_microdagr_fnc_moduleMapFill + * [module] call ace_microdagr_fnc_moduleMapFill * * Public: No */ #include "script_component.hpp" -PARAMS_3(_logic,_syncedUnits,_activated); +if !(isServer) exitWith {}; +params ["_logic"]; -if (!_activated) exitWith {WARNING("Module Placed but not active");}; - -if (isServer) then { - [_logic, QGVAR(MapDataAvailable), "MapDataAvailable"] call EFUNC(common,readSettingFromModule); -}; +[_logic, QGVAR(MapDataAvailable), "MapDataAvailable"] call EFUNC(common,readSettingFromModule); diff --git a/addons/microdagr/functions/fnc_openDisplay.sqf b/addons/microdagr/functions/fnc_openDisplay.sqf index b4cec0fe46..aa2db94827 100644 --- a/addons/microdagr/functions/fnc_openDisplay.sqf +++ b/addons/microdagr/functions/fnc_openDisplay.sqf @@ -6,7 +6,7 @@ * 0: Display Mode to show the microDAGR in * * Return Value: - * Nothing + * None * * Example: * [1] call ace_microdagr_fnc_openDisplay @@ -15,9 +15,9 @@ */ #include "script_component.hpp" -private ["_oldShowMode", "_args", "_pfID", "_player"]; +private ["_oldShowMode", "_args", "_player"]; -DEFAULT_PARAM(0,_newDisplayShowMode,-1); +params [["_newDisplayShowMode", -1, [-1]]]; _oldShowMode = GVAR(currentShowMode); if (_newDisplayShowMode == -1) then { @@ -30,11 +30,10 @@ if ((_newDisplayShowMode == DISPLAY_MODE_DISPLAY) && {!([DISPLAY_MODE_DISPLAY] c if ((_newDisplayShowMode == DISPLAY_MODE_DIALOG) && {!([DISPLAY_MODE_DIALOG] call FUNC(canShow))}) then {_newDisplayShowMode = DISPLAY_MODE_HIDDEN}; - //On first-startup if (GVAR(currentApplicationPage) == APP_MODE_NULL) then { GVAR(currentApplicationPage) = APP_MODE_INFODISPLAY; - GVAR(mapPosition) = getPos ace_player; + GVAR(mapPosition) = getPos ACE_player; }; if (_newDisplayShowMode in [DISPLAY_MODE_CLOSED, DISPLAY_MODE_HIDDEN]) then { @@ -74,14 +73,14 @@ if ((_oldShowMode == DISPLAY_MODE_CLOSED) && {GVAR(currentShowMode) != DISPLAY_M //Start a pfeh to update display and handle hiding display [{ - PARAMS_2(_args,_pfID); - EXPLODE_1_PVT(_args,_player); - if ((isNull ace_player) || {!alive ace_player} || {ace_player != _player} || {!("ACE_microDAGR" in (items ace_player))} || {GVAR(currentShowMode) == DISPLAY_MODE_CLOSED}) then { + params ["_args", "_idPFH"]; + _args params ["_player"]; + if ((isNull ACE_player) || {!alive ACE_player} || {ACE_player != _player} || {!("ACE_microDAGR" in (items ACE_player))} || {GVAR(currentShowMode) == DISPLAY_MODE_CLOSED}) then { //Close Display if still open: if (GVAR(currentShowMode) != DISPLAY_MODE_CLOSED) then { [DISPLAY_MODE_CLOSED] call FUNC(openDisplay); }; - [_pfID] call CBA_fnc_removePerFrameHandler; + [_idPFH] call CBA_fnc_removePerFrameHandler; } else { if (GVAR(currentShowMode) == DISPLAY_MODE_HIDDEN) then { //If display is hidden, and we can show, then swithc modes: @@ -96,5 +95,5 @@ if ((_oldShowMode == DISPLAY_MODE_CLOSED) && {GVAR(currentShowMode) != DISPLAY_M }; }; }; - }, 0.1, [ace_player]] call CBA_fnc_addPerFrameHandler; + }, 0.1, [ACE_player]] call CBA_fnc_addPerFrameHandler; }; diff --git a/addons/microdagr/functions/fnc_recieveRangefinderData.sqf b/addons/microdagr/functions/fnc_recieveRangefinderData.sqf index 154dfff94a..8b2c6672a8 100644 --- a/addons/microdagr/functions/fnc_recieveRangefinderData.sqf +++ b/addons/microdagr/functions/fnc_recieveRangefinderData.sqf @@ -8,7 +8,7 @@ * 2: Inclination (Degrees) * * Return Value: - * Nothing + * None * * Example: * [1000, 45, 1] call ace_microdagr_fnc_recieveRangefinderData @@ -19,7 +19,7 @@ private ["_horizontalDistance", "_verticleDistance", "_targetOffset", "_targetPosASL"]; -PARAMS_3(_slopeDistance,_azimuth,_inclination); +params ["_slopeDistance", "_azimuth", "_inclination"]; if (GVAR(currentWaypoint) != -2) exitWith {}; //Only take waypoint when "connected" if (_slopeDistance < 0) exitWith {}; //Bad Data @@ -29,6 +29,6 @@ _verticleDistance = (sin _inclination) * _slopeDistance; _targetOffset = [((sin _azimuth) * _horizontalDistance), ((cos _azimuth) * _horizontalDistance), _verticleDistance]; //This assumes the "rangefinder view" pos is very close to player, at worst the turret should only be a few meters different -_targetPosASL = (getPosASL ace_player) vectorAdd _targetOffset; +_targetPosASL = (getPosASL ACE_player) vectorAdd _targetOffset; GVAR(rangeFinderPositionASL) = _targetPosASL; diff --git a/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf b/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf index 64a5cab991..7cbec9f242 100644 --- a/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf +++ b/addons/microdagr/functions/fnc_saveCurrentAndSetNewMode.sqf @@ -7,7 +7,7 @@ * 0: New Mode * * Return Value: - * Nothing + * None * * Example: * [2] call ace_microdagr_fnc_saveCurrentAndSetNewMode @@ -16,24 +16,21 @@ */ #include "script_component.hpp" -private ["_display", "_theMap", "_mapSize", "_centerPos", "_mapCtrlPos"]; +private ["_display", "_theMap", "_centerPos", "_mapCtrlPos"]; -PARAMS_1(_newMode); +params ["_newMode"]; disableSerialization; -_display = displayNull; -if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { - _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); -} else { - _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); -}; +_display = uiNamespace getVariable [[QGVAR(RscTitleDisplay), QGVAR(DialogDisplay)] select (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG), displayNull]; + if (isNull _display) exitWith {ERROR("No Display");}; if (GVAR(currentApplicationPage) == 2) then { - _theMap = if (!GVAR(mapShowTexture)) then {_display displayCtrl IDC_MAPPLAIN} else {_display displayCtrl IDC_MAPDETAILS}; + _theMap = [_display displayCtrl IDC_MAPDETAILS, _display displayCtrl IDC_MAPPLAIN] select (!GVAR(mapShowTexture)); _mapCtrlPos = ctrlPosition _theMap; - _mapSize = _mapCtrlPos select 3; - _centerPos = [((_mapCtrlPos select 0) + (_mapCtrlPos select 2) / 2), ((_mapCtrlPos select 1) + (_mapCtrlPos select 3) / 2)]; + + _mapCtrlPos params ["_mapCtrlPosX", "_mapCtrlPosY", "_mapCtrlPosZ", "_mapSize"]; + _centerPos = [(_mapCtrlPosX + _mapCtrlPosZ / 2), (_mapCtrlPosY + _mapSize / 2)]; GVAR(mapPosition) = _theMap ctrlMapScreenToWorld _centerPos; GVAR(mapZoom) = (ctrlMapScale _theMap) * _mapSize; diff --git a/addons/microdagr/functions/fnc_showApplicationPage.sqf b/addons/microdagr/functions/fnc_showApplicationPage.sqf index 3c042fdff3..dba6b54f18 100644 --- a/addons/microdagr/functions/fnc_showApplicationPage.sqf +++ b/addons/microdagr/functions/fnc_showApplicationPage.sqf @@ -3,10 +3,10 @@ * Changes the "application page" shown on the microDAGR * * Arguments: - * Nothing + * None * * Return Value: - * Nothing + * None * * Example: * [] call ace_microdagr_fnc_showApplicationPage @@ -19,12 +19,8 @@ private ["_display", "_theMap", "_mapSize"]; disableSerialization; -_display = displayNull; -if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { - _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); -} else { - _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); -}; +_display = uiNamespace getVariable [[QGVAR(RscTitleDisplay), QGVAR(DialogDisplay)] select (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG), displayNull]; + if (isNull _display) exitWith {ERROR("No Display");}; //TopBar diff --git a/addons/microdagr/functions/fnc_updateDisplay.sqf b/addons/microdagr/functions/fnc_updateDisplay.sqf index 910f422c75..826ea55e6c 100644 --- a/addons/microdagr/functions/fnc_updateDisplay.sqf +++ b/addons/microdagr/functions/fnc_updateDisplay.sqf @@ -3,10 +3,10 @@ * Updates the display (several times a second) called from the pfeh * * Arguments: - * Nothing + * None * * Return Value: - * Nothing + * None * * Example: * [] call ace_microdagr_fnc_updateDisplay @@ -15,15 +15,11 @@ */ #include "script_component.hpp" -private ["_display", "_waypoints", "_posString", "_eastingText", "_northingText", "_numASL", "_aboveSeaLevelText", "_compassAngleText", "_targetPos", "_targetPosName", "_targetPosLocationASL", "_bearingText", "_rangeText", "_targetName", "_bearing", "_2dDistanceKm", "_SpeedText", "_playerPos2d", "_wpListBox", "_currentIndex", "_wpName", "_wpPos", "_settingListBox", "_yearString", "_monthSring", "_dayString"]; +private ["_display", "_waypoints", "_posString", "_eastingText", "_northingText", "_numASL", "_aboveSeaLevelText", "_compassAngleText", "_targetPos", "_targetPosName", "_targetPosLocationASL", "_bearingText", "_rangeText", "_targetName", "_bearing", "_2dDistanceKm", "_SpeedText", "_wpListBox", "_currentIndex", "_wpName", "_wpPos", "_settingListBox", "_yearString", "_monthSring", "_dayString", "_daylight"]; disableSerialization; -_display = displayNull; -if (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG) then { - _display = (uiNamespace getVariable [QGVAR(DialogDisplay), displayNull]); -} else { - _display = (uiNamespace getVariable [QGVAR(RscTitleDisplay), displayNull]); -}; +_display = uiNamespace getVariable [[QGVAR(RscTitleDisplay), QGVAR(DialogDisplay)] select (GVAR(currentShowMode) == DISPLAY_MODE_DIALOG), displayNull]; + if (isNull _display) exitWith {ERROR("No Display");}; //Fade "shell" at night @@ -44,21 +40,21 @@ case (APP_MODE_INFODISPLAY): { (_display displayCtrl IDC_MODEDISPLAY_NORTHING) ctrlSetText _northingText; //Elevation: - _numASL = ((getPosASL ace_player) select 2) + EGVAR(common,mapAltitude); + _numASL = ((getPosASL ACE_player) select 2) + EGVAR(common,mapAltitude); _aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber; _aboveSeaLevelText = if (_numASL > 0) then {"+" + _aboveSeaLevelText + " MSL"} else {_aboveSeaLevelText + " MSL"}; (_display displayCtrl IDC_MODEDISPLAY_ELEVATIONNUM) ctrlSetText _aboveSeaLevelText; //Heading: _compassAngleText = if (GVAR(settingUseMils)) then { - [(floor ((6400 / 360) * (getDir ace_player))), 4, 0] call CBA_fnc_formatNumber; + [(floor ((6400 / 360) * (getDir ACE_player))), 4, 0] call CBA_fnc_formatNumber; } else { - ([(floor (getDir ace_player)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 + ([(floor (getDir ACE_player)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; (_display displayCtrl IDC_MODEDISPLAY_HEADINGNUM) ctrlSetText _compassAngleText; //Speed: - (_display displayCtrl IDC_MODEDISPLAY_SPEEDNUM) ctrlSetText format ["%1kph", (round (speed (vehicle ace_player)))];; + (_display displayCtrl IDC_MODEDISPLAY_SPEEDNUM) ctrlSetText format ["%1kph", (round (speed (vehicle ACE_player)))];; if (GVAR(currentWaypoint) == -1) then { @@ -89,13 +85,13 @@ case (APP_MODE_INFODISPLAY): { }; if (!(_targetPosLocationASL isEqualTo [])) then { - _bearing = [(getPosASL ace_player), _targetPosLocationASL] call BIS_fnc_dirTo; + _bearing = [(getPosASL ACE_player), _targetPosLocationASL] call BIS_fnc_dirTo; _bearingText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; } else { ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; - _2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; + _2dDistanceKm = ((getPosASL ACE_player) distance2D _targetPosLocationASL) / 1000; _rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)]; _numASL = (_targetPosLocationASL select 2) + EGVAR(common,mapAltitude); _aboveSeaLevelText = [_numASL, 5, 0] call CBA_fnc_formatNumber; @@ -111,14 +107,14 @@ case (APP_MODE_INFODISPLAY): { case (APP_MODE_COMPASS): { //Heading: _compassAngleText = if (GVAR(settingUseMils)) then { - [(floor ((6400 / 360) * (getDir ace_player))), 4, 0] call CBA_fnc_formatNumber; + [(floor ((6400 / 360) * (getDir ACE_player))), 4, 0] call CBA_fnc_formatNumber; } else { - ([(floor (getDir ace_player)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 + ([(floor (getDir ACE_player)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; (_display displayCtrl IDC_MODECOMPASS_HEADING) ctrlSetText _compassAngleText; //Speed: - _SpeedText = format ["%1kph", (round (speed (vehicle ace_player)))];; + _SpeedText = format ["%1kph", (round (speed (vehicle ACE_player)))];; (_display displayCtrl IDC_MODECOMPASS_SPEED) ctrlSetText _SpeedText; if (GVAR(currentWaypoint) == -1) then { @@ -126,8 +122,6 @@ case (APP_MODE_COMPASS): { (_display displayCtrl IDC_MODECOMPASS_RANGE) ctrlSetText ""; (_display displayCtrl IDC_MODECOMPASS_TARGET) ctrlSetText ""; } else { - _playerPos2d = (getPosASL ace_player) select [0,2]; - _targetPosName = ""; _targetPosLocationASL = []; @@ -147,13 +141,13 @@ case (APP_MODE_COMPASS): { _rangeText = "---"; if (!(_targetPosLocationASL isEqualTo [])) then { - _bearing = [(getPosASL ace_player), _targetPosLocationASL] call BIS_fnc_dirTo; + _bearing = [(getPosASL ACE_player), _targetPosLocationASL] call BIS_fnc_dirTo; _bearingText = if (GVAR(settingUseMils)) then { [(floor ((6400 / 360) * (_bearing))), 4, 0] call CBA_fnc_formatNumber; } else { ([(floor (_bearing)), 3, 1] call CBA_fnc_formatNumber) + "°" //degree symbol is in UTF-8 }; - _2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_targetPosLocationASL select [0,2])) / 1000; + _2dDistanceKm = ((getPosASL ACE_player) distance2D _targetPosLocationASL) / 1000; _rangeText = format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)]; }; @@ -169,9 +163,9 @@ case (APP_MODE_WAYPOINTS): { lbClear _wpListBox; { - EXPLODE_2_PVT(_x,_wpName,_wpPos); + _x params ["_wpName", "_wpPos"]; _wpListBox lbAdd _wpName; - _2dDistanceKm = (((getPosASL ace_player) select [0,2]) distance (_wpPos select [0,2])) / 1000; + _2dDistanceKm = ((getPosASL ACE_player) distance2D _wpPos) / 1000; _wpListBox lbSetTextRight [_forEachIndex, (format ["%1km", ([_2dDistanceKm, 1, 1] call CBA_fnc_formatNumber)])]; } forEach _waypoints; diff --git a/addons/microdagr/gui_controls.hpp b/addons/microdagr/gui_controls.hpp index 50e9083ed6..270a3325bd 100644 --- a/addons/microdagr/gui_controls.hpp +++ b/addons/microdagr/gui_controls.hpp @@ -77,14 +77,8 @@ class controlsBackground { sizeExLevel = 0; sizeEx = H_PART(1); - ptsPerSquareSea = 5; - ptsPerSquareTxt = 20; - ptsPerSquareRoad = 0.01; + ptsPerSquareRoad = 0.75; ptsPerSquareObj = 2000; //don't show buildings - ptsPerSquareCLn = 100; - ptsPerSquareCost = 200; - ptsPerSquareFor = 9; - ptsPerSquareForEdge = 9; showCountourInterval = 0; @@ -116,14 +110,7 @@ class controlsBackground { onMouseButtonDblClick = QUOTE(_this call FUNC(mapDoubleTapEH)); onMouseButtonDown = QUOTE(_this call FUNC(mapButtonDownEH)); - // ptsPerSquareSea = 5; - // ptsPerSquareTxt = 20; - // ptsPerSquareRoad = 0.01; ptsPerSquareObj = 9; - // ptsPerSquareCLn = 100; - // ptsPerSquareCost = 200; - // ptsPerSquareFor = 9; - // ptsPerSquareForEdge = 9; maxSatelliteAlpha = 0.5; @@ -711,14 +698,18 @@ class controls { y = Y_PART(2); w = W_PART(24.6); h = H_PART(19); - onLBDblClick = QUOTE(_this call FUNC(appSettingsLBClick)); + // onLBDblClick = QUOTE(_this call FUNC(appSettingsLBClick)); + onLBSelChanged = QUOTE(_this call FUNC(appSettingsLBClick)); sizeEx = H_PART(1.5); sizeEx2 = H_PART(1.5); rowHeight = H_PART(1.75); itemSpacing = 0.001; colorText[] = {0.75,0.75,0.75,1}; + colorTextRight[] = {0.75,0.75,0.75,1}; colorSelect[] = {0.75,0.75,0.75,1}; colorSelect2[] = {0.75,0.75,0.75,1}; + colorSelectRight[] = {0.75,0.75,0.75,1}; + colorSelect2Right[] = {0.75,0.75,0.75,1}; colorBackground[] = {0.05,0.05,0.05,1}; colorSelectBackground[] = {0.05,0.05,0.05,1}; colorSelectBackground2[] = {0.05,0.05,0.05,1}; diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index a636ffa4de..d3a955580a 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -283,7 +283,7 @@ Configurar MicroDAGR Настроить MicroDAGR Konfigurovat MicroDAGR - Konfiguruj MicroDAGR + Otwórz MicroDAGR Configurer MicroDAGR MicroDAGR konfigurálása ConfiguraMicroDAGR @@ -325,7 +325,7 @@ Kolik informací je načteno do MicroDAGR? Quanta informação é preenchida no mapa do MicroDAGR - + Full Satellite + Buildings Pełna satelitarna + budynki Satelite completo + Edificios @@ -333,7 +333,7 @@ Satelit + Budovy Satélite completo + Edifícios - + Topographical + Roads Topograficzna + drogi Topografico + Carreteras @@ -341,7 +341,7 @@ Topografické + Cesty Topográfico + Estradas - + None (Cannot use map view) Żadna (wyłącza ekran mapy) Nada (No se puede el mapa) @@ -358,4 +358,4 @@ Controla quantos dados são preenchidos nos itens microDAGR. Menos dados restringe a visualização de mapa para mostrar menos informações no minimapa<br/>Fonte: MicroDAGR.pbo - + \ No newline at end of file diff --git a/addons/missionmodules/README.md b/addons/missionmodules/README.md new file mode 100644 index 0000000000..0b8950d3fe --- /dev/null +++ b/addons/missionmodules/README.md @@ -0,0 +1,11 @@ +ace_missionmodules +=========== + +Adds mission modules. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Glowbal](https://github.com/Glowbal) diff --git a/addons/mk6mortar/README.md b/addons/mk6mortar/README.md index 84c7a6e984..3e5109f38f 100644 --- a/addons/mk6mortar/README.md +++ b/addons/mk6mortar/README.md @@ -1,7 +1,8 @@ ace_mk6mortar ========== -Tweaks the mk6 mortar from Arma3 +Tweaks the Nk6 Mortar system. + ## Maintainers diff --git a/addons/modules/README.md b/addons/modules/README.md new file mode 100644 index 0000000000..b13743b981 --- /dev/null +++ b/addons/modules/README.md @@ -0,0 +1,11 @@ +ace_modules +=========== + +Provides framework for module handling. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Glowbal](https://github.com/Glowbal) diff --git a/addons/mx2a/README.md b/addons/mx2a/README.md index cbaf9add1b..f03edf1849 100644 --- a/addons/mx2a/README.md +++ b/addons/mx2a/README.md @@ -3,8 +3,9 @@ ace_mx2a Adds the MX-2A thermal imaging device. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/noidle/README.md b/addons/noidle/README.md new file mode 100644 index 0000000000..4ea313bd57 --- /dev/null +++ b/addons/noidle/README.md @@ -0,0 +1,11 @@ +ace_noidle +=========== + +Removes idle animations. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [commy2](https://github.com/commy2) diff --git a/addons/norearm/README.md b/addons/norearm/README.md new file mode 100644 index 0000000000..f0035e5749 --- /dev/null +++ b/addons/norearm/README.md @@ -0,0 +1,11 @@ +ace_norearm +=========== + +Removes rearm action. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [commy2](https://github.com/commy2) diff --git a/addons/optics/CfgEventHandlers.hpp b/addons/optics/CfgEventHandlers.hpp index 6c6e824b16..68962af2c4 100644 --- a/addons/optics/CfgEventHandlers.hpp +++ b/addons/optics/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit)); diff --git a/addons/optics/CfgJointRails.hpp b/addons/optics/CfgJointRails.hpp new file mode 100644 index 0000000000..86c962afe5 --- /dev/null +++ b/addons/optics/CfgJointRails.hpp @@ -0,0 +1,15 @@ +class asdg_OpticRail; +class asdg_OpticRail1913: asdg_OpticRail { + class compatibleItems { + ACE_optic_Hamr_2D = 1; + ACE_optic_Hamr_PIP = 1; + ACE_optic_Arco_2D = 1; + ACE_optic_Arco_PIP = 1; + ACE_optic_MRCO_2D = 1; + ACE_optic_MRCO_PIP = 1; + ACE_optic_SOS_2D = 1; + ACE_optic_SOS_PIP = 1; + ACE_optic_LRPS_2D = 1; + ACE_optic_LRPS_PIP = 1; + }; +}; diff --git a/addons/optics/CfgOpticsEffect.hpp b/addons/optics/CfgOpticsEffect.hpp index a1bf62d6e3..8638277732 100644 --- a/addons/optics/CfgOpticsEffect.hpp +++ b/addons/optics/CfgOpticsEffect.hpp @@ -1,4 +1,3 @@ - class CfgOpticsEffect { class ACE_OpticsRadBlur1 { type = "radialblur"; diff --git a/addons/optics/CfgPreloadTextures.hpp b/addons/optics/CfgPreloadTextures.hpp index 57fa2cabf8..1354f91e18 100644 --- a/addons/optics/CfgPreloadTextures.hpp +++ b/addons/optics/CfgPreloadTextures.hpp @@ -1,4 +1,3 @@ - #define MACRO_PRELOAD \ GVAR(BodyDay) = "*"; \ GVAR(BodyNight) = "*"; \ diff --git a/addons/optics/CfgRscTitles.hpp b/addons/optics/CfgRscTitles.hpp index b7d2005d77..3bbd6b62bc 100644 --- a/addons/optics/CfgRscTitles.hpp +++ b/addons/optics/CfgRscTitles.hpp @@ -1,4 +1,3 @@ - class RscOpticsValue; class RscMapControl; class RscText; @@ -111,7 +110,7 @@ class RscInGameUI { idc = 1713011; x = "safeZoneXAbs + safeZoneWAbs - (safezoneX - safeZoneXABS) * ((getResolution select 4)/(16/3))"; colorBackground[] = {0,0,0,1}; - }; + }; }; class ACE_RscWeapon_Hamr: ACE_RscWeapon_base { diff --git a/addons/optics/CfgVehicles.hpp b/addons/optics/CfgVehicles.hpp index 92abeac04f..eda9a3d930 100644 --- a/addons/optics/CfgVehicles.hpp +++ b/addons/optics/CfgVehicles.hpp @@ -1,4 +1,3 @@ - class CfgVehicles { class Box_NATO_Support_F; class ACE_Box_Misc: Box_NATO_Support_F { diff --git a/addons/optics/CfgWeapons.hpp b/addons/optics/CfgWeapons.hpp index 11fdb1f427..1be66d3aa2 100644 --- a/addons/optics/CfgWeapons.hpp +++ b/addons/optics/CfgWeapons.hpp @@ -1,18 +1,17 @@ - class CfgWeapons { class ItemCore; class InventoryOpticsItem_Base_F; class Default; - + class Binocular: Default { forceOptics = 0; // Allow using compass with Binocular opticsZoomMin = 0.056889; // 5.25x power opticsZoomMax = 0.056889; // 9 px/mil - modelOptics = "\z\ace\addons\optics\models\NWD_M22_5x"; // 7 horizontal field of view + modelOptics = "\z\ace\addons\optics\models\NWD_M22_5x"; // 7 degrees horizontal field of view visionMode[] = {"Normal"}; // Can't use nvgs with binoculars any more than you can with scopes // Fix AI using Binocs on short range - #18737 // minRange = 300; // 300 = uses Rangefinder often (runs a few meters, stops, uses RF, repeats) - minRange = 500; //500 = seem almost never use it..? + minRange = 500; //500 = seem almost never use it..? minRangeProbab = 0.001; midRange = 1000; midRangeProbab = 0.01; diff --git a/addons/optics/README.md b/addons/optics/README.md index 2d7281cee7..a5224267b7 100644 --- a/addons/optics/README.md +++ b/addons/optics/README.md @@ -1,7 +1,7 @@ ace_optics =============== -Adds animated 2D optics. Some of them use picture in picture. +Adds animated 2D and PiP (picture-in-picture) optics. ## Maintainers diff --git a/addons/optics/config.cpp b/addons/optics/config.cpp index 224410cdec..79f71842ee 100644 --- a/addons/optics/config.cpp +++ b/addons/optics/config.cpp @@ -30,5 +30,6 @@ class CfgPatches { #include "CfgRscTitles.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "CfgJointRails.hpp" #include "CfgPreloadTextures.hpp" diff --git a/addons/optionsmenu/functions/fnc_exportSettings.sqf b/addons/optionsmenu/functions/fnc_exportSettings.sqf index 9d6437495d..172a95808e 100644 --- a/addons/optionsmenu/functions/fnc_exportSettings.sqf +++ b/addons/optionsmenu/functions/fnc_exportSettings.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_compiledConfig", "_name", "_typeName", "_isClientSetable", "_localizedName", "_localizedDescription", "_possibleValues", "_defaultValue", "_value", "_compiledConfigEntry"]; +private ["_compiledConfig", "_name", "_typeName", "_isClientSetable", "_localizedName", "_localizedDescription", "_possibleValues", "_defaultValue", "_value", "_compiledConfigEntry", "_formatedValue"]; { /*_settingData = [ @@ -40,25 +40,39 @@ private ["_compiledConfig", "_name", "_typeName", "_isClientSetable", "_localize if (GVAR(ClientSettingsExportIncluded) || !_isClientSetable) then { _value = missionNamespace getvariable [_name, _defaultValue]; - if (_typeName == "STRING") then { - _value = format['"%1"', _value]; - }; - if (_typeName == "BOOL") then { - _value = if (typeName _value == "BOOL" && {_value}) then {1} else {0}; + _formatedValue = switch (toLower _typeName) do { + case ("scalar"): { + format['value = %1;', _value]; + }; + case ("string"): { + format['value = "%1";', _value]; + }; + case ("bool"): { + if (typeName _value != "BOOL") then {ERROR("weird bool typename??");}; + _value = if (((typeName _value) == "BOOL") && {_value}) then {1} else {0}; + format ['value = %1;', _value]; + }; + case ("color"): { + _value params [["_r",1], ["_b",0], ["_g",1], ["_a",1]]; + format ["value[] = {%1, %2, %3, %4};", _r, _b, _g, _a]; + }; + default { + ERROR("unknown typeName"); + "" + }; + }; _compiledConfigEntry = format [" class %1 { - value = %2; + %2 typeName = %3; force = 1; -};", _name, _value, format['"%1"', _typeName]]; +};", _name, _formatedValue, format['"%1"', _typeName]]; "ace_clipboard" callExtension _compiledConfigEntry; }; } forEach EGVAR(common,settings); - "ace_clipboard" callExtension "--COMPLETE--"; +"ace_clipboard" callExtension "--COMPLETE--"; [LSTRING(settingsExported)] call EFUNC(common,displayTextStructured); - - diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index 77cbc0961c..f368ef79b4 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -103,7 +103,7 @@ Abrir menú de exportación Открыть меню экспорта Otevřít exportovací menu - Otwórz menu eksportowania + Eksport ustawień Ouvrir le menu d'exportation Exportálási menü megnyitása Apri menù esportazione @@ -175,7 +175,7 @@ Incluir configuración de cliente Включить настройки клиента Zahrnout nastavení klienta - Zawrzyj ustawienia klienta + Zaw. ustaw. klienta Inclure paramètres client Kliens-beállítások melléklése Includi i parametri del client @@ -219,7 +219,7 @@ Allow Config Export [ACE] - Pozwól na eksport ustawień [ACE] + Pozwól na eksport ustawień [ACE] Permitir exportar configuración Erlaube Config-Export [ACE] Povolit export natavení [ACE] @@ -307,7 +307,7 @@ Debug To Clipboard - Debuguj do schowka + Debug do schowka Depurar al portapapeles Debug do schránky Debug in die Zwischenablage @@ -349,5 +349,9 @@ All Categories Wszystkie kategorie + + Logistics + Logistyka + \ No newline at end of file diff --git a/addons/overpressure/README.md b/addons/overpressure/README.md index 3d3f242e40..fce4db7d3f 100644 --- a/addons/overpressure/README.md +++ b/addons/overpressure/README.md @@ -1,7 +1,7 @@ ace_overpressure ============= -Adds backblast to AT launchers and overpressure zones to tank cannons. +Adds backblast area to AT launchers and overpressure zones to tank cannons. ## Maintainers diff --git a/addons/parachute/README.md b/addons/parachute/README.md index fcf1a36333..3dd2608152 100644 --- a/addons/parachute/README.md +++ b/addons/parachute/README.md @@ -3,6 +3,7 @@ ace_parachute Improves parachutes and adds an altimeter. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. diff --git a/addons/ragdolls/README.md b/addons/ragdolls/README.md index b90ba9e5c9..86739775c3 100644 --- a/addons/ragdolls/README.md +++ b/addons/ragdolls/README.md @@ -1,7 +1,7 @@ ace_ragdolls ============ -Tweaks the ragdoll behaviour to be more resposive to bullet impacts and explosions. +Tweaks the ragdoll behaviour to be more responsive to bullet impacts and explosions. ## Maintainers diff --git a/addons/rangecard/README.md b/addons/rangecard/README.md index c96e151869..94169a3075 100644 --- a/addons/rangecard/README.md +++ b/addons/rangecard/README.md @@ -1,10 +1,11 @@ ace_rangecards =============== -Adds range cards +Adds range cards. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/rangecard/stringtable.xml b/addons/rangecard/stringtable.xml index bda93bcab3..7e93df20d5 100644 --- a/addons/rangecard/stringtable.xml +++ b/addons/rangecard/stringtable.xml @@ -8,6 +8,7 @@ Vzdálenostní tabulka Entfernungsspinne Tabela de distâncias + Table de tir 50 METER increments -- MRAD/MRAD (reticle/turrets) @@ -16,6 +17,7 @@ Přidat 50 METRŮ -- MRAD/MRAD (síťka/věže) 50-Meter-Schritte MRAD/MRAD (Fadenkreuz/Geschützturm) Incrementos de 50 METROS - MRAD/MRAD (retícula/torres) + Intervalle 50 mètres -- millième/millième (réticule/tambours) Open Range Card @@ -24,6 +26,7 @@ Otevřít vzdálenostní tabulku Öffne Entfernungsspinne Abrir tabela de distâncias + Afficher table de tir Open Range Card Copy @@ -32,6 +35,7 @@ Otevřít kopii vzdálenostní tabulky Öffne Kopie der Entfernungsspinne Abrir cópia da tabela de distâncias + Afficher table de tir copiée Open Range Card @@ -40,6 +44,7 @@ Otevřít vzdálenostní tabulku Öffne Entfernungsspinne Abrir tabela de distäncias + Afficher table de tir Open Range Card Copy @@ -48,6 +53,7 @@ Otevřít kopii vzdálenostní tabulky Öffne Kopie der Entfernungsspinne Abrir cópia da tabela de distâncias + Afficher table de tir copiée Copy Range Card @@ -56,6 +62,7 @@ Kopírovat vzdálenostní tabulku Kopiere Entfernungsspinne Copiar tabela de distäncias + Copier table de tir - + \ No newline at end of file diff --git a/addons/realisticnames/CfgVehicles.hpp b/addons/realisticnames/CfgVehicles.hpp index aef52578e2..c3288815dd 100644 --- a/addons/realisticnames/CfgVehicles.hpp +++ b/addons/realisticnames/CfgVehicles.hpp @@ -633,4 +633,12 @@ class CfgVehicles { class Weapon_MMG_02_sand_F: Weapon_Base_F { displayName = CSTRING(MMG_02_sand); };*/ + + //attachments + + class Item_Base_F; + + class Item_acc_flashlight: Item_Base_F { + displayName="UTG Defender 126"; + }; }; diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index 0a83239047..83534a1083 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -1,4 +1,4 @@ - +class Mode_SemiAuto; class Mode_FullAuto; class CfgWeapons { @@ -510,14 +510,14 @@ class CfgWeapons { class player: player {}; }; - class cannon_105mm: cannon_120mm { + class cannon_105mm: CannonCore { displayName = "M68"; - class player: player { + class player: Mode_SemiAuto { displayName = "M68"; }; }; - class cannon_125mm: cannon_120mm { + class cannon_125mm: CannonCore { displayName = "2A46"; }; @@ -568,4 +568,12 @@ class CfgWeapons { displayName = "L21A1 RARDEN"; }; }; + + //attachments + + class Itemcore; + + class acc_flashlight: ItemCore { + displayName = "UTG Defender 126"; + }; }; diff --git a/addons/realisticnames/README.md b/addons/realisticnames/README.md index 145ec16a61..6cd05351f6 100644 --- a/addons/realisticnames/README.md +++ b/addons/realisticnames/README.md @@ -1,7 +1,7 @@ ace_realisticnames ================== -Changes the names of various weapons and vehicles to those of their RL counterparts. +Changes the names of various weapons and vehicles to those of their real life counterparts. ## Maintainers diff --git a/addons/recoil/README.md b/addons/recoil/README.md new file mode 100644 index 0000000000..0c81cde34a --- /dev/null +++ b/addons/recoil/README.md @@ -0,0 +1,11 @@ +ace_recoil +=========== + +Tweaks weapon recoils and adds camera shake. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [commy2](https://github.com/commy2) diff --git a/addons/reloadlaunchers/README.md b/addons/reloadlaunchers/README.md new file mode 100644 index 0000000000..2b6357200b --- /dev/null +++ b/addons/reloadlaunchers/README.md @@ -0,0 +1,11 @@ +ace_reloadlaunchers +=========== + +Add the ability to reload someone else's launcher. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [commy2](https://github.com/commy2) diff --git a/addons/reloadlaunchers/config.cpp b/addons/reloadlaunchers/config.cpp index 3a66b39719..6a04f6339a 100644 --- a/addons/reloadlaunchers/config.cpp +++ b/addons/reloadlaunchers/config.cpp @@ -6,8 +6,8 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; - author[] = {""}; - authorUrl = ""; + author[] = {"commy2"}; + authorUrl = "https://github.com/commy2"; VERSION_CONFIG; }; }; diff --git a/addons/repair/ACE_Repair.hpp b/addons/repair/ACE_Repair.hpp index c12566d5b1..219945003d 100644 --- a/addons/repair/ACE_Repair.hpp +++ b/addons/repair/ACE_Repair.hpp @@ -31,7 +31,7 @@ class ACE_Repair { class MiscRepair: ReplaceWheel { displayName = CSTRING(Repairing); // let's make empty string an auto generated string displayNameProgress = CSTRING(RepairingHitPoint); - condition = QUOTE((_target getHitPointDamage _hitPoint) > ([_caller] call FUNC(getPostRepairDamage))); + condition = QUOTE(call FUNC(canMiscRepair)); requiredEngineer = 0; repairingTime = 15; callbackSuccess = QUOTE(call FUNC(doRepair)); @@ -63,7 +63,7 @@ class ACE_Repair { requiredEngineer = QGVAR(engineerSetting_fullRepair); repairLocations[] = {QGVAR(fullRepairLocation)}; repairingTime = 30; - condition = "damage (_this select 1) > 0"; + condition = "damage _target > 0"; callbackSuccess = QUOTE(call FUNC(doFullRepair)); }; }; diff --git a/addons/repair/ACE_Settings.hpp b/addons/repair/ACE_Settings.hpp index e956e853de..48d3a9c0c6 100644 --- a/addons/repair/ACE_Settings.hpp +++ b/addons/repair/ACE_Settings.hpp @@ -5,7 +5,7 @@ class ACE_Settings { typeName = "BOOL"; isClientSettable = 1; value = 1; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; class GVAR(engineerSetting_Repair) { displayName = CSTRING(enginerSetting_Repair_name); @@ -13,7 +13,7 @@ class ACE_Settings { typeName = "SCALAR"; value = 1; values[] = {CSTRING(engineerSetting_anyone), CSTRING(engineerSetting_EngineerOnly), CSTRING(engineerSetting_RepairSpecialistOnly)}; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; class GVAR(engineerSetting_Wheel) { displayName = CSTRING(enginerSetting_Wheel_name); @@ -21,21 +21,21 @@ class ACE_Settings { typeName = "SCALAR"; value = 0; values[] = {CSTRING(engineerSetting_anyone), CSTRING(engineerSetting_EngineerOnly), CSTRING(engineerSetting_RepairSpecialistOnly)}; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; class GVAR(repairDamageThreshold) { displayName = CSTRING(repairDamageThreshold_name); description = CSTRING(repairDamageThreshold_description); typeName = "SCALAR"; value = 0.6; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; class GVAR(repairDamageThreshold_Engineer) { displayName = CSTRING(repairDamageThreshold_Engineer_name); description = CSTRING(repairDamageThreshold_Engineer_description); typeName = "SCALAR"; value = 0.4; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; class GVAR(consumeItem_ToolKit) { displayName = CSTRING(consumeItem_ToolKit_name); @@ -43,7 +43,7 @@ class ACE_Settings { typeName = "SCALAR"; value = 1; values[] = {ECSTRING(common,No), ECSTRING(common,Yes)}; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; class GVAR(fullRepairLocation) { displayName = CSTRING(fullRepairLocation); @@ -51,7 +51,7 @@ class ACE_Settings { typeName = "SCALAR"; value = 2; values[] = {CSTRING(useAnywhere), CSTRING(repairVehicleOnly), CSTRING(repairFacilityOnly), CSTRING(vehicleAndFacility), ECSTRING(common,Disabled)}; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; class GVAR(engineerSetting_fullRepair) { displayName = CSTRING(engineerSetting_fullRepair_name); @@ -59,6 +59,6 @@ class ACE_Settings { typeName = "SCALAR"; value = 3; values[] = {CSTRING(engineerSetting_anyone), CSTRING(engineerSetting_EngineerOnly), CSTRING(engineerSetting_RepairSpecialistOnly)}; - category = CSTRING(categoryName); + category = ECSTRING(OptionsMenu,CategoryLogistics); }; }; diff --git a/addons/repair/CfgEventHandlers.hpp b/addons/repair/CfgEventHandlers.hpp index 27e14937cf..08ec6bad15 100644 --- a/addons/repair/CfgEventHandlers.hpp +++ b/addons/repair/CfgEventHandlers.hpp @@ -40,9 +40,4 @@ class Extended_Init_EventHandlers { init = QUOTE(_this call DFUNC(addRepairActions)); }; }; - class ACE_RepairItem_Base { - class ADDON { - init = QUOTE(if (!isnil QUOTE(QEFUNC(cargo,initObject))) then {_this call EFUNC(cargo,initObject)}); - }; - }; }; diff --git a/addons/repair/CfgVehicleClasses.hpp b/addons/repair/CfgVehicleClasses.hpp deleted file mode 100644 index 585b8f2858..0000000000 --- a/addons/repair/CfgVehicleClasses.hpp +++ /dev/null @@ -1,5 +0,0 @@ -class CfgVehicleClasses { - class GVAR(items) { - displayName = "ACE"; - }; -}; diff --git a/addons/repair/CfgVehicles.hpp b/addons/repair/CfgVehicles.hpp index f24cd9bc9a..47459f532d 100644 --- a/addons/repair/CfgVehicles.hpp +++ b/addons/repair/CfgVehicles.hpp @@ -16,12 +16,11 @@ class CfgVehicles { class ACE_Module; - // @todo localization for all the modules class ACE_moduleRepairSettings: ACE_Module { scope = 2; displayName = CSTRING(moduleName); - icon = QUOTE(PATHTOF(ui\Icon_Module_Repair_ca.paa)); //@todo - category = "ACE"; + icon = QUOTE(PATHTOF(ui\Icon_Module_Repair_ca.paa)); + category = "ACE_Logistics"; function = QFUNC(moduleRepairSettings); functionPriority = 1; isGlobal = 1; @@ -103,7 +102,7 @@ class CfgVehicles { scope = 2; displayName = CSTRING(AssignEngineerRole_Module_DisplayName); icon = QUOTE(PATHTOF(ui\Icon_Module_Repair_ca.paa)); - category = "ACE"; + category = "ACE_Logistics"; function = QFUNC(moduleAssignEngineer); functionPriority = 10; isGlobal = 2; @@ -147,7 +146,7 @@ class CfgVehicles { scope = 2; displayName = CSTRING(AssignRepairVehicle_Module_DisplayName); icon = QUOTE(PATHTOF(ui\Icon_Module_Repair_ca.paa)); - category = "ACE"; + category = "ACE_Logistics"; function = QFUNC(moduleAssignRepairVehicle); functionPriority = 10; isGlobal = 2; @@ -254,7 +253,7 @@ class CfgVehicles { icon = "iconObject_circle"; mapSize = 0.7; accuracy = 0.2; - vehicleClass = QGVAR(items); + vehicleClass = "ACE_Logistics_Items"; destrType = "DesturctNo"; }; @@ -264,7 +263,7 @@ class CfgVehicles { author = "Hawkins"; scope = 2; model = QUOTE(PATHTOF(data\ace_track.p3d)); - displayName = "$STR_ACE_Repair_SpareTrack"; + displayName = CSTRING(SpareTrack); }; class ACE_Wheel: ACE_RepairItem_Base { @@ -273,7 +272,7 @@ class CfgVehicles { author = "Hawkins"; scope = 2; model = QUOTE(PATHTOF(data\ace_wheel.p3d)); - displayName = "$STR_ACE_Repair_SpareWheel"; + displayName = CSTRING(SpareWheel); picture = QUOTE(PATHTOF(ui\tire_ca.paa)); }; @@ -286,7 +285,10 @@ class CfgVehicles { transportRepair = 0; }; - class Heli_Transport_04_base_F; + class Helicopter_Base_H; + class Heli_Transport_04_base_F: Helicopter_Base_H { + GVAR(hitpointGroups[]) = { {"HitEngine", {"HitEngine1", "HitEngine2"}}, {"Glass_1_hitpoint", {"Glass_2_hitpoint", "Glass_3_hitpoint", "Glass_4_hitpoint", "Glass_5_hitpoint", "Glass_6_hitpoint", "Glass_7_hitpoint", "Glass_8_hitpoint", "Glass_9_hitpoint", "Glass_10_hitpoint", "Glass_11_hitpoint", "Glass_12_hitpoint", "Glass_13_hitpoint", "Glass_14_hitpoint", "Glass_15_hitpoint", "Glass_16_hitpoint", "Glass_17_hitpoint", "Glass_18_hitpoint", "Glass_19_hitpoint", "Glass_20_hitpoint"}} }; + }; class O_Heli_Transport_04_repair_F: Heli_Transport_04_base_F { GVAR(canRepair) = 1; transportRepair = 0; @@ -304,12 +306,19 @@ class CfgVehicles { transportRepair = 0; }; - class Offroad_01_base_F; + class Car_F; + class Offroad_01_base_F: Car_F { + GVAR(hitpointGroups[]) = { {"HitGlass1", {"HitGlass2"}} }; + }; class Offroad_01_repair_base_F: Offroad_01_base_F { GVAR(canRepair) = 1; transportRepair = 0; }; + class MRAP_01_base_F: Car_F { + GVAR(hitpointGroups[]) = { {"HitGlass1", {"HitGlass2", "HitGlass3", "HitGlass4", "HitGlass5", "HitGlass6"}} }; + }; + class B_Truck_01_mover_F; class B_Truck_01_Repair_F: B_Truck_01_mover_F { GVAR(canRepair) = 1; @@ -335,4 +344,9 @@ class CfgVehicles { GVAR(canRepair) = 1; transportRepair = 0; }; + + class Quadbike_01_base_F; + class B_Quadbike_01_F: Quadbike_01_base_F { + GVAR(hitpointPositions[]) = { {"HitEngine", {0, 0.5, -0.7}}, {"HitFuel", {0, 0, -0.5}} }; + }; }; diff --git a/addons/repair/README.md b/addons/repair/README.md new file mode 100644 index 0000000000..180ae38128 --- /dev/null +++ b/addons/repair/README.md @@ -0,0 +1,12 @@ +ace_repair +=========== + +Adds repair system. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [commy2](https://github.com/commy2) +- [Glowbal](https://github.com/Glowbal) diff --git a/addons/repair/XEH_preInit.sqf b/addons/repair/XEH_preInit.sqf index ebf4c87537..8d2f1d8497 100644 --- a/addons/repair/XEH_preInit.sqf +++ b/addons/repair/XEH_preInit.sqf @@ -3,6 +3,7 @@ ADDON = false; PREP(addRepairActions); +PREP(canMiscRepair); PREP(canRemove); PREP(canRepair); PREP(canRepairTrack); @@ -15,6 +16,7 @@ PREP(doRepair); PREP(doRepairTrack); PREP(doReplaceTrack); PREP(doReplaceWheel); +PREP(getHitPointString); PREP(getPostRepairDamage); PREP(getWheelHitPointsWithSelections); PREP(hasItems); diff --git a/addons/repair/config.cpp b/addons/repair/config.cpp index d97f9e30e5..c7015f4650 100644 --- a/addons/repair/config.cpp +++ b/addons/repair/config.cpp @@ -12,11 +12,8 @@ class CfgPatches { }; }; -#include "CfgEventHandlers.hpp" - -#include "CfgActions.hpp" -#include "CfgVehicleClasses.hpp" -#include "CfgVehicles.hpp" - -#include "ACE_Settings.hpp" #include "ACE_Repair.hpp" +#include "ACE_Settings.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgActions.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/repair/data/ace_track.p3d b/addons/repair/data/ace_track.p3d index 86b07f0ef8..988499c32b 100644 Binary files a/addons/repair/data/ace_track.p3d and b/addons/repair/data/ace_track.p3d differ diff --git a/addons/repair/data/ace_wheel.p3d b/addons/repair/data/ace_wheel.p3d index f2b07b066f..c24f804b4f 100644 Binary files a/addons/repair/data/ace_wheel.p3d and b/addons/repair/data/ace_wheel.p3d differ diff --git a/addons/repair/data/trailObjects.rvmat b/addons/repair/data/trailObjects.rvmat index 4fa521f376..8692493699 100644 --- a/addons/repair/data/trailObjects.rvmat +++ b/addons/repair/data/trailObjects.rvmat @@ -10,6 +10,7 @@ forcedDiffuse[] = {0,0,0,0}; emmisive[] = {0,0,0,0}; specular[] = {0.0099999998,0.0099999998,0.0099999998,0.0099999998}; specularPower = 500; +surfaceInfo="a3\data_f\penetration\metal.bisurf"; PixelShaderID = "Super"; VertexShaderID = "Super"; class Stage1 diff --git a/addons/repair/functions/fnc_addRepairActions.sqf b/addons/repair/functions/fnc_addRepairActions.sqf index 3503dff3f0..b76f027bb0 100644 --- a/addons/repair/functions/fnc_addRepairActions.sqf +++ b/addons/repair/functions/fnc_addRepairActions.sqf @@ -14,7 +14,6 @@ * Public: No */ #include "script_component.hpp" -#define TRACK_HITPOINTS ["HitLTrack", "HitRTrack"] params ["_vehicle"]; TRACE_1("params", _vehicle); @@ -27,17 +26,18 @@ _initializedClasses = GETMVAR(GVAR(initializedClasses),[]); // do nothing if the class is already initialized if (_type in _initializedClasses) exitWith {}; -// get all hitpoints -private "_hitPoints"; -_hitPoints = [_vehicle] call EFUNC(common,getHitPointsWithSelections) select 0; + +// get all hitpoints and selections +([_vehicle] call EFUNC(common,getHitPointsWithSelections)) params ["_hitPoints", "_hitPointsSelections"]; // get hitpoints of wheels with their selections -private ["_wheelHitPointsWithSelections", "_wheelHitPoints", "_wheelHitPointSelections"]; +([_vehicle] call FUNC(getWheelHitPointsWithSelections)) params ["_wheelHitPoints", "_wheelHitPointSelections"]; -_wheelHitPointsWithSelections = [_vehicle] call FUNC(getWheelHitPointsWithSelections); -_wheelHitPoints = _wheelHitPointsWithSelections select 0; -_wheelHitPointSelections = _wheelHitPointsWithSelections select 1; +private ["_hitPointsAddedNames", "_hitPointsAddedStrings", "_hitPointsAddedAmount"]; +_hitPointsAddedNames = []; +_hitPointsAddedStrings = []; +_hitPointsAddedAmount = []; // add repair events to this vehicle class { @@ -55,7 +55,7 @@ _wheelHitPointSelections = _wheelHitPointsWithSelections select 1; // remove wheel action _name = format ["Remove_%1", _x]; - _text = localize "STR_ACE_Repair_RemoveWheel"; + _text = localize LSTRING(RemoveWheel); _condition = {[_this select 1, _this select 0, _this select 2 select 0, "RemoveWheel"] call DFUNC(canRepair)}; _statement = {[_this select 1, _this select 0, _this select 2 select 0, "RemoveWheel"] call DFUNC(repair)}; @@ -78,25 +78,69 @@ _wheelHitPointSelections = _wheelHitPointsWithSelections select 1; // exit if the hitpoint is in the blacklist, e.g. glasses if (_x in IGNORED_HITPOINTS) exitWith {}; + private ["_hitpointGroupConfig", "_inHitpointSubGroup", "_currentHitpoint"]; + + // Get hitpoint groups if available + _hitpointGroupConfig = configFile >> "CfgVehicles" >> _type >> QGVAR(hitpointGroups); + _inHitpointSubGroup = false; + if (isArray _hitpointGroupConfig) then { + // Set variable if current hitpoint is in a sub-group (to be excluded from adding action) + _currentHitpoint = _x; + { + { + if (_x == _currentHitpoint) exitWith { + _inHitpointSubGroup = true; + }; + } forEach (_x select 1); + } forEach (getArray _hitpointGroupConfig); + }; + + // Exit if current hitpoint is in sub-group (only main hitpoints get actions) + if (_inHitpointSubGroup) exitWith {}; + // exit if the hitpoint is virtual if (isText (configFile >> "CfgVehicles" >> _type >> "HitPoints" >> _x >> "depends")) exitWith {}; // add misc repair action - - private ["_name", "_text", "_icon", "_selection", "_condition", "_statement"]; + private ["_name", "_icon", "_selection", "_condition", "_statement"]; _name = format ["Repair_%1", _x]; - _text = format ["STR_ACE_Repair_%1", _x]; - - if (isLocalized _text) then { - _text = format [localize LSTRING(RepairHitpoint), localize _text]; - } else { - _text = format [localize LSTRING(RepairHitpoint), _x]; - }; + // Find localized string and track those added for numerization + ([_x, "%1", _x, [_hitPointsAddedNames, _hitPointsAddedStrings, _hitPointsAddedAmount]] call FUNC(getHitPointString)) params ["_text", "_trackArray"]; + _hitPointsAddedNames = _trackArray select 0; + _hitPointsAddedStrings = _trackArray select 1; + _hitPointsAddedAmount = _trackArray select 2; _icon = "A3\ui_f\data\igui\cfg\actions\repair_ca.paa"; + _selection = ""; + + // Get custom position if available + _customSelectionsConfig = configFile >> "CfgVehicles" >> _type >> QGVAR(hitpointPositions); + if (isArray _customSelectionsConfig) then { + // Loop through custom hitpoint positions array + _currentHitpoint = _x; + { + _x params ["_hitpoint", "_position"]; + // Exit with supplied custom position when same hitpoint name found or print RPT error if it's invalid + if (_hitpoint == _currentHitpoint) exitWith { + if (typeName _position == "ARRAY") exitWith { + _selection = _position; // Position in model space + }; + if (typeName _position == "STRING") exitWith { + _selection = _vehicle selectionPosition _position; // Selection name + }; + diag_log text format ["[ACE] ERROR: Invalid custom position %1 of hitpoint %2 in vehicle %3", _position, _hitpoint, _vehicle]; + }; + } forEach (getArray _customSelectionsConfig); + }; + + // If position still empty (not a position array or selection name) try extracting from model + if (typeName _selection == "STRING" && {_selection == ""}) then { + _selection = _vehicle selectionPosition (_hitPointsSelections select (_hitPoints find _x)); + }; + _condition = {[_this select 1, _this select 0, _this select 2 select 0, _this select 2 select 1] call DFUNC(canRepair)}; _statement = {[_this select 1, _this select 0, _this select 2 select 0, _this select 2 select 1] call DFUNC(repair)}; @@ -112,7 +156,12 @@ _wheelHitPointSelections = _wheelHitPointsWithSelections select 1; } else { private "_action"; _action = [_name, _text, _icon, _statement, _condition, {}, [_x, "MiscRepair"], _selection, 4] call EFUNC(interact_menu,createAction); - [_type, 0, ["ACE_MainActions", QGVAR(Repair)], _action] call EFUNC(interact_menu,addActionToClass); + // Put inside main actions if no other position was found above + if (_selection isEqualTo [0, 0, 0]) then { + [_type, 0, ["ACE_MainActions", QGVAR(Repair)], _action] call EFUNC(interact_menu,addActionToClass); + } else { + [_type, 0, [], _action] call EFUNC(interact_menu,addActionToClass); + }; }; }; } forEach _hitPoints; diff --git a/addons/repair/functions/fnc_canMiscRepair.sqf b/addons/repair/functions/fnc_canMiscRepair.sqf new file mode 100644 index 0000000000..c60e59c840 --- /dev/null +++ b/addons/repair/functions/fnc_canMiscRepair.sqf @@ -0,0 +1,54 @@ +/* + * Author: Jonpas + * Check if misc repair action can be done, called from callbackSuccess. + * + * Arguments: + * 0: Unit that does the repairing + * 1: Vehicle to repair + * 2: Selected hitpoint + * + * Return Value: + * Can Misc Repair + * + * Example: + * [unit, vehicle, "hitpoint", "classname"] call ace_repair_fnc_canMiscRepair + * + * Public: No + */ +#include "script_component.hpp" + +private ["_hitpointGroupConfig", "_hitpointGroup", "_postRepairDamage", "_return"]; +params ["_caller", "_target", "_hitPoint"]; + +// Get hitpoint groups if available +_hitpointGroupConfig = configFile >> "CfgVehicles" >> typeOf _target >> QGVAR(hitpointGroups); +_hitpointGroup = []; +if (isArray _hitpointGroupConfig) then { + // Retrieve hitpoint subgroup if current hitpoint is main hitpoint of a group + { + // Exit using found hitpoint group if this hitpoint is leader of any + if (_x select 0 == _hitPoint) exitWith { + _hitpointGroup = _x select 1; + }; + } forEach (getArray _hitpointGroupConfig); +}; + +// Add current hitpoint to the group +_hitpointGroup pushBack _hitPoint; + +// Get post repair damage +_postRepairDamage = [_caller] call FUNC(getPostRepairDamage); + +// Return true if damage can be repaired on any hitpoint in the group, else false +_return = false; +{ + if ((_target getHitPointDamage _x) > _postRepairDamage) exitWith { + _return = true; + }; +} forEach _hitpointGroup; + +if (typeOf _target == "B_MRAP_01_F") then { + diag_log format ["%1 - %2", _hitPoint, _hitpointGroup]; +}; + +_return diff --git a/addons/repair/functions/fnc_doRepair.sqf b/addons/repair/functions/fnc_doRepair.sqf index dfc21830c9..1cf3f77bca 100644 --- a/addons/repair/functions/fnc_doRepair.sqf +++ b/addons/repair/functions/fnc_doRepair.sqf @@ -17,11 +17,11 @@ */ #include "script_component.hpp" +private ["_hitPointDamage", "_text", "_hitpointGroup"]; params ["_unit", "_vehicle", "_hitPoint"]; TRACE_3("params",_unit,_vehicle,_hitPoint); // get current hitpoint damage -private "_hitPointDamage"; _hitPointDamage = _vehicle getHitPointDamage _hitPoint; _hitPointDamage = _hitPointDamage - 0.5; @@ -31,16 +31,36 @@ _hitPointDamage = _hitPointDamage max ([_unit] call FUNC(getPostRepairDamage)); // raise event to set the new hitpoint damage ["setVehicleHitPointDamage", _vehicle, [_vehicle, _hitPoint, _hitPointDamage]] call EFUNC(common,targetEvent); +// Get hitpoint groups if available +_hitpointGroupConfig = configFile >> "CfgVehicles" >> typeOf _vehicle >> QGVAR(hitpointGroups); +_hitpointGroup = []; +if (isArray _hitpointGroupConfig) then { + // Retrieve group if current hitpoint is leader of any + { + if (_x select 0 == _hitPoint) exitWith { + ([_vehicle] call EFUNC(common,getHitPointsWithSelections)) params ["_hitpoints"]; + // Set all sub-group hitpoints' damage to 0, if a hitpoint is invalid print RPT error + { + if (_x in _hitpoints) then { + ["setVehicleHitPointDamage", _vehicle, [_vehicle, _x, 0]] call EFUNC(common,targetEvent); + } else { + diag_log text format ["[ACE] ERROR: Invalid hitpoint %1 in hitpointGroups of %2", _x, _vehicle]; + }; + + } forEach (_x select 1); + }; + } forEach (getArray _hitpointGroupConfig); +}; + // display text message if enabled if (GVAR(DisplayTextOnRepair)) then { - private "_text"; - _text = format ["STR_ACE_Repair_%1", _hitPoint]; + private ["_textLocalized", "_textDefault"]; - if (isLocalized _text) then { - _text = format [localize ([LSTRING(RepairedHitPointFully), LSTRING(RepairedHitPointPartially)] select (_hitPointDamage > 0)), localize _text]; - } else { - _text = localize ([LSTRING(RepairedFully), LSTRING(RepairedPartially)] select (_hitPointDamage > 0)); - }; + // Find localized string + _textLocalized = localize ([LSTRING(RepairedHitPointFully), LSTRING(RepairedHitPointPartially)] select (_hitPointDamage > 0)); + _textDefault = localize ([LSTRING(RepairedFully), LSTRING(RepairedPartially)] select (_hitPointDamage > 0)); + ([_hitPoint, _textLocalized, _textDefault] call FUNC(getHitPointString)) params ["_text"]; + // Display text [_text] call EFUNC(common,displayTextStructured); }; diff --git a/addons/repair/functions/fnc_getHitPointString.sqf b/addons/repair/functions/fnc_getHitPointString.sqf new file mode 100644 index 0000000000..1358e99595 --- /dev/null +++ b/addons/repair/functions/fnc_getHitPointString.sqf @@ -0,0 +1,89 @@ +/* + * Author: Jonpas + * Finds the localized string of the given hitpoint name or uses default text if none found. + * + * Arguments: + * 0: Hitpoint + * 1: Localized Text + * 2: Default Text + * 3: Track Added Hitpoints (default: false) + * + * Return Value: + * 0: Text + * 1: Added Hitpoint (default: []) + * + * Example: + * [unit, vehicle, "hitpoint"] call ace_repair_fnc_getHitPointString + * + * Public: No + */ +#include "script_component.hpp" + +private ["_track", "_trackNames", "_trackStrings", "_trackAmount", "_text", "_toFind", "_trackIndex", "_combinedString"]; +params ["_hitPoint", "_textLocalized", "_textDefault", ["_trackArray", []]]; + +_track = if (count _trackArray > 0) then {true} else {false}; +_trackNames = []; +_trackStrings = []; +_trackAmount = []; + +if (_track) then { + _trackNames = _trackArray select 0; + _trackStrings = _trackArray select 1; + _trackAmount = _trackArray select 2; +}; + +// Prepare first part of the string from stringtable +_text = LSTRING(Hit); + +// Remove "Hit" from hitpoint name if one exists +_toFind = if (_hitPoint find "Hit" == 0) then { + [_hitPoint, 3] call CBA_fnc_substr +} else { + _hitPoint +}; + +// Loop through always shorter part of the hitpoint name to find the string from stringtable +for "_i" from 0 to (count _hitPoint) do { + if (_track) then { + // Loop through already added hitpoints and save index + _trackIndex = -1; + { + if (_x == _toFind) exitWith { + _trackIndex = _forEachIndex; + }; + } forEach _trackNames; + + // Use already added hitpoint if one found above and numerize + if (_trackIndex != -1) exitWith { + _text = localize (_trackStrings select _trackIndex) + " " + str(_trackAmount select _trackIndex); + _trackAmount set [_trackIndex, (_trackAmount select _trackIndex) + 1]; // Set amount + TRACE_2("Same hitpoint found",_toFind,_trackNames); + }; + }; + + + // Localize if localization found + _combinedString = _text + _toFind; + if (isLocalized _combinedString) exitWith { + _text = format [_textLocalized, localize _combinedString]; + TRACE_1("Hitpoint localized",_toFind); + + if (_track) then { + // Add hitpoint to the list + _trackNames pushBack _toFind; + _trackStrings pushBack _combinedString; + _trackAmount pushBack 2; + }; + }; + + // Cut off one character + _toFind = [_toFind, 0, count _toFind - 1] call CBA_fnc_substr; +}; + +// Don't display part name if no string is found in stringtable +if (_text == LSTRING(Hit)) then { + _text = _textDefault; +}; + +[_text, [_trackNames, _trackStrings, _trackAmount]] diff --git a/addons/repair/functions/fnc_repair.sqf b/addons/repair/functions/fnc_repair.sqf index 92af5df80e..8fa7f498bd 100644 --- a/addons/repair/functions/fnc_repair.sqf +++ b/addons/repair/functions/fnc_repair.sqf @@ -164,14 +164,10 @@ _repairTime = if (isNumber (_config >> "repairingTime")) then { 0; }; -private ["_text", "_processText"]; +private ["_processText"]; +// Find localized string _processText = getText (_config >> "displayNameProgress"); -_text = format ["STR_ACE_Repair_%1", _hitPoint]; -if (isLocalized _text) then { - _text = format [_processText, localize _text]; -} else { - _text = _processText; -}; +([_hitPoint, _processText, _processText] call FUNC(getHitPointString)) params ["_text"]; // Start repair [ diff --git a/addons/repair/script_component.hpp b/addons/repair/script_component.hpp index 23c52bdec8..89983dd0e8 100644 --- a/addons/repair/script_component.hpp +++ b/addons/repair/script_component.hpp @@ -12,5 +12,5 @@ #include "\z\ace\addons\main\script_macros.hpp" -#define IGNORED_HITPOINTS ["HitGlass1","HitGlass2","HitGlass3","HitGlass4","HitGlass5","HitGlass6","HitGlass7","HitGlass8","HitGlass9","HitGlass10","HitGlass11","HitGlass12","HitGlass13","HitGlass14","HitGlass15","HitRGlass","HitLGlass"] -// #define TRACK_HITPOINTS ["HitLTrack", "HitRTrack"]; +#define IGNORED_HITPOINTS ["HitGlass1", "HitGlass2", "HitGlass3", "HitGlass4", "HitGlass5", "HitGlass6", "HitGlass7", "HitGlass8", "HitGlass9", "HitGlass10", "HitGlass11", "HitGlass12", "HitGlass13", "HitGlass14", "HitGlass15", "HitRGlass", "HitLGlass", "Glass_1_hitpoint", "Glass_2_hitpoint", "Glass_3_hitpoint", "Glass_4_hitpoint", "Glass_5_hitpoint", "Glass_6_hitpoint", "Glass_7_hitpoint", "Glass_8_hitpoint", "Glass_9_hitpoint", "Glass_10_hitpoint", "Glass_11_hitpoint", "Glass_12_hitpoint", "Glass_13_hitpoint", "Glass_14_hitpoint", "Glass_15_hitpoint", "Glass_16_hitpoint", "Glass_17_hitpoint", "Glass_18_hitpoint", "Glass_19_hitpoint", "Glass_20_hitpoint"] +#define TRACK_HITPOINTS ["HitLTrack", "HitRTrack"] diff --git a/addons/repair/stringtable.xml b/addons/repair/stringtable.xml index ffafc56683..09759344f8 100644 --- a/addons/repair/stringtable.xml +++ b/addons/repair/stringtable.xml @@ -41,10 +41,12 @@ Replacing Wheel ... Ersetze Reifen ... + Wymienianie koła ... Wheel replaced Reifen ersetzt + Koło zostało wymienione Remove Wheel @@ -61,60 +63,60 @@ Removing Wheel ... Entferne Reifen ... + Zdejmowanie koła ... Wheel removed Reifen entfernt + Koło zostało zdjęte Change Track + Wymień gąsienicę Replacing Track ... + Wymienianie gąsienicy ... Track replaced + Gąsienica została wymieniona Remove Track + Zdejmij gąsienicę Removing Track ... + Zdejmowanie gąsienicy ... Track removed + Gąsienica została zdjęta - Full Repair + Pełna naprawa Repairing Vehicle ... + Naprawianie pojazdu ... - Full Repair Locations + Lokaliz. pełnej naprawy At what locations can a vehicle be fully repaired? + W jakich miejscach pojazd może zostać w pełni naprawiony? Allow Full Repair + Zezwól na pełną naprawę Who can perform a full repair on a vehicle? - - - Repair %1 - Reparieren %1 - Reparación %1 - Réparer %1 - Napraw %1 - Opravit %1 - Reparar %1 - Ripara %1 - Szerelés %1 - Ремонт %1 + Kto może przeprowadzić pełną naprawę pojazdu? Repair >> @@ -130,9 +132,11 @@ Display text on repair + Wyświetl tekst przy naprawie Display a notification whenever you repair a vehicle + Pokaż informację, kiedy wykonujesz czynności związane z naprawą pojazdu. Repairing ... @@ -173,18 +177,22 @@ Fully repaired part Bauteil vollständig repariert + W pełni naprawiono część Partially repaired %1 Bauteil teilweise repariert + Częściowo naprawiono: %1 Fully repaired %1 %1 vollständig repariert + W pełni naprawiono: %1 Partially repaired %1 %1 teilweise repariert + Częściowo naprawiono: %1 Body @@ -222,6 +230,15 @@ Motor Двигатель + + Left Horizontal Stabilizer + + + Right Horizontal Stabilizer + + + Vertical Stabilizer + Fuel Tank Tank @@ -234,15 +251,36 @@ Üzemanyagtank Топливный бак + + Transmission + + + Gear + + + Starter + + + Tail + + + Pilot Tube + + + Static Port + + + Ammo + - Main Turret + Turret Turm - Torreta príncipal + Torreta Tourelle Wieżyczka - Hlavní Věž - Torre principal - Torretta principale + Věž + Torre + Torretta Lövegtorony Башню @@ -258,6 +296,9 @@ Ágyú Пушку + + Missiles + Left Track Linke Kette @@ -417,6 +458,7 @@ Winch Seilwinde + Wyciągarka Glass (right) @@ -442,201 +484,177 @@ Bal szélvédő Стекло (слава) - - Glass 1 - Scheibe 1 - Ventana 1 - Vitre 1 - Szyba 1 - Sklo 1 - Vidro 1 - Vetro 1 - Üveg 1 - Стекло 1 - - - Glass 2 - Scheibe 2 - Ventana 2 - Vitre 2 - Szyba 2 - Sklo 2 - Vidro 2 - Vetro 2 - Üveg 2 - Стекло 2 - - - Glass 3 - Scheibe 3 - Ventana 3 - Vitre 3 - Szyba 3 - Sklo 3 - Vidro 3 - Vetro 3 - Üveg 3 - Стекло 3 - - - Glass 4 - Scheibe 4 - Ventana 4 - Vitre 4 - Szyba 4 - Sklo 4 - Vidro 4 - Vetro 4 - Üveg 4 - Стекло 4 - - - Glass 5 - Scheibe 5 - Ventana 5 - Vitre 5 - Szyba 5 - Sklo 5 - Vidro 5 - Vetro 5 - Üveg 5 - Стекло 5 - - - Glass 6 - Scheibe 6 - Ventana 6 - Vitre 6 - Szyba 6 - Sklo 6 - Vidro 6 - Vetro 6 - Üveg 6 - Стекло 6 + + Glass + Scheibe + Ventana + Vitre + Szyba + Sklo + Vidro + Vetro + Üveg + Стекло Repair Settings + Ustawienia naprawy Provides a repair system for all types of vehicles. + Dostarcza rozbudowany system naprawy dla wszystkich typów pojazdów. Anyone + Ktokolwiek Engineer only + Tylko mechanicy Repair Specialist only + Tylko inżynierowie Allow Wheel + Wymiana kół Who can remove and replace wheels? + Kto może zdejmować i zmieniać koła? Allow Repair + Możliwość naprawy Who can perform repair actions? + Kto może wykonywać czynności związane z naprawą pojazdów? Repair Threshold + Próg naprawy What is the maximum damage that can be repaired with a toolkit? + Jaki jest maksymalny poziom uszkodzeń jaki może zostać naprawiony przy pomocy narzędzi? Repair Threshold (Engineer) + Próg naprawy (mechanik) What is the maximum damage that can be repaired by an engineer? + Jaki jest maksymalny poziom uszkodzeń jaki może zostać naprawiony przez mechanika? Remove toolkit on use + Usuń narzędzia po użyciu Should the toolkit be removed on usage? + Czy zestaw naprawczy powinien zostać usunięty po jego użyciu? Anywhere + Wszędzie Repair Vehicle only + Przy pojazdach naprawczych Repair Facility only + Przy budynkach naprawczych Repair Facility or Vehicle + Przy budynkach i pojazdach naprawczych Assign Engineer + Przydziel inżyniera List + Lista List of unit names that will be classified as engineer, separated by commas. + Lista nazw jednostek, które są sklasyfikowane jako inżynierowie, oddzielone przecinkami. Is Engineer + Poziom wyszkolenia Select the engineering skill level of the unit + Wybierz biegłość w dziedzinie naprawy danej jednostki None + Żadny Engineer + Mechanik Specialist + Inżynier Assign one or multiple units as an engineer + Przydziel klasę inżyniera do jednej lub kilku jednostek Assign Repair Vehicle + Przydziel pojazd naprawczy List + Lista List of vehicles that will be classified as repair vehicle, separated by commas. + Lista nazw pojazdów, które są sklasyfikowane jako pojazdy naprawcze, oddzielone przecinkami. Is Repair Vehicle + Jest poj. naprawczym Is the vehicle classified as a repair vehicle? + Czy pojazd jest zklasyfikowany jako pojazd naprawczy? Assign one or multiple vehicles as a repair vehicle + Przydziel klasę pojazdu naprawczego do jednego lub kilku pojazdów. - Assign Repair Facility + Przydziel budynek naprawczy List + Lista List of objects that will be classified as repair Facility, separated by commas. + Lista nazw budynków, które są sklasyfikowane jako budynki naprawcze, oddzielone przecinkami. Is Repair Facility + Jest bud. naprawczym Is the object classified as a repair Facility? + Czy budynek jest zklasyfikowany jako budynek naprawczy? Assign one or multiple objects as a repair Facility - - - Vehicle Repair + Przydziel klasę budynku naprawczego do jednego lub kilku budynków. diff --git a/addons/safemode/XEH_preInit.sqf b/addons/safemode/XEH_preInit.sqf index 6bedb35134..e6eb91b8bd 100644 --- a/addons/safemode/XEH_preInit.sqf +++ b/addons/safemode/XEH_preInit.sqf @@ -2,7 +2,6 @@ ADDON = false; -PREP(firstMode); PREP(lockSafety); PREP(playChangeFiremodeSound); PREP(setSafeModeVisual); diff --git a/addons/safemode/functions/fnc_firstMode.sqf b/addons/safemode/functions/fnc_firstMode.sqf deleted file mode 100644 index d10da3f896..0000000000 --- a/addons/safemode/functions/fnc_firstMode.sqf +++ /dev/null @@ -1,9 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -PARAMS_1(_weapon); - -private ["_mode"]; -_mode = getArray (configFile >> "CfgWeapons" >> _weapon >> "modes") select 0; - -[_mode, _weapon] select (_mode == "this") diff --git a/addons/safemode/functions/fnc_lockSafety.sqf b/addons/safemode/functions/fnc_lockSafety.sqf index 42a8ef89fb..54fa254716 100644 --- a/addons/safemode/functions/fnc_lockSafety.sqf +++ b/addons/safemode/functions/fnc_lockSafety.sqf @@ -1,12 +1,29 @@ -// by commy2 +/* + * Author: commy2 + * Put weapon on safety, or take it off safety if safety is already put on. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: Muzzle + * + * Return Value: + * None + * + * Example: + * [ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player] call ace_safemode_fnc_lockSafety + * + * Public: No + */ #include "script_component.hpp" -PARAMS_3(_unit,_weapon,_muzzle); - // don't immediately switch back if (inputAction "nextWeapon" > 0) exitWith {}; -private ["_safedWeapons"]; +private ["_safedWeapons", "_condition", "_statement", "_id", "_picture"]; + +params ["_unit", "_weapon", "_muzzle"]; + _safedWeapons = _unit getVariable [QGVAR(safedWeapons), []]; if (_weapon in _safedWeapons) exitWith { @@ -18,15 +35,14 @@ _safedWeapons pushBack _weapon; _unit setVariable [QGVAR(safedWeapons), _safedWeapons]; if (_unit getVariable [QGVAR(actionID), -1] == -1) then { - private ["_condition", "_statement", "_id"]; - _condition = { + params ["", "_caller"]; if ( - [_this select 1] call EFUNC(common,canUseWeapon) + [_caller] call EFUNC(common,canUseWeapon) && { - if (currentMuzzle (_this select 1) in ((_this select 1) getVariable [QGVAR(safedWeapons), []])) then { + if (currentMuzzle _caller in (_caller getVariable [QGVAR(safedWeapons), []])) then { if (inputAction "nextWeapon" > 0) exitWith { - [_this select 1, currentWeapon (_this select 1), currentMuzzle (_this select 1)] call FUNC(unlockSafety); + [_this select 1, currentWeapon _caller, currentMuzzle _caller] call FUNC(unlockSafety); false }; true @@ -44,7 +60,8 @@ if (_unit getVariable [QGVAR(actionID), -1] == -1) then { }; _statement = { - [_this select 1, currentWeapon (_this select 1), currentMuzzle (_this select 1)] call FUNC(unlockSafety); + params ["", "_caller"]; + [_caller, currentWeapon _caller, currentMuzzle _caller] call FUNC(unlockSafety); }; //_id = [_unit, format ["%1", localize LSTRING(TakeOffSafety)], "DefaultAction", _condition, {}, {true}, _statement, 10] call EFUNC(common,addActionMenuEventHandler); @@ -54,12 +71,11 @@ if (_unit getVariable [QGVAR(actionID), -1] == -1) then { }; if ((typeName _muzzle) == (typeName "")) then { - _unit selectWeapon _muzzle;//_weapon + _unit selectWeapon _muzzle; //_weapon }; // play fire mode selector sound [_unit, _weapon, _muzzle] call FUNC(playChangeFiremodeSound); -private "_picture"; _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture"); [localize LSTRING(PutOnSafety), _picture] call EFUNC(common,displayTextPicture); diff --git a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf index 754a02005c..3fa29f3d88 100644 --- a/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf +++ b/addons/safemode/functions/fnc_playChangeFiremodeSound.sqf @@ -1,9 +1,25 @@ -// by commy2 +/* + * Author: commy2 + * Play weapon firemode change sound. + * + * Arguments: + * 0: Unit + * 1: Weapon + * + * Return Value: + * None + * + * Example: + * [ACE_player, currentWeapon ACE_player] call ace_safemode_fnc_playChangeFiremodeSound + * + * Public: No + */ #include "script_component.hpp" -PARAMS_2(_unit,_weapon); +private ["_sound", "_position"]; + +params ["_unit", "_weapon"]; -private ["_sound"]; _sound = getArray (configFile >> "CfgWeapons" >> _weapon >> "changeFiremodeSound"); if (count _sound == 0) exitWith { @@ -15,13 +31,8 @@ if ({(toLower (_sound select 0) find _x == (count toArray (_sound select 0) - co _sound set [0, (_sound select 0) + ".wss"]; }; -// add default volume, pitch and distance -if (count _sound < 2) then {_sound pushBack 1}; -if (count _sound < 3) then {_sound pushBack 1}; -if (count _sound < 4) then {_sound pushBack 0}; - -private "_position"; _position = _unit modelToWorldVisual (_unit selectionPosition "RightHand"); _position set [2, (_position select 2) + ((getPosASLW _unit select 2) - (getPosATL _unit select 2) max 0)]; -playSound3D [_sound select 0, objNull, false, _position, _sound select 1, _sound select 2, _sound select 3]; +_sound params ["_filename", ["_volume", 1], ["_soundPitch", 1], ["_distance", 0]]; +playSound3D [_filename, objNull, false, _position, _volume, _soundPitch, _distance]; diff --git a/addons/safemode/functions/fnc_setSafeModeVisual.sqf b/addons/safemode/functions/fnc_setSafeModeVisual.sqf index cb8c679855..43f4bc79b6 100644 --- a/addons/safemode/functions/fnc_setSafeModeVisual.sqf +++ b/addons/safemode/functions/fnc_setSafeModeVisual.sqf @@ -1,17 +1,31 @@ -// by commy2 +/* + * Author: commy2 + * Show firemode indicator, representing safety lock + * + * Arguments: + * 0: Show firemode + * + * Return Value: + * None + * + * Example: + * [true] call ace_safemode_fnc_setSafeModeVisual + * + * Public: No + */ #include "script_component.hpp" -PARAMS_1(_show); +private ["_control", "_config"]; + +params ["_show"]; disableSerialization; -private ["_control"]; _control = (uiNamespace getVariable ["ACE_dlgSoldier", displayNull]) displayCtrl 187; if (isNull _control) exitWith {}; if (_show) then { - private "_config"; _config = configFile >> "RscInGameUI" >> "RscUnitInfoSoldier" >> "WeaponInfoControlsGroupLeft" >> "controls" >> "CA_ModeTexture"; _control ctrlSetPosition [getNumber (_config >> "x"), getNumber (_config >> "y"), getNumber (_config >> "w"), getNumber (_config >> "h")]; diff --git a/addons/safemode/functions/fnc_unlockSafety.sqf b/addons/safemode/functions/fnc_unlockSafety.sqf index 2b4f00a4a9..35fdb0dee5 100644 --- a/addons/safemode/functions/fnc_unlockSafety.sqf +++ b/addons/safemode/functions/fnc_unlockSafety.sqf @@ -1,9 +1,26 @@ -// by commy2 +/* + * Author: commy2 + * Take weapon of safety lock. + * + * Arguments: + * 0: Unit + * 1: Weapon + * 2: Muzzle + * + * Return Value: + * None + * + * Example: + * [ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player] call ace_safemode_fnc_unlockSafety + * + * Public: No + */ #include "script_component.hpp" -PARAMS_3(_unit,_weapon,_muzzle); +private ["_safedWeapons", "_id", "_picture"]; + +params ["_unit", "_weapon", "_muzzle"]; -private ["_safedWeapons"]; _safedWeapons = _unit getVariable [QGVAR(safedWeapons), []]; if (_weapon in _safedWeapons) then { @@ -12,7 +29,6 @@ if (_weapon in _safedWeapons) then { _unit setVariable [QGVAR(safedWeapons), _safedWeapons]; if (count _safedWeapons == 0) then { - private "_id"; _id = _unit getVariable [QGVAR(actionID), -1]; //[_unit, "DefaultAction", _id] call EFUNC(common,removeActionMenuEventHandler); @@ -36,7 +52,8 @@ if (inputAction "nextWeapon" > 0) then { if (_x == "this") then { _modes pushBack _weapon; }; - } forEach getArray (configfile >> "CfgWeapons" >> _weapon >> "modes"); + nil + } count getArray (configfile >> "CfgWeapons" >> _weapon >> "modes"); // select last mode _mode = _modes select (count _modes - 1); @@ -57,6 +74,5 @@ if (inputAction "nextWeapon" > 0) then { // player hud [true] call FUNC(setSafeModeVisual); -private "_picture"; _picture = getText (configFile >> "CfgWeapons" >> _weapon >> "picture"); [localize LSTRING(TookOffSafety), _picture] call EFUNC(common,displayTextPicture); diff --git a/addons/sandbag/README.md b/addons/sandbag/README.md index 8c67ed9a6d..e1bd40eee5 100644 --- a/addons/sandbag/README.md +++ b/addons/sandbag/README.md @@ -1,10 +1,11 @@ ace_sandbag =============== -Stackable sandbags. +Adds stackable sandbags. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/scopes/functions/fnc_firedEH.sqf b/addons/scopes/functions/fnc_firedEH.sqf index 5ede2d2cf8..bb9c37a1af 100644 --- a/addons/scopes/functions/fnc_firedEH.sqf +++ b/addons/scopes/functions/fnc_firedEH.sqf @@ -38,4 +38,4 @@ if (_zeroing isEqualTo [0, 0, 0]) exitWith {}; _zeroing = _zeroing vectorMultiply 0.05625; _zeroing params ["_elevation", "_windage", "_zero"]; -[_projectile, _elevation, _elevation + _zero, 0] call EFUNC(common,changeProjectileDirection); +[_projectile, _windage, _elevation + _zero, 0] call EFUNC(common,changeProjectileDirection); diff --git a/addons/sitting/README.md b/addons/sitting/README.md index 41db2ce8ee..5237c7145e 100644 --- a/addons/sitting/README.md +++ b/addons/sitting/README.md @@ -1,10 +1,11 @@ ace_sitting =============== -The Sitting module introduces ability to sit on different chairs and toilets. +The Sitting module introduces ability to sit on chairs. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Jonpas] (https://github.com/jonpas) +- [Jonpas](https://github.com/jonpas) diff --git a/addons/slideshow/README.md b/addons/slideshow/README.md index 58b22c1e17..627e1fe660 100644 --- a/addons/slideshow/README.md +++ b/addons/slideshow/README.md @@ -3,8 +3,9 @@ ace_slideshow Adds ability to have slide-shows on them and control them with a controller (another object). + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Jonpas] (https://github.com/jonpas) +- [Jonpas](https://github.com/jonpas) diff --git a/addons/slideshow/functions/fnc_makeList.sqf b/addons/slideshow/functions/fnc_makeList.sqf index 8de87a2d96..6736fabbdb 100644 --- a/addons/slideshow/functions/fnc_makeList.sqf +++ b/addons/slideshow/functions/fnc_makeList.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Text - * 1: Remove Whitespace + * 1: Trim Whitespace * 2: Check Nil * * Return Value: @@ -15,24 +15,23 @@ * * Public: No */ -//#define DEBUG_MODE_FULL #include "script_component.hpp" -params ["_list", "_removeWhitespace", "_checkNil"]; +params ["_list", "_trimWhitespace", "_checkNil"]; -private ["_splittedList", "_listNoWhitespace", "_nilCheckPassedList"]; +private ["_splittedList", "_listTrimmedWhitespace", "_nilCheckPassedList"]; // Split using comma delimiter _splittedList = [_list, ","] call BIS_fnc_splitString; // Remove whitespace -_listNoWhitespace = []; -if (_removeWhitespace) then { +_listTrimmedWhitespace = []; +if (_trimWhitespace) then { { - _listNoWhitespace pushBack ([_x] call EFUNC(common,stringRemoveWhiteSpace)); + _listTrimmedWhitespace pushBack ([_x] call CBA_fnc_trim); nil } count _splittedList; - _list = _listNoWhitespace; + _list = _listTrimmedWhitespace; }; // Check for object existence @@ -53,6 +52,6 @@ if (_checkNil) then { _list = [] call compile _list; }; -TRACE_4("Lists",_splittedList,_listNoWhitespace,_nilCheckPassedList,_list); +TRACE_4("Lists",_splittedList,_listTrimmedWhitespace,_nilCheckPassedList,_list); _list // return diff --git a/addons/spectator/$PBOPREFIX$ b/addons/spectator/$PBOPREFIX$ new file mode 100644 index 0000000000..42fe4034e9 --- /dev/null +++ b/addons/spectator/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\spectator \ No newline at end of file diff --git a/addons/spectator/ACE_Settings.hpp b/addons/spectator/ACE_Settings.hpp new file mode 100644 index 0000000000..78402cff23 --- /dev/null +++ b/addons/spectator/ACE_Settings.hpp @@ -0,0 +1,22 @@ +class ACE_Settings { + class GVAR(filterUnits) { + typeName = "SCALAR"; + value = 2; + values[] = {CSTRING(units_none), CSTRING(units_players), CSTRING(units_playable), CSTRING(units_all)}; + }; + class GVAR(filterSides) { + typeName = "SCALAR"; + value = 0; + values[] = {CSTRING(sides_player), CSTRING(sides_friendly), CSTRING(sides_hostile), CSTRING(sides_all)}; + }; + class GVAR(restrictModes) { + typeName = "SCALAR"; + value = 0; + values[] = {CSTRING(modes_all), CSTRING(modes_unit), CSTRING(modes_free), CSTRING(modes_internal), CSTRING(modes_external)}; + }; + class GVAR(restrictVisions) { + typeName = "SCALAR"; + value = 0; + values[] = {CSTRING(modes_all), CSTRING(visions_nv), CSTRING(visions_ti), "$STR_Special_None"}; + }; +}; diff --git a/addons/spectator/CfgEventHandlers.hpp b/addons/spectator/CfgEventHandlers.hpp new file mode 100644 index 0000000000..e75956f440 --- /dev/null +++ b/addons/spectator/CfgEventHandlers.hpp @@ -0,0 +1,11 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_PostInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); + }; +}; diff --git a/addons/spectator/CfgVehicles.hpp b/addons/spectator/CfgVehicles.hpp new file mode 100644 index 0000000000..f6869462ac --- /dev/null +++ b/addons/spectator/CfgVehicles.hpp @@ -0,0 +1,117 @@ +class CfgVehicles { + class ACE_Module; + class GVAR(moduleSettings): ACE_Module { + scope = 2; + displayName = CSTRING(Settings_DisplayName); + icon = PATHTOF(UI\Icon_Module_Spectator_ca.paa); + category = "ACE"; + function = QFUNC(moduleSpectatorSettings); + isGlobal = 1; + author = ECSTRING(common,ACETeam); + class Arguments { + class unitsFilter { + displayName = CSTRING(units_DisplayName); + description = CSTRING(units_Description); + typeName = "NUMBER"; + class values { + class none { + name = CSTRING(units_none); + value = 0; + }; + class players { + name = CSTRING(units_players); + value = 1; + }; + class playable { + name = CSTRING(units_playable); + value = 2; + default = 1; + }; + class all { + name = CSTRING(units_all); + value = 3; + }; + }; + }; + class sidesFilter { + displayName = CSTRING(sides_DisplayName); + description = CSTRING(sides_Description); + typeName = "NUMBER"; + class values { + class player { + name = CSTRING(sides_player); + value = 0; + default = 1; + }; + class friendly { + name = CSTRING(sides_friendly); + value = 1; + }; + class hostile { + name = CSTRING(sides_hostile); + value = 2; + }; + class all { + name = CSTRING(sides_all); + value = 3; + }; + }; + }; + class cameraModes { + displayName = CSTRING(modes_DisplayName); + description = CSTRING(modes_Description); + typeName = "NUMBER"; + class values { + class all { + name = CSTRING(modes_all); + value = 0; + default = 1; + }; + class unit { + name = CSTRING(modes_unit); + value = 1; + }; + class free { + name = CSTRING(modes_free); + value = 2; + }; + class internal { + name = CSTRING(modes_internal); + value = 3; + }; + class external { + name = CSTRING(modes_external); + value = 4; + }; + }; + }; + class visionModes { + displayName = CSTRING(visions_DisplayName); + description = CSTRING(visions_Description); + typeName = "NUMBER"; + class values { + class all { + name = CSTRING(modes_all); + value = 0; + default = 1; + }; + class nv { + name = CSTRING(visions_nv); + value = 1; + }; + class ti { + name = CSTRING(visions_ti); + value = 2; + }; + class none { + name = "$STR_Special_None"; + value = 3; + }; + }; + }; + }; + class ModuleDescription { + description = CSTRING(Settings_Description); + }; + }; +}; diff --git a/addons/spectator/README.md b/addons/spectator/README.md new file mode 100644 index 0000000000..b827bdcc49 --- /dev/null +++ b/addons/spectator/README.md @@ -0,0 +1,14 @@ +ace_spectator +======= + +A flexible spectator framework for mission makers to use. + +Includes a public API for integration into custom respawn frameworks and a template for use with the vanilla respawn framework. + +For more information, see: http://ace3mod.com/wiki/feature/spectator.html + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [SilentSpike](https://github.com/SilentSpike) diff --git a/addons/spectator/UI/Icon_Module_Spectator_ca.paa b/addons/spectator/UI/Icon_Module_Spectator_ca.paa new file mode 100644 index 0000000000..97258bb0d0 Binary files /dev/null and b/addons/spectator/UI/Icon_Module_Spectator_ca.paa differ diff --git a/addons/spectator/UI/interface.hpp b/addons/spectator/UI/interface.hpp new file mode 100644 index 0000000000..e8bc6c210f --- /dev/null +++ b/addons/spectator/UI/interface.hpp @@ -0,0 +1,255 @@ +// Temporary fix until BI take care of it +class RscFrame { + x = 0; + y = 0; + w = 0; + h = 0; +}; + + +class RscButtonMenu; +class RscControlsGroupNoScrollbars; +//class RscFrame; +class RscListBox; +class RscMapControl; +class RscPicture; +class RscText; +class RscTree; + +class GVAR(interface) { + idd = 12249; + enableSimulation = 1; + movingEnable = 0; + onLoad = QUOTE([ARR_2('onLoad',_this)] call FUNC(handleInterface)); + onUnload = QUOTE([ARR_2('onUnload',_this)] call FUNC(handleInterface)); + onKeyDown = QUOTE([ARR_2('onKeyDown',_this)] call FUNC(handleInterface)); + onKeyUp = QUOTE([ARR_2('onKeyUp',_this)] call FUNC(handleInterface)); + class controlsBackground { + class mouseHandler: RscControlsGroupNoScrollbars { + x = safeZoneXAbs; + y = safeZoneY; + w = safeZoneWAbs; + h = safeZoneH; + onMouseButtonDown = QUOTE([ARR_2('onMouseButtonDown',_this)] call FUNC(handleInterface)); + onMouseButtonUp = QUOTE([ARR_2('onMouseButtonUp',_this)] call FUNC(handleInterface)); + onMouseZChanged = QUOTE([ARR_2('onMouseZChanged',_this)] call FUNC(handleInterface)); + onMouseMoving = QUOTE([ARR_2('onMouseMoving',_this)] call FUNC(handleInterface)); + onMouseHolding = QUOTE([ARR_2('onMouseMoving',_this)] call FUNC(handleInterface)); + }; + }; + class controls { + class compass: RscControlsGroupNoScrollbars { + idc = IDC_COMP; + x = COMPASS_X; + y = safeZoneY; + w = COMPASS_W; + h = TOOL_H; + class controls { + class compassBack: RscText { + x = 0; + y = 0; + w = COMPASS_W; + h = TOOL_H; + colorBackground[] = {COL_BACK}; + }; + class compass0_90: RscPicture { + idc = IDC_COMP_0; + x = COMPASS_W * 0.5; + y = 0; + w = COMPASS_W * 0.5; + h = TOOL_H; + text = "A3\UI_F_Curator\Data\CfgIngameUI\compass\texture180_ca.paa"; + }; + class compass90_180: compass0_90 { + idc = IDC_COMP_90; + x = COMPASS_W; + text = "A3\UI_F_Curator\Data\CfgIngameUI\compass\texture270_ca.paa"; + }; + class compass180_270: compass0_90 { + idc = IDC_COMP_180; + x = 0; + text = "A3\UI_F_Curator\Data\CfgIngameUI\compass\texture0_ca.paa"; + }; + class compass270_0: compass0_90 { + idc = IDC_COMP_270; + x = COMPASS_W * -0.5; + text = "A3\UI_F_Curator\Data\CfgIngameUI\compass\texture90_ca.paa"; + }; + class compassCaret: RscFrame { + x = COMPASS_W * 0.5; + y = 0; + w = 0; + h = TOOL_H; + colorText[] = {COL_FORE}; + }; + class compassFrame: compassBack { + style = 64; + shadow=2; + colorText[] = {COL_FORE}; + }; + }; + }; + class toolbar: RscControlsGroupNoScrollbars { + idc = IDC_TOOL; + x = safeZoneX; + y = safeZoneY + safeZoneH - TOOL_H; + w = safeZoneW; + h = TOOL_H; + class controls { + class nameTool: RscText { + idc = IDC_TOOL_NAME; + style = 2; + x = 0; + y = 0; + w = TOOL_W * 2; + h = TOOL_H; + shadow = 2; + colorText[]={COL_FORE}; + colorBackground[] = {COL_BACK}; + sizeEx = H_PART(1); + }; + class nameFrame: nameTool { + idc = -1; + style = 64; + }; + class viewTool: nameTool { + idc = IDC_TOOL_VIEW; + x = TOOL_W * 2 + MARGIN; + w = TOOL_W; + }; + class viewFrame: viewTool { + idc = -1; + style = 64; + }; + class visionTool: viewTool { + idc = IDC_TOOL_VISION; + x = TOOL_W * 3 + MARGIN * 2; + }; + class visionFrame: visionTool { + idc = -1; + style = 64; + }; + class clockTool: viewTool { + idc = IDC_TOOL_CLOCK; + x = safeZoneW - TOOL_W * 3 - MARGIN * 2; + }; + class clockFrame: clockTool { + idc = -1; + style = 64; + }; + class zoomTool: viewTool { + idc = IDC_TOOL_FOV; + x = safeZoneW - TOOL_W * 2 - MARGIN; + }; + class zoomFrame: zoomTool { + idc = -1; + style = 64; + }; + class speedTool: viewTool { + idc = IDC_TOOL_SPEED; + x = safeZoneW - TOOL_W; + }; + class speedFrame: speedTool { + idc = -1; + style = 64; + }; + }; + }; + class unitWindow: RscControlsGroupNoScrollbars { + idc = IDC_UNIT; + x = safeZoneX; + y = safeZoneY + TOOL_H * 6; + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 13; + class controls { + class unitTitle: RscText { + x = 0; + y = 0; + w = TOOL_W * 2; + h = H_PART(1); + style = 2; + colorText[] = {COL_FORE}; + colorBackground[] = {COL_FORE_D}; + sizeEx = H_PART(1); + text = CSTRING(UnitTitle); + }; + class unitTree: RscTree { + idc = IDC_UNIT_TREE; + x = 0; + y = H_PART(1); + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 14; + sizeEx = H_PART(0.8); + colorText[] = {COL_FORE}; + colorBorder[] = {0,0,0,0}; + colorBackground[] = {COL_BACK}; + colorSelect[] = { + "profilenamespace getvariable ['GUI_BCG_RGB_R',0.77]", + "profilenamespace getvariable ['GUI_BCG_RGB_G',0.51]", + "profilenamespace getvariable ['GUI_BCG_RGB_B',0.08]", + 1 + }; + multiselectEnabled = 0; + onTreeDblClick = QUOTE([ARR_2('onTreeDblClick',_this)] call FUNC(handleInterface)); + onTreeSelChanged = QUOTE([ARR_2('onTreeSelChanged',_this)] call FUNC(handleInterface)); + }; + class unitFrame: RscFrame { + x = 0; + y = 0; + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 13; + shadow = 2; + colorText[] = {COL_FORE}; + }; + }; + }; + class helpWindow: RscControlsGroupNoScrollbars { + idc = IDC_HELP; + x = safeZoneX + safeZoneW - TOOL_W * 2; + y = safeZoneY + TOOL_H * 6; + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 13; + class controls { + class helpTitle: RscText { + x = 0; + y = 0; + w = TOOL_W * 2; + h = H_PART(1); + style = 2; + colorText[] = {COL_FORE}; + colorBackground[] = {COL_FORE_D}; + sizeEx = H_PART(1); + text = CSTRING(HelpTitle); + }; + class helpContent: RscListBox { + idc = IDC_HELP_LIST; + x = 0; + y = H_PART(1); + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 14; + colorBackground[] = {COL_BACK}; + sizeEx = H_PART(0.8); + default = 1; + }; + class helpFrame: RscFrame { + x = 0; + y = 0; + w = TOOL_W * 2; + h = safeZoneH - TOOL_H * 13; + shadow = 2; + colorText[] = {COL_FORE}; + }; + }; + }; + class mapOverlay: RscMapControl { + idc = IDC_MAP; + type = 100; + x = safeZoneX; + y = safeZoneY; + w = safeZoneW; + h = safeZoneH; + onMouseButtonDown = QUOTE([ARR_2('onMapClick',_this)] call FUNC(handleInterface)); + onDraw = QUOTE(_this call FUNC(handleMap)); + }; + }; +}; diff --git a/addons/spectator/XEH_postInit.sqf b/addons/spectator/XEH_postInit.sqf new file mode 100644 index 0000000000..35b463837f --- /dev/null +++ b/addons/spectator/XEH_postInit.sqf @@ -0,0 +1,10 @@ +#include "script_component.hpp" +//#include "initKeybinds.sqf"; + +// Add interaction menu exception +["isNotSpectating", {!(GETVAR((_this select 0),GVAR(isStaged),false))}] call EFUNC(common,addCanInteractWithCondition); + +["SettingsInitialized", { + GVAR(availableModes) = [[0,1,2], [1,2], [0], [1], [2]] select GVAR(restrictModes); + GVAR(availableVisions) = [[-2,-1,0,1], [-2,-1], [-2,0,1], [-2]] select GVAR(restrictVisions); +}] call EFUNC(common,addEventHandler); diff --git a/addons/spectator/XEH_preInit.sqf b/addons/spectator/XEH_preInit.sqf new file mode 100644 index 0000000000..d1bf48d106 --- /dev/null +++ b/addons/spectator/XEH_preInit.sqf @@ -0,0 +1,59 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(cacheUnitInfo); +PREP(cycleCamera); +PREP(handleCamera); +PREP(handleCompass); +PREP(handleIcons); +PREP(handleInterface); +PREP(handleMap); +PREP(handleMouse); +PREP(handleToolbar); +PREP(handleUnits); +PREP(interrupt); +PREP(moduleSpectatorSettings); +PREP(respawnTemplate); +PREP(setCameraAttributes); +PREP(setSpectator); +PREP(stageSpectator); +PREP(transitionCamera); +PREP(toggleInterface); +PREP(updateCameraModes); +PREP(updateSpectatableSides); +PREP(updateUnits); +PREP(updateVisionModes); + +// Permanent variables +GVAR(availableModes) = [0,1,2]; +GVAR(availableSides) = [west,east,resistance,civilian]; +GVAR(availableVisions) = [-2,-1,0,1]; + +GVAR(camAgent) = objNull; +GVAR(camMode) = 0; +GVAR(camPan) = 0; +GVAR(camPos) = ATLtoASL [worldSize * 0.5, worldSize * 0.5, 20]; +GVAR(camSpeed) = 2.5; +GVAR(camTilt) = -10; +GVAR(camUnit) = objNull; +GVAR(camVision) = -2; +GVAR(camZoom) = 1.25; + +GVAR(interrupts) = []; +GVAR(isSet) = false; + +GVAR(showComp) = true; +GVAR(showHelp) = true; +GVAR(showIcons) = true; +GVAR(showInterface) = true; +GVAR(showMap) = false; +GVAR(showTool) = true; +GVAR(showUnit) = true; + +GVAR(unitList) = []; +GVAR(unitBlacklist) = []; +GVAR(unitWhitelist) = []; +GVAR(groupList) = []; + +ADDON = true; diff --git a/addons/spectator/config.cpp b/addons/spectator/config.cpp new file mode 100644 index 0000000000..6e32ed0413 --- /dev/null +++ b/addons/spectator/config.cpp @@ -0,0 +1,25 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"F3 Project","Head","SilentSpike","voiper"}; + authorUrl = "https://github.com/acemod"; + VERSION_CONFIG; + }; +}; + +#include "ACE_Settings.hpp" +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "ui\interface.hpp" + +class CfgRespawnTemplates { + class ADDON { + onPlayerKilled = QFUNC(respawnTemplate); + onPlayerRespawn = QFUNC(respawnTemplate); + }; +}; diff --git a/addons/spectator/functions/fnc_cacheUnitInfo.sqf b/addons/spectator/functions/fnc_cacheUnitInfo.sqf new file mode 100644 index 0000000000..9f40651748 --- /dev/null +++ b/addons/spectator/functions/fnc_cacheUnitInfo.sqf @@ -0,0 +1,38 @@ +/* + * Author: SilentSpike + * Caches the units information for quick retrevial in spectator interface PFHs + * + * Arguments: + * 0: Unit to have info cached for + * + * Return Value: + * None + * + * Example: + * [vehicle player] call ace_spectator_fnc_cacheUnitInfo + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_unit"]; +private ["_color","_icon","_name"]; + +// Group info only needs to be cached once (groups can't change) +if (isNil { GETVAR((group _unit),GVAR(gColor),nil) }) then { + _color = [side group _unit] call BIS_fnc_sideColor; + SETVAR((group _unit),GVAR(gColor),_color); +}; + +// Unit info should be updated each time +_icon = getText (configFile >> "CfgVehicles" >> typeOf _unit >> "Icon"); +_name = [_unit,false] call EFUNC(common,getName); + +// Handle CfgVehicleIcons +if (isText (configFile >> "CfgVehicleIcons" >> _icon)) then { + _icon = getText (configFile >> "CfgVehicleIcons" >> _icon); +}; + +SETVAR(_unit,GVAR(uIcon),_icon); +SETVAR(_unit,GVAR(uName),_name); diff --git a/addons/spectator/functions/fnc_cycleCamera.sqf b/addons/spectator/functions/fnc_cycleCamera.sqf new file mode 100644 index 0000000000..474d25cd0c --- /dev/null +++ b/addons/spectator/functions/fnc_cycleCamera.sqf @@ -0,0 +1,58 @@ +/* + * Author: SilentSpike + * Cycle through the spectator camera vision/view/units in steps + * + * Arguments: + * 0: Camera mode steps + * 1: Camera unit steps + * 2: Vision mode steps + * + * Return Value: + * None + * + * Example: + * [0, -1] call ace_spectator_fnc_cycleCamera + * + * Public: No + */ + +#include "script_component.hpp" + +params [["_stepMode",0], ["_stepUnit",0], ["_stepVision",0]]; +private ["_modes","_visions","_iMode","_iVision","_countModes","_countVisions","_newMode","_newVision","_newUnit"]; + +_modes = GVAR(availableModes); +_units = GVAR(unitList); +_visions = GVAR(availableVisions); + +// Get current index +_iMode = (_modes find GVAR(camMode)) max 0; +_iUnit = (_units find GVAR(camUnit)) max 0; +_iVision = (_visions find GVAR(camVision)) max 0; + +_countModes = count _modes; +_countUnits = count _units; +_countVisions = count _visions; + +// Step index by step number (loop at ends) +if (_countModes != 0) then { + _iMode = (_iMode + _stepMode) % _countModes; + if (_iMode < 0) then { _iMode = _countModes + _iMode; }; +}; + +if (_countUnits != 0) then { + _iUnit = (_iUnit + _stepUnit) % _countUnits; + if (_iUnit < 0) then { _iUnit = _countUnits + _iUnit; }; +}; + +if (_countVisions != 0) then { + _iVision = (_iVision + _stepVision) % _countVisions; + if (_iVision < 0) then { _iVision = _countVisions + _iVision; }; +}; + +// Get value at new index +_newMode = _modes select _iMode; +_newUnit = _units select _iUnit; +_newVision = _visions select _iVision; + +[_newMode, _newUnit, _newVision] call FUNC(transitionCamera); diff --git a/addons/spectator/functions/fnc_handleCamera.sqf b/addons/spectator/functions/fnc_handleCamera.sqf new file mode 100644 index 0000000000..db196c8504 --- /dev/null +++ b/addons/spectator/functions/fnc_handleCamera.sqf @@ -0,0 +1,48 @@ +/* + * Author: F3 Project, Head, SilentSpike + * Handles free camera manipulation according to input + * + * Arguments: + * 0: Parameters + * 1: PFH handle + * + * Return Value: + * None + * + * Example: + * [ace_spectator_fnc_handleCamera, 0] call CBA_fnc_addPerFrameHandler; + * + * Public: No + */ + +#include "script_component.hpp" + +// Kill PFH when not in free cam (or display is closed) +if (isNil QGVAR(camHandler)) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; + +private ["_camera","_oldPos","_altMod","_zoomMod","_mX","_mY","_mZ","_pan","_x","_y","_z"]; + +_camera = GVAR(camera); +_oldPos = getPosASL _camera; + +// Dolly/Boom amount should be influnced by zoom level (it should really be exponential) +// Dollying should also slow as the camera gets close to the ground +_zoomMod = (GVAR(camZoom) * 0.8) max 1; +_altMod = ((((getPos _camera) select 2) * 0.05) max 0.1) min 1; + +_mX = (GVAR(camDolly) select 0) * _altMod / _zoomMod; +_mY = (GVAR(camDolly) select 1) * _altMod / _zoomMod; +_mZ = GVAR(camBoom) / _zoomMod; + +_pan = (GVAR(camPan) + 360) % 360; +_x = (_oldPos select 0) + (_mX * cos(_pan)) + (_mY * sin(_pan)); +_y = (_oldPos select 1) - (_mX * sin(_pan)) + (_mY * cos(_pan)); +_z = (_oldPos select 2) + _mZ; + +// Prevent camera going under terrain +GVAR(camPos) = [_x,_y,_z max (getTerrainHeightASL [_x,_y])]; + +// Update camera position and rotation +_camera setPosASL GVAR(camPos); +_camera setDir GVAR(camPan); +[_camera, GVAR(camTilt), 0] call BIS_fnc_setPitchBank; diff --git a/addons/spectator/functions/fnc_handleCompass.sqf b/addons/spectator/functions/fnc_handleCompass.sqf new file mode 100644 index 0000000000..a65cc9ddce --- /dev/null +++ b/addons/spectator/functions/fnc_handleCompass.sqf @@ -0,0 +1,67 @@ +/* + * Author: SilentSpike, voiper + * Handles the spectator UI compass + * + * Arguments: + * 0: Parameters + * 1: PFH handle + * + * Return Value: + * None + * + * Example: + * [ace_spectator_fnc_handleCompass, 0, _display] call CBA_fnc_addPerFrameHandler; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_display"]; + +// Kill PFH when compass hidden (or display is closed) +if (isNil QGVAR(compHandler)) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; + +private ["_compass","_NE","_ES","_SW","_WN","_compassW","_degree","_heading","_offset","_positions","_sequence"]; + +_compass = _display displayCtrl IDC_COMP; + +_NE = _compass controlsGroupCtrl IDC_COMP_0; +_ES = _compass controlsGroupCtrl IDC_COMP_90; +_SW = _compass controlsGroupCtrl IDC_COMP_180; +_WN = _compass controlsGroupCtrl IDC_COMP_270; + +_compassW = (ctrlPosition _compass) select 2; +_degree = _compassW / 180; + +// Get direction of screen rather than object (accounts for unit freelook) +_heading = (positionCameraToWorld [0,0,1]) vectorDiff (positionCameraToWorld [0,0,0]); +_heading = (((_heading select 0) atan2 (_heading select 1)) + 360) % 360; +_offset = -(_heading % 90) * _degree; + +_positions = [ + [_compassW * -0.5 + _offset, 0], + [_offset, 0], + [_compassW * 0.5 + _offset, 0], + [_compassW + _offset, 0] +]; + +_sequence = if (_heading < 90) then { + [_SW, _WN, _NE, _ES] +} else { + if (_heading < 180) then { + [_WN, _NE, _ES, _SW] + } else { + if (_heading < 270) then { + [_NE, _ES, _SW, _WN] + } else { + [_ES, _SW, _WN, _NE] + }; + }; +}; + + +{ + _x ctrlSetPosition (_positions select _forEachIndex); + _x ctrlCommit 0; +} forEach _sequence; diff --git a/addons/spectator/functions/fnc_handleIcons.sqf b/addons/spectator/functions/fnc_handleIcons.sqf new file mode 100644 index 0000000000..72c0d7dee6 --- /dev/null +++ b/addons/spectator/functions/fnc_handleIcons.sqf @@ -0,0 +1,46 @@ +/* + * Author: Head, SilentSpike + * Handles rendering the spectator 3D unit icons + * + * Arguments: + * 0: Parameters + * 1: PFH handle + * + * Return Value: + * None + * + * Example: + * [ace_spectator_fnc_handleIcons, 0] call CBA_fnc_addPerFrameHandler; + * + * Public: No + */ + +#include "script_component.hpp" + +if !(GVAR(showIcons)) exitWith {}; +private ["_refPoint","_drawVehicles","_leader","_color","_txt","_unit"]; + +// Draw groups unless leader is within distance +_refPoint = [GVAR(camera),GVAR(camUnit)] select (GVAR(camMode) > 0); +_drawVehicles = []; +{ + _leader = leader _x; + if ((_leader distanceSqr _refPoint) > 40000) then { + _color = GETVAR(_x,GVAR(gColor),[ARR_4(0,0,0,0)]); + _txt = groupID _x; + + drawIcon3D ["\A3\ui_f\data\map\markers\nato\b_inf.paa", _color, _leader modelToWorldVisual [0,0,30], 1, 1, 0, _txt, 2, 0.02]; + } else { + _drawVehicles append (units _x); + }; + false +} count GVAR(groupList); + +// Draw units for groups within distance +{ + _color = GETVAR((group _x),GVAR(gColor),[ARR_4(0,0,0,0)]); + _txt = ["", GETVAR(_x,GVAR(uName),"")] select (isPlayer _x); + + drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", _color, _x modelToWorldVisual [0,0,3], 0.7, 0.7, 0, _txt, 1, 0.02]; + false +} count (_drawVehicles arrayIntersect GVAR(unitList)); diff --git a/addons/spectator/functions/fnc_handleInterface.sqf b/addons/spectator/functions/fnc_handleInterface.sqf new file mode 100644 index 0000000000..93c6ca3ddd --- /dev/null +++ b/addons/spectator/functions/fnc_handleInterface.sqf @@ -0,0 +1,493 @@ +/* + * Author: SilentSpike + * Handles spectator interface events + * + * Arguments: + * 0: Event name + * 1: Event arguments + * + * Return Value: + * None + * + * Example: + * ["onLoad",_this] call ace_spectator_fnc_handleInterface + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_mode",["_args",[]]]; + +switch (toLower _mode) do { + case "onload": { + _args params ["_display"]; + + // Always show interface and hide map upon opening + [_display,nil,nil,!GVAR(showInterface),GVAR(showMap)] call FUNC(toggleInterface); + + // Keep unit list and tree up to date + [FUNC(handleUnits), 21, _display] call CBA_fnc_addPerFrameHandler; + + // Handle 3D unit icons + GVAR(iconHandler) = addMissionEventHandler ["Draw3D",FUNC(handleIcons)]; + + // Populate the help window + private "_help"; + _help = (_display displayCtrl IDC_HELP) controlsGroupCtrl IDC_HELP_LIST; + { + _i = _help lbAdd (_x select 0); + if ((_x select 1) == "") then { + _help lbSetPicture [_i,"\A3\ui_f\data\map\markers\military\dot_CA.paa"]; + _help lbSetPictureColor [_i,[COL_FORE]]; + } else { + _help lbSetTooltip [_i,_x select 1]; + }; + } forEach [ + [localize LSTRING(uiControls),""], + [localize LSTRING(uiToggleUnits),"1"], + [localize LSTRING(uiToggleHelp),"2"], + [localize LSTRING(uiToggleTools),"3"], + [localize LSTRING(uiToggleCompass),"4"], + [localize LSTRING(uiToggleIcons),"5"], + [localize LSTRING(uiToggleMap),"M"], + [localize LSTRING(uiToggleInterface),"Backspace"], + [localize LSTRING(freeCamControls),""], + [localize LSTRING(freeCamForward),"W"], + [localize LSTRING(freeCamBackward),"S"], + [localize LSTRING(freeCamLeft),"A"], + [localize LSTRING(freeCamRight),"D"], + [localize LSTRING(freeCamUp),"Q"], + [localize LSTRING(freeCamDown),"Z"], + [localize LSTRING(freeCamPan),"RMB (Hold)"], + [localize LSTRING(freeCamDolly),"LMB (Hold)"], + [localize LSTRING(freeCamBoost),"Shift (Hold)"], + [localize LSTRING(freeCamFocus),"F"], + [localize LSTRING(attributeControls),""], + [localize LSTRING(nextCam),"Up Arrow"], + [localize LSTRING(prevCam),"Down Arrow"], + [localize LSTRING(nextUnit),"Right Arrow"], + [localize LSTRING(prevUnit),"Left Arrow"], + [localize LSTRING(nextVis),"N"], + [localize LSTRING(prevVis),"Ctrl + N"], + [localize LSTRING(adjZoom),"Scrollwheel"], + [localize LSTRING(adjSpeed),"Ctrl + Scrollwheel"], + [localize LSTRING(incZoom),"Num-/Num+"], + [localize LSTRING(incSpeed),"Ctrl + Num-/Num+"], + [localize LSTRING(reZoom),"Alt + Num-"], + [localize LSTRING(reSpeed),"Alt + Num+"] + ]; + + // Handle support for BI's respawn counter + [{ + if !(isNull (GETUVAR(RscRespawnCounter,displayNull))) then { + disableSerialization; + private ["_counter","_title","_back","_timer","_frame","_x","_y"]; + _counter = GETUVAR(RscRespawnCounter,displayNull); + _title = _counter displayCtrl 1001; + _back = _counter displayCtrl 1002; + _timer = _counter displayCtrl 1003; + _frame = _counter ctrlCreate ["RscFrame",1008]; + + _x = safeZoneX + safeZoneW - TOOL_W * 4 - MARGIN * 3; + _y = safeZoneY + safeZoneH - TOOL_H; + + // Timer + _title ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; + _back ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; + _timer ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; + _frame ctrlSetPosition [_x,_y,TOOL_W,TOOL_H]; + + _title ctrlSetBackgroundColor [0,0,0,0]; + _back ctrlSetBackgroundColor [COL_BACK]; + _timer ctrlSetFontHeight TOOL_H; + _frame ctrlSetTextColor [COL_FORE]; + + _title ctrlCommit 0; + _back ctrlCommit 0; + _timer ctrlCommit 0; + _frame ctrlCommit 0; + }; + },[],0.5] call EFUNC(common,waitAndExecute); + }; + case "onunload": { + // Kill GUI PFHs + removeMissionEventHandler ["Draw3D",GVAR(iconHandler)]; + GVAR(camHandler) = nil; + GVAR(compHandler) = nil; + GVAR(iconHandler) = nil; + GVAR(toolHandler) = nil; + + // Reset variables + GVAR(camBoom) = 0; + GVAR(camDolly) = [0,0]; + GVAR(ctrlKey) = false; + GVAR(heldKeys) = []; + GVAR(heldKeys) resize 255; + GVAR(mouse) = [false,false]; + GVAR(mousePos) = [0.5,0.5]; + GVAR(treeSel) = objNull; + }; + // Mouse events + case "onmousebuttondown": { + _args params ["_ctrl","_button"]; + GVAR(mouse) set [_button,true]; + + // Detect right click + if ((_button == 1) && (GVAR(camMode) == 1)) then { + // In first person toggle sights mode + GVAR(camGun) = !GVAR(camGun); + [] call FUNC(transitionCamera); + }; + }; + case "onmousebuttonup": { + _args params ["_ctrl","_button"]; + + GVAR(mouse) set [_button,false]; + if (_button == 0) then { GVAR(camDolly) = [0,0]; }; + }; + case "onmousezchanged": { + _args params ["_ctrl","_zChange"]; + + // Scroll to change speed, modifier for zoom + if (GVAR(ctrlKey)) then { + [nil,nil,nil,nil,nil,nil,nil, GVAR(camSpeed) + _zChange * 0.2] call FUNC(setCameraAttributes); + } else { + [nil,nil,nil,nil,nil,nil, GVAR(camZoom) + _zChange * 0.1] call FUNC(setCameraAttributes); + }; + }; + case "onmousemoving": { + _args params ["_ctrl","_x","_y"]; + + [_x,_y] call FUNC(handleMouse); + }; + // Keyboard events + case "onkeydown": { + _args params ["_display","_dik","_shift","_ctrl","_alt"]; + + if ((alive player) && {_dik in (actionKeys "curatorInterface")} && {!isNull (getAssignedCuratorLogic player)}) exitWith { + [QGVAR(zeus)] call FUNC(interrupt); + ["zeus"] call FUNC(handleInterface); + }; + if ((isServer || {serverCommandAvailable "#kick"}) && {_dik in (actionKeys "Chat" + actionKeys "PrevChannel" + actionKeys "NextChannel")}) exitWith { + false + }; + + // Handle held keys (prevent repeat calling) + if (GVAR(heldKeys) param [_dik,false]) exitwith {}; + // Exclude movement/adjustment keys so that speed can be adjusted on fly + if !(_dik in [16,17,30,31,32,44,74,78]) then { + GVAR(heldKeys) set [_dik,true]; + }; + + switch (_dik) do { + case 1: { // Esc + [QGVAR(escape)] call FUNC(interrupt); + ["escape"] call FUNC(handleInterface); + }; + case 2: { // 1 + [_display,nil,nil,nil,nil,nil,true] call FUNC(toggleInterface); + }; + case 3: { // 2 + [_display,nil,true] call FUNC(toggleInterface); + }; + case 4: { // 3 + [_display,nil,nil,nil,nil,true] call FUNC(toggleInterface); + }; + case 5: { // 4 + [_display,true] call FUNC(toggleInterface); + }; + case 6: { // 5 + GVAR(showIcons) = !GVAR(showIcons); + }; + case 14: { // Backspace + [_display,nil,nil,true] call FUNC(toggleInterface); + }; + case 16: { // Q + GVAR(camBoom) = 0.5 * GVAR(camSpeed) * ([1, 2] select _shift); + }; + case 17: { // W + GVAR(camDolly) set [1, GVAR(camSpeed) * ([1, 2] select _shift)]; + }; + case 29: { // Ctrl + GVAR(ctrlKey) = true; + }; + case 30: { // A + GVAR(camDolly) set [0, -GVAR(camSpeed) * ([1, 2] select _shift)]; + }; + case 31: { // S + GVAR(camDolly) set [1, -GVAR(camSpeed) * ([1, 2] select _shift)]; + }; + case 32: { // D + GVAR(camDolly) set [0, GVAR(camSpeed) * ([1, 2] select _shift)]; + }; + case 33: { // F + private ["_sel","_vector"]; + _sel = GVAR(treeSel); + if ((GVAR(camMode) == 0) && {!isNull _sel} && {_sel in GVAR(unitList)}) then { + _vector = (positionCameraToWorld [0,0,0]) vectorDiff (positionCameraToWorld [0,0,25]); + [nil,nil,nil,(getPosATL _sel) vectorAdd _vector] call FUNC(setCameraAttributes); + }; + }; + case 44: { // Z + GVAR(camBoom) = -0.5 * GVAR(camSpeed) * ([1, 2] select _shift); + }; + case 49: { // N + if (GVAR(camMode) == 0) then { + if (_ctrl) then { + [nil,nil,-1] call FUNC(cycleCamera); + } else { + [nil,nil,1] call FUNC(cycleCamera); + }; + }; + }; + case 50: { // M + [_display,nil,nil,nil,true] call FUNC(toggleInterface); + }; + case 57: { // Spacebar + // Freecam attachment here, if in external then set cam pos and attach + }; + case 74: { // Num - + if (_alt) exitWith { [nil,nil,nil,nil,nil,nil, 1.25] call FUNC(setCameraAttributes); }; + if (_ctrl) then { + [nil,nil,nil,nil,nil,nil,nil, GVAR(camSpeed) - 0.05] call FUNC(setCameraAttributes); + } else { + [nil,nil,nil,nil,nil,nil, GVAR(camZoom) - 0.01] call FUNC(setCameraAttributes); + }; + }; + case 78: { // Num + + if (_alt) exitWith { [nil,nil,nil,nil,nil,nil,nil, 2.5] call FUNC(setCameraAttributes); }; + if (_ctrl) then { + [nil,nil,nil,nil,nil,nil,nil, GVAR(camSpeed) + 0.05] call FUNC(setCameraAttributes); + } else { + [nil,nil,nil,nil,nil,nil, GVAR(camZoom) + 0.01] call FUNC(setCameraAttributes); + }; + }; + case 200: { // Up arrow + [-1] call FUNC(cycleCamera); + }; + case 203: { // Left arrow + [nil,1] call FUNC(cycleCamera); + }; + case 205: { // Right arrow + [nil,-1] call FUNC(cycleCamera); + }; + case 208: { // Down arrow + [1] call FUNC(cycleCamera); + }; + }; + + true + }; + case "onkeyup": { + _args params ["_display","_dik","_shift","_ctrl","_alt"]; + + // No longer being held + GVAR(heldKeys) set [_dik,nil]; + + switch (_dik) do { + case 16: { // Q + GVAR(camBoom) = 0; + }; + case 17: { // W + GVAR(camDolly) set [1, 0]; + }; + case 29: { // Ctrl + GVAR(ctrlKey) = false; + }; + case 30: { // A + GVAR(camDolly) set [0, 0]; + }; + case 31: { // S + GVAR(camDolly) set [1, 0]; + }; + case 32: { // D + GVAR(camDolly) set [0, 0]; + }; + case 44: { // Z + GVAR(camBoom) = 0; + }; + }; + + true + }; + // Tree events + case "ontreedblclick": { + // Update camera view when listbox unit is double clicked on + _args params ["_tree","_sel"]; + + // Ensure a unit was selected + if (count _sel == 3) then { + private ["_netID","_newUnit","_newMode"]; + _netID = (_args select 0) tvData _sel; + _newUnit = objectFromNetId _netID; + + // When unit is reselected, toggle camera mode + if (_newUnit == GVAR(camUnit) || GVAR(camMode) == 0) then { + _newMode = [2,2,1] select GVAR(camMode); + }; + + [_newMode,_newUnit] call FUNC(transitionCamera); + }; + }; + case "ontreeselchanged": { + _args params ["_tree","_sel"]; + + if (count _sel == 3) then { + GVAR(treeSel) = objectFromNetId (_tree tvData _sel); + } else { + GVAR(treeSel) = objNull; + }; + }; + case "onunitsupdate": { + _args params ["_tree"]; + private ["_cachedUnits","_cachedGrps","_cachedSides","_s","_g","_grp","_u","_unit","_side"]; + + // Cache existing group and side nodes and cull removed data + _cachedUnits = []; + _cachedGrps = []; + _cachedSides = []; + for "_s" from 0 to ((_tree tvCount []) - 1) do { + for "_g" from 0 to ((_tree tvCount [_s]) - 1) do { + _grp = groupFromNetID (_tree tvData [_s,_g]); + + if (_grp in GVAR(groupList)) then { + _cachedGrps pushBack _grp; + _cachedGrps pushBack _g; + + for "_u" from 0 to ((_tree tvCount [_s,_g])) do { + _unit = objectFromNetId (_tree tvData [_s,_g,_u]); + + if (_unit in GVAR(unitList)) then { + _cachedUnits pushBack _unit; + } else { + _tree tvDelete [_s,_g,_u]; + }; + }; + } else { + _tree tvDelete [_s,_g]; + }; + }; + + if ((_tree tvCount [_s]) > 0) then { + _cachedSides pushBack (_tree tvText [_s]); + _cachedSides pushBack _s; + } else { + _tree tvDelete [_s]; + }; + }; + + // Update the tree from the unit list + { + _grp = group _x; + _side = [side _grp] call BIS_fnc_sideName; + + // Use correct side node + if !(_side in _cachedSides) then { + // Add side node + _s = _tree tvAdd [[], _side]; + _tree tvExpand [_s]; + + _cachedSides pushBack _side; + _cachedSides pushBack _s; + } else { + // If side already processed, use existing node + _s = _cachedSides select ((_cachedSides find _side) + 1); + }; + + // Use correct group node + if !(_grp in _cachedGrps) then { + // Add group node + _g = _tree tvAdd [[_s], groupID _grp]; + _tree tvSetData [[_s,_g], netID _grp]; + + _cachedGrps pushBack _grp; + _cachedGrps pushBack _g; + } else { + // If group already processed, use existing node + _g = _cachedGrps select ((_cachedGrps find _grp) + 1); + }; + + _u = _tree tvAdd [[_s,_g], GETVAR(_x,GVAR(uName),"")]; + _tree tvSetData [[_s,_g,_u], netID _x]; + _tree tvSetPicture [[_s,_g,_u], GETVAR(_x,GVAR(uIcon),"")]; + _tree tvSetPictureColor [[_s,_g,_u], GETVAR(_grp,GVAR(gColor),[ARR_4(1,1,1,1)])]; + + _tree tvSort [[_s,_g],false]; + } forEach (GVAR(unitList) - _cachedUnits); + + _tree tvSort [[],false]; + + if ((_tree tvCount []) <= 0) then { + _tree tvAdd [[], localize LSTRING(units_none)]; + }; + }; + // Map events + case "onmapclick": { + _args params ["_map","_button","_x","_y","_shift","_ctrl","_alt"]; + private ["_newPos","_oldZ"]; + + if ((GVAR(camMode) == 0) && (_button == 0)) then { + _newPos = _map ctrlMapScreenToWorld [_x,_y]; + _oldZ = (ASLtoATL GVAR(camPos)) select 2; + _newPos set [2, _oldZ]; + [nil,nil,nil, _newPos] call FUNC(setCameraAttributes); + }; + }; + // Interrupt events + case "escape": { + private "_dlg"; + + createDialog (["RscDisplayInterrupt", "RscDisplayMPInterrupt"] select isMultiplayer); + + disableSerialization; + _dlg = finddisplay 49; + _dlg displayAddEventHandler ["KeyDown", { + _key = _this select 1; + !(_key == 1) + }]; + + // Disable save, respawn, options & manual buttons + (_dlg displayCtrl 103) ctrlEnable false; + if !(alive player) then { + (_dlg displayCtrl 1010) ctrlEnable false; + }; + (_dlg displayCtrl 101) ctrlEnable false; + (_dlg displayCtrl 122) ctrlEnable false; + + // Initalize abort button (the "spawn" is a necessary evil) + (_dlg displayCtrl 104) ctrlAddEventHandler ["ButtonClick",{_this spawn { + disableSerialization; + _display = ctrlparent (_this select 0); + _abort = [localize "str_msg_confirm_return_lobby",nil,localize "str_disp_xbox_hint_yes",localize "str_disp_xbox_hint_no",_display,nil,true] call BIS_fnc_guiMessage; + if (_abort) then {_display closeDisplay 2; failMission "loser"}; + }}]; + + // PFH to re-open display when menu closes + [{ + if !(isNull (findDisplay 49)) exitWith {}; + + // If still a spectator then re-enter the interface + [QGVAR(escape),false] call FUNC(interrupt); + + [_this select 1] call CBA_fnc_removePerFrameHandler; + },0] call CBA_fnc_addPerFrameHandler; + }; + case "zeus": { + openCuratorInterface; + + [{ + // PFH to re-open display when menu closes + [{ + if !((isNull curatorCamera) && {isNull (GETMVAR(bis_fnc_moduleRemoteControl_unit,objNull))}) exitWith {}; + + // If still a spectator then re-enter the interface + [QGVAR(zeus),false] call FUNC(interrupt); + + [_this select 1] call CBA_fnc_removePerFrameHandler; + },0] call CBA_fnc_addPerFrameHandler; + },[],5] call EFUNC(common,waitAndExecute); + + true + }; +}; diff --git a/addons/spectator/functions/fnc_handleMap.sqf b/addons/spectator/functions/fnc_handleMap.sqf new file mode 100644 index 0000000000..4eeb5fd7e1 --- /dev/null +++ b/addons/spectator/functions/fnc_handleMap.sqf @@ -0,0 +1,47 @@ +/* + * Author: Head, SilentSpike + * Handles rendering the spectator map icons + * + * Arguments: + * 0: Parameters + * 1: PFH handle + * + * Return Value: + * None + * + * Example: + * [ace_spectator_fnc_handleIcons, 0] call CBA_fnc_addPerFrameHandler; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_map"]; +private ["_cachedVehicles","_unit","_color","_icon","_txt"]; + +if (GVAR(camMode) == 0) then { + _map drawIcon ["\A3\UI_F\Data\GUI\Rsc\RscDisplayMissionEditor\iconcamera_ca.paa",[0,0,0,1],GVAR(camera),20,20,GVAR(camPan)]; +}; + +_cachedVehicles = []; +{ + _unit = vehicle _x; + + if !(_unit in _cachedVehicles) then { + _cachedVehicles pushBack _unit; + + // Use previously cached info where possible + if (GETVAR(_unit,GVAR(uIcon),"") == "") then { + [_unit] call FUNC(cacheUnitInfo); + }; + + // Function has caching built in + _color = [side effectiveCommander _unit] call BIS_fnc_sideColor; + _icon = GETVAR(_unit,GVAR(uIcon),""); + _txt = ["", GETVAR(_x,GVAR(uName),"")] select (isPlayer _x); + + _map drawIcon [_icon, _color, _unit, 19, 19, getDir _unit, _txt, 1, 0.03]; + }; + false +} count GVAR(unitList); diff --git a/addons/spectator/functions/fnc_handleMouse.sqf b/addons/spectator/functions/fnc_handleMouse.sqf new file mode 100644 index 0000000000..1c2b62798c --- /dev/null +++ b/addons/spectator/functions/fnc_handleMouse.sqf @@ -0,0 +1,46 @@ +/* + * Author: F3 Project, Head, SilentSpike + * Processes the change in mouse position for the spectator camera + * + * Arguments: + * 0: Mouse x coord + * 1: Mouse y coord + * + * Return Value: + * None + * + * Example: + * [0.5, 0.5] call ace_spectator_fnc_handleMouse; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_x","_y"]; +private ["_leftButton","_rightButton","_oldX","_oldY","_deltaX","_deltaY","_zoomMod"]; + +_leftButton = GVAR(mouse) select 0; +_rightButton = GVAR(mouse) select 1; + +_oldX = GVAR(mousePos) select 0; +_oldY = GVAR(mousePos) select 1; + +// Get change in pos +_deltaX = _oldX - _x; +_deltaY = _oldY - _y; + +if (_leftButton) then { + GVAR(camDolly) set [0, _deltaX * -100 * GVAR(camSpeed)]; + GVAR(camDolly) set [1, _deltaY * 100 * GVAR(camSpeed)]; +} else { + if (_rightButton) then { + // Pan/Tilt amount should be influnced by zoom level (it should really be exponential) + _zoomMod = (GVAR(camZoom) * 0.8) max 1; + + GVAR(camPan) = GVAR(camPan) - ((_deltaX * 360) / _zoomMod); + GVAR(camTilt) = ((GVAR(camTilt) + ((_deltaY * 180) / _zoomMod)) min 89) max -89; + }; +}; + +GVAR(mousePos) = [_x,_y]; diff --git a/addons/spectator/functions/fnc_handleToolbar.sqf b/addons/spectator/functions/fnc_handleToolbar.sqf new file mode 100644 index 0000000000..878f3e46de --- /dev/null +++ b/addons/spectator/functions/fnc_handleToolbar.sqf @@ -0,0 +1,54 @@ +/* + * Author: Karel Moricky, SilentSpike + * Handles the spectator UI toolbar values + * + * Arguments: + * 0: Parameters + * 1: PFH handle + * + * Return Value: + * None + * + * Example: + * [ace_spectator_fnc_handleToolbar, 0, _display] call CBA_fnc_addPerFrameHandler; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_display"]; + +// Kill PFH when toolbar hidden (or display is closed) +if (isNil QGVAR(toolHandler)) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; + +private ["_name","_vision","_fov","_speed","_mode","_time","_toolbar"]; +_toolbar = _display displayCtrl IDC_TOOL; + +// Find all tool values +if (GVAR(camMode) == 0) then { + _vision = if (GVAR(camVision) >= 0) then {localize LSTRING(VisionThermal)} else { [localize LSTRING(VisionNight), localize LSTRING(VisionNormal)] select (GVAR(camVision) < -1) }; + _fov = format ["%1x", floor(GVAR(camZoom) * 100) * 0.01]; + _speed = format ["%1 m/s", floor(GVAR(camSpeed) * 100) * 0.01]; +} else { + _vision = [side group GVAR(camUnit)] call BIS_fnc_sideName; + _fov = format ["%1 m", floor(getPosASL GVAR(camUnit) select 2)]; + _speed = format ["%1 km/h", floor(speed GVAR(camUnit)) max 0]; +}; + +if (alive GVAR(camUnit)) then { + _name = GETVAR(GVAR(camUnit),GVAR(uName),""); +} else { + _name = localize "STR_Special_None"; +}; + +_mode = [localize LSTRING(ViewFree),localize LSTRING(ViewInternal),localize LSTRING(ViewExternal)] select GVAR(camMode); +_time = [daytime,"HH:MM"] call BIS_fnc_timeToString; + +// Update the UI tools +(_toolbar controlsGroupCtrl IDC_TOOL_CLOCK) ctrlSetText _time; +(_toolbar controlsGroupCtrl IDC_TOOL_VISION) ctrlSetText _vision; +(_toolbar controlsGroupCtrl IDC_TOOL_FOV) ctrlSetText _fov; +(_toolbar controlsGroupCtrl IDC_TOOL_NAME) ctrlSetText _name; +(_toolbar controlsGroupCtrl IDC_TOOL_SPEED) ctrlSetText _speed; +(_toolbar controlsGroupCtrl IDC_TOOL_VIEW) ctrlSetText _mode; diff --git a/addons/spectator/functions/fnc_handleUnits.sqf b/addons/spectator/functions/fnc_handleUnits.sqf new file mode 100644 index 0000000000..c32961024c --- /dev/null +++ b/addons/spectator/functions/fnc_handleUnits.sqf @@ -0,0 +1,40 @@ +/* + * Author: SilentSpike + * Maintains the spectatable unit list and updates the unit tree accordingly + * Also updates current camera unit when status changes + * + * Arguments: + * 0: Parameters + * 1: PFH handle + * + * Return Value: + * None + * + * Example: + * [ace_spectator_fnc_handleUnits, 10, _display] call CBA_fnc_addPerFrameHandler; + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_display"]; + +// Kill PFH when display is closed +if (isNull _display) exitWith { [_this select 1] call CBA_fnc_removePerFrameHandler; }; + +// Remove all dead and null units from the list +[] call FUNC(updateUnits); + +// Camera shouldn't stay on unit that isn't in the list (unless dead) +if !(GVAR(camUnit) in GVAR(unitList)) then { + if (alive GVAR(camUnit) || isNull GVAR(camUnit)) then { + [nil,1] call FUNC(cycleCamera); + }; +}; + +// Reduce overhead when unit tree is hidden +if (ctrlShown (_display displayCtrl IDC_UNIT)) then { + // Reduce overhead by spreading across frames + [FUNC(handleInterface),["onUnitsUpdate",[(_display displayCtrl IDC_UNIT) controlsGroupCtrl IDC_UNIT_TREE]],1] call EFUNC(common,waitAndExecute); +}; diff --git a/addons/spectator/functions/fnc_interrupt.sqf b/addons/spectator/functions/fnc_interrupt.sqf new file mode 100644 index 0000000000..48cca7d102 --- /dev/null +++ b/addons/spectator/functions/fnc_interrupt.sqf @@ -0,0 +1,44 @@ +/* + * Author: SilentSpike + * Interrupts the spectator interface for external systems + * + * Arguments: + * 0: Reason + * 1: Interrupting + * + * Return Value: + * None + * + * Example: + * ["mySystem"] call ace_spectator_fnc_interrupt + * + * Public: Yes + */ +#include "script_component.hpp" + +params [["_reason", "", [""]], ["_interrupt", true, [true]]]; + +// Nothing to do when spectator is closed +if !(GVAR(isSet)) exitWith {}; + +if (_reason == "") exitWith { ERROR("Invalid Reason"); }; +if (_interrupt) then { + GVAR(interrupts) pushBack _reason; +} else { + GVAR(interrupts) = GVAR(interrupts) - [_reason]; +}; + +if (GVAR(interrupts) isEqualTo []) then { + if (isNull (findDisplay 12249)) then { + createDialog QGVAR(interface); + [] call FUNC(transitionCamera); + }; +} else { + if !(isNull (findDisplay 12249)) then { + while {dialog} do { + closeDialog 0; + }; + + (findDisplay 12249) closeDisplay 0; + }; +}; diff --git a/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf new file mode 100644 index 0000000000..52b6e5d8fa --- /dev/null +++ b/addons/spectator/functions/fnc_moduleSpectatorSettings.sqf @@ -0,0 +1,25 @@ +/* + * Author: SilentSpike + * Read spectator settings from module + * + * 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(filterUnits), "unitsFilter"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(filterSides), "sidesFilter"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(restrictModes), "cameraModes"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(restrictVisions), "visionModes"] call EFUNC(common,readSettingFromModule); diff --git a/addons/spectator/functions/fnc_respawnTemplate.sqf b/addons/spectator/functions/fnc_respawnTemplate.sqf new file mode 100644 index 0000000000..b808c43eab --- /dev/null +++ b/addons/spectator/functions/fnc_respawnTemplate.sqf @@ -0,0 +1,44 @@ +/* + * Author: SilentSpike + * The ace_spectator respawn template, handles killed + respawn + * Can be used via BI's respawn framework, see: + * https://community.bistudio.com/wiki/Arma_3_Respawn + * + * Arguments: + * 0: Corpse/New Unit + * 1: Killer/Old Unit + * 2: Respawn Type + * 3: Respawn Delay + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +params [["_unit",objNull,[objNull]], ["_killer",objNull,[objNull]], ["_respawn",0,[0]], ["_respawnDelay",0,[0]]]; +private ["_vision","_pos"]; + +// End mission when all are dead with respawn type "None" +if ((_respawn == 0) && {{alive _x} count allPlayers <= 0}) exitWith { + [["endDeath",false],"BIS_fnc_endMission"] call EFUNC(common,execRemoteFnc); +}; + +if (isNull _killer) then {_killer = _unit}; +_vision = [-2,-1] select (sunOrMoon < 1); +_pos = (getPosATL _unit) vectorAdd [0,0,5]; + +if (alive _unit) then { + if (_respawn == 1) then { + [_unit,QGVAR(isSeagull)] call EFUNC(common,hideUnit); + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [true] call FUNC(setSpectator); + } else { + [false] call FUNC(setSpectator); + }; +} else { + [2,_killer,_vision,_pos,getDir _unit] call FUNC(setCameraAttributes); + [true] call FUNC(setSpectator); +}; diff --git a/addons/spectator/functions/fnc_setCameraAttributes.sqf b/addons/spectator/functions/fnc_setCameraAttributes.sqf new file mode 100644 index 0000000000..8eb6fe51ac --- /dev/null +++ b/addons/spectator/functions/fnc_setCameraAttributes.sqf @@ -0,0 +1,67 @@ +/* + * Author: SilentSpike + * Sets the spectator camera attributes as desired + * + * Arguments: + * 0: Camera mode + * - 0: Free + * - 1: Internal + * - 2: External + * 1: Camera unit (objNull for random) + * 2: Camera vision + * - -2: Normal + * - -1: Night vision + * - 0: Thermal white hot + * - 1: Thermal black hot + * 3: Camera position (ATL) + * 4: Camera pan (0 - 360) + * 5: Camera tilt (-90 - 90) + * 6: Camera zoom (0.01 - 2) + * 7: Camera speed in m/s (0.05 - 10) + * + * Return Value: + * None + * + * Example: + * [1, objNull] call ace_spectator_fnc_setCameraAttributes + * + * Public: Yes + */ + +#include "script_component.hpp" + +params [ + ["_mode",GVAR(camMode),[0]], + ["_unit",GVAR(camUnit),[objNull]], + ["_vision",GVAR(camVision),[0]], + ["_position",ASLtoATL GVAR(camPos),[[]],3], + ["_heading",GVAR(camPan),[0]], + ["_tilt",GVAR(camTilt),[0]], + ["_zoom",GVAR(camZoom),[0]], + ["_speed",GVAR(camSpeed),[0]] +]; + +// Normalize input +if !(_mode in GVAR(availableModes)) then { + _mode = GVAR(availableModes) select ((GVAR(availableModes) find GVAR(camMode)) max 0); +}; + +if !(_vision in GVAR(availableVisions)) then { + _vision = GVAR(availableVisions) select ((GVAR(availableVisions) find GVAR(camVision)) max 0); +}; + +GVAR(camPan) = _heading % 360; +GVAR(camSpeed) = (_speed max 0.05) min 10; +GVAR(camTilt) = (_tilt max -89) min 89; +GVAR(camUnit) = _unit; +GVAR(camVision) = _vision; +GVAR(camZoom) = (_zoom min 2) max 0.01; + +// Apply if camera exists +if (isNil QGVAR(camera)) then { + GVAR(camMode) = _mode; + GVAR(camPos) = (ATLtoASL _position); +} else { + [_mode,_unit,_vision] call FUNC(transitionCamera); + GVAR(camera) setPosATL _position; +}; diff --git a/addons/spectator/functions/fnc_setSpectator.sqf b/addons/spectator/functions/fnc_setSpectator.sqf new file mode 100644 index 0000000000..621100a5ba --- /dev/null +++ b/addons/spectator/functions/fnc_setSpectator.sqf @@ -0,0 +1,126 @@ +/* + * Author: SilentSpike + * Sets local client to the given spectator state (virtually) + * To physically handle a spectator see ace_spectator_fnc_stageSpectator + * + * Client will be able to communicate in ACRE/TFAR as appropriate + * The spectator interface will be opened/closed + * + * Arguments: + * 0: Spectator state of local client + * + * Return Value: + * None + * + * Example: + * [true] call ace_spectator_fnc_setSpectator + * + * Public: Yes + */ + +#include "script_component.hpp" + +params [["_set",true,[true]]]; + +// Only clients can be spectators +if !(hasInterface) exitWith {}; + +// Exit if no change +if (_set isEqualTo GVAR(isSet)) exitwith {}; + +// Handle common addon audio +if (["ace_hearing"] call EFUNC(common,isModLoaded)) then {EGVAR(hearing,disableVolumeUpdate) = _set}; +if (["acre_sys_radio"] call EFUNC(common,isModLoaded)) then {[_set] call acre_api_fnc_setSpectator}; +if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {[player, _set] call TFAR_fnc_forceSpectator}; + +if (_set) then { + // Initalize camera variables + GVAR(camBoom) = 0; + GVAR(camDolly) = [0,0]; + GVAR(camGun) = false; + + // Initalize display variables + GVAR(ctrlKey) = false; + GVAR(heldKeys) = []; + GVAR(heldKeys) resize 255; + GVAR(mouse) = [false,false]; + GVAR(mousePos) = [0.5,0.5]; + GVAR(treeSel) = objNull; + + // Update units before opening to support pre-set camera unit + [] call FUNC(updateUnits); + + // Initalize the camera view + GVAR(camera) = "Camera" camCreate (ASLtoATL GVAR(camPos)); + [] call FUNC(transitionCamera); + + // Close map and clear radio + openMap [false,false]; + clearRadio; + + // Disable BI damage effects + BIS_fnc_feedback_allowPP = false; + + // Close any open dialogs + while {dialog} do { + closeDialog 0; + }; + + // Create the display + (findDisplay 46) createDisplay QGVAR(interface); + + // Cache and disable nametag settings + if (["ace_nametags"] call EFUNC(common,isModLoaded)) then { + GVAR(nametagSettingCache) = [EGVAR(nametags,showPlayerNames), EGVAR(nametags,showNamesForAI)]; + EGVAR(nametags,showPlayerNames) = 0; + EGVAR(nametags,showNamesForAI) = false; + }; +} else { + // Close any open dialogs (could be interrupts) + while {dialog} do { + closeDialog 0; + }; + + // Kill the display + (findDisplay 12249) closeDisplay 0; + + // Terminate camera + GVAR(camera) cameraEffect ["terminate", "back"]; + camDestroy GVAR(camera); + + clearRadio; + + // Return to player view + player switchCamera "internal"; + + // Enable BI damage effects + BIS_fnc_feedback_allowPP = true; + + // Cleanup camera variables + GVAR(camera) = nil; + GVAR(camBoom) = nil; + GVAR(camDolly) = nil; + GVAR(camGun) = nil; + + // Cleanup display variables + GVAR(ctrlKey) = nil; + GVAR(heldKeys) = nil; + GVAR(mouse) = nil; + GVAR(mousePos) = nil; + GVAR(treeSel) = nil; + + // Reset nametag settings + if (["ace_nametags"] call EFUNC(common,isModLoaded)) then { + EGVAR(nametags,showPlayerNames) = GVAR(nametagSettingCache) select 0; + EGVAR(nametags,showNamesForAI) = GVAR(nametagSettingCache) select 1; + GVAR(nametagSettingCache) = nil; + }; +}; + +// Reset interruptions +GVAR(interrupts) = []; + +// Mark spectator state for reference +GVAR(isSet) = _set; + +["spectatorSet",[_set]] call EFUNC(common,localEvent); diff --git a/addons/spectator/functions/fnc_stageSpectator.sqf b/addons/spectator/functions/fnc_stageSpectator.sqf new file mode 100644 index 0000000000..7f0d862719 --- /dev/null +++ b/addons/spectator/functions/fnc_stageSpectator.sqf @@ -0,0 +1,68 @@ +/* + * Author: SilentSpike + * Sets target unit to the given spectator state (physically) + * To virtually handle a spectator see ace_spectator_fnc_setSpectator + * + * Units will be gathered at marker ace_spectator_respawn (or [0,0,0] by default) + * Upon unstage, units will be moved to the position they were in upon staging + * + * Arguments: + * 0: Unit to put into spectator stage + * 1: Spectator stage + * + * Return Value: + * None + * + * Example: + * [player, false] call ace_spectator_fnc_stageSpectator + * + * Public: Yes + */ + +#include "script_component.hpp" + +params [["_unit",player,[objNull]], ["_set",true,[true]]]; + +// No change, no service (but allow spectators to be reset) +if !(_set || (GETVAR(_unit,GVAR(isStaged),false))) exitWith {}; + +if !(local _unit) exitwith { + [[_unit, _set], QFUNC(stageSpectator), _unit] call EFUNC(common,execRemoteFnc); +}; + +// Prevent unit falling into water +_unit enableSimulation !_set; + +// Move to/from group as appropriate +[_unit, _set, QGVAR(isStaged), side group _unit] call EFUNC(common,switchToGroupSide); + +if (_set) then { + // Position should only be saved on first entry + if !(GETVAR(_unit,GVAR(isStaged),false)) then { + GVAR(oldPos) = getPosATL _unit; + }; + + // Ghosts can't talk + [_unit, QGVAR(isStaged)] call EFUNC(common,hideUnit); + [_unit, QGVAR(isStaged)] call EFUNC(common,muteUnit); + + _unit setPos (markerPos QGVAR(respawn)); +} else { + // Physical beings can talk + [_unit, QGVAR(isStaged)] call EFUNC(common,unhideUnit); + [_unit, QGVAR(isStaged)] call EFUNC(common,unmuteUnit); + + _unit setPosATL GVAR(oldPos); +}; + +// Spectators ignore damage (vanilla and ace_medical) +_unit allowDamage !_set; +_unit setVariable [QEGVAR(medical,allowDamage), !_set]; + +// No theoretical change if an existing spectator was reset +if !(_set isEqualTo (GETVAR(_unit,GVAR(isStaged),false))) then { + // Mark spectator state for reference + _unit setVariable [QGVAR(isStaged), _set, true]; + + ["spectatorStaged",[_set]] call EFUNC(common,localEvent); +}; diff --git a/addons/spectator/functions/fnc_toggleInterface.sqf b/addons/spectator/functions/fnc_toggleInterface.sqf new file mode 100644 index 0000000000..4a03de4271 --- /dev/null +++ b/addons/spectator/functions/fnc_toggleInterface.sqf @@ -0,0 +1,82 @@ +/* + * Author: SilentSpike + * Correctly handles toggling of spectator interface elements for clean UX + * + * Arguments: + * 0: Display + * 1: Toogle compass + * 2: Toogle help + * 3: Toogle interface + * 4: Toogle map + * 5: Toogle toolbar + * 6: Toogle unit list + * + * Return Value: + * None + * + * Example: + * [_dsiplay, nil, true] call ace_spectator_fnc_toggleInterface + * + * Public: No + */ + +#include "script_component.hpp" + +params ["_display", ["_toggleComp",false], ["_toggleHelp",false], ["_toggleInterface",false], ["_toggleMap",false], ["_toggleTool",false], ["_toggleUnit",false]]; + +private ["_comp","_help","_map","_tool","_unit"]; +_comp = _display displayCtrl IDC_COMP; +_help = _display displayCtrl IDC_HELP; +_map = _display displayCtrl IDC_MAP; +_tool = _display displayCtrl IDC_TOOL; +_unit = _display displayCtrl IDC_UNIT; + +// Map operates outside of interface +GVAR(showMap) = [GVAR(showMap), !GVAR(showMap)] select _toggleMap; +_map ctrlShow GVAR(showMap); + +if (GVAR(showMap)) then { + // When map is shown, temporarily hide interface to stop overlapping + { + _x ctrlShow false; + } forEach [_comp,_help,_tool,_unit]; + + // Centre map on camera/unit upon opening + if (_toggleMap) then { + _map ctrlMapAnimAdd [0, 0.5, [GVAR(camUnit),GVAR(camera)] select (GVAR(camMode) == 0)]; + ctrlMapAnimCommit _map; + }; +} else { + // Can only toggle interface with map minimised + GVAR(showInterface) = [GVAR(showInterface), !GVAR(showInterface)] select _toggleInterface; + + if (GVAR(showInterface)) then { + // Can only toggle interface elements with interface shown + GVAR(showComp) = [GVAR(showComp), !GVAR(showComp)] select _toggleComp; + GVAR(showHelp) = [GVAR(showHelp), !GVAR(showHelp)] select _toggleHelp; + GVAR(showTool) = [GVAR(showTool), !GVAR(showTool)] select _toggleTool; + GVAR(showUnit) = [GVAR(showUnit), !GVAR(showUnit)] select _toggleUnit; + + _comp ctrlShow GVAR(showComp); + _help ctrlShow GVAR(showHelp); + _tool ctrlShow GVAR(showTool); + _unit ctrlShow GVAR(showUnit); + } else { + { + _x ctrlShow false; + } forEach [_comp,_help,_tool,_unit]; + }; +}; + +// Only run PFHs when respective control is shown, otherwise kill +if (ctrlShown _comp) then { + if (isNil QGVAR(compHandler)) then { GVAR(compHandler) = [FUNC(handleCompass), 0, _display] call CBA_fnc_addPerFrameHandler; }; +} else { + GVAR(compHandler) = nil; +}; + +if (ctrlShown _tool) then { + if (isNil QGVAR(toolHandler)) then { GVAR(toolHandler) = [FUNC(handleToolbar), 0, _display] call CBA_fnc_addPerFrameHandler; }; +} else { + GVAR(toolHandler) = nil; +}; diff --git a/addons/spectator/functions/fnc_transitionCamera.sqf b/addons/spectator/functions/fnc_transitionCamera.sqf new file mode 100644 index 0000000000..72cb9f1a45 --- /dev/null +++ b/addons/spectator/functions/fnc_transitionCamera.sqf @@ -0,0 +1,111 @@ +/* + * Author: SilentSpike + * Transitions the spectator camera vision/view/unit + * + * Arguments: + * 0: Camera mode + * - 0: Free + * - 1: Internal + * - 2: External + * 1: Camera unit + * 2: Vision mode + * - -2: Normal + * - -1: NV + * - 0: White hot + * - 1: Black hot + * + * Return Value: + * None + * + * Example: + * [0,objNull] call ace_spectator_fnc_transitionCamera + * + * Public: No + */ + +#include "script_component.hpp" + +params [["_newMode",GVAR(camMode)], ["_newUnit",GVAR(camUnit)], ["_newVision",GVAR(camVision)]]; + +// If new mode isn't available then keep current (unless current also isn't) +if !(_newMode in GVAR(availableModes)) then { + _newMode = GVAR(availableModes) select ((GVAR(availableModes) find GVAR(camMode)) max 0); +}; + +// When no units available to spectate, exit to freecam +if ((GVAR(unitList) isEqualTo []) && (alive _newUnit || isNull _newUnit)) then { + _newMode = 0; + _newUnit = objNull; +}; + +// Reset gun cam if not internal +if (_newMode != 1) then { + GVAR(camGun) = false; +}; + +if (_newMode == 0) then { // Free + // Preserve camUnit value for consistency when manually changing view + GVAR(camera) cameraEffect ["internal", "back"]; + showCinemaBorder false; + cameraEffectEnableHUD true; + + // Apply the camera zoom + GVAR(camera) camSetFov -(linearConversion [0.01,2,GVAR(camZoom),-2,-0.01,true]); + GVAR(camera) camCommit 0; + + // Agent is switched to in free cam to hide death table and prevent AI chat while allowing icons to draw (also prevents systemChat and unit HUD) + // (Why is so much stuff tied into the current camera unit BI?!) + if (isNull GVAR(camAgent)) then { + GVAR(camAgent) = createAgent ["VirtualMan_F",markerPos QGVAR(respawn),[],0,""]; + }; + + GVAR(camAgent) switchCamera "internal"; + clearRadio; + + // If new vision isn't available then keep current (unless current also isn't) + if !(_newVision in GVAR(availableVisions)) then { + _newVision = GVAR(availableVisions) select ((GVAR(availableVisions) find GVAR(camVision)) max 0); + }; + + // Vision mode only applies to free cam + if (_newVision < 0) then { + false setCamUseTi 0; + camUseNVG (_newVision >= -1); + } else { + true setCamUseTi _newVision; + }; + GVAR(camVision) = _newVision; + + // Handle camera movement + if (isNil QGVAR(camHandler)) then { GVAR(camHandler) = [FUNC(handleCamera), 0] call CBA_fnc_addPerFrameHandler; }; +} else { + // When null unit is given choose random + if (isNull _newUnit) then { + _newUnit = GVAR(unitList) select floor(random(count GVAR(unitList))); + }; + + if (_newMode == 1) then { // Internal + // Handle gun cam + if (GVAR(camGun)) then { + _newUnit switchCamera "gunner"; + } else { + _newUnit switchCamera "internal"; + }; + } else { // External + _newUnit switchCamera "external"; + }; + + // Clear radio if group changed + if (group _newUnit != group GVAR(camUnit)) then { + clearRadio; + }; + + GVAR(camUnit) = _newUnit; + + // Terminate camera view + GVAR(camera) cameraEffect ["terminate", "back"]; + GVAR(camHandler) = nil; + cameraEffectEnableHUD true; +}; + +GVAR(camMode) = _newMode; diff --git a/addons/spectator/functions/fnc_updateCameraModes.sqf b/addons/spectator/functions/fnc_updateCameraModes.sqf new file mode 100644 index 0000000000..aef51b56c6 --- /dev/null +++ b/addons/spectator/functions/fnc_updateCameraModes.sqf @@ -0,0 +1,48 @@ +/* + * Author: SilentSpike + * Adds or removes spectator camera modes from the selection available to the local player. + * Possible camera modes are: + * - 0: Free + * - 1: Internal + * - 2: External + * + * Arguments: + * 0: Camera modes to add + * 1: Camera modes to remove + * + * Return Value: + * Available camera modes + * + * Example: + * [[0], [1,2]] call ace_spectator_fnc_updateCameraModes + * + * Public: Yes + */ + +#include "script_component.hpp" + +params [["_addModes",[],[[]]], ["_removeModes",[],[[]]]]; +private ["_newModes","_currentModes"]; + +_currentModes = GVAR(availableModes); + +// Restrict additions to only possible values +_newModes = _addModes arrayIntersect [0,1,2]; +_newModes append (_currentModes - _removeModes); + +_newModes = _newModes arrayIntersect _newModes; +_newModes sort true; + +// Can't become an empty array +if (_newModes isEqualTo []) then { + ["Cannot remove all camera modes (%1)", QFUNC(updateCameraModes)] call BIS_fnc_error; +} else { + GVAR(availableModes) = _newModes; +}; + +// Update camera in case of change +if !(isNil QGVAR(camera)) then { + [] call FUNC(transitionCamera); +}; + +_newModes diff --git a/addons/spectator/functions/fnc_updateSpectatableSides.sqf b/addons/spectator/functions/fnc_updateSpectatableSides.sqf new file mode 100644 index 0000000000..57f7756d54 --- /dev/null +++ b/addons/spectator/functions/fnc_updateSpectatableSides.sqf @@ -0,0 +1,33 @@ +/* + * Author: SilentSpike + * Adds or removes sides from the selection available to spectate by the local player. + * Note that the side filter setting is applied to the available sides dynamically. + * + * Default selection is [west,east,resistance,civilian] + * + * Arguments: + * 0: Sides to add + * 1: Sides to remove + * + * Return Value: + * Spectatable sides + * + * Example: + * [[west], [east,civilian]] call ace_spectator_fnc_updateSpectatableSides + * + * Public: Yes + */ + +#include "script_component.hpp" + +params [["_addSides",[],[[]]], ["_removeSides",[],[[]]]]; + +// Add and remove sides +_addSides append (GVAR(availableSides) - _removeSides); + +// Only need array of unique sides +_addSides = _addSides arrayIntersect _addSides; + +GVAR(availableSides) = _addSides; + +_addSides diff --git a/addons/spectator/functions/fnc_updateUnits.sqf b/addons/spectator/functions/fnc_updateUnits.sqf new file mode 100644 index 0000000000..50494cf499 --- /dev/null +++ b/addons/spectator/functions/fnc_updateUnits.sqf @@ -0,0 +1,75 @@ +/* + * Author: SilentSpike + * Adds units to spectator whitelist/blacklist and refreshes the filter units + * + * Arguments: + * 0: Units to add to the whitelist + * 1: Use blacklist + * + * Return Value: + * None + * + * Example: + * [allUnits,true] call ace_spectator_fnc_updateUnits + * + * Public: Yes + */ + +#include "script_component.hpp" + +params [["_newUnits",[],[[]]],["_blacklist",false,[false]]]; + +// Function only matters on player clients +if !(hasInterface) exitWith {}; + +// If adding to a list we can exit here, since it won't show up until the UI refreshes anyway +if !(_newUnits isEqualTo []) exitWith { + if (_blacklist) then { + GVAR(unitWhitelist) = GVAR(unitWhitelist) - _newUnits; + GVAR(unitBlacklist) append _newUnits; + } else { + GVAR(unitBlacklist) = GVAR(unitBlacklist) - _newUnits; + GVAR(unitWhitelist) append _newUnits; + }; +}; + +private ["_sides","_cond","_filteredUnits","_filteredGroups"]; + +// Unit setting filter +_newUnits = [[],allPlayers,playableUnits,allUnits] select GVAR(filterUnits); + +// Side setting filter +_sides = []; +_cond = [{_this == (side group player)},{(_this getFriend (side group player)) >= 0.6},{(_this getFriend (side group player)) < 0.6},{true}] select GVAR(filterSides); +{ + if (_x call _cond) then { + _sides pushBack _x; + }; +} forEach GVAR(availableSides); + +// Filter units and append to list +_filteredUnits = []; +{ + if ( + (alive _x) && + {(_x isKindOf "CAManBase")} && + {(side group _x) in _sides} && // Side filter + {simulationEnabled _x} && + {!(_x getVariable [QGVAR(isStaged), false])} // Who watches the watchmen? + ) then { + _filteredUnits pushBack _x; + }; +} forEach (_newUnits - GVAR(unitBlacklist)); +_filteredUnits append GVAR(unitWhitelist); + +// Cache icons and colour for drawing +_filteredGroups = []; +{ + // Intentionally re-applied to units in case their status changes + [_x] call FUNC(cacheUnitInfo); + _filteredGroups pushBack (group _x); +} forEach _filteredUnits; + +// Replace previous lists entirely (removes any no longer valid) +GVAR(unitList) = _filteredUnits arrayIntersect _filteredUnits; +GVAR(groupList) = _filteredGroups arrayIntersect _filteredGroups; diff --git a/addons/spectator/functions/fnc_updateVisionModes.sqf b/addons/spectator/functions/fnc_updateVisionModes.sqf new file mode 100644 index 0000000000..2a1e500f3f --- /dev/null +++ b/addons/spectator/functions/fnc_updateVisionModes.sqf @@ -0,0 +1,56 @@ +/* + * Author: SilentSpike + * Adds or removes spectator vision modes from the selection available to the local player. + * The default selection is [-2,-1,0,1]. + * Possible vision modes are: + * - -2: Normal + * - -1: Night vision + * - 0: White hot + * - 1: Black hot + * - 2: Light Green Hot / Darker Green cold + * - 3: Black Hot / Darker Green cold + * - 4: Light Red Hot / Darker Red Cold + * - 5: Black Hot / Darker Red Cold + * - 6: White Hot / Darker Red Cold + * - 7: Thermal (Shade of Red and Green, Bodies are white) + * + * Arguments: + * 0: Vision modes to add + * 1: Vision modes to remove + * + * Return Value: + * Available vision modes + * + * Example: + * [[0], [1,2]] call ace_spectator_fnc_updateVisionModes + * + * Public: Yes + */ + +#include "script_component.hpp" + +params [["_addModes",[],[[]]], ["_removeModes",[],[[]]]]; +private ["_newModes","_currentModes"]; + +_currentModes = GVAR(availableVisions); + +// Restrict additions to only possible values +_newModes = _addModes arrayIntersect [-2,-1,0,1,2,3,4,5,6,7]; +_newModes append (_currentModes - _removeModes); + +_newModes = _newModes arrayIntersect _newModes; +_newModes sort true; + +// Can't become an empty array +if (_newModes isEqualTo []) then { + ["Cannot remove all vision modes (%1)", QFUNC(updateVisionModes)] call BIS_fnc_error; +} else { + GVAR(availableVisions) = _newModes; +}; + +// Update camera in case of change +if !(isNil QGVAR(camera)) then { + [] call FUNC(transitionCamera); +}; + +_newModes diff --git a/addons/spectator/functions/script_component.hpp b/addons/spectator/functions/script_component.hpp new file mode 100644 index 0000000000..d5034cb39c --- /dev/null +++ b/addons/spectator/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\spectator\script_component.hpp" \ No newline at end of file diff --git a/addons/spectator/script_component.hpp b/addons/spectator/script_component.hpp new file mode 100644 index 0000000000..de2ee22363 --- /dev/null +++ b/addons/spectator/script_component.hpp @@ -0,0 +1,57 @@ +#define COMPONENT spectator +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_SPECTATOR + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_SPECTATOR + #define DEBUG_SETTINGS DEBUG_SETTINGS_SPECTATOR +#endif + +#include "\z\ace\addons\main\script_macros.hpp" + +// UI grid +#define SIZEX ((safezoneW / safezoneH) min 1.2) +#define SIZEY (SIZEX / 1.2) +#define W_PART(num) (num * (SIZEX / 40)) +#define H_PART(num) (num * (SIZEY / 25)) +#define X_PART(num) (W_PART(num) + (safezoneX + (safezoneW - SIZEX)/2)) +#define Y_PART(num) (H_PART(num) + (safezoneY + (safezoneH - SIZEY)/2)) + +// UI tools +#define TOOL_H H_PART(1) +#define TOOL_W W_PART(5) +#define MARGIN TOOL_W * 0.05 + +// UI compass +#define COMPASS_W (TOOL_W * 4) +#define COMPASS_X (safeZoneX + safeZoneW * 0.5 - COMPASS_W * 0.5) + +// UI IDCs +#define IDC_COMP 4490 +#define IDC_COMP_0 5000 +#define IDC_COMP_90 5090 +#define IDC_COMP_180 5180 +#define IDC_COMP_270 5270 + +#define IDC_HELP 7631 +#define IDC_HELP_LIST 7622 + +#define IDC_MAP 6791 + +#define IDC_TOOL 3000 +#define IDC_TOOL_CLOCK 3003 +#define IDC_TOOL_FOV 3005 +#define IDC_TOOL_NAME 3001 +#define IDC_TOOL_SPEED 3006 +#define IDC_TOOL_VIEW 3002 +#define IDC_TOOL_VISION 3004 + +#define IDC_UNIT 6002 +#define IDC_UNIT_TREE 6005 + +// UI colours +#define COL_BACK 0.1,0.1,0.1,0.7 +#define COL_FORE 1,1,1,1 +#define COL_FORE_D 0.1,0.1,0.1,0.8 diff --git a/addons/spectator/stringtable.xml b/addons/spectator/stringtable.xml new file mode 100644 index 0000000000..5c24224b72 --- /dev/null +++ b/addons/spectator/stringtable.xml @@ -0,0 +1,271 @@ + + + + + Spectator Settings + Ustawienia obserwatora + + + Configure how the spectator system will operate by default. + Skonfiguruj domyślne ustawienia obserwatora. + + + Unit filter + Filtr jednostek + + + Method of filtering spectatable units. + Wybierz jednostki, jakie będzie można obserwować po uruchomeniu obserwatora. + + + No units + Brak jednostek + + + Only players + Tylko gracze + + + Playable Units + Grywalne jednostki + + + All units + Wszystkie jednostki + + + Side filter + Filtr stron + + + Method of filtering spectatable sides. + Wybierz strony, jakie będzie można obserwować po uruchomeniu obserwatora. + + + Player side + Strona gracza + + + Friendly sides + Strony sojusznicze + + + Hostile sides + Strony wrogie + + + All sides + Wszystkie strony + + + Camera modes + Tryby kamery + + + Camera modes that can be used. + Tryby kamery, jakie mogą być używane. + + + All + Wszystkie + + + Free only + Tylko wolna + + + Internal only + Tylko wewnętrzna + + + External only + Tylko zewnętrzna + + + Internal and external + Wewnętrzna i zewnętrzna + + + Vision modes + Tryby wizji + + + Vision modes that can be used. + Tryby wizji, jakie mogą być używane. + + + Night vision + Noktowizja + + + Thermal imaging + Termowizja + + + + Spectator Units + Jednostki obserwatora + + + Spectator Controls + Sterowanie obserwatorem + + + Free + Wolna + + + Internal + Wewnętrzna + + + External + Zewnętrzna + + + Normal + Normalna + + + Night + Noc + + + Thermal + Termo + + + + Free Camera + Kamera swobodna + + + Camera Forward + Kamera naprzód + + + Camera Backward + Kamera w tył + + + Camera Left + Kamera w lewo + + + Camera Right + Kamera w prawo + + + Camera Up + Kamera w górę + + + Camera Down + Kamera w dół + + + Pan Camera + Panoramowanie + + + Dolly Camera + Płynna kamera + + + Lock Camera to Target + Zablokuj kamerę na celu + + + Speed Boost + Przyśpieszenie kamery + + + Focus on Unit + Skup na jednostce + + + Interface + Interfejs + + + Toggle Interface + Przełącz interfejs + + + Toggle Unit Icons + Przełącz ikony jednostek + + + Toggle Unit List + Przełącz listę jednostek + + + Toggle Toolbar + Przełącz pasek narzędzi + + + Toggle Compass + Przełącz kompas + + + Toggle Map + Przełącz mapę + + + Toggle Help + Przełącz pomoc + + + Camera Attributes + Atrybuty kamery + + + Next Camera + Następna kamera + + + Previous Camera + Poprzednia kamera + + + Next Unit + Następna jednostka + + + Previous Unit + Poprzednia jednostka + + + Next Vision Mode + Następny tryb wizji + + + Previous Vision Mode + Poprzedni tryb wizji + + + Adjust Zoom + Reguluj zoom + + + Adjust Speed + Reguluj prędkość + + + Increment Zoom + Reguluj zoom (krok) + + + Increment Speed + Reguluj prędkość (krok) + + + Reset Zoom + Resetuj zoom + + + Reset Speed + Resetuj prędkość + + + diff --git a/addons/spottingscope/README.md b/addons/spottingscope/README.md index ea9f2b819d..a07b9c6c85 100644 --- a/addons/spottingscope/README.md +++ b/addons/spottingscope/README.md @@ -3,8 +3,9 @@ ace_spottingscope Adds a spotting scope. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/switchunits/functions/fnc_addMapFunction.sqf b/addons/switchunits/functions/fnc_addMapFunction.sqf index 7204e73d36..3a7b20601c 100644 --- a/addons/switchunits/functions/fnc_addMapFunction.sqf +++ b/addons/switchunits/functions/fnc_addMapFunction.sqf @@ -10,19 +10,18 @@ * None * * Example: - * [_unit, _sides] call FUNC(addMapFunction) + * [_unit, _sides] call ace_switchunits_fnc_addMapFunction * * Public: No */ - #include "script_component.hpp" -PARAMS_2(_unit,_sides); +params ["_unit", "_sides"]; ["theMapClick", "onMapSingleClick", { // IGNORE_PRIVATE_WARNING(_pos,_shift,_alt) if (alive ACE_player && {GVAR(OriginalUnit) getVariable ["ACE_CanSwitchUnits", false]}) then { [_this, _pos, _shift, _alt] call FUNC(handleMapClick); }; - + }, [_unit, _sides]] call BIS_fnc_addStackedEventHandler; diff --git a/addons/switchunits/functions/fnc_handleMapClick.sqf b/addons/switchunits/functions/fnc_handleMapClick.sqf index e8efa2640f..03a94f81af 100644 --- a/addons/switchunits/functions/fnc_handleMapClick.sqf +++ b/addons/switchunits/functions/fnc_handleMapClick.sqf @@ -3,24 +3,25 @@ * Switches to a unit close to a clicked map position * * Arguments: - * 0: unit - * 1: sides > + * 0: Faction + * 0: unit + * 1: sides + * 1: Map Position * * Return Value: * None * * Example: - * [unit, _sides] call FUNC(handleMapClick) + * [[unit, _sides], [20, 30]] call ace_switchunits_fnc_handleMapClick * * Public: No */ - #include "script_component.hpp" -private ["_sides", "_pos", "_sideNearest"]; +private ["_sideNearest"]; -_sides = (_this select 0) select 1; -_pos = _this select 1; +params ["_faction", "_pos"]; +_faction params ["", "_sides"]; _sideNearest = []; @@ -28,7 +29,8 @@ _sideNearest = []; if ([_x] call FUNC(isValidAi) && (side group _x in _sides)) then { _sideNearest pushBack _x; }; -} forEach (nearestObjects [_pos, ["Man"], 15]); + nil +} count (nearestObjects [_pos, ["Man"], 15]); if (count _sideNearest > 0) then { [_sideNearest select 0] call FUNC(switchUnit); diff --git a/addons/switchunits/functions/fnc_initPlayer.sqf b/addons/switchunits/functions/fnc_initPlayer.sqf index 67669c071c..80388a9d2b 100644 --- a/addons/switchunits/functions/fnc_initPlayer.sqf +++ b/addons/switchunits/functions/fnc_initPlayer.sqf @@ -10,24 +10,21 @@ * None * * Example: - * [player, [west]] call FUNC(initPlayer) + * [player, [west]] call ace_switchunits_fnc_initPlayer * * Public: No */ - #include "script_component.hpp" -PARAMS_2(_playerUnit,_sides); +params ["_playerUnit", "_sides"]; if (vehicle _playerUnit == _playerUnit) then { - [_sides] call FUNC(markAiOnMap); _playerUnit setVariable [QGVAR(IsPlayerUnit), true]; _playerUnit allowDamage false; GVAR(OriginalUnit) = _playerUnit; - //GVAR(OriginalName) = [_playerUnit] call EFUNC(common,getName); GVAR(OriginalName) = name _playerUnit; GVAR(OriginalGroup) = group _playerUnit; diff --git a/addons/switchunits/functions/fnc_isValidAi.sqf b/addons/switchunits/functions/fnc_isValidAi.sqf index 61c2401da9..0b6a35c257 100644 --- a/addons/switchunits/functions/fnc_isValidAi.sqf +++ b/addons/switchunits/functions/fnc_isValidAi.sqf @@ -6,22 +6,19 @@ * 0: unit * * Return Value: - * Boolean + * Valid AI * * Example: - * [_unit] call FUNC(isValidAi) + * [_unit] call ace_switchunits_fnc_isValidAi * * Public: Yes */ - #include "script_component.hpp" -private "_unit"; - -_unit = _this select 0; +params ["_unit"]; !([_unit] call EFUNC(common,isPlayer) || {_unit in playableUnits} -|| {vehicle _unit != _unit} -|| {_unit getVariable [QGVAR(IsPlayerUnit), false]} -|| {_unit getVariable [QGVAR(IsPlayerControlled), false]}) +|| {vehicle _unit != _unit} +|| {_unit getVariable [QGVAR(IsPlayerUnit), false]} +|| {_unit getVariable [QGVAR(IsPlayerControlled), false]}) // return diff --git a/addons/switchunits/functions/fnc_markAiOnMap.sqf b/addons/switchunits/functions/fnc_markAiOnMap.sqf index 620b805cb9..db43c58f43 100644 --- a/addons/switchunits/functions/fnc_markAiOnMap.sqf +++ b/addons/switchunits/functions/fnc_markAiOnMap.sqf @@ -1,7 +1,7 @@ /* * Author: bux578 * Creates markers for AI units for given sides. - * Marks players in a different colour. + * Marks players in a different colour. * * Arguments: * 0: side @@ -10,28 +10,24 @@ * None * * Example: - * [[west, east]] call FUNC(markAiOnMap) + * [[west, east]] call ace_switchunits_fnc_markAiOnMap * * Public: No */ - #include "script_component.hpp" -private "_sidesToShow"; -_sidesToShow = _this select 0; +params ["_sidesToShow"]; GVAR(AllMarkerNames) = []; -DFUNC(pfhMarkAiOnMap) = { - private ["_args", "_sides"]; - _args = _this select 0; - _sides = _args select 0; - +[{ + params ["_args"]; + _args params ["_sides"]; // delete markers { - deleteMarkerLocal _x; - } forEach GVAR(AllMarkerNames); + deleteMarkerLocal _x; + } count GVAR(AllMarkerNames); // reset the array GVAR(AllMarkerNames) = []; @@ -48,7 +44,7 @@ DFUNC(pfhMarkAiOnMap) = { _marker = createMarkerLocal [_markerName, position _x]; _markerName setMarkerTypeLocal "mil_triangle"; _markerName setMarkerShapeLocal "ICON"; - _markerName setMarkerSizeLocal [0.5,0.7]; + _markerName setMarkerSizeLocal [0.5, 0.7]; _markerName setMarkerDirLocal getDir _x; // commy's one liner magic @@ -63,9 +59,8 @@ DFUNC(pfhMarkAiOnMap) = { }; GVAR(AllMarkerNames) pushBack _markerName; + nil }; - } forEach allUnits; + } count allUnits; }; -}; - -[FUNC(pfhMarkAiOnMap), 1.5, [_sidesToShow]] call CBA_fnc_addPerFrameHandler; +}, 1.5, [_sidesToShow]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/switchunits/functions/fnc_module.sqf b/addons/switchunits/functions/fnc_module.sqf index 9563dea71f..ec9164a866 100644 --- a/addons/switchunits/functions/fnc_module.sqf +++ b/addons/switchunits/functions/fnc_module.sqf @@ -15,12 +15,11 @@ * * Public: No */ - #include "script_component.hpp" if !(isServer) exitWith {}; -EXPLODE_3_PVT(_this,_logic,_units,_activated); +params ["_logic", "_units", "_activated"]; if !(_activated) exitWith {}; diff --git a/addons/switchunits/functions/fnc_nearestPlayers.sqf b/addons/switchunits/functions/fnc_nearestPlayers.sqf index 987c4e3528..64e347d7da 100644 --- a/addons/switchunits/functions/fnc_nearestPlayers.sqf +++ b/addons/switchunits/functions/fnc_nearestPlayers.sqf @@ -10,7 +10,7 @@ * Player units > * * Example: - * [[300,300,0], 100] call FUNC(nearestPlayers) + * [[300,300,0], 100] call ace_switchunits_fnc_nearestPlayers * * Public: Yes */ @@ -18,10 +18,7 @@ private ["_nearestPlayers"]; -PARAMS_2(_position,_radius); - -_position = _this select 0; -_radius = _this select 1; +params ["_position", "_radius"]; _nearestPlayers = []; diff --git a/addons/switchunits/functions/fnc_startSwitchUnits.sqf b/addons/switchunits/functions/fnc_startSwitchUnits.sqf index 7985bfa094..481b04d2cd 100644 --- a/addons/switchunits/functions/fnc_startSwitchUnits.sqf +++ b/addons/switchunits/functions/fnc_startSwitchUnits.sqf @@ -9,14 +9,14 @@ * None * * Example: - * [_player] call FUNC(startSwitchUnits) + * [_player] call ace_switchunits_fnc_startSwitchUnits * * Public: No */ #include "script_component.hpp" -PARAMS_1(_player); +params ["_player"]; if (GVAR(EnableSwitchUnits)) then { private "_sides"; diff --git a/addons/switchunits/functions/fnc_switchBack.sqf b/addons/switchunits/functions/fnc_switchBack.sqf index c9ca731427..c3cb99588a 100644 --- a/addons/switchunits/functions/fnc_switchBack.sqf +++ b/addons/switchunits/functions/fnc_switchBack.sqf @@ -10,20 +10,19 @@ * None * * Example: - * [_originalPlayerUnit, _currentUnit] call FUNC(switchBack) + * [_originalPlayerUnit, _currentUnit] call ace_switchunits_fnc_switchBack * * Public: Yes */ - #include "script_component.hpp" -PARAMS_1(_originalPlayerUnit); +params ["_originalPlayerUnit"]; [_originalPlayerUnit] joinSilent GVAR(OriginalGroup); -DFUNC(pfhSwitchBack) = { - PARAMS_2(_args,_pfID); - EXPLODE_2_PVT(_args,_originalPlayerUnit,_currentUnit); +[{ + params ["_args", "_pfhId"]; + _args params ["_originalPlayerUnit", "_currentUnit"]; if (local _originalPlayerUnit) exitWith { selectPlayer _originalPlayerUnit; @@ -33,8 +32,6 @@ DFUNC(pfhSwitchBack) = { _layer = "BIS_fnc_respawnCounter" call bis_fnc_rscLayer; _layer cuttext ["","plain"]; - [(_this select 1)] call cba_fnc_removePerFrameHandler; + [_pfhId] call cba_fnc_removePerFrameHandler; }; -}; - -[FUNC(pfhSwitchBack), 0.2, _this] call CBA_fnc_addPerFrameHandler; +}, 0.2, _this] call CBA_fnc_addPerFrameHandler; diff --git a/addons/switchunits/functions/fnc_switchUnit.sqf b/addons/switchunits/functions/fnc_switchUnit.sqf index c57012afdb..793e72bb71 100644 --- a/addons/switchunits/functions/fnc_switchUnit.sqf +++ b/addons/switchunits/functions/fnc_switchUnit.sqf @@ -3,24 +3,21 @@ * Switches to the new given player unit * * Arguments: - * 0: current unit - * 1: the unit to switch to + * 0: the unit to switch to * * Return Value: * None * * Example: - * [_unit] call FUNC(switchUnit) + * [_unit] call ace_switchunits_fnc_switchUnit * * Public: Yes */ - - #include "script_component.hpp" private ["_nearestEnemyPlayers", "_allNearestPlayers", "_oldUnit", "_leave"]; -PARAMS_1(_unit); +params ["_unit"]; // don't switch to original player units if (!([_unit] call FUNC(isValidAi))) exitWith {}; @@ -29,14 +26,12 @@ if (!([_unit] call FUNC(isValidAi))) exitWith {}; _leave = false; if (GVAR(EnableSafeZone)) then { - _allNearestPlayers = [position _unit, GVAR(SafeZoneRadius)] call FUNC(nearestPlayers); _nearestEnemyPlayers = [_allNearestPlayers, {((side GVAR(OriginalGroup)) getFriend (side _this) < 0.6) && !(_this getVariable [QGVAR(IsPlayerControlled), false])}] call EFUNC(common,filter); if (count _nearestEnemyPlayers > 0) exitWith { _leave = true; }; - }; // exitWith doesn't exit past the "if(EnableSafeZone)" block @@ -49,21 +44,12 @@ if (_leave) exitWith { //[_unit] joinSilent group player; [[_unit, player], QUOTE({(_this select 0) setVariable [ARR_3(QUOTE(QGVAR(OriginalOwner)), owner (_this select 0), true)]; (_this select 0) setOwner owner (_this select 1)}), 1] call EFUNC(common,execRemoteFnc); -_oldUnit = player; - - -DFUNC(pfhSwitchUnit) = { - - private ["_args", "_unit", "_oldUnit", "_respawnEhId", "_oldOwner"]; - _args = _this select 0; - - _unit = _args select 0; - _oldUnit = _args select 1; - - +[{ + private ["_respawnEhId", "_oldOwner"]; + params ["_args", "_pfhId"]; + _args params ["_unit", "_oldUnit"]; if (local _unit) exitWith { - _oldUnit setVariable [QGVAR(IsPlayerControlled), false, true]; _oldUnit setVariable [QGVAR(PlayerControlledName), "", true]; @@ -90,9 +76,6 @@ DFUNC(pfhSwitchUnit) = { [localize LSTRING(SwitchedUnit)] call EFUNC(common,displayTextStructured); - [(_this select 1)] call cba_fnc_removePerFrameHandler; - + [_pfhId] call cba_fnc_removePerFrameHandler; }; -}; - -[FUNC(pfhSwitchUnit), 0.2, [_unit, _oldUnit]] call CBA_fnc_addPerFrameHandler; +}, 0.2, [_unit, player]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/tacticalladder/README.md b/addons/tacticalladder/README.md index ff6b8ecad3..c4b84b1613 100644 --- a/addons/tacticalladder/README.md +++ b/addons/tacticalladder/README.md @@ -3,8 +3,9 @@ ace_tacticalladder Adds a packable tactical ladder. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/tacticalladder/data/ace_tacticalladder.p3d b/addons/tacticalladder/data/ace_tacticalladder.p3d index a331f24084..7bb924ff46 100644 Binary files a/addons/tacticalladder/data/ace_tacticalladder.p3d and b/addons/tacticalladder/data/ace_tacticalladder.p3d differ diff --git a/addons/tacticalladder/data/ace_tacticalladder_pack.p3d b/addons/tacticalladder/data/ace_tacticalladder_pack.p3d index e7b565ff11..5373648426 100644 Binary files a/addons/tacticalladder/data/ace_tacticalladder_pack.p3d and b/addons/tacticalladder/data/ace_tacticalladder_pack.p3d differ diff --git a/addons/tacticalladder/data/model.cfg b/addons/tacticalladder/data/model.cfg index 1fc8840d4f..ba19d58c65 100644 --- a/addons/tacticalladder/data/model.cfg +++ b/addons/tacticalladder/data/model.cfg @@ -1,4 +1,4 @@ -class CfgSkeletons { +class CfgSkeletons { class Default { isDiscrete = 1; skeletonInherit = ""; @@ -21,7 +21,7 @@ class CfgSkeletons { "10","9", "11","10", "step","11" - }; + }; }; class OFP2_ManSkeleton { isDiscrete = 0; @@ -180,7 +180,7 @@ class CfgModels { class ace_tacticalladder { skeletonName = "ace_tacticalladder_skeleton"; sections[] = { "roadway" }; - sectionsInherit = ""; + sectionsInherit = ""; class Animations { class rotate { type = "rotation"; @@ -192,7 +192,7 @@ class CfgModels { maxValue = 90; angle0="rad 0"; angle1="rad +90"; - }; + }; class extract_1 { type = "translation"; source = ""; @@ -280,4 +280,4 @@ class CfgModels { }; class ace_tacticalladder_pack: ArmaMan { }; -}; \ No newline at end of file +}; diff --git a/addons/testmissions/README.md b/addons/testmissions/README.md new file mode 100644 index 0000000000..e8737f0ab6 --- /dev/null +++ b/addons/testmissions/README.md @@ -0,0 +1,11 @@ +ace_testmissions +=========== + +Provides test missions. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- None diff --git a/addons/tripod/README.md b/addons/tripod/README.md index 1f4282f1ab..beb6791b6d 100644 --- a/addons/tripod/README.md +++ b/addons/tripod/README.md @@ -3,8 +3,9 @@ ace_tripod Adds a packable tripod. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/ui/README.md b/addons/ui/README.md index f11027038f..c16d2c04e5 100644 --- a/addons/ui/README.md +++ b/addons/ui/README.md @@ -1,9 +1,11 @@ ace_ui ======= -Changes the chat contrast on the map to allow easier reading +Changes the chat contrast on the map to allow easier reading. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. +- [VKing](https://github.com/VKing6) diff --git a/addons/ui/config.cpp b/addons/ui/config.cpp index e7ea4b32eb..d2f4d114e4 100644 --- a/addons/ui/config.cpp +++ b/addons/ui/config.cpp @@ -7,7 +7,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; author[] = {"VKing"}; - authorUrl = "https://github.com/ACEMod/"; + authorUrl = "http://ace3mod.com/"; VERSION_CONFIG; }; }; diff --git a/addons/vehiclelock/readme.md b/addons/vehiclelock/README.md similarity index 76% rename from addons/vehiclelock/readme.md rename to addons/vehiclelock/README.md index 64ae01a99c..c31402c6e3 100644 --- a/addons/vehiclelock/readme.md +++ b/addons/vehiclelock/README.md @@ -5,11 +5,10 @@ Adds keys as an item, to lock and unlock vehicles. Primary target would be role play or TVT, but has uses in all game types, even co-ops (e.g.: DAC AI will steal unlocked vehicles) Two key modes (can be used together): -* Simple Side based keys (e.g. "ACE_key_west" works on any [WEST] vehicle like the M-ATV//hunter) -* Custom keys (one key will only open a specific vehicle and nothing else) +- Simple Side based keys (e.g. "ACE_key_west" works on any [WEST] vehicle like the M-ATV//hunter) +- Custom keys (one key will only open a specific vehicle and nothing else) #### Items Added: - `ACE_key_lockpick` `ACE_key_master` `ACE_key_west` @@ -20,19 +19,21 @@ Two key modes (can be used together): #### Magazine added: `ACE_key_customKeyMagazine` (should never be manualy added, needs to be "programed" to work on a vehicle, see `ACE_VehicleLock_fnc_addKeyForVehicle`) + ## For Mission Makers: #### Modules: -* Vehicle Lock Setup - Settings for locking inventory of locked vehicles, default lockpick time, and initial vehicle lock state. -* Vehicle Key Assign - Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Will NOT work for JIP units. +- Vehicle Lock Setup - Settings for locking inventory of locked vehicles, default lockpick time, and initial vehicle lock state. +- Vehicle Key Assign - Sync with vehicles and players. Will handout custom keys to players for every synced vehicle. Will NOT work for JIP units. #### Vehicle setVariables: -* `ACE_VehicleLock_lockSide` - SIDE: overrides a vehicle's side, allows indfor to use little-bird's with indp keys -* `ACE_vehicleLock_lockpickStrength` - NUMBER: secons, determines how long lockpicking with take, overrides ACE_VehicleLock_DefaultLockpickStrength +- `ACE_VehicleLock_lockSide` - SIDE: overrides a vehicle's side, allows indfor to use little-bird's with indp keys +- `ACE_vehicleLock_lockpickStrength` - NUMBER: secons, determines how long lockpicking with take, overrides ACE_VehicleLock_DefaultLockpickStrength #### Public Functions: `[bob, car1, true] call ACE_VehicleLock_fnc_addKeyForVehicle;` - will add a `ACE_key_customKeyMagazine` to bob and program it to work on car1 + ## Maintainers The people responsible for merging changes to this component or answering potential questions. diff --git a/addons/viewdistance/README.md b/addons/viewdistance/README.md new file mode 100644 index 0000000000..67860b1ad0 --- /dev/null +++ b/addons/viewdistance/README.md @@ -0,0 +1,11 @@ +ace_viewdistance +=========== + +Adds various View Distance settings and allows limiting maximum view distance that can be set by players. + + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [Winter](https://github.com/Winter259) diff --git a/addons/viewdistance/XEH_postInit.sqf b/addons/viewdistance/XEH_postInit.sqf index 865e5527e5..a30befaa81 100644 --- a/addons/viewdistance/XEH_postInit.sqf +++ b/addons/viewdistance/XEH_postInit.sqf @@ -5,17 +5,10 @@ if (!hasInterface) exitWith {}; ["SettingsInitialized", { // if not enabled, then bugger off. if !(GVAR(enabled)) exitWith {}; - - // Force the view distance down to the limit. - if (viewDistance > GVAR(limitViewDistance)) then { - setViewDistance GVAR(limitViewDistance); - }; - - // Adapt view distance when the player is created or changed according to whether client is on foot or vehicle. - ["playerChanged",{ - [false] call FUNC(adaptViewDistance); - }] call EFUNC(common,addEventHandler); - + + // Limit on load + [false] call FUNC(adaptViewDistance); + // Set the EH which waits for any of the view distance settings to be changed, so that the effect is show immediately ["SettingChanged",{ if ((_this select 0 == QGVAR(viewDistanceOnFoot)) || @@ -28,7 +21,8 @@ if (!hasInterface) exitWith {}; }] call EFUNC(common,addEventHandler); // Set the EH which waits for a vehicle change to automatically swap between On Foot/In Land Vehicle/In Air Vehicle + // Also run when SettingsInitialized runs (not guaranteed) ["playerVehicleChanged",{ [false] call FUNC(adaptViewDistance) }] call EFUNC(common,addEventHandler); -}] call EFUNC(common,addEventHandler); \ No newline at end of file +}] call EFUNC(common,addEventHandler); diff --git a/addons/viewdistance/functions/fnc_changeViewDistance.sqf b/addons/viewdistance/functions/fnc_changeViewDistance.sqf index 34a3f5ba46..30dc4f8144 100644 --- a/addons/viewdistance/functions/fnc_changeViewDistance.sqf +++ b/addons/viewdistance/functions/fnc_changeViewDistance.sqf @@ -26,6 +26,7 @@ _new_view_distance = [_index_requested] call FUNC(returnValue); // changes the s _object_view_distance_coeff = [GVAR(objectViewDistanceCoeff)] call FUNC(returnObjectCoeff); // changes the setting index into a coefficient. _view_distance_limit = GVAR(limitViewDistance); // Grab the limit +TRACE_2("Limit",_new_view_distance,_view_distance_limit); setViewDistance (_new_view_distance min _view_distance_limit); if (_object_view_distance_coeff > 0) then { diff --git a/addons/viewdistance/functions/fnc_initModule.sqf b/addons/viewdistance/functions/fnc_initModule.sqf index 26072e5b5f..912242f373 100644 --- a/addons/viewdistance/functions/fnc_initModule.sqf +++ b/addons/viewdistance/functions/fnc_initModule.sqf @@ -26,4 +26,4 @@ if (!_activated) exitWith { [_logic, QGVAR(enabled),"moduleViewDistanceEnabled"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(limitViewDistance),"moduleViewDistanceLimit"] call EFUNC(common,readSettingFromModule); -diag_log format ["[ACE]: View Distance Limit Module Initialized. Limit set by module: %1",GVAR(limitViewDistance)]; \ No newline at end of file +diag_log format ["[ACE]: View Distance Limit Module Initialized. Limit set by module: %1",GVAR(limitViewDistance)]; diff --git a/addons/viewdistance/functions/fnc_returnValue.sqf b/addons/viewdistance/functions/fnc_returnValue.sqf index d374d69d60..7e0c41f1be 100644 --- a/addons/viewdistance/functions/fnc_returnValue.sqf +++ b/addons/viewdistance/functions/fnc_returnValue.sqf @@ -22,7 +22,7 @@ private ["_return"]; params ["_index"]; _return = switch (_index) do { - case 0: {-1}; + case 0: {viewDistance}; // Video Settings option case 1: {500}; case 2: {1000}; case 3: {1500}; @@ -40,4 +40,5 @@ _return = switch (_index) do { default {1000}; }; -_return; +TRACE_1("VD Index Return",_return); +_return diff --git a/addons/weather/README.md b/addons/weather/README.md index a2b719fc11..da83f62fd2 100644 --- a/addons/weather/README.md +++ b/addons/weather/README.md @@ -4,6 +4,7 @@ ace_weather This module simulates realistic weather effects, according to the geographical location of the map, the date and time. It also ensures that all players experience the same weather effects. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. diff --git a/addons/winddeflection/README.md b/addons/winddeflection/README.md index c2908a6f85..926b957715 100644 --- a/addons/winddeflection/README.md +++ b/addons/winddeflection/README.md @@ -3,9 +3,10 @@ ace_winddeflection Wind deflection for projectiles/bullets. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. - [Glowbal](https://github.com/Glowbal) -- [Ruthberg] (http://github.com/Ulteq) \ No newline at end of file +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/winddeflection/config.cpp b/addons/winddeflection/config.cpp index 82a51a4b73..df2b55d221 100644 --- a/addons/winddeflection/config.cpp +++ b/addons/winddeflection/config.cpp @@ -8,7 +8,7 @@ class CfgPatches { requiredAddons[] = {"ace_weather"}; versionDesc = "ACE Wind Deflection"; author[] = {ECSTRING(common,ACETeam), "Glowbal", "Ruthberg"}; - authorUrl = "http://csemod.com"; + authorUrl = "http://ace3mod.com/"; VERSION_CONFIG; }; }; @@ -23,4 +23,4 @@ class CfgAddons { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" -#include "ACE_Settings.hpp" \ No newline at end of file +#include "ACE_Settings.hpp" diff --git a/addons/yardage450/README.md b/addons/yardage450/README.md index 6301233fe4..991c4f8a22 100644 --- a/addons/yardage450/README.md +++ b/addons/yardage450/README.md @@ -3,8 +3,9 @@ ace_yardage450 Adds the Bushnell Yardage Pro Sport 450 Laser Rangefinder. + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [Ruthberg] (http://github.com/Ulteq) +- [Ruthberg](http://github.com/Ulteq) diff --git a/addons/zeus/ACE_Settings.hpp b/addons/zeus/ACE_Settings.hpp index 388e3c42cb..6488a23e4e 100644 --- a/addons/zeus/ACE_Settings.hpp +++ b/addons/zeus/ACE_Settings.hpp @@ -20,4 +20,10 @@ class ACE_Settings { value = 0; values[] = {"$STR_A3_OPTIONS_DISABLED", CSTRING(revealMines_partial), CSTRING(revealMines_full)}; }; + class GVAR(autoAddObjects) { + displayName = CSTRING(AddObjectsToCurator); + description = CSTRING(AddObjectsToCurator_desc); + value = 0; + typeName = "BOOL"; + }; }; diff --git a/addons/zeus/CfgEventHandlers.hpp b/addons/zeus/CfgEventHandlers.hpp index f0a9f14d91..57d6a1afd0 100644 --- a/addons/zeus/CfgEventHandlers.hpp +++ b/addons/zeus/CfgEventHandlers.hpp @@ -4,3 +4,11 @@ class Extended_PreInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; + +class Extended_InitPost_EventHandlers { + class AllVehicles { + class ADDON { + serverInit = QUOTE(call FUNC(addObjectToCurator)); + }; + }; +}; diff --git a/addons/zeus/README.md b/addons/zeus/README.md index b99edb66bb..35e7da1cdd 100644 --- a/addons/zeus/README.md +++ b/addons/zeus/README.md @@ -1,15 +1,16 @@ ace_zeus ========== -Provides control over various aspects of zeus: +Provides control over various aspects of Zeus: - Ascension messages - Eagle - Wind sounds - Ordnance radio messages - Mine markers + ## Maintainers The people responsible for merging changes to this component or answering potential questions. -- [SilentSpike] (http://github.com/SilentSpike) +- [SilentSpike](http://github.com/SilentSpike) diff --git a/addons/zeus/XEH_preInit.sqf b/addons/zeus/XEH_preInit.sqf index 3817db218f..5aee98c3f3 100644 --- a/addons/zeus/XEH_preInit.sqf +++ b/addons/zeus/XEH_preInit.sqf @@ -2,6 +2,7 @@ ADDON = false; +PREP(addObjectToCurator); PREP(bi_moduleCurator); PREP(bi_moduleMine); PREP(bi_moduleProjectile); diff --git a/addons/zeus/functions/fnc_addObjectToCurator.sqf b/addons/zeus/functions/fnc_addObjectToCurator.sqf new file mode 100644 index 0000000000..be814266ab --- /dev/null +++ b/addons/zeus/functions/fnc_addObjectToCurator.sqf @@ -0,0 +1,24 @@ +/* + * Author: Glowbal + * Adds an object to curator upon spawn + * + * Arguments: + * Object + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +if (!isServer) exitwith {}; + +params ["_object"]; + +if (!(_object getvariable [QGVAR(addObject), GVAR(autoAddObjects)])) exitwith {}; + +{ + _x addCuratorEditableObjects [[_object], true]; +}foreach allCurators; diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index fd1c978188..42bf72d3d1 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -139,12 +139,15 @@ Assign Medic + Przydziel medyka Assign Medical Vehicle + Przydziel pojazd medyczny Assign Medical Facility + Przydziel budynek medyczny Unit must be alive @@ -172,9 +175,11 @@ Unit must be a structure + Jednostka musi być budynkiem Unit must be a vehicle + Jednostka musi być pojazdem Unit must not be captive @@ -204,5 +209,13 @@ Benötigt ein Addon, das nicht vorhanden ist Requer um addon que não está presente + + Add Objects to Curator + Dodaj obiekt do kuratora + + + Adds any spawned object to all curators in the mission + Dodaje każdy zespawnowany obiekt do wszystkich kuratorów podczas misji + - + \ No newline at end of file diff --git a/documentation/README_DE.md b/documentation/README_DE.md index 0b5ca4d0ef..23d54f9e35 100644 --- a/documentation/README_DE.md +++ b/documentation/README_DE.md @@ -1,48 +1,53 @@

- +

- ACE version + ACE3 Version - - ACE download + + ACE3 Download - ACE issues + ACE3 Issues + + + BIF Thread - ACE license + ACE3 License

-

Benötigt eine Aktuelle Version von CBA A3 | BIF thread

+

Benötigt die aktuellste Version von CBA A3. Besucht uns auf Facebook | YouTube | Twitter | Reddit

**ACE3** ist ein Gemeinschaftsprojekt der sich zusammengeschlossenen Moddinggruppen von **ACE2**, **AGM** und **CSE** mit dem Ziel den Realismus und die Spieltiefe von Arma 3 zu steigern. Da die MOD vollkommen als **open-source** Projekt gestaltet ist, steht es jedem frei Änderungen vorzuschlagen, oder seine eigene, modifizierte Version zu erstellen, solange diese ebenfalls der Öffentlichkeit zugänglich ist und mit GNU General Public License übereinstimmt. (Weitere Informationen ist der Lizenzdatei in diesem Projekt entnehmbar) -Die Mod ist **modular gestaltet** — beinahe jede PBO kann entfernt werden, sodass jede Gemeinschaft ihre eigene Version der Mod unterhalten kann. Dies kann zum Beispiel einige Funktionalitäten ausschließen, da das Feature nicht gewünscht ist, oder es mit einer anderen MOD in Konflikt gerät etc. .Ebenfalls können viele Einstellungen vom Missionsersteller vorgenommen werden (u.a. am medizinischem System), sodass eine individuelle Erfahrung gewährleistet wird. +Die Mod ist **modular gestaltet** — beinahe jede PBO kann entfernt werden, sodass jede Gemeinschaft ihre eigene Version der Mod unterhalten kann. Dies kann zum Beispiel einige Funktionalitäten ausschließen, da das Feature nicht gewünscht ist, oder es mit einer anderen MOD in Konflikt gerät etc. .Ebenfalls können viele Einstellungen vom Missionsersteller vorgenommen werden (u.a. am medizinischem System), sodass eine individuelle Erfahrung gewährleistet wird. ### Features -* Verbessertes medizinisches System -* Logistik System: U.a. Transport und Fahrzeugreparatur -* Sprengstoffsystem mit unterschiedlichen Zündern -* Gefangenensystem -* Reale Namen für Arma 3 Fahrzeuge und Waffen -* Realistisches, ballistisches Verhalten (Wind und Luftfeuchtigkeit) -* Simulation der Rückstrahlzone -* Ein Feuerleitsystem für gepanzerte Fahrzeuge und Hubschrauber - ***und noch viel mehr...*** +- Verbessertes medizinisches System +- Logistik System: U.a. Transport und Fahrzeugreparatur +- Sprengstoffsystem mit unterschiedlichen Zündern +- Gefangenensystem +- Reale Namen für Arma 3 Fahrzeuge und Waffen +- Realistisches, ballistisches Verhalten (Wind und Luftfeuchtigkeit) +- Simulation der Rückstrahlzone +- Ein Feuerleitsystem für gepanzerte Fahrzeuge und Hubschrauber +***und noch viel mehr...*** #### Anleitungen -Du hast ACE3 installiert, hast aber keine Ahnung was und wie alles funktioniert und wo sich was befindet? [Erste Schritte](https://github.com/acemod/ACE3/blob/master/documentation/user/getting-started.md). +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). #### Mitwirken -Wenn du bei der Entwicklung der MOD mithelfen möchtest, so kannst du dies tun, indem du nach Fehlern Ausschau hältst, oder neue Funktionen vorschlägst. Um etwas beizutragen, "Forke" einfach dieses Archiv (bzw. repository) und erstelle deine "Pull-Request", welche von anderen Entwicklern und Beiträgern überprüft wird. Bitte trage dich dabei in "AUTHORS.txt" mit deinem Nutzernamen und einer gütligen Email-Adresse ein. +Wenn du bei der Entwicklung der MOD mithelfen möchtest, so kannst du dies tun, indem du nach Fehlern Ausschau hältst, oder neue Funktionen vorschlägst. Um etwas beizutragen, "Forke" einfach dieses Archiv (bzw. repository) und erstelle deine "Pull-Request", welche von anderen Entwicklern und Beiträgern überprüft wird. Bitte trage dich dabei in [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) mit deinem Nutzernamen und einer gütligen Email-Adresse ein. -Um einen Fehler oder ein Feature zu melden bzw. ein bereits Bestehendes zu ändern - nutze unseren [Issue Tracker](https://github.com/acemod/ACE3/issues). +Um einen Fehler oder ein Feature zu melden bzw. ein bereits Bestehendes zu ändern - 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 Feature Request erstellen](http://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 einfach die "Master Branch" herunter. Entweder nutzt du Git - wenn die Schritte bekannt sind - oder du lädst es dir direkt über [diesen Link] (https://github.com/acemod/ACE3/archive/master.zip) herunter. - -Wie du deine eigene Entwicklungsumgebung und eine Testversion von ACE erstellst folge [dieser Anleitung](https://github.com/acemod/ACE3/blob/master/documentation/development/setting-up-the-development-environment.md). +Wenn du die neusten Entwicklungen erleben und uns dabei helfen möchtest bestehende Fehler zu entdecken, lade dir einfach 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. +Wie du deine eigene Entwicklungsumgebung und eine Testversion von ACE3 erstellst folge [dieser Anleitung](https://github.com/acemod/ACE3/blob/master/documentation/development/setting-up-the-development-environment.md). diff --git a/documentation/README_PL.md b/documentation/README_PL.md index 4d4c36a619..3fbeb31664 100644 --- a/documentation/README_PL.md +++ b/documentation/README_PL.md @@ -1,83 +1,77 @@

- +

- ACE wersja + ACE3 Wersja - - ACE pobierz + + ACE3 Pobierz - ACE zagadnienia + ACE3 Zagadnienia - - Temat BIF + + Temat BIF - ACE licencja + ACE3 Licencja

-

Wymaga najnowszej wersji CBA A3. Odwiedź nas na Facebook | YouTube | Twitter | Reddit

+

Wymaga najnowszej wersji CBA A3. Odwiedź nas na Facebook | YouTube | Twitter | Reddit

**ACE3** to efekt wspólnego wysiłku grup moderów odpowiedzialnych za **ACE2**, **AGM** oraz **CSE** w celu zwiększenia realizmu i autentyczności Arma 3. Projekt ten jest całkowicie **otwarty źródłowo** i wszelki wkład w rozwój jest mile widziany. Możesz bez przeszkód prowadzić swoją własną dostosowaną wersję, o ile zmiany jakie wprowadzisz będą otwarte dla publiki zgodnie z GNU General Public License ([GPLv2](https://github.com/acemod/ACE3/blob/master/LICENSE)). -Modyfikacja ta jest **budowana modułowo**, dzięki temu prawie każdy dostarczony plik PBO może zostać łatwo usunięty z konfiguracji. Dzięki temu, grupa może prowadzić własną, dostosowaną do siebie, wersję ACE wyłączając elementy, których nie potrzebują, lub które po prostu nie działają z innymi addonami. Moduły same w sobie np. system medyczny, posiadają wiele możliwości konfiguracji, pozwalając mission designerom dostosować ogólne doświadczenie z gry. +Modyfikacja ta jest **budowana modułowo**, dzięki temu prawie każdy dostarczony plik PBO może zostać łatwo usunięty z konfiguracji. Dzięki temu, grupa może prowadzić własną, dostosowaną do siebie, wersję ACE3 wyłączając elementy, których nie potrzebują, lub które po prostu nie działają z innymi addonami. Moduły same w sobie np. system medyczny, posiadają wiele możliwości konfiguracji, pozwalając mission designerom dostosować ogólne doświadczenie z gry. ### Główne cechy -* Całkowicie nowy system akcji/interakcji 3D -* Wydajna i niezawodna struktura -* Skupienie na modułowości i customizacji -* Elastyczny system ustawień i konfiguracji opcji u klienta i serwera -* Ulepszony system medyczny z różnymi stopniami zaawansowania (podstawowy/rozszerzony) skupiony na grywalności i realizmowi -* Prawidłowa i spójna synchronizowana pogoda -* Balistyka oparta na warunkach pogodowych i wietrze -* Możliwość brania jeńców -* Rozszerzony system ładunków wybuchowych, włączając w to użycie różnego rodzaju zapalników -* Ulepszenia mapy - stawianie markerów i przybory mapy -* Zaawansowane naprowadzanie rakiet i wskazywanie laserem +- Całkowicie nowy system akcji/interakcji 3D +- Wydajna i niezawodna struktura +- Skupienie na modułowości i customizacji +- Elastyczny system ustawień i konfiguracji opcji u klienta i serwera +- Ulepszony system medyczny z różnymi stopniami zaawansowania (podstawowy/rozszerzony) skupiony na grywalności i realizmowi +- Prawidłowa i spójna synchronizowana pogoda +- Balistyka oparta na warunkach pogodowych i wietrze +- Możliwość brania jeńców +- Rozszerzony system ładunków wybuchowych, włączając w to użycie różnego rodzaju zapalników +- Ulepszenia mapy - stawianie markerów i przybory mapy +- Zaawansowane naprowadzanie rakiet i wskazywanie laserem #### Dodatkowe cechy -* Przeciąganie i przenoszenie -* Realistyczne nazwy pojazdów i broni -* System kontroli ognia (SKO) dla pojazdów opancerzonych oraz śmigłowców -* Realistyczna balistyka/SKO obliczana w rozszerzeniach C/C++ -* Symulacja strefy backblastu i podciśnienia -* Jednorazowe wyrzutnie -* Realistyczne siły G -* Zamykanie pojazdów na kluczyk -* Realistyczne tryby termowizji oraz noktowizji -* Przepakowywanie magazynków -* Realistyczna mechanika przegrzewania broni -* Symulacja głuchoty bitewnej (tymczasowej utraty słuchu) -* Ulepszona fizyka ragdoll -* Ulepszona interakcja dla asystentów i amunicyjnych -* Regulowane celowniki snajperskie -* Usunięte animacje bezczynności z opuszczoną bronią -* Usunięte głosy awatara gracza -* Skakanie przez przeszkody, wspinanie się na ściany i przecinanie płotów -* Urządzenia Vector, MicroDAGR, Kestrel
+- Przeciąganie i przenoszenie +- Realistyczne nazwy pojazdów i broni +- System kontroli ognia (SKO) dla pojazdów opancerzonych oraz śmigłowców +- Realistyczna balistyka/SKO obliczana w rozszerzeniach C/C++ +- Symulacja strefy backblastu i podciśnienia +- Jednorazowe wyrzutnie +- Realistyczne siły G +- Zamykanie pojazdów na kluczyk +- Realistyczne tryby termowizji oraz noktowizji +- Przepakowywanie magazynków +- Realistyczna mechanika przegrzewania broni +- Symulacja głuchoty bitewnej (tymczasowej utraty słuchu) +- Ulepszona fizyka ragdoll +- Ulepszona interakcja dla asystentów i amunicyjnych +- Regulowane celowniki snajperskie +- Usunięte animacje bezczynności z opuszczoną bronią +- Usunięte głosy awatara gracza +- Skakanie przez przeszkody, wspinanie się na ściany i przecinanie płotów +- Urządzenia Vector, MicroDAGR, Kestrel
***i wiele wiele więcej...*** ### 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](http://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 ACE, 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. +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](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) #### 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ę ACE do celów testowych. +- [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. diff --git a/optionals/compat_asdg/$PBOPREFIX$ b/optionals/compat_asdg/$PBOPREFIX$ deleted file mode 100644 index 0ba5166c16..0000000000 --- a/optionals/compat_asdg/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_asdg \ No newline at end of file diff --git a/optionals/compat_asdg/config.cpp b/optionals/compat_asdg/config.cpp deleted file mode 100644 index 40dae32051..0000000000 --- a/optionals/compat_asdg/config.cpp +++ /dev/null @@ -1,38 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"asdg_jointrails","ace_laserpointer","ace_optics"}; - author[]={"OnkelDisMaster"}; - authorUrl = "http://2.xn--gebirgsjgerkompanie-nwb.de/"; - VERSION_CONFIG; - }; -}; - -class asdg_SlotInfo; -class asdg_FrontSideRail: asdg_SlotInfo { - class compatibleItems { - ACE_acc_pointer_red = 1; - ACE_acc_pointer_green = 1; - ACE_acc_pointer_green_IR = 1; - }; -}; - -class asdg_OpticRail; -class asdg_OpticRail1913: asdg_OpticRail { - class compatibleItems { - ACE_optic_Hamr_2D = 1; - ACE_optic_Hamr_PIP = 1; - ACE_optic_Arco_2D = 1; - ACE_optic_Arco_PIP = 1; - ACE_optic_MRCO_2D = 1; - ACE_optic_MRCO_PIP = 1; - ACE_optic_SOS_2D = 1; - ACE_optic_SOS_PIP = 1; - ACE_optic_LRPS_2D = 1; - ACE_optic_LRPS_PIP = 1; - }; -}; diff --git a/optionals/compat_asdg/script_component.hpp b/optionals/compat_asdg/script_component.hpp deleted file mode 100644 index e67bf3b9e4..0000000000 --- a/optionals/compat_asdg/script_component.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define COMPONENT asdg_comp - -#include "\z\ace\addons\main\script_mod.hpp" - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_bwa3/$PBOPREFIX$ b/optionals/compat_bwa3/$PBOPREFIX$ deleted file mode 100644 index 7331009959..0000000000 --- a/optionals/compat_bwa3/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\compat_bwa3 \ No newline at end of file diff --git a/optionals/compat_bwa3/CfgAmmo.hpp b/optionals/compat_bwa3/CfgAmmo.hpp deleted file mode 100644 index c19e00819a..0000000000 --- a/optionals/compat_bwa3/CfgAmmo.hpp +++ /dev/null @@ -1,142 +0,0 @@ -class CfgAmmo { - class B_9x21_Ball; - class B_556x45_Ball_Tracer_Red; - class B_762x51_Tracer_Red; - class B_127x99_Ball_Tracer_Red; - class GrenadeHand; - class BWA3_B_556x45_Ball: B_556x45_Ball_Tracer_Red { - ACE_caliber=5.69; - ACE_bulletLength=23.012; - ACE_bulletMass=4.0176; - ACE_ammoTempMuzzleVelocityShifts[]={-27.20, -26.44, -23.76, -21.00, -17.54, -13.10, -7.95, -1.62, 6.24, 15.48, 27.75}; - ACE_ballisticCoefficients[]={0.151}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={723, 764, 796, 825, 843, 866, 878, 892, 906, 915, 922, 900}; - ACE_barrelLengths[]={210.82, 238.76, 269.24, 299.72, 330.2, 360.68, 391.16, 419.1, 449.58, 480.06, 508.0, 609.6}; - }; - class BWA3_B_556x45_Ball_SD: BWA3_B_556x45_Ball { - // Reference? - ACE_ballisticCoefficients[]={}; - ACE_velocityBoundaries[]={}; - ACE_muzzleVelocities[]={}; - ACE_barrelLengths[]={}; - }; - class BWA3_B_556x45_Ball_AP: BWA3_B_556x45_Ball { - ACE_caliber=5.69; - ACE_bulletLength=23.012; - ACE_bulletMass=4.5359237; - 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.310}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={820, 865, 880}; - ACE_barrelLengths[]={254.0, 393.7, 508.0}; - }; - class BWA3_B_762x51_Ball: B_762x51_Tracer_Red { - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=9.4608; - 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.2}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; - ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; - class BWA3_B_762x51_Ball_SD: BWA3_B_762x51_Ball { - ACE_caliber=7.823; - ACE_bulletLength=34.036; - ACE_bulletMass=12.96; - 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.235}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={305, 325, 335, 340}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class BWA3_B_762x51_Ball_AP: BWA3_B_762x51_Ball { - ACE_caliber=7.823; - ACE_bulletLength=31.496; - ACE_bulletMass=8.22946157; - 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.359}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={875, 910, 930}; - ACE_barrelLengths[]={330.2, 406.4, 508.0}; - }; - class BWA3_B_762x51_Ball_LR: BWA3_B_762x51_Ball { - ACE_caliber=7.823; - ACE_bulletLength=31.496; - ACE_bulletMass=11.34; - 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.243}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={750, 780, 790, 794}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class BWA3_B_127x99_Ball: B_127x99_Ball_Tracer_Red { - ACE_caliber=12.954; - ACE_bulletLength=58.674; - ACE_bulletMass=41.9256; - 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.670}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={900}; - ACE_barrelLengths[]={736.6}; - }; - class BWA3_B_127x99_Ball_SD: BWA3_B_127x99_Ball { - // Reference? - ACE_ballisticCoefficients[]={}; - ACE_velocityBoundaries[]={}; - ACE_muzzleVelocities[]={}; - ACE_barrelLengths[]={}; - }; - class BWA3_B_127x99_Ball_AP: BWA3_B_127x99_Ball { - ACE_caliber=12.954; - ACE_bulletLength=58.674; - ACE_bulletMass=41.9904; - 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.670}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={900}; - ACE_barrelLengths[]={736.6}; - }; - class BWA3_B_46x30_Ball: B_9x21_Ball { - ACE_caliber=4.902; - ACE_bulletLength=13.005; - ACE_bulletMass=2.0088; - 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.1455}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={680, 720, 730, 740}; - ACE_barrelLengths[]={101.6, 177.8, 228.6, 304.8}; - }; - class BWA3_B_46x30_Ball_SD: BWA3_B_46x30_Ball { - // Reference? - ACE_ballisticCoefficients[]={}; - ACE_velocityBoundaries[]={}; - ACE_muzzleVelocities[]={}; - ACE_barrelLengths[]={}; - }; - class BWA3_G_DM51A1: GrenadeHand { - ace_frag_metal = 296; - ace_frag_charge = 180; - ace_frag_gurney_c = 2930; // Gurney velocity constant for PETN - ace_frag_gurney_k = 1/2; // shape factor for a cylinder - }; -}; \ No newline at end of file diff --git a/optionals/compat_bwa3/CfgMagazines.hpp b/optionals/compat_bwa3/CfgMagazines.hpp deleted file mode 100644 index bf43af6426..0000000000 --- a/optionals/compat_bwa3/CfgMagazines.hpp +++ /dev/null @@ -1,9 +0,0 @@ -class CfgMagazines { - class CA_Magazine; - class BWA3_200Rnd_556x45: CA_Magazine { - ACE_isBelt = 1; - }; - class BWA3_120Rnd_762x51: CA_Magazine { - ACE_isBelt = 1; - }; -}; \ No newline at end of file diff --git a/optionals/compat_bwa3/CfgWeapons.hpp b/optionals/compat_bwa3/CfgWeapons.hpp deleted file mode 100644 index c0acea9912..0000000000 --- a/optionals/compat_bwa3/CfgWeapons.hpp +++ /dev/null @@ -1,173 +0,0 @@ -class CfgWeapons { - class Pistol_Base_F; - class Rifle_Base_F; - class Rifle_Long_Base_F; - class UGL_F; - class BWA3_P8: Pistol_Base_F { - ACE_barrelTwist=248.92; - ACE_barrelLength=108; - }; - class BWA3_MP7: Pistol_Base_F { - ACE_barrelTwist=160.02; - ACE_barrelLength=180; - }; - class BWA3_G36: Rifle_Base_F { - ACE_barrelTwist=177.8; - ACE_barrelLength=480; - }; - class BWA3_G36K: BWA3_G36 { - ACE_barrelTwist=177.8; - ACE_barrelLength=318; - }; - class BWA3_G28_Standard: Rifle_Long_Base_F { - ACE_barrelTwist=304.8; - ACE_barrelLength=421; - }; - class BWA3_G28_Assault: BWA3_G28_Standard { - ACE_barrelTwist=304.8; - ACE_barrelLength=421; - }; - class BWA3_G27: BWA3_G28_Standard { - ACE_barrelTwist=304.8; - ACE_barrelLength=406; - }; - class BWA3_G27_AG: BWA3_G27 { - class AG40: UGL_F { - magazines[] += { - "ACE_HuntIR_M203" - }; - }; - }; - class BWA3_MG4: Rifle_Long_Base_F { - ACE_barrelTwist=177.8; - ACE_barrelLength=480; - }; - class BWA3_MG5: Rifle_Long_Base_F { - ACE_barrelTwist=304.8; - ACE_barrelLength=550; - }; - class BWA3_G82: Rifle_Long_Base_F { - ACE_barrelTwist=381.0; - ACE_barrelLength=736.7; - }; - class AG40: UGL_F { - magazines[] += { - "ACE_HuntIR_M203" - }; - }; - class optic_Hamr; - class InventoryOpticsItem_Base_F; - - class BWA3_optic_ZO4x30 : optic_Hamr { - ACE_ScopeAdjust_Vertical[] = { -10, 10 }; - ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; - ACE_ScopeAdjust_VerticalIncrement = 0.2; - ACE_ScopeAdjust_HorizontalIncrement = 0.2; - class ItemInfo : InventoryOpticsItem_Base_F { - class OpticsModes { - class Scope { - discreteDistance[] = { 200 }; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class BWA3_optic_ZO4x30_NSV : optic_Hamr { - ACE_ScopeAdjust_Vertical[] = { -10, 10 }; - ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; - ACE_ScopeAdjust_VerticalIncrement = 0.2; - ACE_ScopeAdjust_HorizontalIncrement = 0.2; - class ItemInfo : InventoryOpticsItem_Base_F { - class OpticsModes { - class Scope { - discreteDistance[] = { 200 }; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class BWA3_optic_ZO4x30_IRV : optic_Hamr { - ACE_ScopeAdjust_Vertical[] = { -10, 10 }; - ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; - ACE_ScopeAdjust_VerticalIncrement = 0.2; - ACE_ScopeAdjust_HorizontalIncrement = 0.2; - class ItemInfo : InventoryOpticsItem_Base_F { - class OpticsModes { - class Scope { - discreteDistance[] = { 200 }; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class BWA3_optic_Shortdot : optic_Hamr { - ACE_ScopeAdjust_Vertical[] = { -0.1, 10.1 }; - ACE_ScopeAdjust_Horizontal[] = { -5.1, 5.1 }; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo : InventoryOpticsItem_Base_F { - class OpticsModes { - class Scope { - discreteDistance[] = { 100 }; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class BWA3_optic_20x50 : optic_Hamr { - ACE_ScopeAdjust_Vertical[] = { 0, 26 }; - ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo : InventoryOpticsItem_Base_F { - class OpticsModes { - class Scope { - discreteDistance[] = { 100 }; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class BWA3_optic_20x50_NSV : BWA3_optic_20x50 { - ACE_ScopeAdjust_Vertical[] = { 0, 26 }; - ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo : InventoryOpticsItem_Base_F { - class OpticsModes { - class Scope { - discreteDistance[] = { 100 }; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class BWA3_optic_24x72 : optic_Hamr { - ACE_ScopeAdjust_Vertical[] = { 0, 16 }; - ACE_ScopeAdjust_Horizontal[] = { -7, 7 }; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo : InventoryOpticsItem_Base_F { - class OpticsModes { - class Scope { - discreteDistance[] = { 100 }; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; - class BWA3_optic_24x72_NSV : BWA3_optic_20x50 { - ACE_ScopeAdjust_Vertical[] = { 0, 16 }; - ACE_ScopeAdjust_Horizontal[] = { -7, 7 }; - ACE_ScopeAdjust_VerticalIncrement = 0.1; - ACE_ScopeAdjust_HorizontalIncrement = 0.1; - class ItemInfo : InventoryOpticsItem_Base_F { - class OpticsModes { - class Scope { - discreteDistance[] = { 100 }; - discreteDistanceInitIndex = 0; - }; - }; - }; - }; -}; diff --git a/optionals/compat_bwa3/config.cpp b/optionals/compat_bwa3/config.cpp deleted file mode 100644 index efdebaf616..0000000000 --- a/optionals/compat_bwa3/config.cpp +++ /dev/null @@ -1,16 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"BWA3_Weapons"}; - author[]={"Ruthberg"}; - VERSION_CONFIG; - }; -}; - -#include "CfgAmmo.hpp" -#include "CfgWeapons.hpp" -#include "CfgMagazines.hpp" diff --git a/optionals/compat_bwa3/script_component.hpp b/optionals/compat_bwa3/script_component.hpp deleted file mode 100644 index 86bb669119..0000000000 --- a/optionals/compat_bwa3/script_component.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#define COMPONENT BWA3_Weapons_comp - -#include "\z\ace\addons\main\script_mod.hpp" - -#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_cup/CfgAmmo.hpp b/optionals/compat_cup/CfgAmmo.hpp deleted file mode 100644 index f5ba34fc7e..0000000000 --- a/optionals/compat_cup/CfgAmmo.hpp +++ /dev/null @@ -1,434 +0,0 @@ -class CfgAmmo -{ - class BulletBase; - class B_762x51_Ball; - class B_127x99_Ball; - class CUP_B_545x39_Ball: BulletBase { - airFriction=-0.0011204; - ACE_caliber=5.588; - ACE_bulletLength=21.59; - ACE_bulletMass=3.42792; - 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="ASM"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={780, 880, 920}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_545x39_Ball_Tracer_Green: CUP_B_545x39_Ball { - airFriction=-0.0011204; - 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="ASM"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={785, 883, 925}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_545x39_Ball_Tracer_Red: BulletBase { - airFriction=-0.0011204; - 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="ASM"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={785, 883, 925}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_545x39_Ball_Tracer_White: BulletBase { - airFriction=-0.0011204; - 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="ASM"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={785, 883, 925}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_545x39_Ball_Tracer_Yellow: BulletBase { - airFriction=-0.0011204; - 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="ASM"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={785, 883, 925}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_762x39_Ball: BulletBase { - airFriction=-0.00150173; - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=7.9704; - 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 CUP_B_762x39_Ball_Tracer_Green: BulletBase { - airFriction=-0.00150173; - 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_762x39mm_KLT: BulletBase { - airFriction=-0.00150173; - 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 CUP_B_9x18_Ball: BulletBase { - airFriction=-0.00180193; - 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="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={298, 330, 350}; - ACE_barrelLengths[]={96.52, 127.0, 228.6}; - }; - class CUP_B_9x18_Ball_Tracer_Green: BulletBase { - airFriction=-0.00180193; - 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="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={298, 330, 350}; - ACE_barrelLengths[]={96.52, 127.0, 228.6}; - }; - class CUP_B_9x18_Ball_Tracer_Red: BulletBase { - airFriction=-0.00180193; - 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="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={298, 330, 350}; - ACE_barrelLengths[]={96.52, 127.0, 228.6}; - }; - class CUP_B_9x18_Ball_Tracer_Yellow: BulletBase { - airFriction=-0.00180193; - 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="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={298, 330, 350}; - ACE_barrelLengths[]={96.52, 127.0, 228.6}; - }; - class CUP_B_9x18_Ball_White_Tracer: BulletBase { - airFriction=-0.00180193; - 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="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={298, 330, 350}; - ACE_barrelLengths[]={96.52, 127.0, 228.6}; - }; - class CUP_B_9x19_Ball: BulletBase { - airFriction=-0.00205726; - ACE_caliber=9.017; - ACE_bulletLength=15.494; - ACE_bulletMass=8.0352; - 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.165}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={340, 370, 400}; - ACE_barrelLengths[]={101.6, 127.0, 228.6}; - }; - class CUP_B_762x51_noTracer: B_762x51_Ball { - airFriction=-0.00099036; - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=9.4608; - 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.2}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; - ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; - class CUP_B_303_Ball: BulletBase { - airFriction=-0.00082199; - 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 CUP_B_127x107_Ball_Green_Tracer: BulletBase { - airFriction=-0.00062618; - ACE_caliber=12.979; - ACE_bulletLength=64.008; - ACE_bulletMass=48.276; - 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.63}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={820}; - ACE_barrelLengths[]={728.98}; - }; - class CUP_B_127x108_Ball_Green_Tracer: BulletBase { - airFriction=-0.00062618; - ACE_caliber=12.979; - ACE_bulletLength=64.008; - ACE_bulletMass=48.276; - 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.63}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={820}; - ACE_barrelLengths[]={728.98}; - }; - class CUP_B_762x54_Ball_White_Tracer: BulletBase { - airFriction=-0.00101742; - ACE_caliber=7.925; - ACE_bulletLength=28.956; - ACE_bulletMass=9.6552; - 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.395}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={680, 750, 798, 800}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class CUP_B_762x54_Ball_Red_Tracer: BulletBase { - airFriction=-0.00101742; - ACE_caliber=7.925; - ACE_bulletLength=28.956; - ACE_bulletMass=9.6552; - 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.395}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={680, 750, 798, 800}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class CUP_B_762x54_Ball_Green_Tracer: BulletBase { - airFriction=-0.00101742; - ACE_caliber=7.925; - ACE_bulletLength=28.956; - ACE_bulletMass=9.6552; - 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.395}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={680, 750, 798, 800}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class CUP_B_762x54_Ball_Yellow_Tracer: BulletBase { - airFriction=-0.00101742; - ACE_caliber=7.925; - ACE_bulletLength=28.956; - ACE_bulletMass=9.6552; - 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.395}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={680, 750, 798, 800}; - ACE_barrelLengths[]={406.4, 508.0, 609.6, 660.4}; - }; - class CUP_B_9x39_SP5: BulletBase { - airFriction=-0.00075274; - ACE_caliber=9.246; - ACE_bulletLength=31.496; - ACE_bulletMass=16.2; - 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.275}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={280, 300, 320}; - ACE_barrelLengths[]={254.0, 414.02, 508.0}; - }; - class CUP_B_762x51_Tracer_Green: BulletBase { - airFriction=-0.00099036; - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=9.4608; - 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.2}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; - ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; - class CUP_B_762x51_Tracer_Red: BulletBase { - airFriction=-0.00099036; - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=9.4608; - 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.2}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; - ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; - class CUP_B_762x51_Tracer_Yellow: BulletBase { - airFriction=-0.00099036; - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=9.4608; - 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.2}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; - ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; - class CUP_B_762x51_Tracer_White: BulletBase { - airFriction=-0.00099036; - ACE_caliber=7.823; - ACE_bulletLength=28.956; - ACE_bulletMass=9.4608; - 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.2}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={700, 800, 820, 833, 845}; - ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; - }; - class B_127x107_Ball: BulletBase { - ACE_caliber=12.979; - ACE_bulletLength=64.008; - ACE_bulletMass=48.276; - 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.63}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={820}; - ACE_barrelLengths[]={728.98}; - }; - class CUP_B_9x18_SD: BulletBase { - airFriction=-0.00180193; - 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="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={298, 330, 340}; - ACE_barrelLengths[]={96.52, 127.0, 228.6}; - }; - class CUP_B_765x17_Ball: BulletBase { - airFriction=-0.00173452; - 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 CUP_B_145x115_AP_Green_Tracer: BulletBase { - airFriction=-0.00059041; - ACE_caliber=14.884; - ACE_bulletLength=50.8; - ACE_bulletMass=65.448; - 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.620}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={1000}; - ACE_barrelLengths[]={1346.2}; - }; - class CUP_B_127x99_Ball_White_Tracer: B_127x99_Ball { - airFriction=-0.00057503; - ACE_caliber=12.954; - ACE_bulletLength=58.674; - ACE_bulletMass=41.9256; - 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.670}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ASM"; - ACE_dragModel=1; - ACE_muzzleVelocities[]={853}; - ACE_barrelLengths[]={736.6}; - }; - class CUP_B_86x70_Ball_noTracer: BulletBase { - airFriction=-0.0005788; - ACE_caliber=8.585; - ACE_bulletLength=39.573; - ACE_bulletMass=16.2; - 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.322}; - ACE_velocityBoundaries[]={}; - ACE_standardAtmosphere="ICAO"; - ACE_dragModel=7; - ACE_muzzleVelocities[]={880, 915, 925}; - ACE_barrelLengths[]={508.0, 660.4, 711.2}; - }; -}; \ No newline at end of file diff --git a/optionals/compat_cup/CfgMagazines.hpp b/optionals/compat_cup/CfgMagazines.hpp index 469476734c..b05b0c3efd 100644 --- a/optionals/compat_cup/CfgMagazines.hpp +++ b/optionals/compat_cup/CfgMagazines.hpp @@ -45,223 +45,4 @@ class CfgMagazines { modelSpecial = ""; mass = 0; }; - - class CA_Magazine; - class 30Rnd_556x45_Stanag; - class CUP_30Rnd_545x39_AK_M: CA_Magazine { - initSpeed = 880; - }; - class CUP_30Rnd_TE1_Green_Tracer_545x39_AK_M: CA_Magazine { - initSpeed = 880; - }; - class CUP_30Rnd_TE1_Red_Tracer_545x39_AK_M: CA_Magazine { - initSpeed = 880; - }; - class CUP_30Rnd_TE1_White_Tracer_545x39_AK_M: CA_Magazine { - initSpeed = 880; - }; - class CUP_30Rnd_TE1_Yellow_Tracer_545x39_AK_M: CA_Magazine { - initSpeed = 880; - }; - class CUP_75Rnd_TE4_LRT4_Green_Tracer_545x39_RPK_M: CA_Magazine { - initSpeed = 880; - }; - class CUP_30Rnd_762x39_AK47_M: CA_Magazine { - initSpeed = 750; - }; - class CUP_64Rnd_9x19_Bizon_M: CA_Magazine { - initSpeed = 350; - }; - class CUP_64Rnd_Green_Tracer_9x19_Bizon_M: CA_Magazine { - initSpeed = 350; - }; - class CUP_64Rnd_Red_Tracer_9x19_Bizon_M: CA_Magazine { - initSpeed = 350; - }; - class CUP_64Rnd_White_Tracer_9x19_Bizon_M: CA_Magazine { - initSpeed = 350; - }; - class CUP_64Rnd_Yellow_Tracer_9x19_Bizon_M: CA_Magazine { - initSpeed = 350; - }; - class CUP_5x_22_LR_17_HMR_M: CA_Magazine { - initSpeed = 830; - }; - class CUP_10x_303_M: CA_Magazine { - initSpeed = 765; - }; - class CUP_20Rnd_762x51_FNFAL_M: CA_Magazine { - initSpeed = 833; - }; - class CUP_5Rnd_127x108_KSVK_M: CA_Magazine { - initSpeed = 820; - }; - class CUP_100Rnd_TE4_LRT4_White_Tracer_762x51_Belt_M: CA_Magazine { - initSpeed = 833; - }; - class CUP_100Rnd_TE4_LRT4_Red_Tracer_762x51_Belt_M: CUP_100Rnd_TE4_LRT4_White_Tracer_762x51_Belt_M { - initSpeed = 833; - }; - class CUP_200Rnd_TE4_LRT4_White_Tracer_762x51_Belt_M: CA_Magazine { - initSpeed = 833; - }; - class CUP_200Rnd_TE4_LRT4_Red_Tracer_762x51_Belt_M: CA_Magazine { - initSpeed = 833; - }; - class CUP_100Rnd_TE4_LRT4_762x54_PK_Tracer_Green_M: CA_Magazine { - initSpeed = 800; - }; - class CUP_10Rnd_762x54_SVD_M: CA_Magazine { - initSpeed = 800; - }; - class CUP_10Rnd_9x39_SP5_VSS_M: CA_Magazine { - initSpeed = 300; - }; - class CUP_20Rnd_9x39_SP5_VSS_M: CA_Magazine { - initSpeed = 300; - }; - class CUP_5Rnd_127x99_as50_M: CA_Magazine { - initSpeed = 900; - }; - class CUP_20Rnd_762x51_DMR: CA_Magazine { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_Yellow_Tracer_762x51_DMR: CUP_20Rnd_762x51_DMR { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_Red_Tracer_762x51_DMR: CUP_20Rnd_762x51_DMR { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_Green_Tracer_762x51_DMR: CUP_20Rnd_762x51_DMR { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_White_Tracer_762x51_DMR: CUP_20Rnd_762x51_DMR { - initSpeed = 833; - }; - class CUP_20Rnd_762x51_B_SCAR: CA_Magazine { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_Yellow_Tracer_762x51_SCAR: CUP_20Rnd_762x51_B_SCAR { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_Red_Tracer_762x51_SCAR: CUP_20Rnd_762x51_B_SCAR { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_Green_Tracer_762x51_SCAR: CUP_20Rnd_762x51_B_SCAR { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_White_Tracer_762x51_SCAR: CUP_20Rnd_762x51_B_SCAR { - initSpeed = 833; - }; - class CUP_20Rnd_762x51_B_M110: CA_Magazine { - initSpeed = 833; - }; - class CUP_5Rnd_762x51_M24: CA_Magazine { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_Yellow_Tracer_762x51_M110: CUP_20Rnd_762x51_B_M110 { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_Red_Tracer_762x51_M110: CUP_20Rnd_762x51_B_M110 { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_Green_Tracer_762x51_M110: CUP_20Rnd_762x51_B_M110 { - initSpeed = 833; - }; - class CUP_20Rnd_TE1_White_Tracer_762x51_M110: CUP_20Rnd_762x51_B_M110 { - initSpeed = 833; - }; - class CUP_30Rnd_556x45_G36: 30Rnd_556x45_Stanag { - initSpeed = 920; - }; - class CUP_30Rnd_TE1_Red_Tracer_556x45_G36: CUP_30Rnd_556x45_G36 { - initSpeed = 920; - }; - class CUP_30Rnd_TE1_Green_Tracer_556x45_G36: CUP_30Rnd_556x45_G36 { - initSpeed = 920; - }; - class CUP_30Rnd_TE1_Yellow_Tracer_556x45_G36: CUP_30Rnd_556x45_G36 { - initSpeed = 920; - }; - class CUP_100Rnd_556x45_BetaCMag: 30Rnd_556x45_Stanag { - initSpeed = 920; - }; - class CUP_100Rnd_TE1_Red_Tracer_556x45_BetaCMag: CUP_100Rnd_556x45_BetaCMag { - initSpeed = 920; - }; - class CUP_100Rnd_TE1_Green_Tracer_556x45_BetaCMag: CUP_100Rnd_556x45_BetaCMag { - initSpeed = 920; - }; - class CUP_100Rnd_TE1_Yellow_Tracer_556x45_BetaCMag: CUP_100Rnd_556x45_BetaCMag { - initSpeed = 920; - }; - class CUP_200Rnd_TE4_Green_Tracer_556x45_M249: CA_Magazine { - initSpeed = 920; - }; - class CUP_200Rnd_TE4_Red_Tracer_556x45_M249: CUP_200Rnd_TE4_Green_Tracer_556x45_M249 { - initSpeed = 920; - }; - class CUP_200Rnd_TE4_Yellow_Tracer_556x45_M249: CUP_200Rnd_TE4_Green_Tracer_556x45_M249 { - initSpeed = 920; - }; - class CUP_200Rnd_TE1_Red_Tracer_556x45_M249: CUP_200Rnd_TE4_Red_Tracer_556x45_M249 { - initSpeed = 920; - }; - class CUP_100Rnd_TE4_Green_Tracer_556x45_M249: CA_Magazine { - initSpeed = 920; - }; - class CUP_100Rnd_TE4_Red_Tracer_556x45_M249: CUP_100Rnd_TE4_Green_Tracer_556x45_M249 { - initSpeed = 920; - }; - class CUP_100Rnd_TE4_Yellow_Tracer_556x45_M249: CUP_100Rnd_TE4_Green_Tracer_556x45_M249 { - initSpeed = 920; - }; - class CUP_200Rnd_TE4_Green_Tracer_556x45_L110A1: CUP_200Rnd_TE4_Green_Tracer_556x45_M249 { - initSpeed = 920; - }; - class CUP_200Rnd_TE4_Red_Tracer_556x45_L110A1: CUP_200Rnd_TE4_Red_Tracer_556x45_M249 { - initSpeed = 920; - }; - class CUP_200Rnd_TE4_Yellow_Tracer_556x45_L110A1: CUP_200Rnd_TE4_Yellow_Tracer_556x45_M249 { - initSpeed = 920; - }; - class CUP_30Rnd_556x45_Stanag: CA_Magazine { - initSpeed = 920; - }; - class CUP_20Rnd_556x45_Stanag: CUP_30Rnd_556x45_Stanag { - initSpeed = 920; - }; - class CUP_10Rnd_127x99_M107: CA_Magazine { - initSpeed = 900; - }; - class CUP_10Rnd_762x51_CZ750: CA_Magazine { - initSpeed = 833; - }; - class CUP_10Rnd_762x51_CZ750_Tracer: CUP_10Rnd_762x51_CZ750 { - initSpeed = 833; - }; - class CUP_50Rnd_UK59_762x54R_Tracer: CA_Magazine { - initSpeed = 800; - }; - class CUP_8Rnd_9x18_Makarov_M: CA_Magazine { - initSpeed = 300; - }; - class CUP_8Rnd_9x18_MakarovSD_M: CUP_8Rnd_9x18_Makarov_M { - initSpeed = 300; - }; - class CUP_6Rnd_45ACP_M: CA_Magazine { - initSpeed = 250; - }; - class CUP_17Rnd_9x19_glock17: CA_Magazine { - initSpeed = 370; - }; - class CUP_5Rnd_86x70_L115A1: CA_Magazine { - initSpeed = 915; - }; - class CUP_20Rnd_B_765x17_Ball_M: CA_Magazine { - initSpeed = 290; - }; - class CUP_30Rnd_9x19_MP5: CA_Magazine { - initSpeed = 400; - }; }; \ No newline at end of file diff --git a/optionals/compat_cup/CfgWeapons.hpp b/optionals/compat_cup/CfgWeapons.hpp index 76d442ee53..bbd49548da 100644 --- a/optionals/compat_cup/CfgWeapons.hpp +++ b/optionals/compat_cup/CfgWeapons.hpp @@ -1,432 +1,6 @@ class CfgWeapons { - class Pistol_Base_F; - class Rifle_Base_F; - class Rifle_Long_Base_F; class Launcher_Base_F; - class CUP_hgun_Colt1911 : Pistol_Base_F { - initSpeed=-1.04; - ACE_barrelTwist=406.4; - ACE_barrelLength=127.0; - }; - class CUP_sgun_AA12 : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=0.0; - ACE_twistDirection=0; - ACE_barrelLength=457.2; - }; - class CUP_arifle_AK_Base : Rifle_Base_F { - initSpeed=-0.95467; - ACE_barrelTwist=240.03; - ACE_barrelLength=414.02; - }; - class CUP_arifle_AK107_Base : CUP_arifle_AK_Base { - initSpeed=-1.0; - ACE_barrelTwist=199.898; - ACE_barrelLength=414.02; - }; - class CUP_arifle_AKS_Base : CUP_arifle_AK_Base { - initSpeed=-0.95467; - ACE_barrelTwist=199.898; - ACE_barrelLength=414.02; - }; - class CUP_arifle_AKS74U : CUP_arifle_AK_Base { - initSpeed=-0.88636; - ACE_barrelTwist=160.02; - ACE_barrelLength=210.82; - }; - class CUP_arifle_AK74; - class CUP_arifle_RPK74 : CUP_arifle_AK74 { - initSpeed=-1.0; - ACE_barrelTwist=195.072; - ACE_barrelLength=589.28; - }; - class CUP_srifle_AS50 : Rifle_Long_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=381.0; - ACE_barrelLength=736.6; - }; - class CUP_srifle_AWM_Base : Rifle_Long_Base_F { - initSpeed=-1.00547; - ACE_barrelTwist=279.4; - ACE_barrelLength=685.8; - }; - class CUP_smg_bizon : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=240.03; - ACE_barrelLength=231.14; - }; - class CUP_hgun_Compact : Pistol_Base_F { - initSpeed=-0.97778; - ACE_barrelTwist=248.92; - ACE_barrelLength=94.996; - }; - class CUP_srifle_CZ750 : Rifle_Long_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=304.8; - ACE_barrelLength=660.4; - }; - class CUP_arifle_CZ805_Base : Rifle_Base_F { - initSpeed=-0.87283; - ACE_barrelTwist=304.8; - ACE_barrelLength=355.6; - }; - class CUP_arifle_CZ805_A1 : CUP_arifle_CZ805_Base { - initSpeed=-0.93696; - ACE_barrelTwist=304.8; - ACE_barrelLength=355.6; - }; - class CUP_arifle_CZ805_A2 : CUP_arifle_CZ805_Base { - initSpeed=-0.87283; - ACE_barrelTwist=304.8; - ACE_barrelLength=276.86; - }; - class CUP_srifle_DMR : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=304.8; - ACE_barrelLength=558.8; - }; - class CUP_hgun_Duty : Pistol_Base_F { - initSpeed=-0.97778; - ACE_barrelTwist=248.92; - ACE_barrelLength=94.996; - }; - class CUP_arifle_FNFAL : Rifle_Base_F { - initSpeed=-0.98796; - ACE_barrelTwist=304.8; - ACE_barrelLength=533.4; - }; - class CUP_arifle_G36_Base; - class CUP_arifle_G36A : CUP_arifle_G36_Base { - initSpeed=-0.99357; - ACE_barrelTwist=177.8; - ACE_barrelLength=480; - }; - class CUP_arifle_G36K : CUP_arifle_G36A { - initSpeed=-0.90761; - ACE_barrelTwist=177.8; - ACE_barrelLength=318; - }; - class CUP_arifle_G36C : Rifle_Base_F { - initSpeed=-0.81522; - ACE_barrelTwist=177.8; - ACE_barrelLength=228; - }; - class CUP_arifle_MG36 : CUP_arifle_G36C { - initSpeed=-0.99457; - ACE_barrelTwist=177.8; - ACE_barrelLength=480; - }; - class CUP_hgun_Glock17 : Pistol_Base_F { - initSpeed=-0.9595; - ACE_barrelTwist=248.92; - ACE_barrelLength=114.046; - }; - class CUP_srifle_CZ550 : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=304.8; - ACE_barrelLength=599.999; - }; - class CUP_srifle_ksvk : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=457.2; - ACE_barrelLength=999.998; - }; - class CUP_lmg_L7A2 : Rifle_Long_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=304.8; - ACE_barrelLength=629.92; - }; - class CUP_arifle_L85A2_Base : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=177.8; - ACE_barrelLength=518.16; - }; - class CUP_arifle_L86A2_Base: Rifle_Base_F { - initSpeed=-0.97826; - ACE_barrelTwist=177.8; - ACE_barrelLength=646; - }; - class CUP_lmg_L110A1 : Rifle_Long_Base_F { - initSpeed=-0.93044; - ACE_barrelTwist=177.8; - ACE_barrelLength=347.98; - }; - class CUP_srifle_LeeEnfield : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=254.0; - ACE_barrelLength=640.08; - }; - class CUP_hgun_M9 : Pistol_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=248.92; - ACE_barrelLength=124.46; - }; - class CUP_srifle_M14 : Rifle_Base_F { - initSpeed=-0.99160; - ACE_barrelTwist=304.8; - ACE_barrelLength=558.8; - }; - class CUP_arifle_M16_Base : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=355.6; - ACE_barrelLength=508.0; - }; - class CUP_arifle_M16A4_Base; - class CUP_arifle_M4_Base : CUP_arifle_M16A4_Base { - initSpeed=-0.94565; - ACE_barrelTwist=177.8; - ACE_barrelLength=368.3; - }; - class CUP_arifle_M4A1; - class CUP_srifle_Mk12SPR : CUP_arifle_M4A1 { - initSpeed=-0.98696; - ACE_barrelTwist=177.8; - ACE_barrelLength=457.2; - }; - class CUP_srifle_M24_des : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=285.75; - ACE_barrelLength=609.6; - }; - class CUP_lmg_M60A4 : Rifle_Long_Base_F { - initSpeed=-0.96639; - ACE_barrelTwist=304.8; - ACE_barrelLength=431.8; - }; - class CUP_srifle_M107_Base : Rifle_Long_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=381.0; - ACE_barrelLength=736.6; - }; - class CUP_srifle_M110 : Rifle_Base_F { - initSpeed=-0.98558; - ACE_barrelTwist=279.4; - ACE_barrelLength=508.0; - }; - class CUP_lmg_M240 : Rifle_Long_Base_F { - initSpeed=-1.00600; - ACE_barrelTwist=304.8; - ACE_barrelLength=629.92; - }; - class CUP_lmg_M249_para : Rifle_Long_Base_F { - initSpeed=-0.96739; - ACE_barrelTwist=177.8; - ACE_barrelLength=414.02; - }; - class CUP_lmg_M249 : Rifle_Long_Base_F { - initSpeed=-0.98696; - ACE_barrelTwist=177.8; - ACE_barrelLength=457.2; - }; - class CUP_sgun_M1014 : Rifle_Base_F { - ACE_twistDirection=0; - ACE_barrelTwist=0.0; - ACE_barrelLength=469.9; - }; - class CUP_hgun_Makarov : Pistol_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=240.03; - ACE_barrelLength=93.472; - }; - class CUP_hgun_MicroUzi : Pistol_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=248.92; - ACE_barrelLength=127.0; - }; - class CUP_lmg_Mk48_Base : Rifle_Long_Base_F { - initSpeed=-0.98558; - ACE_barrelTwist=304.8; - ACE_barrelLength=501.65; - }; - class CUP_smg_MP5SD6 : Rifle_Base_F { - initSpeed=-0.9375; - ACE_barrelTwist=254.0; - ACE_barrelLength=144.78; - }; - class CUP_smg_MP5A5 : CUP_smg_MP5SD6 { - initSpeed=-1.0; - ACE_barrelTwist=254.0; - ACE_barrelLength=226.06; - }; - class CUP_smg_EVO : Rifle_Base_F { - initSpeed=-0.975; - ACE_barrelTwist=254.0; - ACE_barrelLength=195.58; - }; - class CUP_hgun_PB6P9 : Pistol_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=240.03; - ACE_barrelLength=104.14; - }; - class CUP_hgun_Phantom : Pistol_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=246.38; - ACE_barrelLength=119.38; - }; - class CUP_lmg_PKM : Rifle_Long_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=240.03; - ACE_barrelLength=645.16; - }; - class CUP_lmg_Pecheneg : CUP_lmg_PKM { - initSpeed=-1.0; - ACE_barrelTwist=240.03; - ACE_barrelLength=657.86; - }; - class CUP_hgun_TaurusTracker455 : Pistol_Base_F { - initSpeed=-0.92; - ACE_barrelTwist=304.8; - ACE_barrelLength=101.6; - }; - class CUP_arifle_Sa58_base; - class CUP_arifle_Sa58P : CUP_arifle_Sa58_base { - initSpeed=-1.0; - ACE_barrelTwist=240.03; - ACE_barrelLength=391.16; - }; - class CUP_arifle_Sa58V : CUP_arifle_Sa58P { - initSpeed=-1.0; - ACE_barrelTwist=240.03; - ACE_barrelLength=391.16; - }; - class CUP_arifle_Sa58RIS1 : CUP_arifle_Sa58_base { - initSpeed=-1.0; - ACE_barrelTwist=240.03; - ACE_barrelLength=391.16; - }; - class CUP_hgun_SA61 : Pistol_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=406.4; - ACE_barrelLength=114.3; - }; - class CUP_sgun_Saiga12K: Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=0.0; - ACE_twistDirection=0; - ACE_barrelLength=429.26; - }; - class CUP_arifle_SCAR_L_Base; - class CUP_arifle_Mk16_CQC : CUP_arifle_SCAR_L_Base { - initSpeed=-0.84783; - ACE_barrelTwist=177.8; - ACE_barrelLength=254.0; - }; - class CUP_arifle_Mk16_STD : CUP_arifle_SCAR_L_Base { - initSpeed=-0.93696; - ACE_barrelTwist=177.8; - ACE_barrelLength=355.6; - }; - class CUP_arifle_Mk16_SV : CUP_arifle_SCAR_L_Base { - initSpeed=-0.98696; - ACE_barrelTwist=177.8; - ACE_barrelLength=457.2; - }; - class CUP_arifle_Mk17_Base; - class CUP_arifle_Mk17_CQC : CUP_arifle_Mk17_Base { - initSpeed=-0.90144; - ACE_barrelTwist=304.8; - ACE_barrelLength=330.2; - }; - class CUP_arifle_Mk17_STD : CUP_arifle_Mk17_Base { - initSpeed=-0.96154; - ACE_barrelTwist=304.8; - ACE_barrelLength=406.4; - }; - class CUP_arifle_Mk20 : CUP_arifle_Mk17_Base { - initSpeed=-0.98558; - ACE_barrelTwist=304.8; - ACE_barrelLength=508.0; - }; - class CUP_srifle_SVD : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=238.76; - ACE_barrelLength=619.76; - }; - class CUP_lmg_UK59 : Rifle_Long_Base_F { - initSpeed=-0.9625; - ACE_barrelTwist=381.0; - ACE_barrelLength=551.18; - }; - class MGun; - class CUP_DSHKM_W : MGun { - initSpeed=-1.0; - ACE_barrelTwist=381.0; - ACE_barrelLength=1069.34; - }; - class CUP_KPVT_W : MGun { - initSpeed=-1.0; - ACE_barrelTwist=454.914; - ACE_barrelLength=1346.2; - }; - class CUP_M242_W; - class CUP_KPVB_W : CUP_M242_W { - initSpeed=-1.0; - ACE_barrelTwist=454.914; - ACE_barrelLength=1346.2; - }; - class MGunCore; - class CUP_M134 : MGunCore { - initSpeed=-1.0; - ACE_barrelTwist=304.8; - ACE_barrelLength=558.8; - }; - class CUP_M240_veh_W : Rifle_Long_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=304.8; - ACE_barrelLength=629.92; - }; - class CUP_PKT_W : MGun { - initSpeed=-1.0; - ACE_barrelTwist=240.03; - ACE_barrelLength=722.122; - }; - class CUP_srifle_VSSVintorez : Rifle_Base_F { - initSpeed=-0.93334; - ACE_barrelTwist=210.82; - ACE_barrelLength=200.66; - }; - class CUP_arifle_XM8_Base : Rifle_Base_F { - initSpeed=-1.0; - ACE_barrelTwist=177.8; - ACE_barrelLength=317.5; - }; - class CUP_arifle_XM8_Carbine : CUP_arifle_XM8_Base { - initSpeed=-0.90760; - ACE_barrelTwist=177.8; - ACE_barrelLength=317.5; - }; - class CUP_arifle_xm8_sharpshooter : CUP_arifle_XM8_Base { - initSpeed=-1.0; - ACE_barrelTwist=177.8; - ACE_barrelLength=508.0; - }; - class CUP_arifle_xm8_SAW : CUP_arifle_XM8_Base { - initSpeed=-1.0; - ACE_barrelTwist=177.8; - ACE_barrelLength=508.0; - }; - class CUP_arifle_XM8_Compact : CUP_arifle_XM8_Base { - initSpeed=-0.81522; - ACE_barrelTwist=177.8; - ACE_barrelLength=228.6; - }; - class CUP_arifle_XM8_Railed_Base : Rifle_Base_F { - initSpeed=-0.90760; - ACE_barrelTwist=177.8; - ACE_barrelLength=317.5; - }; - class CUP_arifle_XM8_Carbine_FG : CUP_arifle_XM8_Base { - initSpeed=-0.90870; - ACE_barrelTwist=177.8; - ACE_barrelLength=317.5; - }; - class CUP_arifle_XM8_Carbine_GL : CUP_arifle_XM8_Base { - initSpeed=-0.90870; - ACE_barrelTwist=177.8; - ACE_barrelLength=317.5; - }; - class ItemCore; class InventoryOpticsItem_Base_F; diff --git a/optionals/compat_cup/config.cpp b/optionals/compat_cup/config.cpp index d013c9034a..20ae5d6911 100644 --- a/optionals/compat_cup/config.cpp +++ b/optionals/compat_cup/config.cpp @@ -11,6 +11,5 @@ class CfgPatches { }; }; -#include "CfgAmmo.hpp" #include "CfgWeapons.hpp" #include "CfgMagazines.hpp" \ No newline at end of file diff --git a/tools/make.py b/tools/make.py index 8eb8950c7f..f8a4c80886 100644 --- a/tools/make.py +++ b/tools/make.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3 +#!/usr/bin/env python3 # vim: set fileencoding=utf-8 : # make.py @@ -30,7 +30,7 @@ ############################################################################### -__version__ = "0.4" +__version__ = "0.7" import sys @@ -49,6 +49,7 @@ import configparser import json import traceback import time +import timeit import re from tempfile import mkstemp @@ -58,7 +59,7 @@ if sys.platform == "win32": ######## GLOBALS ######### project = "@ace" -ACE_VERSION = "3.0.0" +project_version = "3.0.0" arma3tools_path = "" work_drive = "" module_root = "" @@ -116,6 +117,19 @@ def get_directory_hash(directory): #print_yellow("Hash Value for {} is {}".format(directory,retVal)) return directory_hash.hexdigest() +def Fract_Sec(s): + temp = float() + temp = float(s) / (60*60*24) + d = int(temp) + temp = (temp - d) * 24 + h = int(temp) + temp = (temp - h) * 60 + m = int(temp) + temp = (temp - m) * 60 + sec = temp + return d,h,m,sec + #endef Fract_Sec + # Copyright (c) André Burgaud # http://www.burgaud.com/bring-colors-to-the-windows-console-with-python/ if sys.platform == "win32": @@ -372,6 +386,7 @@ def copy_optionals_for_building(mod,pbos): if (os.path.isfile(sig_path)): #print("Moving {} for processing.".format(sig_path)) shutil.move(sig_path, os.path.join(release_dir, project, "addons", sigFile_name)) + except: print_error("Error in moving") raise @@ -435,6 +450,9 @@ def cleanup_optionals(mod): continue shutil.rmtree(destination) + except FileNotFoundError: + print_yellow("{} file not found".format(file_name)) + except: print_error("Cleaning Optionals Failed") raise @@ -541,9 +559,9 @@ def addon_restore(modulePath): return True -def get_ace_version(): - global ACE_VERSION - versionStamp = ACE_VERSION +def get_project_version(): + global project_version + versionStamp = project_version #do the magic based on https://github.com/acemod/ACE3/issues/806#issuecomment-95639048 try: @@ -568,16 +586,16 @@ def get_ace_version(): raise FileNotFoundError("File Not Found: {}".format(scriptModPath)) except Exception as e: - print_error("Get_Ace_Version error: {}".format(e)) + print_error("Get_project_version error: {}".format(e)) print_error("Check the integrity of the file: {}".format(scriptModPath)) - versionStamp = ACE_VERSION + versionStamp = project_version print_error("Resetting to the default version stamp: {}".format(versionStamp)) input("Press Enter to continue...") print("Resuming build...") print_yellow("{} VERSION set to {}".format(project.lstrip("@").upper(),versionStamp)) - ACE_VERSION = versionStamp - return ACE_VERSION + project_version = versionStamp + return project_version def replace_file(filePath, oldSubstring, newSubstring): @@ -595,7 +613,7 @@ def replace_file(filePath, oldSubstring, newSubstring): def set_version_in_files(): - newVersion = ACE_VERSION # MAJOR.MINOR.PATCH.BUILD + newVersion = project_version # MAJOR.MINOR.PATCH.BUILD newVersionShort = newVersion[:-2] # MAJOR.MINOR.PATCH # Regex patterns @@ -677,7 +695,7 @@ def restore_version_files(): def get_private_keyname(commitID,module="main"): global pbo_name_prefix - aceVersion = get_ace_version() + aceVersion = get_project_version() keyName = str("{prefix}{version}-{commit_id}".format(prefix=pbo_name_prefix,version=aceVersion,commit_id=commitID)) return keyName @@ -754,7 +772,7 @@ def main(argv): """Build an Arma addon suite in a directory from rules in a make.cfg file.""" print_blue("\nmake.py for Arma, modified for Advanced Combat Environment v{}".format(__version__)) - global ACE_VERSION + global project_version global arma3tools_path global work_drive global module_root @@ -840,7 +858,7 @@ See the make.cfg file for additional build options. argv.remove("release") else: make_release_zip = False - release_version = ACE_VERSION + release_version = project_version if "target" in argv: make_target = argv[argv.index("target") + 1] @@ -863,7 +881,7 @@ See the make.cfg file for additional build options. check_external = True else: check_external = False - + if "version" in argv: argv.remove("version") version_update = True @@ -897,7 +915,7 @@ See the make.cfg file for additional build options. # Project prefix (folder path) prefix = cfg.get(make_target, "prefix", fallback="") - + # Release archive prefix zipPrefix = cfg.get(make_target, "zipPrefix", fallback=project.lstrip("@").lower()) @@ -1418,5 +1436,8 @@ See the make.cfg file for additional build options. if __name__ == "__main__": + start_time = timeit.default_timer() main(sys.argv) + d,h,m,s = Fract_Sec(timeit.default_timer() - start_time) + print("\nTotal Program time elapsed: {0:2}h {1:2}m {2:4.5f}s".format(h,m,s)) input("Press Enter to continue...")