diff --git a/.gitignore b/.gitignore index 76f95dcd10..f05646fb8a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ release/* texHeaders.bin *.swp *.swo +*.biprivatekey diff --git a/AUTHORS.txt b/AUTHORS.txt index 05049978e6..6585a8eeb7 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -17,7 +17,7 @@ Janus Kieran NouberNou PabstMirror -Ruthberg +Ruthberg tpM ViperMaul VKing @@ -30,9 +30,11 @@ ACCtomeek Adanteh aeroson Aggr094 +Alganthe Anthariel BlackQwar Brakoviejo +Brisse Clon1998 Codingboy Crusty @@ -41,13 +43,14 @@ evromalarkey Falke75 Ferenczi Ferenzi -Filip Basara (Logo) +Filip Basara FreeZbe geraldbolso1899 Ghost GieNkoV gpgpgpgp Grzegorz +Gianmarco Varriale (TeamNuke) Hamburger SV Harakhti havena @@ -69,7 +72,7 @@ Raspu86 Riccardo Petricca Robert Boklahánics ramius86 -simon84 +simon84 Sniperwolf572 Tachi Tonic @@ -83,3 +86,5 @@ Asgar Serran Kavinsky Coren OnkelDisMaster +Dimaslg +VyMajoris(W-Cephei) diff --git a/LICENSE b/LICENSE index 0f013a10b9..b76b90e8fb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) 2014 Felix "KoffeinFlummi" Wiegand +Copyright (C) 2015 Felix "KoffeinFlummi" Wiegand This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/README.md b/README.md index 3ec6fe0683..4ed84011bf 100644 --- a/README.md +++ b/README.md @@ -1,48 +1,83 @@

- +

- ACE version + ACE version - - ACE download + + ACE download - ACE issues + ACE issues + + + BIF thread - ACE license + ACE license

-

Requires the latest version of CBA A3 | BIF thread

+

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. -This mod is entirely **open-source**, and everyone is free to propose changes or maintain their own, customized version as long as they make their changes open to the public in accordance with the GNU General Public License (for more information check the license file attached to this project). +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** — almost any PBO can be removed, thus a team can maintain its own tailored version of ACE, which excludes a select number of components that they don't like, or which conflict with other add-ons. Components themselves, like 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 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. -### Features -* Improved medical system -* Logistics system including cargo transport and vehicle maintenance -* Explosives system including different trigger types -* Captivity system -* Realistic names for vehicles and weapons -* Realistic ballistics including wind and humidity -* Backblast simulation -* A fire control system for armored vehicles and helicopters - ***and more...*** +### 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 -#### Guides & How-Tos -If you installed ACE3, but have trouble understanding how it all works, or where to start — see [Getting Started](https://github.com/acemod/ACE3/blob/master/documentation/user/getting-started.md). +#### 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
+***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) #### Contributing -If you want to help put with the ongoing development, you can do so by looking for possible bugs or by contributing new features. To contribute something to ACE, simply fork this repository and submit your pull requests for review by other collaborators. In the process, please add yourself to the author array of any .pbo you will be editing and the 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 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. -To report a bug, propose a feature, or suggest a change to the existing one — please, use our [Issue Tracker](https://github.com/acemod/ACE3/issues). See [this link](http://ace3mod.com/wiki/user/how-to-report-an-issue.html) for details. +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) -#### Testing & Building -If you want to help us test the latest development changes, feel free to download our master branch, using either git — if familiar with the process — or directly, by following [this link](https://github.com/acemod/ACE3/archive/master.zip). - -To find out how to set up your development environment and build a version of ACE for testing, follow [these instructions](https://github.com/acemod/ACE3/blob/master/documentation/development/setting-up-the-development-environment.md). +#### 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. diff --git a/addons/advanced_ballistics/ACE_Settings.hpp b/addons/advanced_ballistics/ACE_Settings.hpp index d1462b144f..67bc51511e 100644 --- a/addons/advanced_ballistics/ACE_Settings.hpp +++ b/addons/advanced_ballistics/ACE_Settings.hpp @@ -57,7 +57,7 @@ class ACE_Settings { }; class GVAR(simulationRadius) { displayName = "Simulation Radius"; - description = "Defines the radius (in meters) in which advanced ballistics are applied"; + description = "Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles"; typeName = "SCALAR"; value = 3000; }; diff --git a/addons/advanced_ballistics/CfgVehicles.hpp b/addons/advanced_ballistics/CfgVehicles.hpp index 8e6e40e21e..fda4b9a8ff 100644 --- a/addons/advanced_ballistics/CfgVehicles.hpp +++ b/addons/advanced_ballistics/CfgVehicles.hpp @@ -69,7 +69,7 @@ class CfgVehicles { }; class simulationRadius { displayName = "Simulation Radius"; - description = "Defines the radius (in meters) in which advanced ballistics are applied"; + description = "Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles"; typeName = "NUMBER"; defaultValue = 3000; }; diff --git a/addons/advanced_ballistics/XEH_postInit.sqf b/addons/advanced_ballistics/XEH_postInit.sqf index 8273859033..3f0e101d3b 100644 --- a/addons/advanced_ballistics/XEH_postInit.sqf +++ b/addons/advanced_ballistics/XEH_postInit.sqf @@ -20,19 +20,10 @@ GVAR(WindInfoStart) = time; GVAR(Protractor) = false; GVAR(ProtractorStart) = time; -// Those are only used in the pure sqf version (extension free PFH) -GVAR(SimulationPrecision) = 2; -GVAR(WindEnabled) = true; -GVAR(SpinDriftEnabled) = true; -GVAR(CoriolisEnabled) = true; -GVAR(EoetvoesEnabled) = true; -GVAR(AdvancedAirDragEnabled) = true; -GVAR(TransonicRegionEnabled) = true; -GVAR(AtmosphericDensitySimulationEnabled) = true; - GVAR(currentGrid) = 0; GVAR(INIT_MESSAGE_ENABLED) = false; +GVAR(extensionAvailable) = true; /* @TODO: Remove this until verisoning is in sync with cmake/build versioning GVAR(extensionVersion) = ("ace_advanced_ballistics" callExtension "version"); GVAR(extensionAvailable) = (GVAR(extensionVersion) == EXTENSION_REQUIRED_VERSION); diff --git a/addons/advanced_ballistics/functions/fnc_handleFired.sqf b/addons/advanced_ballistics/functions/fnc_handleFired.sqf index 0180245f25..b6aae2c740 100644 --- a/addons/advanced_ballistics/functions/fnc_handleFired.sqf +++ b/addons/advanced_ballistics/functions/fnc_handleFired.sqf @@ -19,7 +19,7 @@ */ #include "script_component.hpp" -private ["_unit", "_weapon", "_mode", "_ammo", "_magazine", "_caliber", "_bullet", "_abort", "_index", "_opticsName", "_opticType", "_bulletTraceVisible", "_temperature", "_barometricPressure", "_atmosphereModel", "_bulletMass", "_bulletLength", "_airFriction", "_dragModel", "_muzzleVelocity", "_muzzleVelocityCoef", "_muzzleAccessory", "_initSpeedCoef", "_muzzleVelocityShift", "_bulletVelocity", "_bulletSpeed", "_bulletLength", "_barrelTwist", "_twistDirection", "_stabilityFactor", "_transonicStabilityCoef"]; +private ["_unit", "_weapon", "_mode", "_ammo", "_magazine", "_caliber", "_bullet", "_abort", "_index", "_opticsName", "_opticType", "_bulletTraceVisible", "_temperature", "_barometricPressure", "_atmosphereModel", "_bulletMass", "_bulletLength", "_airFriction", "_dragModel", "_muzzleVelocity", "_muzzleVelocityShift", "_bulletVelocity", "_bulletSpeed", "_bulletLength", "_barrelTwist", "_twistDirection", "_stabilityFactor", "_transonicStabilityCoef", "_ballisticCoefficients", "_velocityBoundaries"]; _unit = _this select 0; _weapon = _this select 1; _mode = _this select 3; @@ -35,49 +35,34 @@ if (!([_unit] call EFUNC(common,isPlayer))) exitWith {}; if (underwater _unit) exitWith {}; if (!(_ammo isKindOf "BulletBase")) exitWith {}; if (_unit distance ACE_player > GVAR(simulationRadius)) exitWith {}; -if (GVAR(onlyActiveForLocalPlayers) && _unit != ACE_player) then { _abort = true; }; +if (GVAR(onlyActiveForLocalPlayers) && !(local _unit)) then { + if (GVAR(alwaysSimulateForSnipers)) then { + // The shooter is non local + if (currentWeapon _unit == primaryWeapon _unit && count primaryWeaponItems _unit > 2) then { + _opticsName = (primaryWeaponItems _unit) select 2; + _opticType = getNumber(configFile >> "cfgWeapons" >> _opticsName >> "ItemInfo" >> "opticType"); + _abort = _opticType != 2; // We only abort if the non local shooter is not a sniper + }; + } else { + _abort = true; + }; +}; //if (!GVAR(vehicleGunnerEnabled) && !(_unit isKindOf "Man")) then { _abort = true; }; // TODO: We currently do not have firedEHs on vehicles if (GVAR(disabledInFullAutoMode) && getNumber(configFile >> "cfgWeapons" >> _weapon >> _mode >> "autoFire") == 1) then { _abort = true; }; -if (_abort && alwaysSimulateForSnipers) then { - // The shooter is non local - if (currentWeapon _unit == primaryWeapon _unit && count primaryWeaponItems _unit > 2) then { - _opticsName = (primaryWeaponItems _unit) select 2; - _opticType = getNumber(configFile >> "cfgWeapons" >> _opticsName >> "ItemInfo" >> "opticType"); - _abort = _opticType != 2; // We only abort if the non local shooter is not a sniper - }; -}; if (_abort || !(GVAR(extensionAvailable))) exitWith { [_bullet, getNumber(configFile >> "cfgAmmo" >> _ammo >> "airFriction")] call EFUNC(winddeflection,updateTrajectoryPFH); }; _airFriction = getNumber(configFile >> "cfgAmmo" >> _ammo >> "airFriction"); -_muzzleVelocity = getNumber(configFile >> "cfgMagazines" >> _magazine >> "initSpeed"); -_muzzleVelocityCoef = getNumber(configFile >> "cfgWeapons" >> _weapon >> "initSpeed"); -if (_muzzleVelocityCoef > 0) then { - _muzzleVelocity = _muzzleVelocityCoef; -}; -if (_muzzleVelocityCoef < 0) then { - _muzzleVelocity = _muzzleVelocity * (-1 * _muzzleVelocityCoef); -}; -_muzzleAccessory = ""; -switch (currentWeapon _unit) do { - case primaryWeapon _unit: { _muzzleAccessory = (primaryWeaponItems _unit) select 0; }; - case handgunWeapon _unit: { _muzzleAccessory = (handgunItems _unit) select 0; }; -}; - -if (_muzzleAccessory != "" && isNumber(configFile >> "cfgWeapons" >> _muzzleAccessory >> "ItemInfo" >> "MagazineCoef" >> "initSpeed")) then { - _initSpeedCoef = getNumber(configFile >> "cfgWeapons" >> _muzzleAccessory >> "ItemInfo" >> "MagazineCoef" >> "initSpeed"); - _muzzleVelocity = _muzzleVelocity * _initSpeedCoef; -}; +_bulletVelocity = velocity _bullet; +_muzzleVelocity = vectorMagnitude _bulletVelocity; if (GVAR(barrelLengthInfluenceEnabled)) then { _muzzleVelocityShift = [_ammo, _weapon, _muzzleVelocity] call FUNC(calculateBarrelLengthVelocityShift); if (_muzzleVelocityShift != 0) then { - _bulletVelocity = velocity _bullet; - _bulletSpeed = vectorMagnitude _bulletVelocity; - _bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift * (_bulletSpeed / _muzzleVelocity))); + _bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift)); _bullet setVelocity _bulletVelocity; _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; }; @@ -87,19 +72,23 @@ if (GVAR(ammoTemperatureEnabled)) then { _temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL _unit) select 2); _muzzleVelocityShift = [_ammo, _temperature] call FUNC(calculateAmmoTemperatureVelocityShift); if (_muzzleVelocityShift != 0) then { - _bulletVelocity = velocity _bullet; - _bulletSpeed = vectorMagnitude _bulletVelocity; - _bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift * (_bulletSpeed / _muzzleVelocity))); + _bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift)); _bullet setVelocity _bulletVelocity; _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; }; }; _bulletTraceVisible = false; -if (GVAR(bulletTraceEnabled) && cameraView == "GUNNER" && currentWeapon ACE_player == primaryWeapon ACE_player && count primaryWeaponItems ACE_player > 2) then { - _opticsName = (primaryWeaponItems ACE_player) select 2; - _opticType = getNumber(configFile >> "cfgWeapons" >> _opticsName >> "ItemInfo" >> "opticType"); - _bulletTraceVisible = (_opticType == 2 || currentWeapon ACE_player in ["ACE_Vector", "Binocular", "Rangefinder", "Laserdesignator"]); +if (GVAR(bulletTraceEnabled) && cameraView == "GUNNER") then { + if (currentWeapon ACE_player in ["ACE_Vector", "Binocular", "Rangefinder", "Laserdesignator"]) then { + _bulletTraceVisible = true; + } else { + if (currentWeapon ACE_player == primaryWeapon ACE_player && count primaryWeaponItems ACE_player > 2) then { + _opticsName = (primaryWeaponItems ACE_player) select 2; + _opticType = getNumber(configFile >> "cfgWeapons" >> _opticsName >> "ItemInfo" >> "opticType"); + _bulletTraceVisible = _opticType == 2; + }; + }; }; _caliber = getNumber(configFile >> "cfgAmmo" >> _ammo >> "ACE_caliber"); @@ -131,253 +120,47 @@ _dragModel = 1; _ballisticCoefficients = []; _velocityBoundaries = []; _atmosphereModel = "ICAO"; -if (GVAR(AdvancedAirDragEnabled)) then { - 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; - }; - }; - 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"); +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; }; }; +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"); +}; -#ifdef USE_ADVANCEDBALLISTICS_DLL - GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000; +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), _airFriction, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _stabilityFactor, _twistDirection, _muzzleVelocity, _transonicStabilityCoef, getPosASL _bullet, EGVAR(weather,Latitude), EGVAR(weather,currentTemperature), EGVAR(weather,Altitude), EGVAR(weather,currentHumidity), overcast, floor(time), time - floor(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(weather,Latitude), EGVAR(weather,currentTemperature), EGVAR(weather,Altitude), EGVAR(weather,currentHumidity), overcast, floor(time), time - floor(time)]; - [{ - private ["_index", "_bullet", "_caliber", "_bulletTraceVisible", "_bulletVelocity", "_bulletPosition"]; - EXPLODE_4_PVT(_this select 0,_bullet,_caliber,_bulletTraceVisible,_index); - - _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 > 600) then { - drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.4*_caliber,0.2*_caliber],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""]; - }; - - 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(time), time - floor(time)]); - - }, GVAR(simulationInterval), [_bullet, _caliber, _bulletTraceVisible, GVAR(currentbulletID)]] call CBA_fnc_addPerFrameHandler; -#else - _index = count GVAR(bulletDatabase); - if (count GVAR(bulletDatabaseFreeIndices) > 0) then { - _index = GVAR(bulletDatabaseFreeIndices) select 0; - GVAR(bulletDatabaseFreeIndices) = GVAR(bulletDatabaseFreeIndices) - [_index]; +[{ + 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 > 600) then { + drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.4*_caliber,0.2*_caliber],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""]; }; - GVAR(bulletDatabase) set[_index, [_bullet, _caliber, _airFriction, _muzzleVelocity, _stabilityFactor, _transonicStabilityCoef, _twistDirection, _unit, _bulletTraceVisible, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _index]]; - GVAR(bulletDatabaseStartTime) set[_index, time]; - GVAR(bulletDatabaseSpeed) set[_index, 0]; - GVAR(bulletDatabaseFrames) set[_index, 1]; - GVAR(bulletDatabaseLastFrame) set[_index, time]; - GVAR(bulletDatabaseHDeflect) set[_index, 0]; - GVAR(bulletDatabaseSpinDrift) set[_index, 0]; + 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(time), time - floor(time)]); - if ((GVAR(bulletDatabaseOccupiedIndices) pushBack _index) == 0) then { - [{ - private ["_bulletDatabaseEntry", "_bullet", "_caliber", "_muzzleVelocity", "_frames", "_speed", "_airFriction", "_airFrictionRef", "_dragModel", "_atmosphereModel", "_ballisticCoefficient", "_ballisticCoefficients", "_velocityBoundaries", "_airDensity", "_stabilityFactor", "_transonicStabilityCoef", "_twistDirection", "_unit", "_bulletTraceVisible", "_index", "_temperature", "_humidity", "_deltaT", "_TOF", "_bulletPosition", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_bulletSpeedAvg", "_wind", "_drag", "_dragRef", "_vect", "_accel", "_accelRef", "_centripetalAccel", "_pressure", "_pressureDeviation", "_windSourceObstacle", "_windSourceTerrain", "_height", "_roughnessLength", "_bulletDir", "_horizontalDeflection", "_horizontalDeflectionPartial", "_spinDrift", "_spinDriftPartial"]; - - { - _bulletDatabaseEntry = (GVAR(bulletDatabase) select _x); - if (!alive (_bulletDatabaseEntry select 0)) then { - _index = _bulletDatabaseEntry select 13; - GVAR(bulletDatabaseOccupiedIndices) = GVAR(bulletDatabaseOccupiedIndices) - [_index]; - GVAR(bulletDatabaseFreeIndices) pushBack _index; - }; - true - } count GVAR(bulletDatabaseOccupiedIndices); - - if (count GVAR(bulletDatabaseOccupiedIndices) == 0) exitWith { - GVAR(bulletDatabase) = []; - GVAR(bulletDatabaseStartTime) = []; - GVAR(bulletDatabaseSpeed) = []; - GVAR(bulletDatabaseFrames) = []; - GVAR(bulletDatabaseLastFrame) = []; - GVAR(bulletDatabaseHDeflect) = []; - GVAR(bulletDatabaseSpinDrift) = []; - GVAR(bulletDatabaseOccupiedIndices) = []; - GVAR(bulletDatabaseFreeIndices) = []; - [_this select 1] call cba_fnc_removePerFrameHandler; - }; - - { - _bulletDatabaseEntry = GVAR(bulletDatabase) select _x; - _bullet = _bulletDatabaseEntry select 0; - _caliber = _bulletDatabaseEntry select 1; - _airFriction = _bulletDatabaseEntry select 2; - _muzzleVelocity = _bulletDatabaseEntry select 3; - _stabilityFactor = _bulletDatabaseEntry select 4; - _transonicStabilityCoef = _bulletDatabaseEntry select 5; - _twistDirection = _bulletDatabaseEntry select 6; - _unit = _bulletDatabaseEntry select 7; - _bulletTraceVisible = _bulletDatabaseEntry select 8; - _ballisticCoefficients = _bulletDatabaseEntry select 9; - _velocityBoundaries = _bulletDatabaseEntry select 10; - _atmosphereModel = _bulletDatabaseEntry select 11; - _dragModel = _bulletDatabaseEntry select 12; - _index = _bulletDatabaseEntry select 13; - - _TOF = time - (GVAR(bulletDatabaseStartTime) select _index); - - _bulletVelocity = velocity _bullet; - _bulletPosition = getPosASL _bullet; - - _bulletSpeed = vectorMagnitude _bulletVelocity; - _bulletDir = (_bulletVelocity select 0) atan2 (_bulletVelocity select 1); - - _speed = (GVAR(bulletDatabaseSpeed) select _index); - GVAR(bulletDatabaseSpeed) set[_index, _speed + _bulletSpeed]; - - _frames = (GVAR(bulletDatabaseFrames) select _index); - GVAR(bulletDatabaseFrames) set[_index, _frames + 1]; - - _bulletSpeedAvg = (_speed / _frames); - - if ((GVAR(SimulationPrecision) < 2) || {_frames % GVAR(SimulationPrecision) == _index % GVAR(SimulationPrecision)}) then { - _deltaT = time - (GVAR(bulletDatabaseLastFrame) select _index); - GVAR(bulletDatabaseLastFrame) set[_index, time]; - - _trueVelocity = _bulletVelocity; - _trueSpeed = _bulletSpeed; - _wind = [0, 0, 0]; - if (GVAR(WindEnabled) && (vectorMagnitude ACE_wind) > 0) then { - _windSourceObstacle = _bulletPosition vectorDiff ((vectorNormalized ACE_wind) vectorMultiply 10); - _windSourceTerrain = _bulletPosition vectorDiff ((vectorNormalized ACE_wind) vectorMultiply 100); - - if (!(lineIntersects [_bulletPosition, _windSourceObstacle]) && !(terrainIntersectASL [_bulletPosition, _windSourceTerrain])) then { - _wind = ACE_wind; - _height = ASLToATL(_bulletPosition) select 2; - _height = 0 max _height min 20; - if (_height < 20) then { - _roughnessLength = _bulletPosition call FUNC(calculateRoughnessLength); - _wind = _wind vectorMultiply (ln(_height / _roughnessLength) / ln(20 / _roughnessLength)); - }; - - _trueVelocity = _bulletVelocity vectorDiff _wind; - _trueSpeed = vectorMagnitude _trueVelocity; - }; - }; - - _airFrictionRef = _airFriction; - if (GVAR(AdvancedAirDragEnabled) && (count _ballisticCoefficients) == (count _velocityBoundaries) + 1) then { - _dragRef = _deltaT * _airFrictionRef * _bulletSpeed * _bulletSpeed; - _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); - _bulletVelocity = _bulletVelocity vectorDiff _accelRef; - - _ballisticCoefficient = (_ballisticCoefficients select 0); - for "_i" from (count _velocityBoundaries) - 1 to 0 step -1 do { - if (_bulletSpeed < (_velocityBoundaries select _i)) exitWith { - _ballisticCoefficient = (_ballisticCoefficients select (_i + 1)); - }; - }; - - if (GVAR(AtmosphericDensitySimulationEnabled)) then { - _pressure = (_bulletPosition select 2) call EFUNC(weather,calculateBarometricPressure); - _temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2); - _humidity = EGVAR(weather,currentHumidity); - _airDensity = STD_AIR_DENSITY_ICAO; - if (_humidity > 0) then { - private ["_pSat", "_vaporPressure", "_partialPressure"]; - // Saturation vapor pressure calculated according to: http://wahiduddin.net/calc/density_algorithms.htm - _pSat = 6.1078 * 10 ^ ((7.5 * _temperature) / (_temperature + 237.3)); - _vaporPressure = _humidity * _pSat; - _partialPressure = (_pressure * 100)- _vaporPressure; - - _airDensity = (_partialPressure * DRY_AIR_MOLAR_MASS + _vaporPressure * WATER_VAPOR_MOLAR_MASS) / (UNIVERSAL_GAS_CONSTANT * KELVIN(_temperature)); - } else { - _airDensity = (_pressure * 100) / (SPECIFIC_GAS_CONSTANT_DRY_AIR * KELVIN(_temperature)); - }; - if (_atmosphereModel == "ICAO") then { - _ballisticCoefficient = (STD_AIR_DENSITY_ICAO / _airDensity) * _ballisticCoefficient; - } else { - _ballisticCoefficient = (STD_AIR_DENSITY_ASM / _airDensity) * _ballisticCoefficient; - }; - }; - - _drag = _deltaT * ([_dragModel, _ballisticCoefficient, _trueSpeed] call FUNC(calculateRetardation)); - _accel = (vectorNormalized _trueVelocity) vectorMultiply (_drag); - _bulletVelocity = _bulletVelocity vectorDiff _accel; - } else { - if (GVAR(AtmosphericDensitySimulationEnabled)) then { - _pressureDeviation = (_bulletPosition select 2) call EFUNC(weather,calculateBarometricPressure) - 1013.25; - _temperature = GET_TEMPERATURE_AT_HEIGHT(_bulletPosition select 2); - _humidity = EGVAR(weather,currentHumidity); - _airFriction = _airFriction + ((_temperature - 15) * 0.0000015 + _humidity * 0.0000040 + _pressureDeviation * -0.0000009); - }; - - if (_airFriction != _airFrictionRef || vectorMagnitude _wind > 0) then { - _dragRef = _deltaT * _airFrictionRef * _bulletSpeed * _bulletSpeed; - _accelRef = (vectorNormalized _bulletVelocity) vectorMultiply (_dragRef); - _bulletVelocity = _bulletVelocity vectorDiff _accelRef; - - _drag = _deltaT * _airFriction * _trueSpeed * _trueSpeed; - _accel = (vectorNormalized _trueVelocity) vectorMultiply (_drag); - _bulletVelocity = _bulletVelocity vectorAdd _accel; - }; - }; - - if (GVAR(CoriolisEnabled) && _bulletSpeedAvg > 0) then { - _horizontalDeflection = 0.0000729 * (_unit distanceSqr _bullet) * sin(EGVAR(weather,Latitude)) / _bulletSpeedAvg; - _horizontalDeflectionPartial = _horizontalDeflection - (GVAR(bulletDatabaseHDeflect) select _index); - GVAR(bulletDatabaseHDeflect) set[_index, _horizontalDeflection]; - _vect = [sin(_bulletDir + 90) * _horizontalDeflectionPartial, cos(_bulletDir + 90) * _horizontalDeflectionPartial, 0]; - - _bulletPosition = _bulletPosition vectorAdd _vect; - }; - - /* - // Negligible effect on the trajectory - if (GVAR(EoetvoesEnabled)) then { - _centripetalAccel = 2 * 0.0000729 * (_muzzleVelocity / -32.2) * cos(EGVAR(weather,Latitude)) * sin(_bulletDir); - _accel = [0, 0, -(_centripetalAccel * _deltaT)]; - - _bulletVelocity = _bulletVelocity vectorAdd _accel; - }; - //*/ - - if (GVAR(SpinDriftEnabled)) then { - _spinDrift = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; - _spinDriftPartial = _spinDrift - (GVAR(bulletDatabaseSpinDrift) select _index); - GVAR(bulletDatabaseSpinDrift) set[_index, _spinDrift]; - _vect = [sin(_bulletDir + 90) * _spinDriftPartial, cos(_bulletDir + 90) * _spinDriftPartial, 0]; - - _bulletPosition = _bulletPosition vectorAdd _vect; - }; - }; - - if (GVAR(TransonicRegionEnabled) && _transonicStabilityCoef < 1) then { - if (_bulletSpeed < 345 && _bulletSpeedAvg > 340 && _bulletSpeed > 335) then { - _accel = [(random 0.8) - 0.4, (random 0.8) - 0.4, (random 0.8) - 0.4]; - _accel = _accel vectorMultiply (1 - _transonicStabilityCoef); - _bulletVelocity = _bulletVelocity vectorAdd _accel; - }; - }; - - if (_bulletTraceVisible && _bulletSpeed > 600 && _bullet distanceSqr _unit > 400) then { - drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.4*_caliber,0.2*_caliber],[[0,0,0,0.6],[0,0,0,0.4]],[1,0],0,0,"","",""]; - }; - - _bullet setVelocity _bulletVelocity; - _bullet setPosASL _bulletPosition; - true - } count GVAR(bulletDatabaseOccupiedIndices); - - }, GVAR(simulationInterval), []] call CBA_fnc_addPerFrameHandler; - }; -#endif +}, GVAR(simulationInterval), [_bullet, _caliber, _bulletTraceVisible, GVAR(currentbulletID)]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/advanced_ballistics/script_component.hpp b/addons/advanced_ballistics/script_component.hpp index 70c2f47990..3334bb3207 100644 --- a/addons/advanced_ballistics/script_component.hpp +++ b/addons/advanced_ballistics/script_component.hpp @@ -1,8 +1,6 @@ #define COMPONENT advanced_ballistics #include "\z\ace\addons\main\script_mod.hpp" -#define USE_ADVANCEDBALLISTICS_DLL - #ifdef DEBUG_ENABLED_ADVANCEDBALLISTICS #define DEBUG_MODE_FULL #endif diff --git a/addons/advanced_ballistics/stringtable.xml b/addons/advanced_ballistics/stringtable.xml index cd6b75cf97..dbf2784f21 100644 --- a/addons/advanced_ballistics/stringtable.xml +++ b/addons/advanced_ballistics/stringtable.xml @@ -1,5 +1,4 @@  - diff --git a/addons/aircraft/stringtable.xml b/addons/aircraft/stringtable.xml index 57fecc2a44..1dd01e08ab 100644 --- a/addons/aircraft/stringtable.xml +++ b/addons/aircraft/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -29,23 +29,25 @@ Open Cargo Door Laderampe öffnen Abrir compuerta de carga - Ourvir rampe cargo + Ourvir la rampe Otwórz drzwi ładowni Otevřít nákladní prostor Rakodórámpa nyitása Открыть грузовой отсек Apri la porta del cargo + Abrir porta de carga Close Cargo Door Laderampe schließen Cerrar compuerta de carga - Fermer rampe cargo + Fermer la rampe Zamknij drzwi ładowni Zavřít nákladní prostor Rakodórámpa zárása Закрыть грузовой отсек Chiudi la porta del cargo + Fechar porta de carga diff --git a/addons/atragmx/RscTitles.hpp b/addons/atragmx/RscTitles.hpp index 76f06744dc..4ae08c20aa 100644 --- a/addons/atragmx/RscTitles.hpp +++ b/addons/atragmx/RscTitles.hpp @@ -760,7 +760,7 @@ class ATragMX_Display { y=0.265*safezoneH+safezoneY+0.35; strings[]={"Height","Width"}; values[]={1,0}; - onToolBoxSelChanged="GVAR(rangeAssistUseTargetHeight)=((_this select 1)==0)"; + onToolBoxSelChanged=QUOTE(GVAR(rangeAssistUseTargetHeight) = ((_this select 1) == 0)); }; class TEXT_TARGET_RANGE_ASSIST_TARGET_SIZE: TEXT_TARGET_RANGE_ASSIST_MEASUREMENT_METHOD { idc=7003; diff --git a/addons/atragmx/functions/fnc_calculate_range_card.sqf b/addons/atragmx/functions/fnc_calculate_range_card.sqf index f3f27f7d3e..cfaf7441f8 100644 --- a/addons/atragmx/functions/fnc_calculate_range_card.sqf +++ b/addons/atragmx/functions/fnc_calculate_range_card.sqf @@ -54,7 +54,7 @@ if (!GVAR(atmosphereModeTBH)) then { private ["_bulletLength", "_stabilityFactor"]; _bulletLength = 1.8; _stabilityFactor = 1.5; -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { if (_bulletDiameter > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { _stabilityFactor = [_bulletDiameter / 10 / 2.54, _bulletLength, _bulletMass * 15.4323584, _barrelTwist / 2.54, _muzzleVelocity, _temperature, _barometricPressure] call EFUNC(advanced_ballistics,calculateStabilityFactor); }; diff --git a/addons/atragmx/functions/fnc_calculate_solution.sqf b/addons/atragmx/functions/fnc_calculate_solution.sqf index f90b299ce9..2049398a9c 100644 --- a/addons/atragmx/functions/fnc_calculate_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_solution.sqf @@ -106,7 +106,7 @@ private ["_wind1", "_wind2", "_windDrift"]; _wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windDirection * 30) * _windSpeed1, 0]; _wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0]; _windDrift = 0; -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _bc = [_bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel] call EFUNC(advanced_ballistics,calculateAtmosphericCorrection); }; @@ -117,7 +117,7 @@ _speedAverage = 0; private ["_eoetvoesMultiplier"]; _eoetvoesMultiplier = 0; -if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then { +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _eoetvoesMultiplier = 2 * (0.0000729 * _muzzleVelocity / -9.80665) * cos(_latitude) * sin(_directionOfFire); }; @@ -142,14 +142,12 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { _trueSpeed = vectorMagnitude _trueVelocity; if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { - if (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false]) then { - _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { - parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])) - } else { - ([_dragModel, _bc, _trueSpeed] call EFUNC(advanced_ballistics,calculateRetardation)) - }; - _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); + _drag = if (missionNamespace getVariable [QEGVAR(advanced_ballistics,extensionAvailable), false]) then { + parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3", _dragModel, _bc, _trueSpeed])) + } else { + ([_dragModel, _bc, _trueSpeed] call EFUNC(advanced_ballistics,calculateRetardation)) }; + _bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag); } else { _bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction); }; @@ -177,23 +175,20 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do { _kineticEnergy = _kineticEnergy * 0.737562149; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then { - if (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false]) then { - _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; - _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); - _windage1 = _windage1 + _horizontalCoriolis; - _windage2 = _windage2 + _horizontalCoriolis; - }; - if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then { - _verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier; - _verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1)); - _elevation = _elevation + _verticalCoriolis; - }; - if (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false]) then { - _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; - _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); - _windage1 = _windage1 + _spinDrift; - _windage2 = _windage2 + _spinDrift; - }; + // Coriolis + _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); + _windage1 = _windage1 + _horizontalCoriolis; + _windage2 = _windage2 + _horizontalCoriolis; + // Eoetvoes + _verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier; + _verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1)); + _elevation = _elevation + _verticalCoriolis; + // Spin drift + _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; + _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); + _windage1 = _windage1 + _spinDrift; + _windage2 = _windage2 + _spinDrift; }; GVAR(rangeCardData) set [_n, [_range, _elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy]]; @@ -217,23 +212,20 @@ _kineticEnergy = 0.5 * (_bulletMass / 1000 * (_bulletSpeed ^ 2)); _kineticEnergy = _kineticEnergy * 0.737562149; if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (_bulletPos select 1) > 0) then { - if (missionNamespace getVariable [QEGVAR(advanced_ballistics,CoriolisEnabled), false]) then { - _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; - _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); - _windage1 = _windage1 + _horizontalCoriolis; - _windage2 = _windage2 + _horizontalCoriolis; - }; - if (missionNamespace getVariable [QEGVAR(advanced_ballistics,EoetvoesEnabled), false]) then { - _verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier; - _verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1)); - _elevation = _elevation + _verticalCoriolis; - }; - if (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false]) then { - _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; - _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); - _windage1 = _windage1 + _spinDrift; - _windage2 = _windage2 + _spinDrift; - }; + // Coriolis + _horizontalDeflection = 0.0000729 * ((_bulletPos select 1) ^ 2) * sin(_latitude) / _speedAverage; + _horizontalCoriolis = - atan(_horizontalDeflection / (_bulletPos select 1)); + _windage1 = _windage1 + _horizontalCoriolis; + _windage2 = _windage2 + _horizontalCoriolis; + // Eoetvoes + _verticalDeflection = (_bulletPos select 2) * _eoetvoesMultiplier; + _verticalCoriolis = - atan(_verticalDeflection / (_bulletPos select 1)); + _elevation = _elevation + _verticalCoriolis; + // Spin drift + _spinDeflection = _twistDirection * 0.0254 * 1.25 * (_stabilityFactor + 1.2) * _TOF ^ 1.83; + _spinDrift = - atan(_spinDeflection / (_bulletPos select 1)); + _windage1 = _windage1 + _spinDrift; + _windage2 = _windage2 + _spinDrift; }; [_elevation * 60, [_windage1 * 60, _windage2 * 60], _lead, _TOF, _bulletSpeed, _kineticEnergy, _verticalCoriolis * 60, _horizontalCoriolis * 60, _spinDrift * 60] diff --git a/addons/atragmx/functions/fnc_calculate_target_solution.sqf b/addons/atragmx/functions/fnc_calculate_target_solution.sqf index 641551fca1..677c4bb793 100644 --- a/addons/atragmx/functions/fnc_calculate_target_solution.sqf +++ b/addons/atragmx/functions/fnc_calculate_target_solution.sqf @@ -54,7 +54,7 @@ if (!GVAR(atmosphereModeTBH)) then { private ["_bulletLength", "_stabilityFactor"]; _bulletLength = 1.8; _stabilityFactor = 1.5; -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,SpinDriftEnabled), false])) then { +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { if (_bulletDiameter > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { _stabilityFactor = [_bulletDiameter / 10 / 2.54, _bulletLength, _bulletMass * 15.4323584, _barrelTwist / 2.54, _muzzleVelocity, _temperature, _barometricPressure] call EFUNC(advanced_ballistics,calculateStabilityFactor); }; diff --git a/addons/atragmx/functions/fnc_parse_input.sqf b/addons/atragmx/functions/fnc_parse_input.sqf index 504c45fb28..2534c2a319 100644 --- a/addons/atragmx/functions/fnc_parse_input.sqf +++ b/addons/atragmx/functions/fnc_parse_input.sqf @@ -60,7 +60,7 @@ private ["_boreHeight", "_bulletMass", "_bulletDiameter", "_airFriction", "_rifl _boreHeight = parseNumber(ctrlText 120000); _bulletMass = parseNumber(ctrlText 120010); _bulletDiameter = parseNumber(ctrlText 120020); -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { _airFriction = 0.1 max parseNumber(ctrlText 120030) min 2; } else { _airFriction = parseNumber(ctrlText 120030) / -1000; @@ -87,7 +87,7 @@ GVAR(workingMemory) set [5, _boreHeight]; GVAR(workingMemory) set [12, _bulletMass]; GVAR(workingMemory) set [13, _bulletDiameter]; GVAR(workingMemory) set [14, _rifleTwist]; -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { GVAR(workingMemory) set [15, _airFriction]; } else { GVAR(workingMemory) set [4, _airFriction]; diff --git a/addons/atragmx/functions/fnc_update_gun.sqf b/addons/atragmx/functions/fnc_update_gun.sqf index 4ca7338e57..aa1f8c44bf 100644 --- a/addons/atragmx/functions/fnc_update_gun.sqf +++ b/addons/atragmx/functions/fnc_update_gun.sqf @@ -26,7 +26,7 @@ if (GVAR(currentUnit) != 2) then { } else { ctrlSetText [110, Str(Round(GVAR(workingMemory) select 12))]; }; -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { ctrlSetText [120, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)]; } else { ctrlSetText [120, Str(Round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)]; diff --git a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf index 4ccae287e7..b11b214500 100644 --- a/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf +++ b/addons/atragmx/functions/fnc_update_gun_ammo_data.sqf @@ -32,7 +32,7 @@ if (GVAR(currentUnit) != 2) then { } else { ctrlSetText [120020, Str(Round((GVAR(workingMemory) select 13) * 1000) / 1000)]; }; -if ((missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) && (missionNamespace getVariable [QEGVAR(advanced_ballistics,AdvancedAirDragEnabled), false])) then { +if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then { ctrlSetText [120030, Str(Round((GVAR(workingMemory) select 15) * 1000) / 1000)]; } else { ctrlSetText [120030, Str(Round((GVAR(workingMemory) select 4) * -1000 * 1000) / 1000)]; diff --git a/addons/atragmx/stringtable.xml b/addons/atragmx/stringtable.xml index dd8fe236a7..cd5eff1181 100644 --- a/addons/atragmx/stringtable.xml +++ b/addons/atragmx/stringtable.xml @@ -1,5 +1,4 @@  - @@ -21,6 +20,7 @@ Abrir ATragMX Ouvrir ATragMX ATragMX öffnen + Apri ATragMX Rugged PDA with ATragMX @@ -28,6 +28,8 @@ Защищенный КПК с ATragMX PDA rugerizada con ATragMX Robuster PDA mit ATragMX + PDA robuste avec ATragMX + PDA Robusto con ATragMX Open ATragMX @@ -36,6 +38,7 @@ Abrir ATragMX Ouvrir ATragMX ATragMX öffnen + Apri ATragMX - + \ No newline at end of file diff --git a/addons/attach/stringtable.xml b/addons/attach/stringtable.xml index 70ed9666b4..02066f26b4 100644 --- a/addons/attach/stringtable.xml +++ b/addons/attach/stringtable.xml @@ -176,8 +176,10 @@ Не удалось присоединить Error al acoplar Připnutí selhalo + Erro ao anexar Przyczepianie nie powiodło się Hozzácsatolás sikertelen + Impossibile Attaccare %1<br/>Attached diff --git a/addons/ballistics/CfgAmmo.hpp b/addons/ballistics/CfgAmmo.hpp index c2d6f0147a..02df51e891 100644 --- a/addons/ballistics/CfgAmmo.hpp +++ b/addons/ballistics/CfgAmmo.hpp @@ -337,7 +337,7 @@ class CfgAmmo { ACE_caliber=0.308; ACE_bulletLength=1.353; ACE_bulletMass=190; - 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_ammoTempMuzzleVelocityShifts[]={-5.3, -5.1, -4.6, -4.2, -3.4, -2.6, -1.4, -0.3, 1.4, 3.0, 5.2}; ACE_ballisticCoefficients[]={0.268}; ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; @@ -353,7 +353,7 @@ class CfgAmmo { ACE_caliber=0.308; ACE_bulletLength=1.489; ACE_bulletMass=220; - 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_ammoTempMuzzleVelocityShifts[]={-5.3, -5.1, -4.6, -4.2, -3.4, -2.6, -1.4, -0.3, 1.4, 3.0, 5.2}; ACE_ballisticCoefficients[]={0.310}; ACE_velocityBoundaries[]={}; ACE_standardAtmosphere="ICAO"; @@ -572,7 +572,6 @@ class CfgAmmo { ACE_caliber=0.366; ACE_bulletLength=1.350; ACE_bulletMass=230; - ACE_transonicStabilityCoef=1; ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; ACE_ballisticCoefficients[]={0.368}; ACE_velocityBoundaries[]={}; diff --git a/addons/ballistics/CfgMagazines.hpp b/addons/ballistics/CfgMagazines.hpp index 9ead13c962..32121e4e87 100644 --- a/addons/ballistics/CfgMagazines.hpp +++ b/addons/ballistics/CfgMagazines.hpp @@ -322,13 +322,14 @@ class CfgMagazines { class 10Rnd_762x54_Mag: 10Rnd_762x51_Mag { initSpeed = 800; }; - class ACE_10Rnd_762x54_Tracer_mag: 16Rnd_9x21_Mag { + class ACE_10Rnd_762x54_Tracer_mag: 10Rnd_762x54_Mag { author = "$STR_ACE_Common_ACETeam"; ammo = "ACE_762x54_Ball_7T2"; displayName = "$STR_ACE_10Rnd_762x54_Tracer_mag_Name"; displayNameShort = "$STR_ACE_10Rnd_762x54_Tracer_mag_NameShort"; descriptionShort = "$STR_ACE_10Rnd_762x54_Tracer_mag_Description"; initSpeed = 800; + tracersEvery = 1; }; class 150Rnd_762x54_Box: 150Rnd_762x51_Box { diff --git a/addons/ballistics/CfgVehicles.hpp b/addons/ballistics/CfgVehicles.hpp index 89f5c26652..82e7fef5e3 100644 --- a/addons/ballistics/CfgVehicles.hpp +++ b/addons/ballistics/CfgVehicles.hpp @@ -9,7 +9,7 @@ class CfgVehicles { //hitPart = "systemChat str _this"; }; }; - + class NATO_Box_Base; class Box_NATO_Wps_F: NATO_Box_Base { class TransportMagazines { @@ -42,6 +42,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk316_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk319_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk319_Mod_0_Mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4); @@ -59,6 +60,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk316_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk319_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk319_Mod_0_Mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,3); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M993_AP_Mag,4); @@ -82,6 +84,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk316_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk319_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk319_Mod_0_Mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); }; }; @@ -200,6 +203,7 @@ class CfgVehicles { MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk316_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk319_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mk319_Mod_0_Mag,4); + MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_Tracer_Dim,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x67_Mk248_Mod_0_Mag,4); MACRO_ADDMAGAZINE(ACE_20Rnd_762x67_Mk248_Mod_1_Mag,4); diff --git a/addons/ballistics/CfgWeapons.hpp b/addons/ballistics/CfgWeapons.hpp index 7e647d2605..0f9dbcfbe4 100644 --- a/addons/ballistics/CfgWeapons.hpp +++ b/addons/ballistics/CfgWeapons.hpp @@ -509,6 +509,7 @@ class CfgWeapons { class srifle_EBR_F: EBR_base_F { magazines[] = { "20Rnd_762x51_Mag", + "ACE_20Rnd_762x51_Mag_Tracer", "ACE_20Rnd_762x51_Mag_Tracer_Dim", "ACE_20Rnd_762x51_Mk316_Mod_0_Mag", "ACE_20Rnd_762x51_M118LR_Mag", @@ -560,6 +561,7 @@ class CfgWeapons { class srifle_DMR_03_F: DMR_03_base_F { magazines[] = { "20Rnd_762x51_Mag", + "ACE_20Rnd_762x51_Mag_Tracer", "ACE_20Rnd_762x51_Mag_Tracer_Dim", "ACE_20Rnd_762x51_Mk316_Mod_0_Mag", "ACE_20Rnd_762x51_M118LR_Mag", @@ -584,6 +586,7 @@ class CfgWeapons { class srifle_DMR_06_camo_F: DMR_06_base_F { magazines[] = { "20Rnd_762x51_Mag", + "ACE_20Rnd_762x51_Mag_Tracer", "ACE_20Rnd_762x51_Mag_Tracer_Dim", "ACE_20Rnd_762x51_Mk316_Mod_0_Mag", "ACE_20Rnd_762x51_M118LR_Mag", diff --git a/addons/ballistics/config.cpp b/addons/ballistics/config.cpp index 8ea75e4460..66ff7d188e 100644 --- a/addons/ballistics/config.cpp +++ b/addons/ballistics/config.cpp @@ -2,7 +2,7 @@ class CfgPatches { class ADDON { - units[] = {"ACE_TargetWall"}; + units[] = {"ACE_TargetWall","ACE_Box_Ammo"}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; diff --git a/addons/ballistics/scripts/initTargetWall.sqf b/addons/ballistics/scripts/initTargetWall.sqf index b09d5897bc..391faaa82e 100644 --- a/addons/ballistics/scripts/initTargetWall.sqf +++ b/addons/ballistics/scripts/initTargetWall.sqf @@ -1,6 +1,8 @@ // by commy2 #include "script_component.hpp" +private ["_wall", "_paper"]; + _wall = _this select 0; if (local _wall) then { diff --git a/addons/ballistics/stringtable.xml b/addons/ballistics/stringtable.xml index 49b39c0af6..eea2f0cb9e 100644 --- a/addons/ballistics/stringtable.xml +++ b/addons/ballistics/stringtable.xml @@ -4,8 +4,8 @@ 6.5mm 30Rnd Tracer IR-DIM Mag - 6,5 mm Nyomjelző IR-DIM 30-as Tár - 6,5 mm 30-Schuss-Magazin Leuchtspur IR-DIM + 6,5mm Nyomjelző IR-DIM 30-as Tár + 6,5mm 30-Patronen-Magazin Leuchtspur IR-DIM Cargador de 30 balas trazadoras IR-DIM de 6,5mm Ch. 6,5mm 30Cps Traçantes IR-DIM Magazynek 6,5mm 30rd Smugacz IR-DIM @@ -16,32 +16,32 @@ 6.5mm IR-DIM - 6,5 mm IR-DIM + 6,5mm IR-DIM 6,5mm IR-DIM 6,5mm IR-DIM 6,5mm IR-DIM 6,5mm IR-DIM 6.5mm IR-DIM 6,5mm IR-DIM - 6.5 IR-DIM + 6.5mm IR-DIM 6,5 мм ИК-трассирующие - Caliber: 6.5x39 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm Nyomjelző IR-DIM<br />Lövedékek: 30<br />Használható: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL - Calibre: 6,5x39 mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL - Calibre: 6,5x39 mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé dans: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm Smugacz IR-DIM<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL - Ráže: 6.5x39 mm Svítící IR-DIM<br />Munice: 30<br />Použití: MX/C/M/SW/3GL - Calibre: 6,5x39 mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL - Calibro: 6.5x39 mm Traccianti IR-DIM <br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL + Caliber: 6.5x39mm Tracer IR-DIM<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6,5x39mm Nyomjelző IR-DIM<br />Lövedékek: 30<br />Használható: MX/C/M/SW/3GL + Kaliber: 6,5x39mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL + Calibre: 6,5x39mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL + Calibre: 6,5x39mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé avec: MX/C/M/SW/3GL + Kaliber: 6,5x39mm Smugacz IR-DIM<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL + Ráže: 6.5x39mm Svítící IR-DIM<br />Munice: 30<br />Použití: MX/C/M/SW/3GL + Calibre: 6,5x39mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL + Calibro: 6.5x39mm Traccianti IR-DIM <br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 6.5mm 30Rnd SD Mag - 6,5 mm Halk 30-as Tár - 6,5 mm 30-Schuss-Magazin SD + 6,5mm Halk 30-as Tár + 6,5mm 30-Patronen-Magazin SD Cargador de 30 balas SD de 6,5mm Ch. 6,5mm 30Cps SD Magazynek 6,5mm 30rd SD @@ -52,7 +52,7 @@ 6.5mm SD - 6,5 mm Halk + 6,5mm Halk 6,5mm SD 6,5mm SD 6,5mm SD @@ -63,21 +63,21 @@ 6,5 мм дозвуковые - Caliber: 6.5x39 mm SD<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm Halk<br />Lövedékek: 30<br />Használható: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm SD<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL - Calibre: 6,5x39 mm SD<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL - Calibre: 6,5x39 mm SD<br />Cartouches: 30<br />Utilisé dans: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm SD<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL - Ráže: 6.5x39 mm SD<br />Munice: 30<br />Použití: MX/C/M/SW/3GL - Calibre: 6,5x39 mm SD<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL - Calibro: 6.5x39 mm Sil.<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL + Caliber: 6.5x39mm SD<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6,5x39mm Halk<br />Lövedékek: 30<br />Használható: MX/C/M/SW/3GL + Kaliber: 6,5x39mm SD<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL + Calibre: 6,5x39mm SD<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL + Calibre: 6,5x39mm SD<br />Cartouches: 30<br />Utilisé avec: MX/C/M/SW/3GL + Kaliber: 6,5x39mm SD<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL + Ráže: 6.5x39mm SD<br />Munice: 30<br />Použití: MX/C/M/SW/3GL + Calibre: 6,5x39mm SD<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL + Calibro: 6.5x39mm Sil.<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 6.5mm 30Rnd AP Mag - 6,5 mm Páncéltörő 30-as Tár - 6,5 mm 30-Schuss-Magazin AP + 6,5mm Páncéltörő 30-as Tár + 6,5mm 30-Patronen-Magazin AP Cargador de 30 balas AP de 6,5mm Ch. 6,5mm 30Cps AP Magazynek 6,5mm 30rd AP @@ -88,7 +88,7 @@ 6.5mm AP - 6,5 mm Páncéltörő + 6,5mm Páncéltörő 6,5mm AP 6,5mm AP 6,5mm AP @@ -99,22 +99,22 @@ 6,5 мм бронебойные - Caliber: 6.5x39 mm AP<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm Páncéltörő<br />Lövedékek: 30<br />Használható: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm AP<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL - Calibre: 6,5x39 mm AP<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL - Calibre: 6,5x39 mm AP<br />Cartouches: 30<br />Utilisé dans: MX/C/M/SW/3GL - Kaliber: 6,5x39 mm AP<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL - Ráže: 6.5x39 mm AP<br />Munice: 30<br />Použití: MX/C/M/SW/3GL - Calibre: 6,5x39 mm AP<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL - Calibro: 6.5x39 mm AP<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL + Caliber: 6.5x39mm AP<br />Rounds: 30<br />Used in: MX/C/M/SW/3GL + Kaliber: 6,5x39mm Páncéltörő<br />Lövedékek: 30<br />Használható: MX/C/M/SW/3GL + Kaliber: 6,5x39mm AP<br />Patronen: 30<br />Eingesetzt von: MX/C/M/SW/3GL + Calibre: 6,5x39mm AP<br />Balas: 30<br />Se usa en: MX/C/M/SW/3GL + Calibre: 6,5x39mm AP<br />Cartouches: 30<br />Utilisé avec: MX/C/M/SW/3GL + Kaliber: 6,5x39mm AP<br />Pociski: 30<br />Używane w: MX/C/M/SW/3GL + Ráže: 6.5x39mm AP<br />Munice: 30<br />Použití: MX/C/M/SW/3GL + Calibre: 6,5x39mm AP<br />Projéteis: 30<br />Usado em: MX/C/M/SW/3GL + Calibro: 6.5x39mm AP<br />Munizioni: 30<br />In uso su: MX/C/M/SW/3GL Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: MX/C/M/SW/3GL 6.5mm 30Rnd Tracer IR-DIM Mag 6,5mm IR-DIM Nyomjelző 30-as Tár - 6,5 mm 30-Schuss-Magazin Leuchtspur IR-DIM + 6,5mm 30-Patronen-Magazin Leuchtspur IR-DIM Cargador de 30 balas trazadoras IR-DIM de 6,5mm Ch. 6,5mm 30Cps Traçantes IR-DIM Magazynek 6,5mm 30rd Smugacz IR-DIM @@ -136,21 +136,21 @@ 6,5 мм ИК-трассирующие - Caliber: 6.5x39 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: Katiba - Kaliber: 6,5x39 mm Nyomjelző IR-DIM<br />Lövedékek: 30<br />Használható: Katiba - Kaliber: 6,5x39 mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: Katiba - Calibre: 6,5x39 mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: Katiba - Calibre: 6,5x39 mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé dans: Katiba - Kaliber: 6,5x39 mm Smugacz IR-DIM<br />Pociski: 30<br />Używane w: Katiba - Ráže: 6.5x39 mm Svítící IR-DIM<br />Munice: 30<br />Použití: Katiba - Calibre: 6,5x39 mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: Katiba - Calibro: 6.5x39 mm Tracciant IR-DIM<br />Munizioni: 30<br />In uso su: Katiba + Caliber: 6.5x39mm Tracer IR-DIM<br />Rounds: 30<br />Used in: Katiba + Kaliber: 6,5x39mm Nyomjelző IR-DIM<br />Lövedékek: 30<br />Használható: Katiba + Kaliber: 6,5x39mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: Katiba + Calibre: 6,5x39mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: Katiba + Calibre: 6,5x39mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé avec: Katiba + Kaliber: 6,5x39mm Smugacz IR-DIM<br />Pociski: 30<br />Używane w: Katiba + Ráže: 6.5x39mm Svítící IR-DIM<br />Munice: 30<br />Použití: Katiba + Calibre: 6,5x39mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: Katiba + Calibro: 6.5x39mm Tracciant IR-DIM<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: Katiba 6.5mm 30Rnd SD Mag - 6,5 mm Halk 30-as Tár - 6,5 mm 30-Schuss-Magazin SD + 6,5mm Halk 30-as Tár + 6,5mm 30-Patronen-Magazin SD Cargador de 30 balas SD de 6,5mm Ch. 6,5mm 30Cps SD Magazynek 6,5mm 30rd SD @@ -161,7 +161,7 @@ 6.5mm SD - 6,5 mm Halk + 6,5mm Halk 6,5mm SD 6,5mm SD 6,5mm SD @@ -172,21 +172,21 @@ 6,5 мм дозвуковые - Caliber: 6.5x39 mm SD<br />Rounds: 30<br />Used in: Katiba - Kaliber: 6,5x39 mm Halk<br />Lövedékek: 30<br />Használható: Katiba - Kaliber: 6,5x39 mm SD<br />Patronen: 30<br />Eingesetzt von: Katiba - Calibre: 6,5x39 mm SD<br />Balas: 30<br />Se usa en: Katiba - Calibre: 6,5x39 mm SD<br />Cartouches: 30<br />Utilisé dans: Katiba - Kaliber: 6,5x39 mm SD<br />Naboje: 30<br />Używane w: Katiba - Ráže: 6.5x39 mm SD<br />Munice: 30<br />Použití: Katiba - Calibre: 6,5x39 mm SD<br />Projéteis: 30<br />Usado em: Katiba - Calibro: 6.5x39 mm Sil.<br />Munizioni: 30<br />In uso su: Katiba + Caliber: 6.5x39mm SD<br />Rounds: 30<br />Used in: Katiba + Kaliber: 6,5x39mm Halk<br />Lövedékek: 30<br />Használható: Katiba + Kaliber: 6,5x39mm SD<br />Patronen: 30<br />Eingesetzt von: Katiba + Calibre: 6,5x39mm SD<br />Balas: 30<br />Se usa en: Katiba + Calibre: 6,5x39mm SD<br />Cartouches: 30<br />Utilisé avec: Katiba + Kaliber: 6,5x39mm SD<br />Naboje: 30<br />Używane w: Katiba + Ráže: 6.5x39mm SD<br />Munice: 30<br />Použití: Katiba + Calibre: 6,5x39mm SD<br />Projéteis: 30<br />Usado em: Katiba + Calibro: 6.5x39mm Sil.<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм дозвуковые<br />Патронов: 30<br />Используются с: Katiba 6.5mm 30Rnd AP Mag - 6,5 mm Páncéltörő 30-as Tár - 6,5 mm 30-Schuss-Magazin AP + 6,5mm Páncéltörő 30-as Tár + 6,5mm 30-Patronen-Magazin AP Cargador de 30 balas AP de 6,5mm Ch. 6,5mm 30Cps AP Magazynek 6,5mm 30rd AP @@ -197,7 +197,7 @@ 6.5mm AP - 6,5 mm Páncéltörő + 6,5mm Páncéltörő 6,5mm AP 6,5mm AP 6,5mm AP @@ -208,22 +208,22 @@ 6,5 мм бронебойные - Caliber: 6.5x39 mm AP<br />Rounds: 30<br />Used in: Katiba - Kaliber: 6,5x39 mm Páncéltörő<br />Lövedékek: 30<br />Használható: Katiba - Kaliber: 6,5x39 mm AP<br />Patronen: 30<br />Eingesetzt von: Katiba - Calibre: 6,5x39 mm AP<br />Balas: 30<br />Se usa en: Katiba - Calibre: 6,5x39 mm AP<br />Cartouches: 30<br />Utilisé dans: Katiba - Kaliber: 6,5x39 mm AP<br />Pociski: 30<br />Używane w: Katiba - Ráže: 6.5x39 mm AP<br />Munice: 30<br />Použití: Katiba - Calibre: 6,5x39 mm AP<br />Projéteis: 30<br />Usado em: Katiba - Calibro: 6.5x39 mm AP<br />Munizioni: 30<br />In uso su: Katiba + Caliber: 6.5x39mm AP<br />Rounds: 30<br />Used in: Katiba + Kaliber: 6,5x39mm Páncéltörő<br />Lövedékek: 30<br />Használható: Katiba + Kaliber: 6,5x39mm AP<br />Patronen: 30<br />Eingesetzt von: Katiba + Calibre: 6,5x39mm AP<br />Balas: 30<br />Se usa en: Katiba + Calibre: 6,5x39mm AP<br />Cartouches: 30<br />Utilisé avec: Katiba + Kaliber: 6,5x39mm AP<br />Pociski: 30<br />Używane w: Katiba + Ráže: 6.5x39mm AP<br />Munice: 30<br />Použití: Katiba + Calibre: 6,5x39mm AP<br />Projéteis: 30<br />Usado em: Katiba + Calibro: 6.5x39mm AP<br />Munizioni: 30<br />In uso su: Katiba Калибр: 6,5x39 мм бронебойные<br />Патронов: 30<br />Используются с: Katiba 5.56mm 30rnd Tracer IR-DIM Mag - 5,56 mm Nyomjelző IR-DIM 30-as Tár - 5,56 mm 30-Schuss-Magazin Leuchtspur IR-DIM + 5,56mm Nyomjelző IR-DIM 30-as Tár + 5,56mm 30-Patronen-Magazin Leuchtspur IR-DIM Cargador de 30 balas trazadoras IR-DIM de 5,56mm Ch. 5,56mm 30Cps Traçantes IR-DIM Magazynek 5,56mm 30rd Smugacz IR-DIM @@ -234,7 +234,7 @@ 5.56mm IR-DIM - 5,56 mm IR-DIM + 5,56mm IR-DIM 5,56mm IR-DIM 5,56mm IR-DIM 5,56mm IR-DIM @@ -245,22 +245,22 @@ 5,56 мм ИК-трассирующие - Caliber: 5.56x45 mm Tracer IR-DIM<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56x45 mm Nyomjelző IR-DIM<br />Lövedékek: 30<br />Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56x45 mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5,56x45 mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5,56x45 mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé dans: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Kaliber: 5,56x45 mm Smugacz IR-DIM<br />Pociski: 30<br />Używane w: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Ráže: 5.56x45 mm Svítící IR-DIM<br />Munice: 30<br />Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibre: 5,56x45 mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR - Calibro: 5.56x45 mm Traccianti IR-DIM<br />Munizioni: 30<br />In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Caliber: 5.56x45mm Tracer IR-DIM<br />Rounds: 30<br />Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56x45mm Nyomjelző IR-DIM<br />Lövedékek: 30<br />Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56x45mm Leuchtspur IR-DIM<br />Patronen: 30<br />Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5,56x45mm Trazadoras IR-DIM<br />Balas: 30<br />Se usa en: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5,56x45mm Traçantes IR-DIM<br />Cartouches: 30<br />Utilisé avec: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Kaliber: 5,56x45mm Smugacz IR-DIM<br />Pociski: 30<br />Używane w: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Ráže: 5.56x45mm Svítící IR-DIM<br />Munice: 30<br />Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibre: 5,56x45mm Traçante IR-DIM<br />Projéteis: 30<br />Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR + Calibro: 5.56x45mm Traccianti IR-DIM<br />Munizioni: 30<br />In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR Калибр: 5,56x45 мм ИК-трассирующие<br />Патронов: 30<br />Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR 7.62mm 20rnd Tracer Mag - 7,62 mm Nyomjelző IR-DIM 20-as Tár - 7,62 mm 20-Schuss-Magazin Leuchtspur + 7,62mm Nyomjelző IR-DIM 20-as Tár + 7,62mm 20-Patronen-Magazin Leuchtspur Cargador de 20 balas trazadores de 7,62mm Ch. 7,62mm 20Cps Traçantes Magazynek 7,62mm 20rd Smugacz @@ -271,7 +271,7 @@ 7.62mm Tracer - 7,62 mm Nyomjelző + 7,62mm Nyomjelző 7,62mm Leuchtspur 7,62mm trazadora 7,62mm Traçantes @@ -282,21 +282,21 @@ 7,62 мм трассирущие - Caliber: 7.62x51 mm Tracer<br />Rounds: 20<br />Used in: Mk18 ABR - Kaliber: 7,62x51 mm Nyomjelző<br />Lövedékek: 20<br />Használható: Mk18 ABR - Kaliber: 7,62x51 mm Leuchtspur<br />Patronen: 20<br />Eingesetzt von: EBR - Calibre: 7,62x51 mm Trazadora<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51 mm Traçantes<br />Cartouches: 20<br />Utilisé dans: EBR - Kaliber: 7,62x51 mm Smugacz<br />Pociski: 20<br />Używane w: Mk18 ABR - Ráže: 7.62x51 mm Svítící<br />Munice: 20<br />Použití: Mk18 ABR - Calibre: 7,62x51 mm Traçante<br />Projéteis: 20<br />Usado em: Mk18 ABR - Calibro: 7.62x51 mm Traccianti<br />Munizioni: 20<br />In uso su: Mk18 ABR + Caliber: 7.62x51mm Tracer<br />Rounds: 20<br />Used in: Mk18 ABR + Kaliber: 7,62x51mm Nyomjelző<br />Lövedékek: 20<br />Használható: Mk18 ABR + Kaliber: 7,62x51mm Leuchtspur<br />Patronen: 20<br />Eingesetzt von: EBR + Calibre: 7,62x51mm Trazadora<br />Balas: 20<br />Se usa en: Mk18 ABR + Calibre: 7,62x51mm Traçantes<br />Cartouches: 20<br />Utilisé avec: EBR + Kaliber: 7,62x51mm Smugacz<br />Pociski: 20<br />Używane w: Mk18 ABR + Ráže: 7.62x51mm Svítící<br />Munice: 20<br />Použití: Mk18 ABR + Calibre: 7,62x51mm Traçante<br />Projéteis: 20<br />Usado em: Mk18 ABR + Calibro: 7.62x51mm Traccianti<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR 7.62mm 20rnd Tracer IR-DIM Mag - 7,62 mm Nyomjelző IR-DIM 20-as Tár - 7,62 mm 20-Schuss-Magazin Leuchtspur IR-DIM + 7,62mm Nyomjelző IR-DIM 20-as Tár + 7,62mm 20-Patronen-Magazin Leuchtspur IR-DIM Cargador de 20 balas trazadoras IR-DIM de 7,62mm Ch. 7,62mm 20Cps Traçantes IR-DIM Magazynek 7,62mm 20rd Smugacz IR-DIM @@ -307,7 +307,7 @@ 7.62mm IR-DIM - 7,62 mm IR-DIM + 7,62mm IR-DIM 7,62mm IR-DIM 7,62mm IR-DIM 7,62mm IR-DIM @@ -318,21 +318,21 @@ 7,62 мм ИК-трассирующие - Caliber: 7.62x51 mm Tracer IR-DIM<br />Rounds: 20<br />Used in: Mk18 ABR - Kaliber: 7,62x51 mm Nyomjelző IR-DIM<br />Lövedékek: 20<br />Használható: Mk18 ABR - Kaliber: 7,62x51 mm Leuchtspur IR-DIM<br />Patronen: 20<br />Eingesetzt von: EBR - Calibre: 7,62x51 mm Trazadoras IR-DIM<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51 mm Traçantes IR-DIM<br />Cartouches: 20<br />Utilisé dans: EBR - Kaliber: 7,62x51 mm Smugacz IR-DIM<br />Pociski: 20<br />Używane w: Mk18 ABR - Ráže: 7.62x51 mm Svítící IR-DIM<br />Munice: 20<br />Použití: Mk18 ABR - Calibre: 7,62x51 mm Traçante IR-DIM<br />Projéteis: 20<br />Usado em: Mk18 ABR - Calibro: 7.62x51 mm Traccianti IR-DIM<br />Munizioni: 20<br />In uso su: Mk18 ABR + Caliber: 7.62x51mm Tracer IR-DIM<br />Rounds: 20<br />Used in: Mk18 ABR + Kaliber: 7,62x51mm Nyomjelző IR-DIM<br />Lövedékek: 20<br />Használható: Mk18 ABR + Kaliber: 7,62x51mm Leuchtspur IR-DIM<br />Patronen: 20<br />Eingesetzt von: EBR + Calibre: 7,62x51mm Trazadoras IR-DIM<br />Balas: 20<br />Se usa en: Mk18 ABR + Calibre: 7,62x51mm Traçantes IR-DIM<br />Cartouches: 20<br />Utilisé avec: EBR + Kaliber: 7,62x51mm Smugacz IR-DIM<br />Pociski: 20<br />Używane w: Mk18 ABR + Ráže: 7.62x51mm Svítící IR-DIM<br />Munice: 20<br />Použití: Mk18 ABR + Calibre: 7,62x51mm Traçante IR-DIM<br />Projéteis: 20<br />Usado em: Mk18 ABR + Calibro: 7.62x51mm Traccianti IR-DIM<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм ИК-трассирующие<br />Патронов: 20<br />Используются с: Mk18 ABR 7.62mm 20Rnd SD Mag - 7,62 mm Halk 20-as Tár - 7,62 mm 20-Schuss-Magazin SD + 7,62mm Halk 20-as Tár + 7,62mm 20-Patronen-Magazin SD Cargador de 20 balas SD de 7,62mm Ch. 7,62mm 20Cps SD Magazynek 7,62mm 20rd SD @@ -343,7 +343,7 @@ 7.62mm SD - 7,62 mm Halk + 7,62mm Halk 7,62mm SD 7,62mm SD 7,62mm SD @@ -354,25 +354,26 @@ 7,62 мм дозвуковые - Caliber: 7.62x51 mm SD<br />Rounds: 20<br />Used in: Mk18 ABR - Kaliber: 7,62x51 mm Halk<br />Lövedékek: 20<br />Használható: Mk18 ABR - Kaliber: 7,62x51 mm SD<br />Patronen: 20<br />Eingesetzt von: EBR - Calibre: 7,62x51 mm SD<br />Balas: 20<br />Se usa en: Mk18 ABR - Calibre: 7,62x51 mm SD<br />Cartouches: 20<br />Utilisé dans: EBR - Kaliber: 7,62x51 mm SD<br />Pociski: 20<br />Używane w: Mk18 ABR - Ráže: 7.62x51 mm SD<br />Munice: 20<br />Použití: Mk18 ABR - Calibre: 7,62x51 mm SD<br />Projéteis: 20<br />Usado em: Mk18 ABR - Calibro: 7.62x51 mm Sil.<br />Munizioni: 20<br />In uso su: Mk18 ABR + Caliber: 7.62x51mm SD<br />Rounds: 20<br />Used in: Mk18 ABR + Kaliber: 7,62x51mm Halk<br />Lövedékek: 20<br />Használható: Mk18 ABR + Kaliber: 7,62x51mm SD<br />Patronen: 20<br />Eingesetzt von: EBR + Calibre: 7,62x51mm SD<br />Balas: 20<br />Se usa en: Mk18 ABR + Calibre: 7,62x51mm SD<br />Cartouches: 20<br />Utilisé avec: EBR + Kaliber: 7,62x51mm SD<br />Pociski: 20<br />Używane w: Mk18 ABR + Ráže: 7.62x51mm SD<br />Munice: 20<br />Použití: Mk18 ABR + Calibre: 7,62x51mm SD<br />Projéteis: 20<br />Usado em: Mk18 ABR + Calibro: 7.62x51mm Sil.<br />Munizioni: 20<br />In uso su: Mk18 ABR Калибр: 7,62x51 мм дозвуковые<br />Патронов: 20<br />Используются с: Mk18 ABR .338 NM 130Rnd Tracer Belt - .338 NM 130-Schuss-Gurt Leuchtspur + .338 NM 130-Patronen-Gurt Leuchtspur Taśma .338 NM 130rd Smugacz Bande .338 NM 130Cps Traçante Cinta de 130 balas trazadoras de .338 NM Лента из 130-ти .338 NM трассирующих + .338 NM 130Rnd Tracciante Belt .338 NM Tracer @@ -382,22 +383,25 @@ .338 NM Traçante .338 NM trazadora .338 NM трассирующие + .338 NM 130Rnd Tracciante Caliber: .338 Norma Magnum Tracer<br />Rounds: 130<br />Used in: SPMG - Kaliber: .338 Norma Magnum Leuchtspur<br />Schuss: 130<br />Verwendet für: SPMG + Kaliber: .338 Norma Magnum Leuchtspur<br />Patronen: 130<br />Eingesetzt von: SPMG Kaliber: .338 Norma Magnum Smugacz<br />Pociski: 130<br />Używany w: SPMG - Calibre: .338 Norma Magnum Traçante<br />Cartouches: 130<br />Utilisé dans: SPMG + Calibre: .338 Norma Magnum Traçante<br />Cartouches: 130<br />Utilisé avec: SPMG Calibre: .338 Norma Magnum trazadora<br />Balas: 130<br />Se usa en: SPMG Калибр: .338 Norma Magnum трассирующие<br />Патронов: 130<br />Используются в: SPMG + Calibro: .338 Norma Magnum Tracciante<br />Munizioni: 130<br />In uso su: SPMG .338 NM 130Rnd IR-DIM Belt - .338 NM 130-Schuss-Gurt Leuchtspur IR-DIM + .338 NM 130-Patronen-Gurt Leuchtspur IR-DIM Taśma .338 NM 130rd IR-DIM Bande .338 NM 130Cps IR-DIM Cinta de 130 balas IR-DIM de .338 NM Лента из 130-ти .338 NM ИК-трассирующих + .338 NM 130Rnd IR-DIM Belt .338 NM IR-DIM @@ -407,22 +411,25 @@ .338 NM IR-DIM .338 NM IR-DIM .338 NM ИК-трассирующие + .338 NM IR-DIM Caliber: .338 Norma Magnum Tracer IR-DIM<br />Rounds: 130<br />Used in: SPMG - Kaliber: .338 Norma Magnum Leuchtspur IR-DIM<br />Schuss: 130<br />Verwendet für: SPMG + Kaliber: .338 Norma Magnum Leuchtspur IR-DIM<br />Patronen: 130<br />Eingesetzt von: SPMG Kaliber: .338 Norma Magnum Smugacz IR-DIM<br />Pociski: 130<br />Używany w: SPMG - Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartouches: 130<br />Utilisé dans: SPMG + Calibre: .338 Norma Magnum Traçante IR-DIM<br />Cartouches: 130<br />Utilisé avec: SPMG Calibre: .338 Norma Magnum trazadora IR-DIM<br />Balas: 130<br />Se usa en: SPMG Калибр: .338 Norma Magnum ИК-трассирующие<br />Патронов: 130<br />Используются с: SPMG + Calibro: .338 Norma Magnum Tracciante IR-DIM<br />Munizioni: 130<br />In uso su: SPMG .338 NM 130Rnd AP Belt - .338 NM 130-Schuss-Gurt Hartkern + .338 NM 130-Patronen-Gurt Hartkern Taśma .338 NM 130rd AP Bande .338 NM 130Cps AP Cinta de 130 balas AP de .338 NM Лента из 130-ти .338 NM бронебойных + .338 NM 130Rnd AP Belt .338 NM AP @@ -432,23 +439,26 @@ .338 NM AP .338 NM AP .338 NM бронебойные + .338 NM AP Caliber: .338 Norma Magnum AP<br />Rounds: 130<br />Used in: SPMG - Kaliber: .338 Norma Magnum Hartkern<br />Schuss: 130<br />Verwendet für: SPMG + Kaliber: .338 Norma Magnum Hartkern<br />Patronen: 130<br />Eingesetzt von: SPMG Kaliber: .338 Norma Magnum AP<br />Pociski: 130<br />Używane w: SPMG - Calibre: .338 Norma Magnum AP<br />Cartouches: 130<br />Utilisé dans: SPMG + Calibre: .338 Norma Magnum AP<br />Cartouches: 130<br />Utilisé avec: SPMG Calibre: .338 Norma Magnum AP<br />Balas: 130<br />Se usa en: SPMG Калибр: .338 Norma Magnum бронебойные<br />Патронов: 130<br />Используются с: SPMG + Calibro: .338 Norma Magnum AP<br />Munizioni: 130<br />In uso su: SPMG 9.3mm 10Rnd Tracer Mag - 9,3mm 10-Schuss-Magazin Leuchtspur + 9,3mm 10-Patronen-Magazin Leuchtspur Magazynek 9.3mm 10rd Smugacz Chargeur 9.3mm 10Cps Traçante Cargador de 10 balas trazadoras de 9.3mm Магазин из 10-ти 9,3 мм трассирующих + 9.3mm 10Rnd Tracer Mag 9.3mm Tracer @@ -458,22 +468,25 @@ 9.3mm Traçante 9.3mm trazadora 9,3 мм трассирующие + 9.3mm Tracer Caliber: 9.3x64mm Tracer<br />Rounds: 10<br />Used in: Cyrus - Kaliber: 9,3x64mm Leuchtspur<br />Schuss: 10<br />Verwendet für: Cyrus - Kaliber: 9,3x64 mm Smugacz<br />Pociski: 10<br />Używany w: Cyrus - Calibre: 9.3x64mm Traçante<br />Cartouches: 10<br />Utilisé dans: Cyrus + Kaliber: 9,3x64mm Leuchtspur<br />Patronen: 10<br />Eingesetzt von: Cyrus + Kaliber: 9,3x64mm Smugacz<br />Pociski: 10<br />Używany w: Cyrus + Calibre: 9.3x64mm Traçante<br />Cartouches: 10<br />Utilisé avec: Cyrus Calibre: 9.3x64mm trazadora<br />Balas: 10<br />Se usa en: Cyrus Калибр: 9,3x64 мм трассирующие<br />Патронов: 10<br />Используются с: Cyrus + Calibro: 9.3x64mm Tracer<br />Munizioni: 10<br />In uso su: Cyrus 9.3mm 10Rnd Tracer IR-DIM Mag - 9,3mm 10-Schuss-Magazin Leuchtspur IR-DIM + 9,3mm 10-Patronen-Magazin Leuchtspur IR-DIM Magazynek 9,3mm 10rd Smugacz IR-DIM Chargeur 9.3mm 10Cps Traçante IR-DIM Cargador de 10 balas trazadoras IR-DIM de 9.3mm Магазин из 10-ти 9,3 мм ИК-трассирующих + 9.3mm 10Rnd Tracciante IR-DIM Mag 9.3mm IR-DIM @@ -483,23 +496,26 @@ 9.3mm IR-DIM 9.3mm IR-DIM 9,3 мм ИК-трассирующие + 9.3mm IR-DIM Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 10<br />Used in: Cyrus - Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Schuss: 10<br />Verwendet für: Cyrus - Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 10<br />Używany w: Cyrus - Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 10<br />Utilisé dans: Cyrus + Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Patronen: 10<br />Eingesetzt von: Cyrus + Kaliber: 9,3x64mm Smugacz IR-DIM<br />Pociski: 10<br />Używany w: Cyrus + Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 10<br />Utilisé avec: Cyrus Calibre: 9.3x64mm trazadora IR-DIM<br />Balas: 10<br />Se usa en: Cyrus Калибр: 9,3x64 мм ИК-трассирующие<br />Патронов: 10<br />Используются с: Cyrus + Calibro: 9.3x64mm Tracciante IR-DIM<br />Munizioni: 10<br />In uso su: Cyrus 9.3mm 150Rnd Tracer Belt - 9,3mm 150-Schuss-Gurt Leuchtspur + 9,3mm 150-Patronen-Gurt Leuchtspur Taśma 9,3mm 150rd Smugacz Bande 9.3mm 150Cps Traçante Cinta de 150 balas trazadoras de 9.3mm Лента из 150-ти 9,3 мм трассирующих + 9.3mm 150Rnd Tracer Belt 9.3mm Tracer @@ -509,22 +525,25 @@ 9.3mm Traçante 9.3mm trazadora 9,3 мм трассирующие + 9.3mm Tracciante Caliber: 9.3x64mm Tracer<br />Rounds: 150<br />Used in: Navid - Kaliber: 9,3x64mm Leuchtspur<br />Schuss: 150<br />Verwendet für: Navid - Kaliber: 9,3x64 mm Smugacz<br />Pociski: 150<br />Używane w: Navid - Calibre: 9.3x64mm Traçante<br />Cartouches: 150<br />Utilisé dans: Navid + Kaliber: 9,3x64mm Leuchtspur<br />Patronen: 150<br />Eingesetzt von: Navid + Kaliber: 9,3x64mm Smugacz<br />Pociski: 150<br />Używane w: Navid + Calibre: 9.3x64mm Traçante<br />Cartouches: 150<br />Utilisé avec: Navid Calibre: 9.3x64mm trazadora<br />Balas: 150<br />Se usa en: Navid Калибр: 9,3x64 мм трассирующие<br />Патронов: 150<br />Используются с: Навид + Calibro: 9.3x64mm Tracciante<br />Munizioni: 150<br />In uso su: Navid 9.3mm 150Rnd Tracer IR-DIM Belt - 9,3mm 150-Schuss-Gurt Leuchtspur IR-DIM + 9,3mm 150-Patronen-Gurt Leuchtspur IR-DIM Taśma 9,3mm 150rd Smugacz IR-DIM Bande 9.3mm 150Cps Traçante IR-DIM Cinta de 150 balas trazadoras IR-DIM de 9.3mm Лента из 150-ти 9,3 мм ИК-трассирующих + 9.3mm 150Rnd Tracciante IR-DIM Belt 9.3mm IR-DIM @@ -534,22 +553,25 @@ 9.3mm IR-DIM 9.3mm IR-DIM 9,3 мм ИК-трассирующие + 9.3mm IR-DIM Caliber: 9.3x64mm Tracer IR-DIM<br />Rounds: 150<br />Used in: Navid - Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Schuss: 150<br />Verwendet für: Navid - Kaliber: 9,3x64 mm Smugacz IR-DIM<br />Pociski: 150<br />Używane w: Navid - Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 150<br />Utilisé dans: Navid + Kaliber: 9,3x64mm Leuchtspur IR-DIM<br />Patronen: 150<br />Eingesetzt von: Navid + Kaliber: 9,3x64mm Smugacz IR-DIM<br />Pociski: 150<br />Używane w: Navid + Calibre: 9.3x64mm Traçante IR-DIM<br />Cartouches: 150<br />Utilisé avec: Navid Calibre: 9.3x64mm trazadora IR-DIM<br />Balas: 150<br />Se usa en: Navid Калибр: 9,3x64 мм ИК-трассирующие<br />Патронов: 150<br />Используются с: Навид + Calibro: 9.3x64mm Tracciante IR-DIM<br />Munizioni: 150<br />In uso su: Navid 9.3mm 150Rnd AP Belt - 9,3mm 150-Schuss-Gurt Hartkern + 9,3mm 150-Patronen-Gurt Hartkern Taśma 9,3mm 150rd AP Bande 9.3mm 150Cps AP Cinta de 150 balas AP de 9.3mm Лента из 150-ти 9,3 мм бронебойных + 9.3mm 150Rnd AP Belt 9.3mm AP @@ -559,14 +581,16 @@ 9.3mm AP 9.3mm AP 9,3 мм бронебойные + 9.3mm AP Caliber: 9.3x64mm AP<br />Rounds: 150<br />Used in: Navid - Kaliber: 9,3x64mm Hartkern<br />Schuss: 150<br />Verwendet für: Navid - Kaliber: 9,3x64 mm AP<br />Pociski: 150<br />Używane w: Navid - Calibre: 9.3x64mm AP<br />Cartouches: 150<br />Utilisé dans: Navid + Kaliber: 9,3x64mm Hartkern<br />Patronen: 150<br />Eingesetzt von: Navid + Kaliber: 9,3x64mm AP<br />Pociski: 150<br />Używane w: Navid + Calibre: 9.3x64mm AP<br />Cartouches: 150<br />Utilisé avec: Navid Calibre: 9.3x64mm AP<br />Balas: 150<br />Se usa en: Navid Калибр: 9,3x64 мм бронебойные<br />Патронов: 150<br />Используются с: Навид + Calibro: 9.3x64mm AP<br />Munizioni: 150<br />In uso su: Navid 9x19mm 16Rnd Mag @@ -574,6 +598,8 @@ Chargeur 9x19mm 16Cps Cargador de 16 balas de 9x19mm Магазин из 16-ти 9х19 мм + 9x19mm 20-Patronen-Magazin + 9x19mm 16Rnd Mag 9x19mm @@ -581,20 +607,26 @@ 9x19mm 9x19mm 9х19 мм + 9x19mm + 9x19mm 9x19mm 30Rnd Mag Magazynek 9x19mm 16rd - 9x19mm 30Cps + Chargeur 9x19mm 30Cps Cargador de 16 balas de 9x19mm Магазин из 16-ти 9х19 мм + 9x19mm 30-Patronen-Magazin + 9x19mm 30Rnd Mag 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd - 9x19mm 30Cps + Chargeur 9x19mm 30Cps Cargador de 30 balas de 9x19mm Магазин из 30-ти 9х19 мм + 9x19mm 30-Patronen-Magazin + 9x19mm 30Rnd Mag 9x19mm @@ -602,34 +634,44 @@ 9x19mm 9x19mm 9х19 мм + 9x19mm + 9x19mm 9x19mm 30Rnd Mag Magazynek 9x19mm 30rd - 9x19mm 30Cps + Chargeur 9x19mm 30Cps Cargador de 30 balas de 9x19mm Магазин из 30-ти 9х19 мм + 9x19mm 30-Patronen-Magazin + 9x19mm 30Rnd Mag - 7.62x54mm 10Rnd Tracer IR-DIM Mag - Magazynek 7,62x54 mm 10rd Smugacz IR-DIM - Chargeur 7.62x54mm 10Rnd Traçante IR-DIM - Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm + 7.62x54mm 10Rnd Tracer Mag + Magazynek 7,62x54mm 10rd Smugacz + Chargeur 7.62x54mm 10Rnd Traçante + Cargador de 10 balas trazadoras de 7.62x54mm Магазин из 10-ти 7,62 мм ИК-трассирующих + 7,62x54mm 10-Patronen-Magazin Leuchtspur + 7.62x54mm 10Munizioni Traccianti IR-DIM Mag - 7.62mm IR-DIM - 7,62mm IR-DIM - 7.62mm IR-DIM - 7.62mm IR-DIM - 7,62 мм ИК-трассирующие + 7.62mm + 7,62mm + 7.62mm + 7.62mm + 7,62 мм + 7,62x54mm + 7.62mm IR-DIM - 7.62x54mm 10Rnd Tracer IR-DIM Mag - Magazynek 7,62x54 mm 10rd Smugacz IR-DIM - Chargeur 7.62x54mm 10Cps Traçante IR-DIM - Cargador de 10 balas trazadoras IR-DIM de 7.62x54mm + 7.62x54mm 10Rnd Tracer Mag + Magazynek 7,62x54mm 10rd Smugacz + Chargeur 7.62x54mm 10Cps Traçante + Cargador de 10 balas trazadoras de 7.62x54mm Магазин из 10-ти 7,62 мм ИК-трассирующих + 7,62x54mm 10-Patronen-Magazin Leuchtspur + 7.62x54mm 10Munizioni Traccianti IR-DIM Mag 6.5mm 100Rnd Tracer IR-DIM Mag @@ -637,6 +679,8 @@ Chargeur 6.5mm 100Rnd Traçante IR-DIM Cargador de 100 balas trazadoras IR-DIM de 6.5mm Магазин из 100 6,5 мм ИК-трассирующих + 6,5mm 100-Patronen-Magazin IR-DIM Leuchtspur + 6.5mm 100Munizioni Traccianti IR-DIM Mag 6.5mm IR-DIM @@ -644,13 +688,17 @@ 6.5mm IR-DIM 6.5mm IR-DIM 6,5 мм ИК-трассирующие + 6,5mm IR-DIM + 6.5mm IR-DIM 6.5mm 100Rnd Tracer IR-DIM Mag<br />Rounds: 100<br />Used in: MX LSW Magazynek 6,5mm 100rd Smugacz IR-DIM - Chargeur 6.5mm 100Rnd Traçante IR-DIM + Chargeur 6.5mm 100Rnd Traçante IR-DIM<br />Cartouches: 100<br />Utilisé avec: MX LSW Cargador de 100 balas trazadoras IR-DIM de 6.5mm Магазин из 100 6,5 мм ИК-трассирующих + 6,5mm 100-Patronen-Magazin IR-DIM Leuchtspur<br />Patronen: 100<br />Eingesetzt von: MXLSW + 6.5mm 100Rnd Tracer IR-DIM Mag<br />Munizioni: 100<br />In uso su: MX LSW 6.5mm 200Rnd Tracer IR-DIM Belt @@ -658,6 +706,8 @@ Bande 6.5mm 200Rnd Traçante IR-DIM Cinta de 200 balas trazadoras IR-DIM de 6.5mm Магазин из 200-т 6,5 мм ИК-трассирующих + 6,5mm 200-Patronen-Gurt IR-DIM Leuchtspur + 6.5mm 200Rnd Tracer IR-DIM Belt 6.5mm IR-DIM @@ -665,13 +715,17 @@ 6.5mm IR-DIM 6.5mm IR-DIM 6,5 мм ИК-трассирующие + 6,5mm IR-DIM + 6.5mm IR-DIM 6.5mm 200Rnd Tracer IR-DIM Belt<br />Rounds: 200<br />Used in: Stoner 99 LMG Magazynek 6,5mm 200rd Smugacz IR-DIM - Bande 6.5mm 200Cps Traçante IR-DIM + Bande 6.5mm 200Cps Traçante IR-DIM<br />Cartouches: 200<br />Utilisé avec: Stoner 99 LMG Cinta de 200 balas trazadoras IR-DIM de 6.5mm Магазин из 200-т 6,5 мм ИК-трассирующих + 6,5mm 200-Patronen-Gurt IR-DIM Leuchtspur<br />Patronen: 200<br />Eingesetzt von: Stoner 99 LMG + 6.5mm 200Rnd Tracer IR-DIM Belt<br />Munizioni: 200<br />In uso su: Stoner 99 LMG 5.56mm 30Rnd Mag (Mk262) @@ -679,6 +733,8 @@ 5.56mm 30Cps (Mk262) Cargador de 30 balas de 5.56mm (Mk262) Магазин из 30-ти 5.56 мм Mk262 + 5,56mm 30-Patronen-Magazin (Mk262) + 5.56mm 30Rnd Mag (Mk262) 5.56mm Mk262 @@ -686,20 +742,26 @@ 5.56mm Mk262 5.56mm Mk262 5,56 мм Mk262 + 5,56mm Mk262 + 5.56mm Mk262 - Caliber: 5.56x45 mm NATO (Mk262)<br />Rounds: 30 - Kaliber: 5,56x45 mm NATO (Mk262)<br />Pociski: 30 - Calibre: 5.56x45 mm NATO (Mk262)<br />Cartouches: 30 - Calibre: 5.56x45 mm NATO (Mk262)<br />Balas: 30 + Caliber: 5.56x45mm NATO (Mk262)<br />Rounds: 30 + Kaliber: 5,56x45mm NATO (Mk262)<br />Pociski: 30 + Calibre: 5.56x45mm NATO (Mk262)<br />Cartouches: 30 + Calibre: 5.56x45mm NATO (Mk262)<br />Balas: 30 Калибр: 5,56x45 мм NATO (Mk262)<br />Патронов: 30 + Kaliber: 5,56x45mm NATO (Mk262)<br />Patronen: 30 + Calibro: 5.56x45 mm NATO (Mk262)<br />Munizioni: 30 5.56mm 30Rnd Mag (Mk318) Magazynek 5,56mm 30rd (Mk318) - 5.56mm 30Cps (Mk318) + Chargeur 5.56mm 30Cps (Mk318) Cargador de 30 balas de 5.56mm (Mk318) Магазин из 30-ти 5.56 мм (Mk318) + 5,56mm 30-Patronen-Magazin (Mk318) + 5.56mm 30Rnd Mag (Mk318) 5.56mm Mk318 @@ -707,41 +769,53 @@ 5.56mm Mk318 5.56mm Mk318 5.56 мм Mk318 + 5,56mm Mk318 + 5.56mm Mk318 - Caliber: 5.56x45 mm NATO (Mk318)<br />Rounds: 30 - Kaliber: 5,56x45 mm NATO (Mk318)<br />Pociski: 30 - Calibre: 5.56x45 mm NATO (Mk318)<br />Cartouches: 30 - Calibre: 5.56x45 mm NATO (Mk318)<br />Balas: 30 + Caliber: 5.56x45mm NATO (Mk318)<br />Rounds: 30 + Kaliber: 5,56x45mm NATO (Mk318)<br />Pociski: 30 + Calibre: 5.56x45mm NATO (Mk318)<br />Cartouches: 30 + Calibre: 5.56x45mm NATO (Mk318)<br />Balas: 30 Калибр: 5,56x45 мм NATO (Mk318)<br />Патронов: 30 + Kaliber: 5,56x45mm NATO (Mk318)<br />Patronen: 30 + Calibro: 5.56x45 mm NATO (Mk318)<br />Munizioni: 30 5.56mm 30Rnd Mag (M995 AP) Magazynek 5,56mm 30rd (M995 AP) - 5.56mm 30Cps (M995 AP) + Chargeur 5.56mm 30Cps (M995 AP) Cargador de 30 balas de 5.56mm (M995 AP) - Магазин из 30-ти 5.56 мм (M995 AP) + Магазин из 30-ти 5.56 мм (M995 бронебойные) + 5,56mm 30-Patronen-Magazin (M995AP) + 5.56mm 30Rnd Mag (M995 AP) 5.56mm AP 5,56mm AP 5.56mm AP 5.56mm AP - 5.56 мм AP + 5.56 мм бронебойные + 5,56mm AP + 5.56mm AP - Caliber: 5.56x45 mm NATO (M995 AP)<br />Rounds: 30 - Kaliber: 5,56x45 mm NATO (M995 AP)<br />Pociski: 30 - Calibre: 5.56x45 mm NATO (M995 AP)<br />Cartouches: 30 - Calibre: 5.56x45 mm NATO (M995 AP)<br />Balas: 30 - Калибр: 5,56x45 мм NATO (M995 AP)<br />Патронов: 30 + Caliber: 5.56x45mm NATO (M995 AP)<br />Rounds: 30 + Kaliber: 5,56x45mm NATO (M995 AP)<br />Pociski: 30 + Calibre: 5.56x45mm NATO (M995 AP)<br />Cartouches: 30 + Calibre: 5.56x45mm NATO (M995 AP)<br />Balas: 30 + Калибр: 5,56x45 мм NATO (M995 бронебойные)<br />Патронов: 30 + Kaliber: 5,56x45mm NATO (M995 AP)<br />Patronen: 30 + Calibro: 5.56x45 mm NATO (M995 AP)<br />Munizioni: 30 7.62mm 10Rnd Mag (M118LR) Magazynek 7,62mm 10rd (M118LR) - 7.62mm 10Cps (M118LR) + Chargeur 7.62mm 10Cps (M118LR) Cargador de 10 balas de 7.62mm (M118LR) Магазин из 10-ти 7,62 мм (M118LR) + 7,62mm 10-Patronen-Magazin (M118LR) + 7.62mm 10Rnd Mag (M118LR) 7.62mm M118LR @@ -749,20 +823,26 @@ 7.62mm M118LR 7.62mm (M118LR) 7,62 мм M118LR + 7,62mm M118LR + 7.62mm M118LR - Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 10 - Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 10 - Calibre: 7.62x51 mm NATO (M118LR)<br />Cartouches: 10 - Calibre: 7.62x51 mm NATO (M118LR)<br />Balas: 10 + Caliber: 7.62x51mm NATO (M118LR)<br />Rounds: 10 + Kaliber: 7,62x51mm NATO (M118LR)<br />Pociski: 10 + Calibre: 7.62x51mm NATO (M118LR)<br />Cartouches: 10 + Calibre: 7.62x51mm NATO (M118LR)<br />Balas: 10 Калибр: 7,62x51 мм NATO (M118LR)<br />Патронов: 10 + Kaliber: 7,62x51mm NATO (M118LR)<br />Patronen: 10 + Calibro: 7.62x51 mm NATO (M118LR)<br />Munizioni: 10 7.62mm 20Rnd Mag (M118LR) Magazynek 7,62mm 20rd (M118LR) - 7.62mm 20Cps (M118LR) + Chargeur 7.62mm 20Cps (M118LR) Cargador de 20 balas de 7.62mm (M118LR) Магазин из 20-ти 7,62 мм (M118LR) + 7,62mm 20-Patronen-Magazin (M118LR) + 7.62mm 20Rnd Mag (M118LR) 7.62mm M118LR @@ -770,20 +850,26 @@ 7.62mm M118LR 7.62mm (M118LR) 7,62 мм M118LR + 7,62mm M118LR + 7.62mm M118LR - Caliber: 7.62x51 mm NATO (M118LR)<br />Rounds: 20 - Kaliber: 7,62x51 mm NATO (M118LR)<br />Pociski: 20 - Calibre: 7.62x51 mm NATO (M118LR)<br />Cartouches: 20 - Calibre: 7.62x51 mm NATO (M118LR)<br />Balas: 20 + Caliber: 7.62x51mm NATO (M118LR)<br />Rounds: 20 + Kaliber: 7,62x51mm NATO (M118LR)<br />Pociski: 20 + Calibre: 7.62x51mm NATO (M118LR)<br />Cartouches: 20 + Calibre: 7.62x51mm NATO (M118LR)<br />Balas: 20 Калибр: 7,62x51 мм NATO (M118LR)<br />Патронов: 20 + Kaliber: 7,62x51mm NATO (M118LR)<br />Patronen: 20 + Calibro: 7.62x51 mm NATO (M118LR)<br />Munizioni: 20 7.62mm 10Rnd Mag (Mk316 Mod 0) Magazynek 7,62mm 10rd (Mk316 Mod 0) - 7.62mm 10Cps (Mk316 Mod 0) + Chargeur 7.62mm 10Cps (Mk316 Mod 0) Cargador de 10 balas de 7.62mm (Mk316 Mod 0) Магазин из 10-ти 7,62 мм (Mk316 Mod 0) + 7,62mm 10-Patronen-Magazin (Mk316 Mod 0) + 7.62mm 10Rnd Mag (Mk316 Mod 0) 7.62mm Mk316 @@ -791,20 +877,26 @@ 7.62mm Mk316 7.62mm Mk316 7,62 мм Mk316 + 7,62mm Mk316 + 7.62mm Mk316 - Caliber: 7.62x51 mm NATO (Mk316 Mod 0)<br />Rounds: 10 - Kaliber: 7,62x51 mm NATO (Mk316 Mod 0)<br />Pociski: 10 - Calibre: 7.62x51 mm NATO (Mk316 Mod 0)<br />Cartouches: 10 - Calibre: 7.62x51 mm NATO (Mk316 Mod 0)<br />Balas: 10 + Caliber: 7.62x51mm NATO (Mk316 Mod 0)<br />Rounds: 10 + Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Pociski: 10 + Calibre: 7.62x51mm NATO (Mk316 Mod 0)<br />Cartouches: 10 + Calibre: 7.62x51mm NATO (Mk316 Mod 0)<br />Balas: 10 Калибр: 7,62x51 мм NATO (Mk316 Mod 0)<br />Патронов: 10 + Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Patronen: 10 + Calibro: 7.62x51 mm NATO (Mk316 Mod 0)<br />Munizioni: 10 7.62mm 20Rnd Mag (Mk316 Mod 0) Magazynek 7,62mm 20rd (Mk316 Mod 0) - 7.62mm 20Cps (Mk316 Mod 0) + Chargeur 7.62mm 20Cps (Mk316 Mod 0) Cargador de 20 balas de 7.62mm (Mk316 Mod 0) Магазин из 20-ти 7,62 мм (Mk316 Mod 0) + 7,62mm 20-Patronen-Magazin (Mk316 Mod 0) + 7.62mm 20Rnd Mag (Mk316 Mod 0) 7.62mm Mk316 @@ -812,41 +904,53 @@ 7.62mm Mk316 7.62mm Mk316 7,62 мм Mk316 + 7,62mm Mk316 + 7.62mm Mk316 - Caliber: 7.62x51 mm NATO (Mk316 Mod 0)<br />Rounds: 20 - Kaliber: 7,62x51 mm NATO (Mk316 Mod 0)<br />Pociski: 20 - Calibre: 7.62x51 mm NATO (Mk316 Mod 0)<br />Cartouches: 20 - Calibre: 7.62x51 mm NATO (Mk316 Mod 0)<br />Balas: 20 + Caliber: 7.62x51mm NATO (Mk316 Mod 0)<br />Rounds: 20 + Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Pociski: 20 + Calibre: 7.62x51mm NATO (Mk316 Mod 0)<br />Cartouches: 20 + Calibre: 7.62x51mm NATO (Mk316 Mod 0)<br />Balas: 20 Калибр: 7,62x51 мм NATO (Mk316 Mod 0)<br />Патронов: 20 + Kaliber: 7,62x51mm NATO (Mk316 Mod 0)<br />Patronen: 20 + Calibro: 7.62x51 mm NATO (Mk316 Mod 0)<br />Munizioni: 20 7.62mm 10Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 10rd (Mk319 Mod 0) - 7.62mm 10Cps (Mk319 Mod 0) + Chargeur 7.62mm 10Cps (Mk319 Mod 0) Cargador de 10 balas de 7.62mm (Mk319 Mod 0) Магазин из 10-ти 7,62 мм (Mk319 Mod 0) + 7,62mm 10-Patronen-Magazin (Mk319 Mod 0) + 7.62mm 10Rnd Mag (Mk319 Mod 0) 7.62mm Mk319 7,62mm Mk319 7.62mm Mk319 7.62mm Mk319 - 7,62mm Mk319 + 7,62 мм Mk319 + 7,62mm Mk319 + 7.62mm Mk319 - Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 10 - Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 10 - Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 10 - Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Balas: 10 + Caliber: 7.62x51mm NATO (Mk319 Mod 0)<br />Rounds: 10 + Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Pociski: 10 + Calibre: 7.62x51mm NATO (Mk319 Mod 0)<br />Cartouches: 10 + Calibre: 7.62x51mm NATO (Mk319 Mod 0)<br />Balas: 10 Калибр: 7,62x51 мм NATO (Mk319 Mod 0)<br />Патронов: 10 + Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Patronen: 10 + Calibro: 7.62x51 mm NATO (Mk319 Mod 0)<br />Munizioni: 10 7.62mm 20Rnd Mag (Mk319 Mod 0) Magazynek 7,62mm 20rd (Mk319 Mod 0) - 7.62mm 20Cps (Mk319 Mod 0) + Chargeur 7.62mm 20Cps (Mk319 Mod 0) Cargador de 20 balas de 7.62mm (Mk319 Mod 0) Магазин из 20-ти 7,62 мм (Mk319 Mod 0) + 7,62mm 20-Patronen-Magazin (Mk319 Mod 0) + 7.62mm 20Rnd Mag (Mk319 Mod 0) 7.62mm Mk319 @@ -854,62 +958,80 @@ 7.62mm Mk319 7.62mm Mk319 7,62 мм Mk319 + 7,62mm Mk319 + 7.62mm Mk319 - Caliber: 7.62x51 mm NATO (Mk319 Mod 0)<br />Rounds: 20 - Kaliber: 7,62x51 mm NATO (Mk319 Mod 0)<br />Pociski: 20 - Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Cartouches: 20 - Calibre: 7.62x51 mm NATO (Mk319 Mod 0)<br />Balas: 20 + Caliber: 7.62x51mm NATO (Mk319 Mod 0)<br />Rounds: 20 + Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Pociski: 20 + Calibre: 7.62x51mm NATO (Mk319 Mod 0)<br />Cartouches: 20 + Calibre: 7.62x51mm NATO (Mk319 Mod 0)<br />Balas: 20 Калибр: 7,62x51 мм NATO (Mk319 Mod 0)<br />Патронов: 20 + Kaliber: 7,62x51mm NATO (Mk319 Mod 0)<br />Patronen: 20 + Calibro: 7.62x51 mm NATO (Mk319 Mod 0)<br />Munizioni: 20 7.62mm 10Rnd Mag (M993 AP) Magazynek 7,62mm 10rd (M993 AP) - 7.62mm 10Cps (M993 AP) + Chargeur 7.62mm 10Cps (M993 AP) Cargador de 10 balas de 7.62mm (M993 AP) - Магазин из 10-ти 7,62 мм (M993 AP) + Магазин из 10-ти 7,62 мм (M993 бронебойные) + 7,62mm 10-Patronen-Magazin (M993 AP) + 7.62mm 10Rnd Mag (M993 AP) 7.62mm AP 7,62mm AP 7.62mm AP 7.62mm AP - 7,62mm AP + 7,62mm бронебойные + 7,62mm AP + 7.62mm AP - Caliber: 7.62x51 mm NATO (M993 AP)<br />Rounds: 10 - Kaliber: 7,62x51 mm NATO (M993 AP)<br />Pociski: 10 - Calibre: 7.62x51 mm NATO (M993 AP)<br />Cartouches: 10 - Calibre: 7.62x51 mm NATO (M993 AP)<br />Balas: 10 - Калибр: 7,62x51 мм NATO (M993 AP)<br />Патронов: 10 + Caliber: 7.62x51mm NATO (M993 AP)<br />Rounds: 10 + Kaliber: 7,62x51mm NATO (M993 AP)<br />Pociski: 10 + Calibre: 7.62x51mm NATO (M993 AP)<br />Cartouches: 10 + Calibre: 7.62x51mm NATO (M993 AP)<br />Balas: 10 + Калибр: 7,62x51 мм NATO (M993 бронебойные)<br />Патронов: 10 + Kaliber: 7,62x51mm NATO (M993 AP)<br />Patronen: 10 + Calibro: 7.62x51 mm NATO (M993 AP)<br />Munizioni: 10 7.62mm 20Rnd Mag (M993 AP) Magazynek 7,62mm 20rd (M993 AP) - 7.62mm 20Cps (M993 AP) + Chargeur 7.62mm 20Cps (M993 AP) Cargador de 20 balas de 7.62mm (M993 AP) - Магазин из 20-ти 7,62 мм (M993 AP) + Магазин из 20-ти 7,62 мм (M993 бронебойные) + 7,62mm 20-Patronen-Magazin (M993 AP) + 7.62mm 20Rnd Mag (M993 AP) 7.62mm AP 7,62mm AP 7.62mm AP 7.62mm AP - 7,62 мм AP + 7,62 мм бронебойные + 7,62mm AP + 7.62mm AP - Caliber: 7.62x51 mm NATO (M993 AP)<br />Rounds: 20 - Kaliber: 7,62x51 mm NATO (M993 AP)<br />Pociski: 20 - Calibre: 7.62x51 mm NATO (M993 AP)<br />Cartouches: 20 - Calibre: 7.62x51 mm NATO (M993 AP)<br />Balas: 20 - Калибр: 7,62x51 мм NATO (M993 AP)<br />Патронов: 20 - + Caliber: 7.62x51mm NATO (M993 AP)<br />Rounds: 20 + Kaliber: 7,62x51mm NATO (M993 AP)<br />Pociski: 20 + Calibre: 7.62x51mm NATO (M993 AP)<br />Cartouches: 20 + Calibre: 7.62x51mm NATO (M993 AP)<br />Balas: 20 + Калибр: 7,62x51 мм NATO (M993 бронебойные)<br />Патронов: 20 + Kaliber: 7,62x51mm NATO (M993 AP)<br />Patronen: 20 + Calibro: 7.62x51 mm NATO (M993 AP)<br />Munizioni: 20 + 7.62mm 20Rnd Mag (Mk248 Mod 0) Magazynek 7,62mm 20rd (Mk248 Mod 0) - 7.62mm 20Cps (Mk248 Mod 0) + Chargeur 7.62mm 20Cps (Mk248 Mod 0) Cargador de 20 balas de 7.62mm (Mk248 Mod 0) Магазин из 20-ти 7,62 мм (Mk248 Mod 0) + 7,62mm 20-Patronen-Magazin (Mk248 Mod 0) + 7.62mm 20Rnd Mag (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) @@ -917,20 +1039,26 @@ 7.62mm (Mk248 Mod 0) 7.62mm (Mk248 Mod 0) 7,62 мм (Mk248 Mod 0) + 7,62mm (Mk248 Mod 0) + 7.62mm (Mk248 Mod 0) - Caliber: 7.62x67 mm NATO (Mk248 Mod 0)<br />Rounds: 20 - Kaliber: 7,62x67 mm NATO (Mk248 Mod 0)<br />Pociski: 20 + Caliber: 7.62x67mm NATO (Mk248 Mod 0)<br />Rounds: 20 + Kaliber: 7,62x67mm NATO (Mk248 Mod 0)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Mk248 Mod 0)<br />Cartouches: 20 - Calibre: 7.62x67 mm NATO (Mk248 Mod 0)<br />Balas: 20 + Calibre: 7.62x67mm NATO (Mk248 Mod 0)<br />Balas: 20 Калибр: 7,62x67 мм NATO (Mk248 Mod 0)<br />Патронов: 20 + Kaliber: 7,62x51mm NATO (Mk248 Mod 0)<br />Patronen: 20 + Calibro: 7.62x67 mm NATO (Mk248 Mod 0)<br />Munizioni: 20 7.62mm 20Rnd Mag (Mk248 Mod 1) Magazynek 7,62mm 20rd (Mk248 Mod 1) - 7.62mm 20Cps (Mk248 Mod 1) + Chargeur 7.62mm 20Cps (Mk248 Mod 1) Cargador de 20 balas de 7.62mm (Mk248 Mod 1) Магазин из 20-ти 7,62 мм (Mk248 Mod 1) + 7,62mm 20-Patronen-Magazin (Mk248 Mod 1) + 7.62mm 20Rnd Mag (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) @@ -938,20 +1066,26 @@ 7.62mm (Mk248 Mod 1) 7.62mm (Mk248 Mod 1) 7,62 мм (Mk248 Mod 1) + 7,62mm (Mk248 Mod 1) + 7.62mm (Mk248 Mod 1) - Caliber: 7.62x67 mm NATO (Mk248 Mod 1)<br />Rounds: 20 - Kaliber: 7,62x67 mm NATO (Mk248 Mod 1)<br />Pociski: 20 + Caliber: 7.62x67mm NATO (Mk248 Mod 1)<br />Rounds: 20 + Kaliber: 7,62x67mm NATO (Mk248 Mod 1)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Mk248 Mod 1)<br />Cartouches: 20 - Calibre: 7.62x67 mm NATO (Mk248 Mod 1)<br />Balas: 20 + Calibre: 7.62x67mm NATO (Mk248 Mod 1)<br />Balas: 20 Калибр: 7,62x67 мм NATO (Mk248 Mod 1)<br />Патронов: 20 + Kaliber: 7,62x51mm NATO (Mk248 Mod 1)<br />Patronen: 20 + Calibro: 7.62x67 mm NATO (Mk248 Mod 1)<br />Munizioni: 20 7.62mm 20Rnd Mag (Berger Hybrid OTM) Magazynek 7,62mm 20rd (Berger Hybrid OTM) - 7.62 20Cps (Berger Hybrid OTM) + Chargeur 7.62 20Cps (Berger Hybrid OTM) Cargador de 20 balas de 7.62mm (Berger Hybrid OTM) Магазин из 20-ти 7,62 мм (Berger Hybrid OTM) + 7,62mm 20-Patronen-Magazin (Berger Hybrid OTM) + 7.62mm 20Rnd Mag (Berger Hybrid OTM) 7.62mm (OTM) @@ -959,20 +1093,26 @@ 7.62mm (OTM) 7.62mm (OTM) 7,62 мм (OTM) + 7,62mm (OTM) + 7.62mm (OTM) - Caliber: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Rounds: 20 - Kaliber: 7,62x67 mm NATO (Berger Hybrid OTM)<br />Pociski: 20 + Caliber: 7.62x67mm NATO (Berger Hybrid OTM)<br />Rounds: 20 + Kaliber: 7,62x67mm NATO (Berger Hybrid OTM)<br />Pociski: 20 Calibre: 7.62x67mm NATO (Berger Hybrid OTM)<br />Cartouches: 20 - Calibre: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Balas: 20 + Calibre: 7.62x67mm NATO (Berger Hybrid OTM)<br />Balas: 20 Калибр: 7,62x67 мм NATO (Berger Hybrid OTM)<br />Патронов: 20 + Kaliber: 7,62x67mm NATO (Berger Hybrid OTM)<br />Patronen: 20 + Calibro: 7.62x67 mm NATO (Berger Hybrid OTM)<br />Munizioni: 20 6.5x47mm 30Rnd Mag (HPBT Scenar) - 6.5x47mm 30Cps (HPBT Scenar) + Chargeur 6.5x47mm 30Cps (HPBT Scenar) Cargador de 30 balas de 6.5x47mm (HPBT Scenar) - Magazynek 6,5x47 mm 30rd (HPBT Scenar) - Магазин из 30-ти 6,5x47 мм (HPBT Scenar) + Magazynek 6,5x47mm 30rd (HPBT Scenar) + Магазин из 30-ти 6,5x47 мм (экспансивные Scenar) + 6,5x47mm 30-Patronen-Magazin (HPBT Scenar) + 6.5x47mm 30Rnd Mag (HPBT Scenar) 6.5mm Lapua @@ -980,16 +1120,25 @@ 6.5mm Lapua 6,5mm Lapua 6,5 мм Lapua + 6,5mm Lapua + 6.5mm Lapua Caliber: 6.5x47mm (HPBT Scenar)<br />Rounds: 30<br />Used in: MXM Calibre: 6.5x47mm (HPBT Scenar)<br />Cartouches: 30 Calibre: 6.5x47mm (HPBT Scenar)<br />Balas: 30 - Kaliber: 6,5x47 mm (HPBT Scenar)<br />Pociski: 30 - Калибр: 6,5x47 мм (HPBT Scenar)<br />Патронов: 30 + Kaliber: 6,5x47mm (HPBT Scenar)<br />Pociski: 30 + Калибр: 6,5x47 мм (экспансивные Scenar)<br />Патронов: 30 + Kaliber: 6,5x47mm (HPBT Scenar)<br />Patronen: 30<br />Eingesetzt von: MXM + Calibro: 6.5x47mm (HPBT Scenar)<br />Munizioni: 30<br />In uso su: MXM 6.5mm Creedmor 30Rnd Mag + Magazynek 6,5mm Creedmor 30rd + 6.5mm Creedmor 30Rnd Mag + Магазин из 30-ти 6,5 мм Creedmor + 6,5mm Creedmor 30-Patronen-Magazin + Chargeur 6.5mm Creedmor 30Cps 6.5mm CM @@ -997,58 +1146,78 @@ 6.5mm CM 6,5mm CM 6,5 мм CM + 6,5mm CM + 6.5mm CM - Caliber: 6.5mm Creedmor<br />Rounds: 30<br />Used in: MXM + Caliber: 6.5x47mm Creedmor<br />Rounds: 30<br />Used in: MXM + Kaliber: 6,5x47mm Creedmor<br />Pociski: 30<br />Używany w: MXM + Kaliber: 6,5x47mm Creedmor<br />Patronen: 30<br />Eingesetzt von: MXM + Calibre: 6.5x47mm Creedmor <br />Cartouches: 30<br />Utilisé avec: MXM + Calibro: 6.5mm Creedmor<br />Munizioni: 30<br />In uso su: MXM .338 10Rnd Mag (300gr Sierra MatchKing HPBT) - .338 10 Cps (300gr Sierra MatchKing HPBT) + Chargeur .338 10 Cps (300gr Sierra MatchKing HPBT) Cargador de 10 balas de 8.6x70mm (300gr Sierra MatchKing HPBT) Magazynek .338 10rd (300gr Sierra MatchKing HPBT) - Магазин из 10-ти .338 (300 гран Sierra MatchKing HPBT) + Магазин из 10-ти .338 (300 гран Sierra MatchKing экспансивные) + .338 10-Patronen-Magazin (300gr Sierra MatchKing HPBT) + .338 10Munizioni Mag (300gr Sierra MatchKing HPBT) - .338 (HPBT) - .338 (HPBT) - .338 (HPBT) - .338 (HPBT) - .338 (HPBT) + .338 HPBT + .338 HPBT + .338 HPBT + .338 HPBT + .338 экспансивные + .338 HPBT + .338 (HPBT) Caliber: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Rounds: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Cartouches: 10 Calibre: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Balas: 10 - Kaliber: 8,6x70 mm (300gr Sierra MatchKing HPBT)<br />Pociski: 10 - Калибр: .338 (300 гран Sierra MatchKing HPBT)<br />Патронов: 10 + Kaliber: 8,6x70mm (300gr Sierra MatchKing HPBT)<br />Pociski: 10 + Калибр: 8,6x70mm (300 гран Sierra MatchKing экспансивные)<br />Патронов: 10 + Kaliber: 8,6x70mm (300gr Sierra MatchKing HPBT)<br />Patronen: 10 + Calibro: 8.6x70mm (300gr Sierra MatchKing HPBT)<br />Munizioni: 10 .338 10Rnd Mag (API526) - .338 10Cps (API526) + Chargeur .338 10Cps (API526) Cargador de 10 balas de .338 (API526) Magazynek .338 10rd (API526) Магазин из 10-ти .338 (API526) + .338 10-Patronen-Magazin (API526) + .338 10Rnd Mag (API526) .338 AP .338 AP .338 AP .338 AP - .338 бронебойные + .338 AP + .338 AP + .338 AP Caliber: 8.6x70mm (API526)<br />Rounds: 10 Calibre: 8.6x70mm (API526)<br />Cartouches: 10 Calibre: 8.6x70mm (API526)<br />Balas: 10 - Kaliber: 8,6x70 mm (API526)<br />Pociski: 10 - Калибр: .338 (API526)<br />Патронов: 10 + Kaliber: 8,6x70mm (API526)<br />Pociski: 10 + Калибр: 8,6x70 мм (API526)<br />Патронов: 10 + Kaliber: 8,6x70mm (API526)<br />Patronen: 10 + Calibro: 8.6x70mm (API526)<br />Munizioni: 10 12.7x99mm 5Rnd Mag - 12.7x99mm 5Cps + Chargeur 12.7x99mm 5Cps Cargador de 5 balas de 12.7x99mm - Magazynek 12,7x99 mm 5rd + Magazynek 12,7x99mm 5rd Магазин из 5-ти 12,7x99 мм + 12,7x99mm 5-Patronen-Magazin + 12.7x99mm 5Rnd Mag 12.7mm @@ -1056,38 +1225,53 @@ 12.7mm 12,7mm 12,7 мм + 12,7mm + 12.7mm Caliber: 12.7x99mm<br />Rounds: 5 Calibre: 12.7x99mm<br />Cartouches: 5 Calibre: 12.7x99mm<br />Balas: 5 - Kaliber: 12,7x99 mm<br />Pociski: 5 + Kaliber: 12,7x99mm<br />Pociski: 5 Калибр: 12,7x99 мм<br />Патронов: 5 + Kaliber: 12,7x99mm<br />Patronen: 5 + Calibro: 12.7x99mm<br />Munizioni: 5 12.7x99mm API 5Rnd Mag - 12.7x99mm API 5Cps + Chargeur 12.7x99mm API 5Cps Cargador de 5 balas de 12.7x99mm API Magazynek 12,7x99mm API 5rd + 12.7x99mm API 5Rnd Mag + Магазин из 5-ти 12,7x99 мм (бронебойно-зажигательные) + 12,7x99mm 5-Patronen-Magazin (API) 12.7mm API 12.7mm API 12.7mm API 12,7mm API + 12.7mm API + 12.7 мм бронебойно-зажигательные + 12,7mm API Caliber: 12.7x99mm API<br />Rounds: 5 Calibre: 12.7x99mm API<br />Cartouches: 5 Calibre: 12.7x99mm API<br />Balas: 5 - Kaliber: 12,7x99 mm API<br />Pociski: 5 + Kaliber: 12,7x99mm API<br />Pociski: 5 + Калибр: 12,7x99 мм бронебойно-зажигательные<br />Патронов: 5 + Kaliber:12,7x99mm API<br />Patronen: 5 + Calibro: 12.7x99mm API<br />Munizioni: 5 12.7x99mm 5Rnd Mag (AMAX) - 12.7x99mm 5Rnd Mag (AMAX) + Chargeur 12.7x99mm 5Rnd Mag (AMAX) Cargador de 5 balas de 12.7x99mm (AMAX) - Magazynek 12,7x99 mm 5rd (AMAX) + Magazynek 12,7x99mm 5rd (AMAX) Магазин из 5-ти 12,7x99 мм (A-MAX) + 12,7x99mm 5-Patronen-Magazin (AMAX) + 12.7x99mm 5Rnd Mag (AMAX) 12.7mm @@ -1095,13 +1279,17 @@ 12.7mm 12,7mm 12,7 мм + 12,7mm + 12.7mm Caliber: 12.7x99mm (AMAX)<br />Rounds: 5 Calibre: 12.7x99mm (AMAX)<br />Cartouches: 5 Calibre: 12.7x99mm (AMAX)<br />Balas: 5 - Kaliber: 12,7x99 mm (AMAX)<br />Pociski: 5 + Kaliber: 12,7x99mm (AMAX)<br />Pociski: 5 Калибр: 12,7x99 мм (A-MAX)<br />Патронов: 5 + Calibro: 12.7x99mm (AMAX)<br />Munizioni: 5 + Kaliber:12,7x99mm (AMAX)<br />Patronen: 5 - + \ No newline at end of file diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 10b2d0285f..1e2eb3f201 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -101,25 +101,20 @@ class CfgVehicles { #define MACRO_LOADUNLOADCAPTIVE \ class ACE_Actions { \ class ACE_MainActions { \ - selection = ""; \ - class ACE_LoadCaptive { \ + class GVAR(LoadCaptive) { \ displayName = "$STR_ACE_Captives_LoadCaptive"; \ distance = 4; \ condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(doLoadCaptive)); \ exceptions[] = {"isNotEscorting"}; \ - showDisabled = 0; \ priority = 1.2; \ - hotkey = "L"; \ }; \ - class ACE_UnloadCaptive { \ + class GVAR(UnloadCaptive) { \ displayName = "$STR_ACE_Captives_UnloadCaptive"; \ distance = 4; \ condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive)); \ - showDisabled = 0; \ priority = 1.2; \ - hotkey = "C"; \ }; \ }; \ }; diff --git a/addons/captives/functions/fnc_doEscortCaptive.sqf b/addons/captives/functions/fnc_doEscortCaptive.sqf index 08f44a1437..b8758065d8 100644 --- a/addons/captives/functions/fnc_doEscortCaptive.sqf +++ b/addons/captives/functions/fnc_doEscortCaptive.sqf @@ -22,7 +22,7 @@ PARAMS_3(_unit,_target,_state); if (_state) then { if (_unit getVariable [QGVAR(isEscorting), false]) exitWith {}; - [_unit, _target] call EFUNC(common,claim); + [_unit, _target, false] call EFUNC(common,claim); _unit setVariable [QGVAR(isEscorting), true, true]; _target attachTo [_unit, [0, 1, 0]]; @@ -34,8 +34,7 @@ if (_state) then { {[(_this select 0), ((_this select 0) getVariable [QGVAR(escortedUnit), objNull]), false] call FUNC(doEscortCaptive);}, nil, 20, false, true, "", QUOTE(!isNull (GETVAR(_target,QGVAR(escortedUnit),objNull)))]; - private "_escortFnc"; - _escortFnc = { + [{ EXPLODE_3_PVT((_this select 0),_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 { @@ -45,13 +44,12 @@ if (_state) then { if (!(_unit getVariable [QGVAR(isEscorting), false])) then { [(_this select 1)] call cba_fnc_removePerFrameHandler; - [objNull, _target] call EFUNC(common,claim); + [objNull, _target, false] call EFUNC(common,claim); detach _target; _unit removeAction _actionID; _unit setVariable [QGVAR(escortedUnit), objNull, true]; }; - }; - [_escortFnc, 0, [_unit, _target, _actionID]] call CBA_fnc_addPerFrameHandler; + }, 0, [_unit, _target, _actionID]] call CBA_fnc_addPerFrameHandler; } else { _unit setVariable [QGVAR(isEscorting), false, true]; diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 55a9f6211a..86722a0014 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -1,4 +1,4 @@ - + @@ -119,6 +119,7 @@ Ekwipunek rewidowanej osoby Инвентарь обысканного человека Inventário da pessoa revistada + Inventario delle persone perquisite Frisk person @@ -137,6 +138,7 @@ Se rendre Kapitulieren Rendirse + Render-se Vzdát se Poddaj się Сдаться @@ -148,6 +150,7 @@ Annuler la capitulation Den Kampf erneut aufnehmen Dejar de rendirse + Parar de se render Přestat se vzdávat Podejmij walkę ponownie Прекратить сдачу в плен @@ -181,6 +184,7 @@ Rien sous le curseur Es wurde nichts ausgewählt Nada bajo el ratón + Nada debaixo do mouse Nic není vybráno Nie ma nic pod kursorem Ничего не выделено diff --git a/addons/common/CfgEventHandlers.hpp b/addons/common/CfgEventHandlers.hpp index ce0938f063..bea7b6e7bc 100644 --- a/addons/common/CfgEventHandlers.hpp +++ b/addons/common/CfgEventHandlers.hpp @@ -24,7 +24,7 @@ class Extended_InitPost_EventHandlers { init = QUOTE(if (local (_this select 0)) then {_this call FUNC(setName)};); }; class GVAR(forceWalk) { - init = QUOTE(if (local (_this select 0)) then {_this call FUNC(applyForceWalkStatus);};); + init = QUOTE(_this call FUNC(applyForceWalkStatus)); }; class GVAR(muteUnit) { init = QUOTE(_this call FUNC(muteUnitHandleInitPost)); diff --git a/addons/common/CfgUnitInsignia.hpp b/addons/common/CfgUnitInsignia.hpp new file mode 100644 index 0000000000..aba82823c9 --- /dev/null +++ b/addons/common/CfgUnitInsignia.hpp @@ -0,0 +1,15 @@ + +class CfgUnitInsignia { + class ACE_insignia_logo { + displayName = "ACE3"; + author = "$STR_ACE_Common_ACETeam"; + texture = PATHTOF(data\Insignia_ace3logo_ca.paa); + textureVehicle = ""; + }; + class ACE_insignia_banana { + displayName = "ABE3"; + author = "$STR_ACE_Common_ACETeam"; + texture = PATHTOF(data\insignia_banana_ca.paa); + textureVehicle = ""; + }; +}; diff --git a/addons/common/CfgWeapons.hpp b/addons/common/CfgWeapons.hpp index cf8c06798e..59bb8f6b9a 100644 --- a/addons/common/CfgWeapons.hpp +++ b/addons/common/CfgWeapons.hpp @@ -15,7 +15,7 @@ class CfgWeapons { class ACE_FakePrimaryWeapon: Rifle_Base_F { scope = 2; scopeCurator = 1; - + scopeArsenal = 1; displayName = ""; model = "\A3\Weapons_f\empty"; picture = ""; diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index 3a16ac9d43..7dc07743ed 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -97,14 +97,16 @@ if (!hasInterface) exitWith {}; call COMPILE_FILE(scripts\assignedItemFix); call COMPILE_FILE(scripts\initScrollWheel); -0 spawn { - while {true} do { - waitUntil {!isNull (findDisplay 46)}; sleep 0.1; - findDisplay 46 displayAddEventHandler ["MouseZChanged", QUOTE( _this call GVAR(onScrollWheel) )]; - [false] call FUNC(disableUserInput); - waitUntil {isNull (findDisplay 46)}; - }; +DFUNC(mouseZHandler) = { + waitUntil {!isNull (findDisplay 46)}; sleep 0.1; + findDisplay 46 displayAddEventHandler ["MouseZChanged", QUOTE( _this call GVAR(onScrollWheel) )]; + [false] call FUNC(disableUserInput); }; + +addMissionEventHandler ["Loaded", {[] spawn FUNC(mouseZHandler)}]; +[] spawn FUNC(mouseZHandler); + + enableCamShake true; // Set the name for the current player diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 16bd13fc0c..27647f8d00 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -22,6 +22,7 @@ class CfgPatches { #include "CfgActions.hpp" #include "CfgMoves.hpp" #include "CfgVoice.hpp" +#include "CfgUnitInsignia.hpp" class ACE_Rsc_Display_Base { idd = -1; diff --git a/addons/common/data/insignia_ace3logo_ca.paa b/addons/common/data/insignia_ace3logo_ca.paa new file mode 100644 index 0000000000..5a8ca321d7 Binary files /dev/null and b/addons/common/data/insignia_ace3logo_ca.paa differ diff --git a/addons/common/data/insignia_banana_ca.paa b/addons/common/data/insignia_banana_ca.paa new file mode 100644 index 0000000000..379fd9c733 Binary files /dev/null and b/addons/common/data/insignia_banana_ca.paa differ diff --git a/addons/common/functions/fnc_resetAllDefaults.sqf b/addons/common/functions/fnc_resetAllDefaults.sqf index 63e6764d01..64a8e39fa6 100644 --- a/addons/common/functions/fnc_resetAllDefaults.sqf +++ b/addons/common/functions/fnc_resetAllDefaults.sqf @@ -37,3 +37,4 @@ if (isPlayer _unit) then { }; }foreach ([_unit] call FUNC(getAllDefinedSetVariables)); +_unit setVariable ["ACE_forceWalkStatusNumber", 0, true]; diff --git a/addons/common/functions/fnc_setForceWalkStatus.sqf b/addons/common/functions/fnc_setForceWalkStatus.sqf index 52b674015f..477f76297d 100644 --- a/addons/common/functions/fnc_setForceWalkStatus.sqf +++ b/addons/common/functions/fnc_setForceWalkStatus.sqf @@ -50,4 +50,4 @@ _bitmaskNumber = _forceWalkReasonsBooleans call FUNC(toBitmask); _unit setVariable ["ACE_forceWalkStatusNumber", _bitmaskNumber, true]; // actually apply the forceWalk command globaly -[[_unit], QUOTE(FUNC(applyForceWalkStatus)), _unit] call FUNC(execRemoteFnc); +[[_unit], QUOTE(FUNC(applyForceWalkStatus)), 2] call FUNC(execRemoteFnc); diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index de10a60893..a78ff0a7fc 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -276,6 +276,7 @@ Выключить командное меню Parancsnoki menü kikapcsolása Disabilita Menù di comando + Desabilitar menu de comando Unknown @@ -287,6 +288,7 @@ Ismeretlen Sconosciuto Inconnu + Desconhecido No Voice @@ -298,6 +300,7 @@ Nincs hang Senza voce Pas de voix + Sem voz Accept Requests @@ -309,6 +312,7 @@ Accepter requête Принять запросы Kérések elfogadása + Aceitar Pedido Decline Requests @@ -320,6 +324,7 @@ Отклонить запросы Rejeter requête Kérések elutasítása + Rejeitar pedido Accept Requests send by other players. These can be requests to use / share equipment, perform certain actions. @@ -331,6 +336,7 @@ Принять запросы, отправленные другими игроками. Например, запросы на использование/совместное использование снаряжения, выполнение определенных действий Accepter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalisation d'actions. Más játékosok általi kérések elfogadása. Ezek a kérések vonatkozhatnak a felszerelés használatára/megosztására, valamint különböző cselekményekre. + Aceitar pedidos enviados por outros jogadores. Podem ser pedidos para usar/ compartilhar equipamento, realizar certas ações. Decline Requests send by other players. These can be requests to use / share equipment, perform certain actions. @@ -342,6 +348,7 @@ Отклонить запросы, отправленные другими игроками. Например, запросы на использование/совместное использование снаряжения, выполнение определенных действий Rejeter les requêtes d'autres joueurs. Comme l'utilisation / l'échange d'équipement, la réalisation d'actions. Más játékosok általi kérések elutasítása. Ezek a kérések vonatkozhatnak a felszerelés használatára/megosztására, valamint különböző cselekményekre. + Rejeita pedidos enviados por outros jogadores. Podem ser pedidos para usar/ compartilhar equipamento, realizar certas ações. Feedback icons @@ -353,6 +360,7 @@ Icones d'information Pomocné ikony Visszajelző ikonok + Ícones de Feedback Select the position of or disable the feedback icons on your screen. These icons will show to provide extra feedback on your character status and actions performed. @@ -364,6 +372,7 @@ Sélection de la position ou la désactivation des icones de feedback. Ces icones vous apportent des informations complémentaires sur votre status et sur les actions en cours. Nastavuje pozici nebo vypíná pomocné ikony. Tyto ikony ukazují extra informace ke stavu postavy a vykonávaných činností. Itt beállítható a visszajelző ikonok képernyőn lévő helyzete és jelenléte. Ezek az ikonok extra visszajelzést biztosítanak a karaktered állapotán és végrehajtott cselekvésein. + Selecione a posição ou disabilite a posição dos ícones de feedback na sua tela. Esses ícones irão aparecer para mostrar feedback extra do status do seu personagem e ações realizadas. Progress bar location @@ -375,28 +384,31 @@ Position de la barre de progression Pozice ukazetele průběhu činnosti Állapotjelző sáv helyzete + Local da barra de progresso Set the desired location of the progress bar on your screen. Setze die gewünschte Position der Fortschrittsanzeige fest. Seleccionar la ubicación deseada de la barra de progreso en tu pantalla - Modifica la posizione su schermo della barra di avanzamento. + Modifica la posizione della barra di avanzamernto sullo schermo Установите желаемое положение строки состояния на экране. Ustaw pożądaną lokalizację paska postępu na ekranie Appliquer la position de la barre de progression sur l'écran Nastavuje pozici ukazetele průběhu činnosti na vaší obrazovce. Itt beállítható az állapotjelző sáv képernyődön lévő helyzete. + Define o local desejado da barra de progresso na sua tela. Hint Background color Hintergrundfarbe der Hinweise Color de fondo de las notificaciones - Sfondo dei Suggerimenti + Colore di sfondo dei Suggerimenti Цвет фона всплывающих подсказок Kolor tła powiadomień Notification: couleur de l'arrière plan Barva pozadí nápovědy Súgó háttérszíne + Cor do fundo da hint The color of the background from the ACE hints. @@ -408,28 +420,31 @@ Notification ACE: couleur de l'arrière plan Barva pozadí ACE nápověd. Az ACE-súgók hátterének színe. + A cor de fundo das hints do ACE. Hint text font color Textfarbe der Hinweise Color del texto de las notificaciones - Testo dei Suggerimenti + Il colore del Testo dei Suggerimenti Цвет шрифта всплывающих подсказок Kolor tekstu powiadomień Notification: couleur du texte Barva fontu nápověd. Súgószöveg betűinek színe + Cor do do texto da hint The color of the text font from the ACE hints. This color is the default color for all text displayed through the ACE Hint system, if the hint text has no other color specified. Wähle die Textfarbe für ACE-Hinweise. Die gewählte Farbe wird als Standartfarbe der Hinweise angezeigt, wenn der Hinweis selbst keine spezifische Farbe hat. El color del texto de las notificaciones del ACE. Este es el color predeterminado para todo el texto que se muestra a través del sistema de notificaciones del ACE, si el texto de notificación no tiene otro color especificado. - Il colore del testo dei suggerimenti dell'ACE. Questo è il colore standard per tutti i caratteri mostrati dal sistema di suggerimenti dell'ACE, se questo non è altrimenti specificato. + Il colore del testo dei suggerimenti dell'ACE. Questo è il colore standard per tutti i caratteri mostrati dal sistema di suggerimenti dell'ACE, se il colore del testo non è specificato. Цвет шрифта текста всплывающих подсказок АСЕ. Этот цвет является стандартным для всего текста, транслирующегося через систему подсказок АСЕ, если не установлено другого цвета для текста подсказок. Kolor tekstu dla powiadomień ACE. Ten kolor jest domyślnym dla wszystkich tekstów wyświetlanych poprzez System Powiadomień ACE, jeżeli dla powiadomienia nie określono innego koloru. Notification ACE: couleur du texte. C'est la couleur par défaut de tout texte affiché dans les notifications ACE, si aucune couleur n'est spécifiée pour les notifications Barva fontu ACE nápověd. Toto je standardní barva pro všechen text zobrazovaný ACE nápovědami, pokud nemá nápověda žádnou specifikanou barvu. Az ACE-súgók betűkészletének színek. Ez a szín alapértelmezett az összes szövegre az ACE-súgórendszerben, ha a súgószöveg maga nem ad meg más színt. + A cor do texto das hints do ACE. Essa cor é a cor default para todos os texos exibidos pelo sistema de hints do ACE , caso o texto da hint não tem outra cor especificada. Banana @@ -441,17 +456,19 @@ Banan Banane Banán + Banana A banana is an edible fruit, botanically a berry, produced by several kinds of large herbaceous flowering plants in the genus Musa. Die Bananen (Musa) sind eine Pflanzengattung in der Familie der Bananengewächse (Musaceae) innerhalb der Einkeimblättrigen Pflanzen (Monokotyledonen). Una banana es una fruta comestible, botanicamente una baya, producida por varios tipos de grandes plantas herbáceas del género Musa. Banán je protáhlé ovoce a plod banánovníku (epigeická bobule). - Una banana è un frutto commestibile, nello specifico una bacca cuoiosa, prodotto da un gran numero di grandi pianti erbacee dotate di fiori, della famiglia delle Musaceae. + Una banana è un frutto commestibile, nello specifico una bacca cuoiosa, prodotta da un gran numero di grandi piante erbacee dotate di fiori, della famiglia delle Musaceae. Банан - это съедобный фрукт, ягода с ботанической точки зрения, произрастающий на нескольких видах травянистых растениях рода Банан (Musa). A banán egy ehető gyümölcs, technikai szempontból bogyótermés, melyet több fürtvirágzatú növény termel a Musa rendszertani nemzetségben. Rodzaj roślin z rodziny bananowatych, obejmujący około 80 gatunków.<br />Przedstawiciele są typowymi przedstawicielami flory międzyzwrotnikowej Azji, Afryki i Australii.<br />Część gatunków dostarcza jadalnych owoców. Słowo banan pochodzi prawdopodobnie od arabskiego słowa banan, co oznacza palec, lub afrykańskiego języka wolof, w którym rośliny te określa się mianem banaana. Une banane est un fruit qui, d'un point de vue botanique, fait partie du groupe des baies. Produite par plusieurs sortes de grandes plantes à fleurs herbacées du type Musa. + A banana é uma fruta comestível, botanicamente uma baga, produzida por vários tipos de plantas herbáceas grandes do genero Musa. - \ No newline at end of file + diff --git a/addons/disarming/functions/fnc_openDisarmDialog.sqf b/addons/disarming/functions/fnc_openDisarmDialog.sqf index 832f32ced5..88e0e81be8 100644 --- a/addons/disarming/functions/fnc_openDisarmDialog.sqf +++ b/addons/disarming/functions/fnc_openDisarmDialog.sqf @@ -60,7 +60,7 @@ GVAR(disarmTarget) = _target; //Setup PFEH [{ - private ["_groundContainer", "_targetContainer", "_playerName", "_rankPicture", "_rankIndex", "_targetUniqueItems", "_holderUniqueItems"]; + private ["_groundContainer", "_targetContainer", "_playerName", "_rankPicture", "_rankIndex", "_targetUniqueItems", "_holderUniqueItems", "_holder"]; disableSerialization; EXPLODE_2_PVT(_this,_args,_pfID); EXPLODE_3_PVT(_args,_player,_target,_display); diff --git a/addons/disposable/stringtable.xml b/addons/disposable/stringtable.xml index 7f57998157..d80ac58885 100644 --- a/addons/disposable/stringtable.xml +++ b/addons/disposable/stringtable.xml @@ -11,6 +11,7 @@ Elhasznált kilövőcső Отстрелянная труба Tubo utilizzato + Tubo utilizado Used disposable rocket launcher @@ -22,6 +23,7 @@ Elhasznált eldobható rakétavető Отстрелянная одноразовая пусковая установка Lanciarazzi monouso utilizzato + Lança foguetes descartável utilizado Preloaded Missile Dummy @@ -33,6 +35,7 @@ Előtöltött műrakéta Предзаряженная ракетная болванка Missile stupido precaricato + Míssel dummy pré-carregado diff --git a/addons/dragging/CfgMovesBasic.hpp b/addons/dragging/CfgMovesBasic.hpp new file mode 100644 index 0000000000..de15271416 --- /dev/null +++ b/addons/dragging/CfgMovesBasic.hpp @@ -0,0 +1,8 @@ +class CfgMovesBasic { + class Actions { + class MoveWithInjuredManDragger; + class MoveWithInjuredManDraggerRfl: MoveWithInjuredManDragger { + Up = "amovpercmstpsraswrfldnon"; + }; + }; +}; diff --git a/addons/dragging/config.cpp b/addons/dragging/config.cpp index c58aab607e..cc843d4a68 100644 --- a/addons/dragging/config.cpp +++ b/addons/dragging/config.cpp @@ -14,3 +14,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" +#include "CfgMovesBasic.hpp" diff --git a/addons/dragging/stringtable.xml b/addons/dragging/stringtable.xml index 521ab87006..d981f0792a 100644 --- a/addons/dragging/stringtable.xml +++ b/addons/dragging/stringtable.xml @@ -7,7 +7,7 @@ Arrastrar Ciągnij Táhnout - Tracter + Trainer Ziehen Arrastar Trascina @@ -21,7 +21,7 @@ Položit Lâcher Loslassen - Largar + Soltar Lascia Elengedés diff --git a/addons/explosives/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf index a4a55f8609..998f73ccaf 100644 --- a/addons/explosives/XEH_postInit.sqf +++ b/addons/explosives/XEH_postInit.sqf @@ -37,7 +37,7 @@ player addEventHandler ["Killed", { } count _deadman; }]; player addEventHandler ["Take", { - private ["_item", "_getter", "_giver", "_config"]; + private ["_item", "_getter", "_giver", "_config", "_detonators"]; _item = _this select 2; _getter = _this select 0; _giver = _this select 1; diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf index 3be21df559..953476861b 100644 --- a/addons/explosives/functions/fnc_addCellphoneIED.sqf +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -17,7 +17,11 @@ * Public: No */ #include "script_component.hpp" + EXPLODE_4_PVT(_this,_unit,_explosive,_magazineClass,_extra); + +private["_config", "_detonators", "_hasRequired", "_requiredItems", "_code", "_count", "_codeSet"]; + // Config is the last item in the list of passed in items. _config = (_this select 3) select (count (_this select 3) - 1); @@ -29,7 +33,7 @@ _detonators = [_unit] call FUNC(getDetonators); _hasRequired = false; }; } count _requiredItems; -private ["_code", "_count", "_codeSet"]; + _codeSet = false; while {!_codeSet} do { _code = str(round (random 9999)); diff --git a/addons/explosives/functions/fnc_addClacker.sqf b/addons/explosives/functions/fnc_addClacker.sqf index 7e3529f931..b25c1e1bcd 100644 --- a/addons/explosives/functions/fnc_addClacker.sqf +++ b/addons/explosives/functions/fnc_addClacker.sqf @@ -17,7 +17,7 @@ * Public: Yes */ #include "script_component.hpp" -private ["_clacker", "_config", "_requiredItems", "_hasRequired"]; +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); diff --git a/addons/explosives/functions/fnc_addDetonateActions.sqf b/addons/explosives/functions/fnc_addDetonateActions.sqf index 5081040233..5c94649608 100644 --- a/addons/explosives/functions/fnc_addDetonateActions.sqf +++ b/addons/explosives/functions/fnc_addDetonateActions.sqf @@ -15,7 +15,7 @@ * Public: No */ #include "script_component.hpp" -private ["_result", "_item", "_children"]; +private ["_result", "_item", "_children", "_range", "_required"]; EXPLODE_2_PVT(_this,_unit,_detonator); _range = GetNumber (ConfigFile >> "CfgWeapons" >> _detonator >> "ACE_Range"); diff --git a/addons/explosives/functions/fnc_addExplosiveActions.sqf b/addons/explosives/functions/fnc_addExplosiveActions.sqf index 29a2eed608..214b41602c 100644 --- a/addons/explosives/functions/fnc_addExplosiveActions.sqf +++ b/addons/explosives/functions/fnc_addExplosiveActions.sqf @@ -11,7 +11,7 @@ * Public: No */ #include "script_component.hpp" -private ["_mags", "_item", "_index", "_children"]; +private ["_mags", "_item", "_index", "_children", "_itemCount", "_list"]; EXPLODE_1_PVT(_this,_unit); diff --git a/addons/explosives/functions/fnc_addTransmitterActions.sqf b/addons/explosives/functions/fnc_addTransmitterActions.sqf index 6408eb2ec7..abaa57decc 100644 --- a/addons/explosives/functions/fnc_addTransmitterActions.sqf +++ b/addons/explosives/functions/fnc_addTransmitterActions.sqf @@ -14,7 +14,7 @@ * Public: No */ #include "script_component.hpp" -private ["_items", "_unit", "_children", "_config"]; +private ["_unit", "_children", "_config", "_detonators"]; _unit = _this select 0; _detonators = [_unit] call FUNC(getDetonators); _children = []; diff --git a/addons/explosives/functions/fnc_addTriggerActions.sqf b/addons/explosives/functions/fnc_addTriggerActions.sqf index e9c2dca0e6..6f4ece163c 100644 --- a/addons/explosives/functions/fnc_addTriggerActions.sqf +++ b/addons/explosives/functions/fnc_addTriggerActions.sqf @@ -15,8 +15,7 @@ * Public: No */ #include "script_component.hpp" -private ["_hasRequiredItems","_triggerTypes", "_children", - "_detonators", "_required", "_magTriggers"]; +private ["_hasRequiredItems","_triggerTypes", "_children", "_detonators", "_required", "_magTriggers"]; EXPLODE_2_PVT(_this,_magazine,_explosive); _detonators = [ACE_player] call FUNC(getDetonators); diff --git a/addons/explosives/functions/fnc_canDefuse.sqf b/addons/explosives/functions/fnc_canDefuse.sqf index cd04564a9f..ef4bd10a83 100644 --- a/addons/explosives/functions/fnc_canDefuse.sqf +++ b/addons/explosives/functions/fnc_canDefuse.sqf @@ -14,7 +14,7 @@ * Public: Yes */ #include "script_component.hpp" -private ["_specialist"]; +private ["_isSpecialist"]; EXPLODE_2_PVT(_this,_unit,_target); if (isNull(_target getVariable [QGVAR(Explosive),objNull])) exitWith { deleteVehicle _target; diff --git a/addons/explosives/functions/fnc_detonateExplosive.sqf b/addons/explosives/functions/fnc_detonateExplosive.sqf index f05a265c3a..917c874af6 100644 --- a/addons/explosives/functions/fnc_detonateExplosive.sqf +++ b/addons/explosives/functions/fnc_detonateExplosive.sqf @@ -19,18 +19,18 @@ * Public: Yes */ #include "script_component.hpp" -private ["_result", "_ignoreRange", "_helper"]; +private ["_result", "_ignoreRange", "_helpers", "_pos"]; EXPLODE_3_PVT(_this,_unit,_range,_item); _ignoreRange = (_range == -1); _result = true; if (!_ignoreRange && {(_unit distance (_item select 0)) > _range}) exitWith {false}; -_helper = (attachedTo (_item select 0)); -if (!isNull(_helper)) then { - detach (_item select 0); - deleteVehicle _helper; -}; +_helpers = attachedObjects (_item select 0); +{ + detach _x; + deleteVehicle _x; +} forEach _helpers; if (getNumber (ConfigFile >> "CfgAmmo" >> typeof (_item select 0) >> "TriggerWhenDestroyed") == 0) then { private ["_exp", "_previousExp"]; @@ -46,10 +46,11 @@ if (getNumber (ConfigFile >> "CfgAmmo" >> typeof (_item select 0) >> "TriggerWhe }; }; [{ - _explosive = _this; - if (!isNull _explosive) then { - _explosive setDamage 1; - }; + private ["_explosive"]; + _explosive = _this; + if (!isNull _explosive) then { + _explosive setDamage 1; + }; }, _item select 0, _item select 1, 0] call EFUNC(common,waitAndExecute); _result diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index f00fa8a970..aa163b027f 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -15,7 +15,7 @@ * Public: Yes */ #include "script_component.hpp" -private ["_arr", "_ran", "_i","_speedDial"]; +private ["_arr", "_ran", "_i"]; EXPLODE_2_PVT(_this,_unit,_code); if (_unit getVariable [QGVAR(Dialing),false]) exitWith {}; if !(alive _unit) exitWith {}; diff --git a/addons/explosives/functions/fnc_getDetonators.sqf b/addons/explosives/functions/fnc_getDetonators.sqf index 26bde9b190..da0bdc93d2 100644 --- a/addons/explosives/functions/fnc_getDetonators.sqf +++ b/addons/explosives/functions/fnc_getDetonators.sqf @@ -14,6 +14,8 @@ * Public: Yes */ #include "script_component.hpp" +// IGNORE_PRIVATE_WARNING(_detonators); + private ["_unit", "_items", "_result", "_config"]; _unit = _this select 0; _items = (items _unit); @@ -21,7 +23,7 @@ _result = []; { _config = ConfigFile >> "CfgWeapons" >> _x; - if (getNumber (_config >> "ACE_Detonator") == 1) then { + if (getNumber (_config >> "ACE_Detonator") == 1 && {!(_x in _result)}) then { _result pushBack _x; }; } forEach _items; diff --git a/addons/explosives/functions/fnc_getPlacedExplosives.sqf b/addons/explosives/functions/fnc_getPlacedExplosives.sqf index 1164972047..0c2080923a 100644 --- a/addons/explosives/functions/fnc_getPlacedExplosives.sqf +++ b/addons/explosives/functions/fnc_getPlacedExplosives.sqf @@ -16,6 +16,8 @@ * Public: Yes */ #include "script_component.hpp" +// IGNORE_PRIVATE_WARNING(_allExplosives,_deadmanExplosives); + private ["_unit", "_clackerList", "_adjustedList", "_list", "_filter"]; _unit = _this select 0; _filter = nil; diff --git a/addons/explosives/functions/fnc_hasExplosives.sqf b/addons/explosives/functions/fnc_hasExplosives.sqf index 794cebc57d..bd790bd12f 100644 --- a/addons/explosives/functions/fnc_hasExplosives.sqf +++ b/addons/explosives/functions/fnc_hasExplosives.sqf @@ -14,6 +14,8 @@ * Public: Yes */ #include "script_component.hpp" +// IGNORE_PRIVATE_WARNING(_hasExplosives); + private ["_unit", "_result", "_magazines"]; _result = false; _unit = _this select 0; diff --git a/addons/explosives/functions/fnc_hasPlacedExplosives.sqf b/addons/explosives/functions/fnc_hasPlacedExplosives.sqf index 4a6ccc9de8..174bc07fbc 100644 --- a/addons/explosives/functions/fnc_hasPlacedExplosives.sqf +++ b/addons/explosives/functions/fnc_hasPlacedExplosives.sqf @@ -14,4 +14,6 @@ * Public: Yes */ #include "script_component.hpp" +// IGNORE_PRIVATE_WARNING(_hasPlacedExplosives); + (count (_this call FUNC(getPlacedExplosives)) > 0) diff --git a/addons/explosives/functions/fnc_module.sqf b/addons/explosives/functions/fnc_module.sqf index 3e522e9a70..4080b41bde 100644 --- a/addons/explosives/functions/fnc_module.sqf +++ b/addons/explosives/functions/fnc_module.sqf @@ -15,6 +15,9 @@ */ #include "script_component.hpp" if !(isServer) exitWith {}; + +private["_activated", "_logic"]; + _logic = _this select 0; _activated = _this select 2; diff --git a/addons/explosives/functions/fnc_onLanded.sqf b/addons/explosives/functions/fnc_onLanded.sqf index 59487e651c..f2ed729b1a 100644 --- a/addons/explosives/functions/fnc_onLanded.sqf +++ b/addons/explosives/functions/fnc_onLanded.sqf @@ -1,7 +1,10 @@ /* * 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 @@ -14,19 +17,23 @@ #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 = _setup getVariable [QGVAR(Direction), 0]; + _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; diff --git a/addons/explosives/functions/fnc_placeExplosive.sqf b/addons/explosives/functions/fnc_placeExplosive.sqf index 228e8eef23..4bed019d47 100644 --- a/addons/explosives/functions/fnc_placeExplosive.sqf +++ b/addons/explosives/functions/fnc_placeExplosive.sqf @@ -21,10 +21,14 @@ * Public: Yes */ #include "script_component.hpp" -private ["_ammo", "_explosive"]; +private ["_ammo", "_explosive", "_attachedTo", "_expPos", "_magazineTrigger"]; EXPLODE_6_PVT(_this,_unit,_pos,_dir,_magazineClass,_triggerConfig,_triggerSpecificVars); -if (count _this > 6) then { - deleteVehicle (_this select 6); +DEFAULT_PARAM(6,_setupPlaceholderObject,objNull); + +_attachedTo = objNull; +if (!isNull _setupPlaceholderObject) then { + _attachedTo = attachedTo _setupPlaceholderObject; + deleteVehicle _setupPlaceholderObject; }; if (isNil "_triggerConfig") exitWith { @@ -57,6 +61,11 @@ _expPos = getPosATL _explosive; _defuseHelper setPosATL (((getPosATL _defuseHelper) vectorAdd (_pos vectorDiff _expPos))); _explosive setPosATL _pos; +if (!isNull _attachedTo) then { + TRACE_1("Attaching Live Explosive",_attachedTo); + _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); diff --git a/addons/explosives/functions/fnc_place_Approve.sqf b/addons/explosives/functions/fnc_place_Approve.sqf index 0082a9bd6a..f133dbb080 100644 --- a/addons/explosives/functions/fnc_place_Approve.sqf +++ b/addons/explosives/functions/fnc_place_Approve.sqf @@ -19,7 +19,7 @@ if (GVAR(pfeh_running)) then { [QGVAR(Placement),"OnEachFrame"] call CALLSTACK(BIS_fnc_removeStackedEventHandler); GVAR(pfeh_running) = false; }; -private ["_mag", "_setup", "_player"]; +private ["_setup", "_player", "_dir"]; _setup = GVAR(Setup); GVAR(Setup) = objNull; [GVAR(placer), "ACE_Explosives", false] call EFUNC(Common,setForceWalkStatus); diff --git a/addons/explosives/functions/fnc_setupExplosive.sqf b/addons/explosives/functions/fnc_setupExplosive.sqf index ea3a086274..a0aad3d1ab 100644 --- a/addons/explosives/functions/fnc_setupExplosive.sqf +++ b/addons/explosives/functions/fnc_setupExplosive.sqf @@ -28,7 +28,7 @@ GVAR(Setup) setVariable [QGVAR(class), _class, true]; GVAR(TweakedAngle) = 180; [QGVAR(Placement),"OnEachFrame", { - private "_player"; + private ["_player", "_pos"]; _player = ACE_player; if (GVAR(placer) != _player) exitWith { call FUNC(place_Cancel); diff --git a/addons/explosives/functions/fnc_startDefuse.sqf b/addons/explosives/functions/fnc_startDefuse.sqf index 7eacdd33e1..d3631fdb5f 100644 --- a/addons/explosives/functions/fnc_startDefuse.sqf +++ b/addons/explosives/functions/fnc_startDefuse.sqf @@ -16,11 +16,14 @@ */ #include "script_component.hpp" EXPLODE_2_PVT(_this,_unit,_target); + +private["_actionToPlay"]; + _target = attachedTo (_target); _fnc_DefuseTime = { EXPLODE_2_PVT(_this,_specialist,_target); - + private ["_defuseTime"]; _defuseTime = 5; if (isNumber(ConfigFile >> "CfgAmmo" >> typeOf (_target) >> "ACE_DefuseTime")) then { _defuseTime = getNumber(ConfigFile >> "CfgAmmo" >> typeOf (_target) >> "ACE_DefuseTime"); diff --git a/addons/explosives/functions/fnc_startTimer.sqf b/addons/explosives/functions/fnc_startTimer.sqf index 13da62ec29..9d2ca0aee4 100644 --- a/addons/explosives/functions/fnc_startTimer.sqf +++ b/addons/explosives/functions/fnc_startTimer.sqf @@ -19,6 +19,7 @@ EXPLODE_2_PVT(_this,_explosive,_delay); [{ + private ["_explosive"]; _explosive = _this; if (!isNull _explosive) then { [_explosive, -1, [_explosive, 0]] call FUNC(detonateExplosive); diff --git a/addons/explosives/functions/fnc_triggerType.sqf b/addons/explosives/functions/fnc_triggerType.sqf index fc6a0b90c1..f9d8790a56 100644 --- a/addons/explosives/functions/fnc_triggerType.sqf +++ b/addons/explosives/functions/fnc_triggerType.sqf @@ -14,7 +14,10 @@ * Public: Yes */ #include "script_component.hpp" -private "_result"; + +private["_result", "_config", "_count", "_index", "_supports"]; +// IGNORE_PRIVATE_WARNING(_supports); + _result = []; _config = getArray (ConfigFile >> "CfgMagazines" >> (_this select 0) >> "ACE_Triggers" >> "SupportedTriggers"); _count = count _config; diff --git a/addons/explosives/script_component.hpp b/addons/explosives/script_component.hpp index 60c7e88d06..5ff12b8ba3 100644 --- a/addons/explosives/script_component.hpp +++ b/addons/explosives/script_component.hpp @@ -1,6 +1,8 @@ #define COMPONENT explosives #include "\z\ace\addons\main\script_mod.hpp" +// #define DEBUG_MODE_FULL + #ifdef DEBUG_ENABLED_EXPLOSIVES #define DEBUG_MODE_FULL #endif diff --git a/addons/explosives/stringtable.xml b/addons/explosives/stringtable.xml index 8e941b1f2a..1fbc728cb1 100644 --- a/addons/explosives/stringtable.xml +++ b/addons/explosives/stringtable.xml @@ -42,7 +42,7 @@ Sprengstoffcode: %1 Código del explosivo: %1 Kod ładunku: %1 - Code explosif: %1 + Code de l'explosif: %1 Kód výbušniny: %1 Robbanóanyag kódja: %1 Código do explosivo: %1 @@ -222,7 +222,7 @@ Löschen Borrar Usuń - Désamorçé + Effacer Čistý Libera Törlés @@ -477,7 +477,9 @@ Czuwak Detonador de hombre muerto Dead Man's Switch + Detonador do homem morto Кнопка мертвеца + Detonatore a rilascio Used to remotely trigger explosives when released. @@ -486,9 +488,10 @@ Používaný k vzdálenému odpálení, při uvolnění odpálí výbušniny Używany w celu zdalnej detonacji ładunków, kiedy jego operator zostanie zabity. Utilizado para detonar explosivos remotamente al soltarlo. - Robbanóanyagok távoli robbantásához való, elengedéskor gyújt. + Robbanóanyagok távoli robbantásához + Usado para detonar remotamente o explosivo quando solto. Используется для дистанционного подрыва, после смерти оператора. - Usato per attivare esplosivi quando rilasciato + Usato per attivare esplosivi al momento del rilascio Pick up @@ -500,6 +503,7 @@ Felszedés Поднять Raccogli + Pegar diff --git a/addons/fcs/stringtable.xml b/addons/fcs/stringtable.xml index 857f511fca..f9ebd35a97 100644 --- a/addons/fcs/stringtable.xml +++ b/addons/fcs/stringtable.xml @@ -10,6 +10,8 @@ Iluminar objetivo / Medir distancia Подсветить цель / Замерить расстояние Célpont lézerezése / Távolság Bemérése + Misura la distanza + Marcar com laser / Medir Distância Zeroed To diff --git a/addons/flashsuppressors/stringtable.xml b/addons/flashsuppressors/stringtable.xml index d3185fc2b0..e312f2d5c1 100644 --- a/addons/flashsuppressors/stringtable.xml +++ b/addons/flashsuppressors/stringtable.xml @@ -1,5 +1,4 @@  - diff --git a/addons/frag/ACE_Settings.hpp b/addons/frag/ACE_Settings.hpp new file mode 100644 index 0000000000..b160a127f3 --- /dev/null +++ b/addons/frag/ACE_Settings.hpp @@ -0,0 +1,8 @@ +class ACE_Settings { + class GVAR(enabled) { + displayName = "Frag System"; + description = "Enables the shrapnel system for explosives"; + typeName = "BOOL"; + value = 1; + }; +}; diff --git a/addons/frag/CfgAmmo.hpp b/addons/frag/CfgAmmo.hpp index 94b4e5dbb6..c4841ef96a 100644 --- a/addons/frag/CfgAmmo.hpp +++ b/addons/frag/CfgAmmo.hpp @@ -6,109 +6,190 @@ class CfgAmmo { //class ace_arty_105mm_m1_m782_time; //class ace_arty_105mm_m1_m782_prox: ace_arty_105mm_m1_m782_time {}; //class ace_arty_105mm_m1_m782_delay: ace_arty_105mm_m1_m782_prox { - // ACE_FRAG_SKIP = 1; + // GVAR(skip) = 1; //}; class Bo_GBU12_LGB; - class Nou_GBU12 : Bo_GBU12_LGB { - ACE_FRAG_CLASSES[] = {"ACE_frag_large", "ACE_frag_large", "ACE_frag_large_HD", "ACE_frag_large", "ACE_frag_huge", "ACE_frag_huge_HD", "ACE_frag_huge"}; - ACE_FRAG_METAL = 140000; - ACE_FRAG_CHARGE = 87000; - ACE_FRAG_GURNEY_C = 2320; - ACE_FRAG_GURNEY_K = 1/2; + class ACE_GBU12 : Bo_GBU12_LGB { + GVAR(classes)[] = {"ACE_frag_large", "ACE_frag_large", "ACE_frag_large_HD", "ACE_frag_large", "ACE_frag_huge", "ACE_frag_huge_HD", "ACE_frag_huge"}; + GVAR(metal) = 140000; + GVAR(charge) = 87000; + GVAR(gurney_c) = 2320; + GVAR(gurney_k) = 1/2; sideAirFriction = 0.04; airFriction = 0.04; laserLock = 0; }; - + class GrenadeBase; class Grenade; class GrenadeHand: Grenade { - ACE_FRAG_SKIP = 0; - ACE_FRAG_FORCE = 1; + GVAR(skip) = 0; + GVAR(force) = 1; // This is a good high-drag frag type for grenades. - ACE_FRAG_CLASSES[] = {"ACE_frag_tiny_HD"}; + GVAR(classes)[] = {"ACE_frag_tiny_HD"}; /* These values are based on the M67 Grenade, should be tweaked for individual grenades. */ - ACE_FRAG_METAL = 210; // metal in grams - ACE_FRAG_CHARGE = 185; // explosive in grams - ACE_FRAG_GURNEY_C = 2843; // Gurney velocity constant for explosive type. See: http://en.wikipedia.org/wiki/Gurney_equations - ACE_FRAG_GURNEY_K = 3/5; // Gurney shape factor, in this case a sphere. See: http://en.wikipedia.org/wiki/Gurney_equations + GVAR(metal) = 210; // metal in grams + GVAR(charge) = 185; // explosive in grams + GVAR(gurney_c) = 2843; // Gurney velocity constant for explosive type. See: http://en.wikipedia.org/wiki/Gurney_equations + GVAR(gurney_k) = 3/5; // Gurney shape factor, in this case a sphere. See: http://en.wikipedia.org/wiki/Gurney_equations }; class GrenadeHand_stone: GrenadeHand { - ACE_FRAG_SKIP = 1; + GVAR(skip) = 1; }; class SmokeShell: GrenadeHand { - ACE_FRAG_SKIP = 1; + GVAR(skip) = 1; }; - + class RocketBase; - //class R_Hydra_HE: RocketBase { - // ACE_FRAG_SKIP = 1; - //}; - - //class R_57mm_HE: RocketBase { - // ACE_FRAG_SKIP = 1; - //}; - - class R_80mm_HE: RocketBase { - ACE_FRAG_SKIP = 1; + class R_Hydra_HE: RocketBase { + // Source: http://fas.org/man/dod-101/sys/missile/hydra-70.htm + GVAR(classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"}; + GVAR(metal) = 3850; + GVAR(charge) = 1040; + GVAR(gurney_c) = 2700; + GVAR(gurney_k) = 1/2; }; - - //class R_S8T_AT: RocketBase { - // ACE_FRAG_SKIP = 1; + //class R_57mm_HE: RocketBase { + // GVAR(skip) = 1; //}; - + + class R_80mm_HE: RocketBase { + GVAR(skip) = 1; + }; + + //class R_S8T_AT: RocketBase { + // GVAR(skip) = 1; + //}; + class BombCore; class Bo_Mk82: BombCore { - ACE_FRAG_CLASSES[] = {"ACE_frag_large", "ACE_frag_large", "ACE_frag_large_HD", "ACE_frag_large", "ACE_frag_huge", "ACE_frag_huge_HD", "ACE_frag_huge"}; - ACE_FRAG_METAL = 140000; - ACE_FRAG_CHARGE = 87000; - ACE_FRAG_GURNEY_C = 2320; - ACE_FRAG_GURNEY_K = 1/2; + GVAR(classes)[] = {"ACE_frag_large", "ACE_frag_large", "ACE_frag_large_HD", "ACE_frag_large", "ACE_frag_huge", "ACE_frag_huge_HD", "ACE_frag_huge"}; + GVAR(metal) = 140000; + GVAR(charge) = 87000; + GVAR(gurney_c) = 2320; + GVAR(gurney_k) = 1/2; }; - + class G_40mm_HEDP: GrenadeBase { + // Source: http://www.inetres.com/gp/military/infantry/grenade/40mm_ammo.html#M433 + GVAR(classes)[] = {"ACE_frag_tiny_HD"}; + GVAR(metal) = 200; + GVAR(charge) = 45; + GVAR(gurney_c) = 2830; + GVAR(gurney_k) = 1/2; + }; class G_40mm_HE: GrenadeBase { - ACE_FRAG_SKIP = 0; - ACE_FRAG_FORCE = 1; + // Source: http://www.inetres.com/gp/military/infantry/grenade/40mm_ammo.html#M441 + GVAR(classes)[] = {"ACE_frag_tiny_HD"}; + GVAR(metal) = 200; + GVAR(charge) = 32; + GVAR(gurney_c) = 2700; + GVAR(gurney_k) = 1/2; }; - class ACE_G_40mm_HEDP: G_40mm_HE { - ACE_FRAG_CLASSES[] = {"ACE_frag_tiny_HD"}; - ACE_FRAG_METAL = 200; - ACE_FRAG_CHARGE = 45; - ACE_FRAG_GURNEY_C = 2830; - ACE_FRAG_GURNEY_K = 3/5; + class ACE_G_40mm_HEDP: G_40mm_HEDP { }; - class ACE_G_40mm_HE: ACE_G_40mm_HEDP { - ACE_FRAG_CLASSES[] = {"ACE_frag_tiny_HD"}; - ACE_FRAG_METAL = 200; - ACE_FRAG_CHARGE = 32; - ACE_FRAG_GURNEY_C = 2700; - ACE_FRAG_GURNEY_K = 3/5; + class ACE_G_40mm_HE: G_40mm_HE { }; class ACE_G_40mm_Practice: ACE_G_40mm_HE { - ACE_FRAG_SKIP = 1; + GVAR(skip) = 1; }; class ACE_G40mm_HE_VOG25P: G_40mm_HE { - ACE_FRAG_SKIP = 0; - ACE_FRAG_FORCE = 1; + GVAR(skip) = 0; + GVAR(force) = 1; }; - + + // curator ammo entries + class ShellBase; + class Sh_125mm_HEAT; + class Sh_82mm_AMOS : ShellBase { + // Source: http://www.arsenal-bg.com/defense_police/mortar_bombs_82mm.htm + GVAR(classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"}; + GVAR(metal) = 3200; + GVAR(charge) = 420; + GVAR(gurney_c) = 2440; + GVAR(gurney_k) = 1/2; + }; + class ModuleOrdnanceMortar_F_Ammo: Sh_82mm_AMOS { + GVAR(classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"}; + GVAR(metal) = 800; + GVAR(charge) = 4200; + GVAR(gurney_c) = 2320; + GVAR(gurney_k) = 1/2; + }; + class Sh_105mm_HEAT_MP : Sh_125mm_HEAT { + GVAR(classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"}; + GVAR(metal) = 11400; + GVAR(charge) = 7100; + GVAR(gurney_c) = 2800; + GVAR(gurney_k) = 1/2; + }; + class Sh_120mm_HE : ShellBase { + GVAR(classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"}; + GVAR(metal) = 23000; + GVAR(charge) = 3148; + GVAR(gurney_c) = 2830; + GVAR(gurney_k) = 1/2; + }; + class Sh_125mm_HE: Sh_120mm_HE { + GVAR(classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"}; + GVAR(metal) = 16000; + GVAR(charge) = 3200; + GVAR(gurney_c) = 2440; + GVAR(gurney_k) = 1/2; + }; + class Sh_155mm_AMOS: ShellBase { + // Source: http://www.globalsecurity.org/military/systems/munitions/m795.htm + GVAR(classes)[] = {"ACE_frag_large", "ACE_frag_large", "ACE_frag_large_HD", "ACE_frag_large", "ACE_frag_huge", "ACE_frag_huge_HD", "ACE_frag_huge"}; + GVAR(metal) = 36000; + GVAR(charge) = 9979; + GVAR(gurney_c) = 2440; + GVAR(gurney_k) = 1/2; + }; + class ModuleOrdnanceHowitzer_F_ammo: Sh_155mm_AMOS { + GVAR(classes)[] = {"ACE_frag_large", "ACE_frag_large", "ACE_frag_large_HD", "ACE_frag_large", "ACE_frag_huge", "ACE_frag_huge_HD", "ACE_frag_huge"}; + GVAR(metal) = 1950; + GVAR(charge) = 15800; + GVAR(gurney_c) = 2320; + GVAR(gurney_k) = 1/2; + }; + + //class R_230mm_HE; + //class ModuleOrdnanceRocket_F_ammo: R_230mm_HE { + //}; + + //class R_230mm_fly; + //class ModuleOrdnanceRocket_F_subammo: R_230mm_fly { + //}; + // end of curator ammo entries + //class R_SMAW_HEDP; //class R_MEEWS_HEDP : R_SMAW_HEDP { - // ACE_FRAG_FORCE = 1; - // ACE_FRAG_MULTIPLIER = 1.2; + // GVAR(force) = 1; + // GVAR(multiplier) = 1.2; //}; - - //class MissileBase; - //class M_Hellfire_AT: MissileBase { - // ACE_FRAG_FORCE = 1; - // ACE_FRAG_MULTIPLIER = 1.75; - //}; - + + class MissileBase; + class Missile_AGM_02_F : MissileBase { + // Source: http://fas.org/man/dod-101/sys/smart/agm-65.htm + GVAR(classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"}; + GVAR(metal) = 56250; + GVAR(charge) = 39000; + GVAR(gurney_c) = 2700; + GVAR(gurney_k) = 1/2; + }; + class M_Hellfire_AT: MissileBase { + // Source: http://www.designation-systems.net/dusrm/m-114.html + GVAR(classes)[] = {"ACE_frag_medium", "ACE_frag_medium_HD"}; + GVAR(metal) = 8000; + GVAR(charge) = 2400; + GVAR(gurney_c) = 2700; + GVAR(gurney_k) = 1/2; + }; + /* class B_762x51_Ball; class ACE_frag_base: B_762x51_Ball { ////TODO: B_762x45_Ball no longer exists, is this a valid replacement? @@ -263,51 +344,51 @@ class CfgAmmo { bulletFly8[] = {"A3\sounds_f\weapons\hits\bullet_by_8.wav",1,1,35}; bulletFly[] = {"bulletFly1",0.166,"bulletFly2",0.166,"bulletFly3",0.166,"bulletFly4",0.166,"bulletFly5",0.166,"bulletFly6",0.167,"bulletFly7",0.166,"bulletFly8",0.167}; supersonicCrackNear[] = {"A3\sounds_f\weapons\hits\sscrack1.wav",1,1,35}; - supersonicCrackFar[] = {"A3\sounds_f\weapons\hits\sscrack2.wav",1,1,135}; + supersonicCrackFar[] = {"A3\sounds_f\weapons\hits\sscrack2.wav",1,1,135}; }; */ - + class B_65x39_Caseless; class ACE_frag_base: B_65x39_Caseless { timeToLive = 12; typicalSpeed = 1500; deflecting = 65; }; - + class ACE_frag_tiny: ACE_frag_base { hit = 6; airFriction = BASE_DRAG; caliber = 0.75; }; - + class ACE_frag_tiny_HD: ACE_frag_base { hit = 6; airFriction = BASE_DRAG_HD; caliber = 0.75; }; - + class ACE_frag_small: ACE_frag_base { hit = 12; airFriction = BASE_DRAG*0.9; }; - + class ACE_frag_small_HD: ACE_frag_base { hit = 12; airFriction = BASE_DRAG_HD*0.9; }; - + class ACE_frag_medium: ACE_frag_base { hit = 14; airFriction = BASE_DRAG*0.75; caliber = 1.2; }; - + class ACE_frag_medium_HD: ACE_frag_base { hit = 14; airFriction = BASE_DRAG_HD*0.75; caliber = 1.2; }; - + class ACE_frag_large: ACE_frag_base { hit = 28; indirectHit = 2; @@ -315,19 +396,19 @@ class CfgAmmo { airFriction = BASE_DRAG*0.65; caliber = 2; explosive = 0; - + }; - + class ACE_frag_large_HD: ACE_frag_large { hit = 28; indirectHit = 2; indirectHitRange = 0.25; airFriction = BASE_DRAG_HD*0.65; caliber = 2; - - + + }; - + class ACE_frag_huge: ACE_frag_large { hit = 40; indirectHit = 4; @@ -335,7 +416,7 @@ class CfgAmmo { airFriction = BASE_DRAG*0.5; caliber = 2.8; }; - + class ACE_frag_huge_HD: ACE_frag_large { hit = 40; indirectHit = 4; @@ -343,19 +424,19 @@ class CfgAmmo { airFriction = BASE_DRAG_HD*0.5; caliber = 2.8; }; - + class ACE_frag_spall_small: ACE_frag_small { timeToLive = 0.1; }; - + class ACE_frag_spall_medium: ACE_frag_medium { timeToLive = 0.15; }; - + class ACE_frag_spall_large: ACE_frag_large { timeToLive = 0.25; }; - + class ACE_frag_spall_huge: ACE_frag_huge { timeToLive = 0.3; }; diff --git a/addons/frag/CfgEventhandlers.hpp b/addons/frag/CfgEventhandlers.hpp index 1e631e07eb..df7eaeacd1 100644 --- a/addons/frag/CfgEventhandlers.hpp +++ b/addons/frag/CfgEventhandlers.hpp @@ -1,12 +1,12 @@ class Extended_PreInit_EventHandlers { class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_pre_init)); + init = QUOTE(call COMPILE_FILE(XEH_preInit)); }; }; class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_post_init)); + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; diff --git a/addons/frag/CfgVehicles.hpp b/addons/frag/CfgVehicles.hpp deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/addons/frag/XEH_postInit.sqf b/addons/frag/XEH_postInit.sqf new file mode 100644 index 0000000000..6c8d64d1fb --- /dev/null +++ b/addons/frag/XEH_postInit.sqf @@ -0,0 +1,5 @@ +#include "script_component.hpp" + +if(isServer) then { + [QGVAR(frag_eh), { _this call FUNC(frago); }] call ace_common_fnc_addEventHandler; +}; \ No newline at end of file diff --git a/addons/frag/XEH_post_init.sqf b/addons/frag/XEH_post_init.sqf deleted file mode 100644 index 9769148871..0000000000 --- a/addons/frag/XEH_post_init.sqf +++ /dev/null @@ -1,18 +0,0 @@ -#include "script_component.hpp" -if(isServer) then { - [QGVAR(frag_eh), { _this call FUNC(frago); }] call ace_common_fnc_addEventHandler; -}; -/* -GVAR(replacedBisArtyWrapper) = false; -[] spawn { - waitUntil { - if(!(isNil "BIS_ARTY_F_ShellFlight")) then { - ACE_WRAPPER_BIS_ARTY_F_ShellFlight = BIS_ARTY_F_ShellFlight; - BIS_ARTY_F_ShellFlight = FUNC(BIS_ARTY_WRAPPER); - GVAR(replacedBisArtyWrapper) = true; - }; - sleep 4; - GVAR(replacedBisArtyWrapper) - }; -}; -*/ \ No newline at end of file diff --git a/addons/frag/XEH_pre_Init.sqf b/addons/frag/XEH_preInit.sqf similarity index 73% rename from addons/frag/XEH_pre_Init.sqf rename to addons/frag/XEH_preInit.sqf index 5b3aa36b18..906a696ebf 100644 --- a/addons/frag/XEH_pre_Init.sqf +++ b/addons/frag/XEH_preInit.sqf @@ -1,45 +1,35 @@ #include "script_component.hpp" - ADDON = false; +PREP(doSpall); PREP(fired); PREP(frago); -PREP(trackFragRound); PREP(spallTrack); -PREP(doSpall); -PREP(vectorDiffFast); +PREP(trackFragRound); -GVAR(trackedObjects) = []; GVAR(blackList) = []; GVAR(traceFrags) = false; - -GVAR(replacedBisArtyWrapper) = true; +GVAR(trackedObjects) = []; GVAR(TOTALFRAGS) = 0; -GVAR(spallIsTrackingCount) = 0; GVAR(spallHPData) = []; +GVAR(spallIsTrackingCount) = 0; +GVAR(autoTrace) = true; +GVAR(traceID) = -1; GVAR(traces) = []; GVAR(tracesStarted) = false; -GVAR(traceID) = -1; -GVAR(autoTrace) = true; - // * Other Shit */ -PREP(frag_trace); -PREP(denyFrag); -PREP(BIS_ARTY_WRAPPER); -PREP(startTracing); -PREP(stopTracing); -PREP(clearTraces); -PREP(trackTrace); +PREP(addBlackList); PREP(addTrack); PREP(drawTraces); PREP(removeTrack); PREP(spallHP); -PREP(addBlackList); -PREP(addManualTrack); +PREP(startTracing); +PREP(stopTracing); +PREP(trackTrace); ADDON = true; diff --git a/addons/frag/config.cpp b/addons/frag/config.cpp index 4c1fb71e15..16af88bfc4 100644 --- a/addons/frag/config.cpp +++ b/addons/frag/config.cpp @@ -10,7 +10,6 @@ class CfgPatches { }; }; -//PRELOAD_ADDONS; - #include "CfgEventhandlers.hpp" #include "CfgAmmo.hpp" +#include "ACE_Settings.hpp" \ No newline at end of file diff --git a/addons/frag/functions/fnc_BIS_ARTY_WRAPPER.sqf b/addons/frag/functions/fnc_BIS_ARTY_WRAPPER.sqf deleted file mode 100644 index 0d71cf58ac..0000000000 --- a/addons/frag/functions/fnc_BIS_ARTY_WRAPPER.sqf +++ /dev/null @@ -1,13 +0,0 @@ -#include "script_component.hpp" -_ret = [(_this select 6)] call FUNC(removeTrack); -if(!_ret) then { - [(_this select 6)] call FUNC(addBlackList); -}; -_this call ACE_WRAPPER_BIS_ARTY_F_ShellFlight; -_catEntry = BIS_ARTY_SHELLCAT select ((count BIS_ARTY_SHELLCAT) - 1); -_shell = _catEntry select 0; -_ARTY_DeployOnImpact = getText (configFile >> "CfgAmmo" >> "ARTY_DeployOnImpact"); -if(_ARTY_DeployOnImpact == "") then { - _this set[6, _shell]; - _this call FUNC(fired); -}; \ No newline at end of file diff --git a/addons/frag/functions/fnc_addBlackList.sqf b/addons/frag/functions/fnc_addBlackList.sqf index f7b3faf902..95edcd1590 100644 --- a/addons/frag/functions/fnc_addBlackList.sqf +++ b/addons/frag/functions/fnc_addBlackList.sqf @@ -1,4 +1,4 @@ -#include "script_component.hpp" -private ["_round"]; -_round = _this select 0; +#include "script_component.hpp" +private ["_round"]; +_round = _this select 0; GVAR(blackList) set[(count GVAR(blackList)), _round]; \ No newline at end of file diff --git a/addons/frag/functions/fnc_addManualTrack.sqf b/addons/frag/functions/fnc_addManualTrack.sqf deleted file mode 100644 index 3dc14cc748..0000000000 --- a/addons/frag/functions/fnc_addManualTrack.sqf +++ /dev/null @@ -1,7 +0,0 @@ -#include "script_component.hpp" -private ["_round"]; -_round = _this select 0; -if(alive _round) then { - GVAR(trackedObjects) set[(count GVAR(trackedObjects)), _round]; - [DFUNC(trackFragRound), 0, [_round, (getPosASL _round), (velocity _round), (typeOf _round), time, objNull, false, 0, 0]] call cba_fnc_addPerFrameHandler; -}; \ No newline at end of file diff --git a/addons/frag/functions/fnc_addTrack.sqf b/addons/frag/functions/fnc_addTrack.sqf index 2beea1dd56..d4a4272a9c 100644 --- a/addons/frag/functions/fnc_addTrack.sqf +++ b/addons/frag/functions/fnc_addTrack.sqf @@ -1,5 +1,8 @@ #include "script_component.hpp" -if(GVAR(autoTrace)) then { + +private ["_color", "_data", "_index", "_obj", "_objSpd", "_origin", "_positions"]; + +if (GVAR(autoTrace)) then { [] call FUNC(startTracing); }; @@ -12,9 +15,9 @@ if((count _this) > 2) then { _color = _this select 2; }; _positions = []; -_objVel = velocity _obj; -_objTVel = sqrt((_objVel select 0)^2 + (_objVel select 1)^2 + (_objVel select 2)^2); -_positions set[(count _positions), [(getPos _obj), _objTVel]]; -_data = [_origin, typeOf _origin, typeOf _obj, _objTVel, _positions, _color]; +_objSpd = vectorMagnitude (velocity _obj); +_positions set[(count _positions), [(getPos _obj), _objSpd]]; +_data = [_origin, typeOf _origin, typeOf _obj, _objSpd, _positions, _color]; + GVAR(traces) set[_index, _data]; -[DFUNC(trackTrace), 0, [_obj, _index, time]] call cba_fnc_addPerFrameHandler; \ No newline at end of file +[DFUNC(trackTrace), 0, [_obj, _index, time]] call cba_fnc_addPerFrameHandler; diff --git a/addons/frag/functions/fnc_clearTraces.sqf b/addons/frag/functions/fnc_clearTraces.sqf deleted file mode 100644 index b301094044..0000000000 --- a/addons/frag/functions/fnc_clearTraces.sqf +++ /dev/null @@ -1,2 +0,0 @@ -#include "script_component.hpp" -GVAR(traces) = []; \ No newline at end of file diff --git a/addons/frag/functions/fnc_denyFrag.sqf b/addons/frag/functions/fnc_denyFrag.sqf deleted file mode 100644 index 6c4aa9bf8d..0000000000 --- a/addons/frag/functions/fnc_denyFrag.sqf +++ /dev/null @@ -1,7 +0,0 @@ -#include "script_component.hpp" - -private ["_ret"]; -_ret = [(_this select 0)] call FUNC(removeTrack); -if(!_ret) then { - [(_this select 0)] call FUNC(addBlackList); -}; \ No newline at end of file diff --git a/addons/frag/functions/fnc_doSpall.sqf b/addons/frag/functions/fnc_doSpall.sqf index 761490fa90..990fb80f8d 100644 --- a/addons/frag/functions/fnc_doSpall.sqf +++ b/addons/frag/functions/fnc_doSpall.sqf @@ -3,13 +3,12 @@ #ifdef DEBUG_MODE_FULL GVAR(traceFrags) = true; #endif -// player sideChat "WAAAAAAAAAAAAAAAAAAAAA"; -private ["_params", "_initialData", "_hpData", "_roundType", "_round", "_object", "_caliber", "_explosive", - "_idh", "_alive", "_exit", "_vm", "_velocity", "_unitDir", "_oldVelocity", "_curVelocity", "_diff", "_polar", - "_pos", "_spallPos", "_i", "_pos1", "_pos2", "_blah", "_data", "_spallPolar", "_c", "_warn", "_m", "_k", - "_gC", "_shellType", "_fragPower", "_spread", "_spallCount", "_elev", "_dir", "_vel", "_spallFragVect", - "_fragment"]; - +// ACE_player sideChat "WAAAAAAAAAAAAAAAAAAAAA"; +private ["_params", "_initialData", "_hpData", "_roundType", "_round", "_object", "_caliber", "_explosive", + "_idh", "_alive", "_exit", "_vm", "_velocity", "_unitDir", "_oldVelocity", "_curVelocity", "_diff", "_polar", + "_pos", "_spallPos", "_i", "_pos1", "_pos2", "_blah", "_data", "_spallPolar", "_c", "_warn", "_m", "_k", + "_gC", "_shellType", "_fragPower", "_spread", "_spallCount", "_elev", "_dir", "_vel", "_spallFragVect", + "_fragment", "_index", "_hitData", "_fragTypes", "_fragType", "_foundObjects"]; _params = _this select 0; [(_this select 1)] call cba_fnc_removePerFrameHandler; @@ -40,21 +39,21 @@ if(!alive _round && (_initialData select 6) == 1) then { }; if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { - // player sideChat format["BBBB"]; + // ACE_player sideChat format["BBBB"]; _exit = false; _vm = 1; _velocity = _initialData select 5; - - _oldVelocity = _velocity call BIS_fnc_magnitude; - _curVelocity = (velocity _round) call BIS_fnc_magnitude; - + + _oldVelocity = vectorMagnitude _velocity; + _curVelocity = vectorMagnitude (velocity _round); + if(alive _round) then { _diff = _velocity vectorDiff (velocity _round); _polar = _diff call CBA_fnc_vect2polar; - // player sideChat format["polar: %1", _polar]; + // ACE_player sideChat format["polar: %1", _polar]; if((abs(_polar select 1) > 45 || abs(_polar select 2) > 45)) then { if(_caliber < 2.5) then { - // player sideChat format["exit!"]; + // ACE_player sideChat format["exit!"]; _exit = true; } else { _vm = 1-(_curVelocity/_oldVelocity); @@ -66,32 +65,24 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { _pos = _hpData select 3; _spallPos = nil; for "_i" from 0 to 100 do { - _pos1 = [ - (_pos select 0) + (((_unitDir select 0)*0.01)*_i), - (_pos select 1) + (((_unitDir select 1)*0.01)*_i), - (_pos select 2) + (((_unitDir select 2)*0.01)*_i) - ]; - _pos2 = [ - (_pos select 0) + (((_unitDir select 0)*0.01)*(_i+1)), - (_pos select 1) + (((_unitDir select 1)*0.01)*(_i+1)), - (_pos select 2) + (((_unitDir select 2)*0.01)*(_i+1)) - ]; + _pos1 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * _i)); + _pos2 = _pos vectorAdd (_unitDir vectorMultiply (0.01 * (_i + 1))); // _blah = [_object, "FIRE"] intersect [_object worldToModel (ASLtoATL _pos1), _object worldToModel (ASLtoATL _pos2)]; // diag_log text format["b: %1", _blah]; - + // _data = [nil, nil, nil, 1, [[ASLtoATL _pos1, 1], [ASLtoATL _pos2, 1]]]; // NOU_TRACES set[(count NOU_TRACES), _data]; - + if(!lineIntersects [_pos1, _pos2]) exitWith { - // player sideChat format["FOUND!"]; + // ACE_player sideChat format["FOUND!"]; _spallPos = _pos2; }; }; if(!isNil "_spallPos") then { _spallPolar = _velocity call CBA_fnc_vect2polar; - + if(_explosive > 0) then { - // player sideChat format["EXPLOSIVE!"]; + // ACE_player sideChat format["EXPLOSIVE!"]; _warn = false; _c = getNumber(configFile >> "CfgAmmo" >> _roundType >> "ACE_frag_CHARGE"); if(_c == 0) then { _c = 1; _warn = true;}; @@ -109,7 +100,7 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { _fragPower = (((_m/_c)+_k)^-(1/2))*_gC; _spallPolar set[0, _fragPower*0.66]; }; - + _fragTypes = [ "ACE_frag_spall_small", "ACE_frag_spall_small", "ACE_frag_spall_small", "ACE_frag_spall_small","ACE_frag_spall_medium","ACE_frag_spall_medium","ACE_frag_spall_medium", @@ -117,7 +108,7 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { "ACE_frag_spall_huge" ]; - + // diag_log text format["SPALL POWER: %1", _spallPolar select 0]; _spread = 15+(random 25); _spallCount = 5+(random 10); @@ -130,14 +121,14 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { _dir = _dir % 360; _vel = (_spallPolar select 0)*0.33*_vm; _vel = (_vel-(_vel*0.25))+(random (_vel*0.5)); - + _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; _fragType = round (random ((count _fragTypes)-1)); _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; _fragment setPosASL _spallPos; _fragment setVelocity _spallFragVect; if(GVAR(traceFrags)) then { - [player, _fragment, [1,0.5,0,1]] call FUNC(addTrack); + [ACE_player, _fragment, [1,0.5,0,1]] call FUNC(addTrack); }; }; _spread = 5+(random 5); @@ -151,14 +142,14 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then { _dir = _dir % 360; _vel = (_spallPolar select 0)*0.55*_vm; _vel = (_vel-(_vel*0.25))+(random (_vel*0.5)); - + _spallFragVect = [_vel, _dir, _elev] call CBA_fnc_polar2vect; _fragType = round (random ((count _fragTypes)-1)); _fragment = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; _fragment setPosASL _spallPos; _fragment setVelocity _spallFragVect; if(GVAR(traceFrags)) then { - [player, _fragment, [1,0,0,1]] call FUNC(addTrack); + [ACE_player, _fragment, [1,0,0,1]] call FUNC(addTrack); }; }; }; diff --git a/addons/frag/functions/fnc_drawTraces.sqf b/addons/frag/functions/fnc_drawTraces.sqf index b9645bab97..e61fc9b5ba 100644 --- a/addons/frag/functions/fnc_drawTraces.sqf +++ b/addons/frag/functions/fnc_drawTraces.sqf @@ -1,13 +1,13 @@ #include "script_component.hpp" + +private ["_color", "_index", "_lastPos", "_lastSpd", "_max", "_positions", "_startSpeed"]; + { _positions = _x select 4; _color = _x select 5; _index = 0; _max = count _positions; - _startSpeed = (_positions select 0) select 1; - if(_startSpeed <= 0) then { - _startSpeed = 0.01; - }; + _startSpeed = 0.01 max ((_positions select 0) select 1); _lastSpd = []; _lastPos = []; while {_index < _max} do { @@ -29,4 +29,4 @@ _lastSpd = _data1 select 1; }; // drawIcon3D ["", [1,0,0,1], _lastPos, 0, 0, 0, format["%1m/s", _lastSpd], 1, 0.05, "PuristaMedium"]; -} forEach GVAR(traces); \ No newline at end of file +} forEach GVAR(traces); diff --git a/addons/frag/functions/fnc_fired.sqf b/addons/frag/functions/fnc_fired.sqf index e7d7d09682..7ed717c2b8 100644 --- a/addons/frag/functions/fnc_fired.sqf +++ b/addons/frag/functions/fnc_fired.sqf @@ -1,6 +1,8 @@ #include "script_component.hpp" -private ["_gun", "_type", "_round", "_doFragTrack", "_doSpall"]; -if !(isNil QGVAR(enabled) && {GVAR(enabled)}) exitWith {}; + +private ["_gun", "_type", "_round", "_doFragTrack", "_doSpall", "_spallTrack", "_spallTrackID"]; + +if (!GVAR(enabled)) exitWith {}; _gun = _this select 0; _type = _this select 4; @@ -11,10 +13,10 @@ if(_round in GVAR(blackList)) exitWith { }; _doFragTrack = false; -if(_gun == player) then { +if(_gun == ACE_player) then { _doFragTrack = true; } else { - if((gunner _gun) == player) then { + if((gunner _gun) == ACE_player) then { _doFragTrack = true; } else { if(local _gun && {!(isPlayer (gunner _gun))} && {!(isPlayer _gun)}) then { @@ -28,14 +30,18 @@ if(_doSpall) then { GVAR(spallHPData) = []; }; if(GVAR(spallIsTrackingCount) > 5) then { - // player sideChat "LIMT!"; + // ACE_player sideChat "LIMT!"; _doSpall = false; } else { GVAR(spallIsTrackingCount) = GVAR(spallIsTrackingCount) + 1; }; }; -// player sideChat format["c: %1", GVAR(spallIsTrackingCount)]; -[player, _round, [1,0,0,1]] call nou_fnc_addTrack; +// ACE_player sideChat format["c: %1", GVAR(spallIsTrackingCount)]; + +#ifdef DEBUG_MODE_FULL +[ACE_player, _round, [1,0,0,1]] call FUNC(addTrack); +#endif + if(_doFragTrack && alive _round) then { GVAR(trackedObjects) pushBack _round; _spallTrack = []; @@ -44,5 +50,5 @@ if(_doFragTrack && alive _round) then { if(_doSpall) then { [_round, 2, _spallTrack, _spallTrackID] call FUNC(spallTrack); }; - // player sideChat "WTF2"; + // ACE_player sideChat "WTF2"; }; diff --git a/addons/frag/functions/fnc_frag_trace.sqf b/addons/frag/functions/fnc_frag_trace.sqf deleted file mode 100644 index 664e117793..0000000000 --- a/addons/frag/functions/fnc_frag_trace.sqf +++ /dev/null @@ -1,10 +0,0 @@ -#include "script_component.hpp" - -private ["_params", "_shell"]; -_params = _this select 0; -_shell = _params select 0; -if(alive _shell) then { - drop ["\Ca\Data\Cl_basic","","Billboard",1,30,(getPos _shell),[0,0,0],1,1.275,1.0,0.0,[0.5],[[0,1,0,1]],[0],0.0,2.0,"","",""]; -} else { - [_this select 1] call cba_fnc_removePerFrameHandler; -}; \ No newline at end of file diff --git a/addons/frag/functions/fnc_frago.sqf b/addons/frag/functions/fnc_frago.sqf index 1b737dc70d..de7c6986d9 100644 --- a/addons/frag/functions/fnc_frago.sqf +++ b/addons/frag/functions/fnc_frago.sqf @@ -9,14 +9,14 @@ if(!isServer) exitWith { }; // _startTime = diag_tickTime; -private ["_round", "_lastPos", "_lastVel", "_shellType", "_gun", "_fragTypes", "_warn", "_atlPos", "_isArmed", - "_fuseDist", "_indirectHitRange", "_fragRange", "_c", "_m", "_k", "_gC", "_fragPower", "_fragPowerRandom", - "_manObjects", "_objects", "_crew", "_fragCount", "_fragArcs", "_doRandom", "_target", "_boundingBox", - "_targetPos", "_distance", "_add", "_bbX", "_bbY", "_bbZ", "_cubic", "_targetVel", "_baseVec", "_dir", - "_currentCount", "_count", "_vecVar", "_i", "_vec", "_fp", "_vel", "_fragType", "_fragObj", "_randomCount", - "_sectorSize", "_sectorOffset", "_randomDir"]; - - +private ["_round", "_lastPos", "_lastVel", "_shellType", "_gun", "_fragTypes", "_warn", "_atlPos", "_isArmed", + "_fuseDist", "_indirectHitRange", "_fragRange", "_c", "_m", "_k", "_gC", "_fragPower", "_fragPowerRandom", + "_manObjects", "_objects", "_crew", "_fragCount", "_fragArcs", "_doRandom", "_target", "_boundingBox", + "_targetPos", "_distance", "_add", "_bbX", "_bbY", "_bbZ", "_cubic", "_targetVel", "_baseVec", "_dir", + "_currentCount", "_count", "_vecVar", "_i", "_vec", "_fp", "_vel", "_fragType", "_fragObj", "_randomCount", + "_sectorSize", "_sectorOffset", "_randomDir", "_endTime"]; + + _round = _this select 0; _lastPos = _this select 1; _lastVel = _this select 2; @@ -108,8 +108,8 @@ _fragArcs = []; _fragArcs set[360, 0]; #ifdef DEBUG_MODE_FULL - player sideChat format["_fragRange: %1", _fragRange]; - player sideChat format["_objects: %1", _objects]; + ACE_player sideChat format["_fragRange: %1", _fragRange]; + ACE_player sideChat format["_objects: %1", _objects]; #endif _doRandom = false; if(_isArmed && (count _objects) > 0) then { @@ -127,16 +127,16 @@ if(_isArmed && (count _objects) > 0) then { _cubic = _bbX*_bbY*_bbZ; if(_cubic > 1) then { _doRandom = true; - + _targetVel = (velocity _target); - - + + _targetPos set[0, (_targetPos select 0)+((_targetVel select 0)*(_distance/_fragPower))]; _targetPos set[1, (_targetPos select 1)+((_targetVel select 1)*(_distance/_fragPower))]; _targetPos set[2, (_targetPos select 2)+_add]; - + _baseVec = _lastPos vectorFromTo _targetPos; - + _dir = floor(_baseVec call CBA_fnc_vectDir); _currentCount = _fragArcs select _dir; if(isNil "_currentCount") then { @@ -153,18 +153,14 @@ if(_isArmed && (count _objects) > 0) then { }; for "_i" from 1 to _count do { _vec = +_baseVec; - + _vec set[0, (_vec select 0)-(_vecVar/2)+(random _vecVar)]; _vec set[1, (_vec select 1)-(_vecVar/2)+(random _vecVar)]; _vec set[2, (_vec select 2)-(_vecVar/2)+(random _vecVar)]; - + _fp = (_fragPower-(random (_fragPowerRandom))); - _vel = [ - (_vec select 0)*_fp, - (_vec select 1)*_fp, - (_vec select 2)*_fp - ]; - + _vel = _vec vectorMultiply _fp; + _fragType = round (random ((count _fragTypes)-1)); _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; // diag_log text format["fp: %1 %2", _fp, typeOf _fragObj]; @@ -176,7 +172,7 @@ if(_isArmed && (count _objects) > 0) then { GVAR(traceFrags) = true; #endif if(GVAR(traceFrags)) then { - [player, _fragObj, [1,0,0,1]] call FUNC(addTrack); + [ACE_player, _fragObj, [1,0,0,1]] call FUNC(addTrack); }; _fragCount = _fragCount + 1; _currentCount = _currentCount + 1; @@ -201,12 +197,8 @@ if(_isArmed && (count _objects) > 0) then { _fp = (_fragPower-(random (_fragPowerRandom))); - _vel = [ - (_vec select 0)*_fp, - (_vec select 1)*_fp, - (_vec select 2)*_fp - ]; - + _vel = _vec vectorMultiply _fp; + _fragType = round (random ((count _fragTypes)-1)); _fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000]; _fragObj setPosASL _lastPos; @@ -217,14 +209,14 @@ if(_isArmed && (count _objects) > 0) then { GVAR(traceFrags) = true; #endif if(GVAR(traceFrags)) then { - [player, _fragObj, [1,0.5,0,1]] call FUNC(addTrack); + [ACE_player, _fragObj, [1,0.5,0,1]] call FUNC(addTrack); }; _fragCount = _fragCount + 1; }; }; }; // #ifdef DEBUG_MODE_FULL - // player sideChat format["total frags: %1", GVAR(TOTALFRAGS)]; - // player sideChat format["tracks: %1", (count GVAR(trackedObjects))]; + // ACE_player sideChat format["total frags: %1", GVAR(TOTALFRAGS)]; + // ACE_player sideChat format["tracks: %1", (count GVAR(trackedObjects))]; // #endif // _endTime = diag_tickTime; diff --git a/addons/frag/functions/fnc_spallHP.sqf b/addons/frag/functions/fnc_spallHP.sqf index fb894be499..5e3719cb47 100644 --- a/addons/frag/functions/fnc_spallHP.sqf +++ b/addons/frag/functions/fnc_spallHP.sqf @@ -1,15 +1,15 @@ #include "script_component.hpp" -private ["_initialData", "_currentCount", "_hpData", "_round", "_hpRound"]; +private ["_initialData", "_hpData", "_round", "_hpRound", "_hpDirect"]; //player sideChat format["f: %1 c: %2", (_this select 0), (count GVAR(spallHPData))]; -if((_this select 0) <= (count GVAR(spallHPData))) then { + +if ((_this select 0) <= (count GVAR(spallHPData))) then { _initialData = GVAR(spallHPData) select (_this select 0); - if(!isNil "_initialData") then { + if (!isNil "_initialData") then { _hpRound = ((_this select 1) select 0) select 2; _round = _initialData select 3; _hpDirect = ((_this select 1) select 0) select 10; - if(_hpDirect && {_round == _hpRound}) then { - + if (_hpDirect && {_round == _hpRound}) then { { _hpData = _x; _round = _initialData select 3; @@ -26,4 +26,4 @@ if((_this select 0) <= (count GVAR(spallHPData))) then { } forEach (_this select 1); }; }; -}; \ No newline at end of file +}; diff --git a/addons/frag/functions/fnc_spallTrack.sqf b/addons/frag/functions/fnc_spallTrack.sqf index a264e1ded9..4b7a06bc65 100644 --- a/addons/frag/functions/fnc_spallTrack.sqf +++ b/addons/frag/functions/fnc_spallTrack.sqf @@ -1,30 +1,22 @@ //fnc_spallTrack.sqf #include "script_component.hpp" -private ["_params", "_round", "_multiplier", "_delta", "_curPos", "_velocity", "_velocityStep", "_forwardPos", "_intersectsWith", "_index", "_i", "_test", "_hpId", "_data"]; -// setAccTime 0; + +private ["_round", "_multiplier", "_foundObjects", "_foundObjectHPIds", "_delta", "_curPos", "_velocity", "_velocityStep", "_forwardPos", "_intersectsWith", "_index", "_hpId", "_data"]; _round = _this select 0; _multiplier = _this select 1; _foundObjects = _this select 2; _foundObjectHPIds = _this select 3; -_delta = (1/diag_fps)*_multiplier; +_delta = (1/diag_fps) * _multiplier; _curPos = getPosASL _round; _velocity = velocity _round; -_velocityStep = [ - (_velocity select 0)*_delta, - (_velocity select 1)*_delta, - (_velocity select 2)*_delta - ]; -_forwardPos = [ - (_curPos select 0) + (_velocityStep select 0), - (_curPos select 1) + (_velocityStep select 1), - (_curPos select 2) + (_velocityStep select 2) - ]; - +_velocityStep = _velocity vectorMultiply _delta; +_forwardPos = _curPos vectorAdd _velocityStep; + _intersectsWith = lineIntersectsWith [_curPos, _forwardPos]; -if(count _intersectsWith > 0) then { +if (count _intersectsWith > 0) then { // player sideChat format["inter: %1", _intersectsWith]; { if(!(_x in _foundObjects)) then { @@ -37,4 +29,4 @@ if(count _intersectsWith > 0) then { GVAR(spallHPData) set[_index, _data]; }; } forEach _intersectsWith; -}; \ No newline at end of file +}; diff --git a/addons/frag/functions/fnc_trackFragRound.sqf b/addons/frag/functions/fnc_trackFragRound.sqf index 586bbc0166..8db68c99e8 100644 --- a/addons/frag/functions/fnc_trackFragRound.sqf +++ b/addons/frag/functions/fnc_trackFragRound.sqf @@ -1,6 +1,6 @@ //fnc_trackFragRound.sqf #include "script_component.hpp" -private ["_params", "_round", "_lastPos", "_lastVel", "_type", "_time", "_doSpall", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; +private ["_params", "_round", "_lastPos", "_lastVel", "_type", "_time", "_doSpall", "_spallTrack", "_foundObjectHPIds", "_skip", "_explosive", "_indirectRange", "_force", "_fragPower"]; _params = _this select 0; _round = _params select 0; _lastPos = _params select 1; @@ -15,11 +15,11 @@ if (!alive _round) then { [_this select 1] call cba_fnc_removePerFrameHandler; if(_time != time && {_round in GVAR(trackedObjects)} && {!(_round in GVAR(blackList))}) then { GVAR(trackedObjects) = GVAR(trackedObjects) - [_round]; - _skip = getNumber (configFile >> "CfgAmmo" >> _type >> "ACE_FRAG_SKIP"); + _skip = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(skip)); if(_skip == 0) then { _explosive = getNumber (configFile >> "CfgAmmo" >> _type >> "explosive"); _indirectRange = getNumber (configFile >> "CfgAmmo" >> _type >> "indirectHitRange"); - _force = getNumber (configFile >> "CfgAmmo" >> _type >> "ACE_FRAG_FORCE"); + _force = getNumber (configFile >> "CfgAmmo" >> _type >> QGVAR(force)); _fragPower = getNumber(configFile >> "CfgAmmo" >> _type >> "indirecthit")*(sqrt(_indirectRange)); if((_explosive > 0.5 && {_indirectRange >= 4.5} && {_fragPower >= 35}) || {_force == 1} ) then { [QGVAR(frag_eh), _params] call ace_common_fnc_serverEvent; diff --git a/addons/frag/functions/fnc_trackTrace.sqf b/addons/frag/functions/fnc_trackTrace.sqf index b0f3f06633..371d58b3b1 100644 --- a/addons/frag/functions/fnc_trackTrace.sqf +++ b/addons/frag/functions/fnc_trackTrace.sqf @@ -1,14 +1,14 @@ #include "script_component.hpp" + +private ["_params", "_tracerObj", "_index", "_positions", "_data"]; _params = _this select 0; _tracerObj = _params select 0; _index = _params select 1; -if(alive _tracerObj && (count GVAR(traces)) > 0) then { +if (alive _tracerObj && (count GVAR(traces)) > 0) then { _data = GVAR(traces) select _index; _positions = _data select 4; - _objVel = velocity _tracerObj; - _objTVel = sqrt((_objVel select 0)^2 + (_objVel select 1)^2 + (_objVel select 2)^2); - _positions set[(count _positions), [(getPos _tracerObj), _objTVel]]; + _positions set[(count _positions), [(getPos _tracerObj), vectorMagnitude (velocity _tracerObj)]]; } else { [(_this select 1)] call cba_fnc_removePerFrameHandler; -}; \ No newline at end of file +}; diff --git a/addons/frag/functions/fnc_vectorDiffFast.sqf b/addons/frag/functions/fnc_vectorDiffFast.sqf deleted file mode 100644 index 0a41860727..0000000000 --- a/addons/frag/functions/fnc_vectorDiffFast.sqf +++ /dev/null @@ -1,15 +0,0 @@ -#include "script_component.hpp" -private["_p1","_p2","_return"]; - -_p1 = _this select 0; -_p2 = _this select 1; - -if ((count _p1) != (count _p2)) then {textLogFormat ["BIS_FNC Error: vectors not of same size"]}; - -_return = []; - -{ - _return set[_forEachIndex, (_p2 select _forEachIndex) - _x]; -} forEach _p1; - -_return diff --git a/addons/frag/stringtable.xml b/addons/frag/stringtable.xml index e34ad2b681..2e4f86249a 100644 --- a/addons/frag/stringtable.xml +++ b/addons/frag/stringtable.xml @@ -11,6 +11,7 @@ Désactive la fragmentation Repeszek letiltása Disattiva la frammentazione + Disabilitar Fragmentação diff --git a/addons/goggles/stringtable.xml b/addons/goggles/stringtable.xml index 16fd227b11..ce337760d7 100644 --- a/addons/goggles/stringtable.xml +++ b/addons/goggles/stringtable.xml @@ -1,5 +1,4 @@  - diff --git a/addons/grenades/CfgAmmo.hpp b/addons/grenades/CfgAmmo.hpp index 0f86230784..0c74f33940 100644 --- a/addons/grenades/CfgAmmo.hpp +++ b/addons/grenades/CfgAmmo.hpp @@ -82,7 +82,7 @@ class CfgAmmo { SmokeShellSoundHit3[] = {"A3\Sounds_F\weapons\smokeshell\smoke_3",1.25893,1,100}; SmokeShellSoundLoop1[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop1",0.125893,1,70}; SmokeShellSoundLoop2[] = {"A3\Sounds_F\weapons\smokeshell\smoke_loop2",0.125893,1,70}; - timeToLive = 60; + timeToLive = 6; fuseDistance = 2.3; model = PATHTOF(models\ACE_m84_thrown.p3d); }; diff --git a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf index 67fb2ded9c..9be24bcc47 100644 --- a/addons/grenades/functions/fnc_flashbangExplosionEH.sqf +++ b/addons/grenades/functions/fnc_flashbangExplosionEH.sqf @@ -56,7 +56,7 @@ _affected = _grenade nearEntities ["CAManBase", 20]; }; } forEach [[0,0,0], [0,0,0.2], [0.1, 0.1, 0.1], [-0.1, -0.1, 0.1]]; TRACE_1("Line of sight count (out of 4)",_losCount); - if (_losCount == 0) then { + if (_losCount <= 1) then { _strength = _strength / 10; }; diff --git a/addons/grenades/stringtable.xml b/addons/grenades/stringtable.xml index 7f8321d6c6..8b97c46418 100644 --- a/addons/grenades/stringtable.xml +++ b/addons/grenades/stringtable.xml @@ -1,5 +1,4 @@  - @@ -96,7 +95,7 @@ XM84 (M84) - граната нелетального действия, и предназначена для отвлечения и временного вывода из строя, либо дезориентации противника. Основное использование нашла при освобождении заложников, захвате преступников и террористов, а также проведении диверсионных миссий. Villanógránát néven is ismert. Azonnali villanási vakságot, süketséget, fülzúgást, és belső füli zavart okoz. Anche conosciuta come flashbang. Causa accecamento immediato, sensazioni di sposatezza, mancanza d'equilibrio e disturbi al timpano. - Um tipo de granada não-letal destinado a confundir, desorientar e distrair uma potencial ameaça. + Também conhecida como flashbang. Causa uma clarão imediato, cegueira, surdez, zumbido e distúrbio no tímpano. M127A1 Hand Held Signal (White) @@ -153,7 +152,7 @@ Kézi jelzőrakéta, Fehér színű Bengala (Bianco) Flara ręczna (biała) - Sinalizador (Branco) + Sinalizador de Mão (Branco) Фальшфейер (Белый) Bengala (Blanca) Feux à main (Blanc) @@ -165,7 +164,7 @@ Kézi jelzőrakéta, Piros színű Bengala (Rosso) Flara ręczna (czerwona) - Sinalizador (Vermelho) + Sinalizador de Mão (Vermelho) Фальшфейер (Красный) Bengala (Roja) Feux à main (Rouge) @@ -177,7 +176,7 @@ Kézi jelzőrakéta, Zöld színű Bengala (Verde) Flara ręczna (zielona) - Sinalizador (Verde) + Sinalizador de Mão (Verde) Фальшфейер (Зелёный) Bengala (Verde) Feux à main (Vert) @@ -189,7 +188,7 @@ Kézi jelzőrakéta, Sárga színű Bengala (Giallo) Flara ręczna (żółta) - Sinalizador (Amarelo) + Sinalizador de Mão (Amarelo) Фальшфейер (Жёлтые) Bengala (Amarilla) Feux à main (Jaune) @@ -243,4 +242,4 @@ M127A1 (Amarilla) - \ No newline at end of file + diff --git a/addons/hearing/CfgEventHandlers.hpp b/addons/hearing/CfgEventHandlers.hpp index 94b1ab0703..ce968ed2ca 100644 --- a/addons/hearing/CfgEventHandlers.hpp +++ b/addons/hearing/CfgEventHandlers.hpp @@ -1,4 +1,3 @@ - class Extended_PreInit_EventHandlers { class ADDON { init = QUOTE(call COMPILE_FILE(XEH_preInit) ); @@ -20,9 +19,9 @@ class Extended_Init_EventHandlers { }; class Extended_FiredNear_EventHandlers { - class CAManBase { + class AllVehicles { class GVAR(FiredNear) { - clientFiredNear = QUOTE( if (GVAR(enableCombatDeafness) && {_this select 0 == ACE_player}) then {_this call FUNC(firedNear)}; ); + clientFiredNear = QUOTE(_this call FUNC(firedNear);); }; }; }; diff --git a/addons/hearing/XEH_postInit.sqf b/addons/hearing/XEH_postInit.sqf index adb7827ce7..7b584f8397 100644 --- a/addons/hearing/XEH_postInit.sqf +++ b/addons/hearing/XEH_postInit.sqf @@ -1,7 +1,14 @@ #include "script_component.hpp" +if (!hasInterface) exitWith {}; + GVAR(currentDeafness) = 0; GVAR(newStrength) = 0; +GVAR(playerVehAttenuation) = 1; // Spawn volume updating process [FUNC(updateVolume), 0.1, [] ] call CBA_fnc_addPerFrameHandler; + +//Update veh attunation when player veh changes +["playerVehicleChanged", {_this call FUNC(updatePlayerVehAttenuation);}] call EFUNC(common,addEventHandler); +["playerTurretChanged", {_this call FUNC(updatePlayerVehAttenuation);}] call EFUNC(common,addEventHandler); diff --git a/addons/hearing/XEH_preInit.sqf b/addons/hearing/XEH_preInit.sqf index 0785a32aff..16b9f35f80 100644 --- a/addons/hearing/XEH_preInit.sqf +++ b/addons/hearing/XEH_preInit.sqf @@ -10,6 +10,7 @@ PREP(hasEarPlugsIn); PREP(moduleHearing); PREP(putInEarPlugs); PREP(removeEarPlugs); +PREP(updatePlayerVehAttenuation); PREP(updateVolume); ADDON = true; diff --git a/addons/hearing/functions/fnc_firedNear.sqf b/addons/hearing/functions/fnc_firedNear.sqf index 7e9472e72a..b456b3b872 100644 --- a/addons/hearing/functions/fnc_firedNear.sqf +++ b/addons/hearing/functions/fnc_firedNear.sqf @@ -21,18 +21,19 @@ */ #include "script_component.hpp" -private ["_unit", "_firer", "_distance", "_weapon", "_muzzle", "_mode", "_ammo", "_silencer", "_audibleFireCoef", "_loudness", "_strength", "_audibleFire", "_audibleFireTime", "_audibleFireTimeCoef"]; +private ["_silencer", "_audibleFireCoef", "_audibleFire", "_loudness", "_strength", "_vehAttenuation"]; -_unit = _this select 0; -_firer = _this select 1; -_distance = (_this select 2) max 1; -_weapon = _this select 3; -_muzzle = _this select 4; -_mode = _this select 5; -_ammo = _this select 6; +PARAMS_7(_object,_firer,_distance,_weapon,_muzzle,_mode,_ammo); -if (toLower _weapon in ["throw", "put"]) exitWith {}; -if (_unit != vehicle _unit && {!([_unit] call EFUNC(common,isTurnedOut))}) exitWith {}; +//Only run if combatDeafness enabled: +if (!GVAR(enableCombatDeafness)) exitWith {}; +//Only run if firedNear object is player or player's vehicle: +if ((ACE_player != _object) && {(vehicle ACE_player) != _object}) exitWith {}; +if (_weapon in ["Throw", "Put"]) exitWith {}; + +_vehAttenuation = if ((ACE_player == (vehicle ACE_player)) || {isTurnedOut ACE_player}) then {1} else {GVAR(playerVehAttenuation)}; + +if (_distance < 1) then {_distance = 1;}; _silencer = switch (_weapon) do { case (primaryWeapon _firer) : {(primaryWeaponItems _firer) select 0}; @@ -42,18 +43,15 @@ _silencer = switch (_weapon) do { }; _audibleFireCoef = 1; -//_audibleFireTimeCoef = 1; if (_silencer != "") then { _audibleFireCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "audibleFire"); - //_audibleFireTimeCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "audibleFireTime"); }; _audibleFire = getNumber (configFile >> "CfgAmmo" >> _ammo >> "audibleFire"); -//_audibleFireTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "audibleFireTime"); _loudness = _audibleFireCoef * _audibleFire / 64; -_strength = _loudness - (_loudness/50 * _distance); // linear drop off +_strength = _vehAttenuation * (_loudness - (_loudness/50 * _distance)); // linear drop off if (_strength < 0.01) exitWith {}; -[{_this call FUNC(earRinging)}, [_unit, _strength], 0.2, 0] call EFUNC(common,waitAndExecute); +[{_this call FUNC(earRinging)}, [ACE_player, _strength], 0.2, 0] call EFUNC(common,waitAndExecute); diff --git a/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf new file mode 100644 index 0000000000..a7285d5e2b --- /dev/null +++ b/addons/hearing/functions/fnc_updatePlayerVehAttenuation.sqf @@ -0,0 +1,57 @@ +/* + * Author: PabstMirror + * Gets the sound attenuation of a player to the outside. + * + * Arguments: + * None + * + * Return Value: + * Ammount that unit can hear outside + * + * Example: + * [] call ace_hearing_fnc_updatePlayerVehAttenuation + * + * Public: No + */ +#include "script_component.hpp" + +_vehicle = vehicle ACE_player; + +if (isNull _vehicle) exitWith {}; + +_newAttenuation = 1; +if (ACE_player != _vehicle) then { + _effectType = ""; + _turretPath = [ACE_player] call EFUNC(common,getTurretIndex); + _effectType = getText (configFile >> "CfgVehicles" >> (typeOf _vehicle) >> "attenuationEffectType"); + + if (!(_turretPath isEqualTo [])) then { + _turretConfig = [(configFile >> "CfgVehicles" >> (typeOf _vehicle)), _turretPath] call EFUNC(common,getTurretConfigPath); + + if ((getNumber (_turretConfig >> "disableSoundAttenuation")) == 1) then { + _effectType = ""; + } else { + if (isText (_turretConfig >> "soundAttenuationTurret")) then { + _effectType = getText (_turretConfig >> "soundAttenuationTurret"); + }; + }; + }; + + _newAttenuation = switch (true) do { + case (_effectType == ""): {1}; + case (_effectType == "CarAttenuation"): {0.5}; + case (_effectType == "RHS_CarAttenuation"): {0.5}; + case (_effectType == "OpenCarAttenuation"): {1}; + case (_effectType == "TankAttenuation"): {0.1}; + case (_effectType == "HeliAttenuation"): {0.3}; + case (_effectType == "OpenHeliAttenuation"): {0.9}; + case (_effectType == "SemiOpenHeliAttenuation"): {0.6}; + case (_effectType == "HeliAttenuationGunner"): {0.85}; + case (_effectType == "HeliAttenuationRamp"): {0.85}; + default {1}; + }; +}; + +TRACE_2("New vehicle attenuation",_vehicle,_newAttenuation); + +GVAR(playerVehAttenuation) = _newAttenuation; diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index 1a7dba3065..750b2d75e1 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -3,10 +3,12 @@ if (!hasInterface) exitWith {}; +GVAR(ParsedTextCached) = []; + //Setup text/shadow color matrix [] call FUNC(setupTextColors); ["SettingChanged", { - PARAMS_2(_name,_value); + PARAMS_1(_name); if ((_name == QGVAR(colorTextMax)) || {_name == QGVAR(colorTextMin)} || {_name == QGVAR(colorShadowMax)} || {_name == QGVAR(colorShadowMin)}) then { [] call FUNC(setupTextColors); }; diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index 65d5dd4305..7e86646b79 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -8,6 +8,7 @@ PREP(compileMenu); PREP(compileMenuSelfAction); PREP(collectActiveActionTree); PREP(createAction); +PREP(ctrlSetParsedTextCached); PREP(findActionNode); PREP(handlePlayerChanged); PREP(isSubPath); diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index 5ca0ebdc5f..281f66492a 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -24,6 +24,13 @@ class ACE_Settings { typeName = "BOOL"; isClientSettable = 1; displayName = "$STR_ACE_Interact_Menu_AlwaysUseCursorSelfInteraction"; + }; + class GVAR(cursorKeepCentered) { + value = 0; + typeName = "BOOL"; + isClientSettable = 1; + displayName = "$STR_ACE_Interact_cursorKeepCentered"; + description = "$STR_ACE_Interact_cursorKeepCenteredDescription"; }; class GVAR(AlwaysUseCursorInteraction) { value = 0; diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 7983c493e1..f5296ec9cf 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -26,8 +26,7 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; private "_recurseFnc"; _recurseFnc = { - private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", - "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"]; + private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction", "_i"]; EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; @@ -53,7 +52,9 @@ _recurseFnc = { if (_condition == "") then {_condition = "true"}; // Add canInteract (including exceptions) and canInteractWith to condition - _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; + if ((configName _entryCfg) != "ACE_MainActions") then { + _condition = _condition + format [QUOTE( && {[ARR_3(ACE_player, _target, %1)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; + }; _insertChildren = compile (getText (_entryCfg >> "insertChildren")); _modifierFunction = compile (getText (_entryCfg >> "modifierFunction")); diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 0258b3dc8a..e4c449ce80 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -14,7 +14,7 @@ EXPLODE_1_PVT(_this,_target); -private ["_objectType","_actionsVarName"]; +private ["_objectType","_actionsVarName", "_canCollapse", "_children", "_enableInside", "_entry", "_entryCfg", "_i", "_insertChildren", "_modifierFunction", "_runOnHover"]; _objectType = _target; if (typeName _target == "OBJECT") then { _objectType = typeOf _target; @@ -26,7 +26,7 @@ if !(isNil {missionNamespace getVariable [_actionsVarName, nil]}) exitWith {}; private "_recurseFnc"; _recurseFnc = { - private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", + private ["_actions", "_displayName", "_icon", "_statement", "_condition", "_showDisabled", "_enableInside", "_canCollapse", "_runOnHover", "_children", "_entry", "_entryCfg", "_insertChildren", "_modifierFunction"]; EXPLODE_1_PVT(_this,_actionsCfg); _actions = []; diff --git a/addons/interact_menu/functions/fnc_createAction.sqf b/addons/interact_menu/functions/fnc_createAction.sqf index fb3f05b7b5..a7d939722e 100644 --- a/addons/interact_menu/functions/fnc_createAction.sqf +++ b/addons/interact_menu/functions/fnc_createAction.sqf @@ -28,6 +28,7 @@ EXPLODE_5_PVT(_this,_actionName,_displayName,_icon,_statement,_condition); +// IGNORE_PRIVATE_WARNING(_target); private ["_insertChildren","_customParams","_position","_distance","_params", "_modifierFunction"]; _insertChildren = if (count _this > 5) then { diff --git a/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf b/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf new file mode 100644 index 0000000000..b5d6a4e967 --- /dev/null +++ b/addons/interact_menu/functions/fnc_ctrlSetParsedTextCached.sqf @@ -0,0 +1,15 @@ +// by commy2 +#include "script_component.hpp" + +private ["_ctrl", "_index", "_text"]; + +_ctrl = _this select 0; +_index = _this select 1; +_text = _this select 2; + +//systemChat str (_text != ARR_SELECT(GVAR(ParsedTextCached),_index,"-1")); + +if (_text != ARR_SELECT(GVAR(ParsedTextCached),_index,"-1")) then { + GVAR(ParsedTextCached) set [_index, _text]; + _ctrl ctrlSetStructuredText parseText _text; +}; diff --git a/addons/interact_menu/functions/fnc_findActionNode.sqf b/addons/interact_menu/functions/fnc_findActionNode.sqf index 4027b7a852..b8639754d2 100644 --- a/addons/interact_menu/functions/fnc_findActionNode.sqf +++ b/addons/interact_menu/functions/fnc_findActionNode.sqf @@ -19,7 +19,7 @@ EXPLODE_2_PVT(_this,_actionTreeList,_parentPath); -private ["_parentNode", "_foundParentNode", "_fnc_findFolder"]; +private ["_parentNode", "_foundParentNode", "_fnc_findFolder", "_actionTree"]; // Hack to make this work on the root node too if (count _parentPath == 0) exitWith { diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index 1bd4d04474..9f1d0b9bcb 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -30,6 +30,7 @@ if (_menuType == 0) then { GVAR(keyDownTime) = diag_tickTime; GVAR(openedMenuType) = _menuType; GVAR(lastTimeSearchedActions) = -1000; +GVAR(ParsedTextCached) = []; GVAR(useCursorMenu) = (vehicle ACE_player != ACE_player) || visibleMap || @@ -42,8 +43,14 @@ if (GVAR(useCursorMenu)) then { // uiNamespace getVariable QGVAR(dlgCursorMenu); // uiNamespace getVariable QGVAR(cursorMenuOpened); ctrlEnable [91921, true]; + GVAR(cursorPos) = [0.5,0.5,0]; ((finddisplay 91919) displayctrl 91921) ctrlAddEventHandler ["MouseMoving", { - GVAR(cursorPos) = [_this select 1, _this select 2, 0]; + if (GVAR(cursorKeepCentered)) then { + GVAR(cursorPos) = GVAR(cursorPos) vectorAdd [_this select 1, _this select 2, 0] vectorDiff [0.5, 0.5, 0]; + setMousePosition [0.5, 0.5]; + } else { + GVAR(cursorPos) = [_this select 1, _this select 2, 0]; + }; }]; setMousePosition [0.5, 0.5]; }; diff --git a/addons/interact_menu/functions/fnc_removeActionFromClass.sqf b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf index 898228d6d8..c407273258 100644 --- a/addons/interact_menu/functions/fnc_removeActionFromClass.sqf +++ b/addons/interact_menu/functions/fnc_removeActionFromClass.sqf @@ -19,7 +19,7 @@ EXPLODE_3_PVT(_this,_objectType,_typeNum,_fullPath); -private ["_res","_varName","_actionTrees"]; +private ["_res","_varName","_actionTrees", "_actionIndex", "_parentLevel", "_parentNode"]; _res = _fullPath call FUNC(splitPath); EXPLODE_2_PVT(_res,_parentPath,_actionName); diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index b9afa75616..06c155ac54 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -14,7 +14,7 @@ BEGIN_COUNTER(fnc_render); -private ["_cursorPos1", "_cursorPos2", "_cursorVec", "_p1", "_p2", "_p", "_v", "_cp", "_forEachIndex", "_renderTargets", "_x", "_cursorScreenPos", "_closestDistance", "_closestSelection", "_pos", "_sPos", "_disSq", "_closest", "_cTime", "_delta", "_foundTarget", "_misMatch", "_hoverPath", "_i"]; +private ["_cursorPos1", "_cursorPos2", "_p1", "_p2", "_forEachIndex", "_x", "_cursorScreenPos", "_closestDistance", "_closestSelection", "_sPos", "_disSq", "_closest", "_cTime", "_delta", "_foundTarget", "_misMatch", "_hoverPath", "_i", "_actionData", "_player", "_target"]; _foundTarget = false; _cursorPos1 = positionCameraToWorld [0, 0, 0]; _cursorPos2 = positionCameraToWorld [0, 0, 2]; @@ -119,6 +119,7 @@ if(!_foundTarget && GVAR(actionSelected)) then { }; for "_i" from GVAR(iconCount) to (count GVAR(iconCtrls))-1 do { ctrlDelete (GVAR(iconCtrls) select _i); + GVAR(ParsedTextCached) set [_i, ""]; }; GVAR(iconCtrls) resize GVAR(iconCount); GVAR(iconCount) = 0; diff --git a/addons/interact_menu/functions/fnc_renderActionPoints.sqf b/addons/interact_menu/functions/fnc_renderActionPoints.sqf index 78d5418e5a..8e6cb7d390 100644 --- a/addons/interact_menu/functions/fnc_renderActionPoints.sqf +++ b/addons/interact_menu/functions/fnc_renderActionPoints.sqf @@ -14,7 +14,7 @@ GVAR(currentOptions) = []; -private ["_player","_numInteractObjects","_numInteractions","_actionsVarName","_classActions","_objectActions","_target","_player","_action","_actionData","_active","_cameraPos","_cameraDir"]; +private ["_player","_numInteractObjects","_numInteractions","_actionsVarName","_classActions","_target","_player","_action","_cameraPos","_cameraDir", "_lambda", "_nearestObjects", "_pos"]; _player = ACE_player; _fnc_renderNearbyActions = { diff --git a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf index a5214ddcbe..841303bcdf 100644 --- a/addons/interact_menu/functions/fnc_renderBaseMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderBaseMenu.sqf @@ -16,7 +16,7 @@ BEGIN_COUNTER(fnc_renderBaseMenu) -private ["_distance","_pos","_weaponDir","_ref","_cameraPos","_sPos","_activeActionTree"]; +private ["_distance","_pos","_weaponDir","_ref","_sPos","_activeActionTree", "_line"]; EXPLODE_2_PVT(_this,_object,_baseActionNode); EXPLODE_1_PVT(_baseActionNode,_actionData); @@ -50,11 +50,12 @@ if (GVAR(openedMenuType) == 0 && vehicle ACE_player == ACE_player && if (_actualDistance > _distance) exitWith {true}; - if (_distance > 1.0) exitWith { + if (_actualDistance > 1.0) exitWith { // If distance to action is greater than 1.0 m, check LOS _line = [_headPos call EFUNC(common,positionToASL), _pos call EFUNC(common,positionToASL), _object, ACE_player]; lineIntersects _line }; + false }) exitWith {false}; // Exit if the action is behind you diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 9107b6d998..642464028d 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -17,7 +17,7 @@ */ #include "script_component.hpp" #define DEFAULT_ICON QUOTE(\z\ace\addons\interaction\ui\dot_ca.paa) -private ["_ctrl"]; +private ["_ctrl", "_pos", "_displayNum"]; PARAMS_6(_text,_icon,_sPos,_textColor,_shadowColor,_iconColor); //systemChat format ["Icon %1 - %2,%3", _text, _sPos select 0, _sPos select 1]; @@ -38,10 +38,20 @@ _text = if (GVAR(UseListMenu)) then { format ["
%5", _icon, _iconColor, _textColor, _shadowColor, "ace_breakLine" callExtension _text]; }; -_ctrl ctrlSetStructuredText (parseText _text); -_text = if (GVAR(UseListMenu)) then { - _ctrl ctrlSetPosition [(_sPos select 0)-(0.0095*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.20*SafeZoneW, 0.035*SafeZoneW]; +//_ctrl ctrlSetStructuredText parseText _text; +[_ctrl, GVAR(iconCount), _text] call FUNC(ctrlSetParsedTextCached); + +_pos = []; +if (GVAR(UseListMenu)) then { + _pos = [(_sPos select 0)-(0.0095*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.20*SafeZoneW, 0.035*SafeZoneW]; } else { - _ctrl ctrlSetPosition [(_sPos select 0)-(0.0750*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.15*SafeZoneW, 0.100*SafeZoneW]; + _pos = [(_sPos select 0)-(0.0750*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.15*SafeZoneW, 0.100*SafeZoneW]; }; + +if (GVAR(cursorKeepCentered) && {uiNamespace getVariable [QGVAR(cursorMenuOpened),false]}) then { + _pos set [0, ((_pos select 0) - (GVAR(cursorPos) select 0) + 0.5)]; + _pos set [1, ((_pos select 1) - (GVAR(cursorPos) select 1) + 0.5)]; +}; + +_ctrl ctrlSetPosition _pos; _ctrl ctrlCommit 0; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index e80e9d41ab..a050374786 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -15,7 +15,7 @@ */ #include "script_component.hpp" -private ["_menuInSelectedPath", "_path", "_menuDepth", "_currentRenderDepth", "_x", "_offset", "_newPos", "_forEachIndex"]; +private ["_menuInSelectedPath", "_path", "_menuDepth", "_x", "_offset", "_newPos", "_forEachIndex", "_player", "_pos", "_shadowColor", "_target", "_textColor"]; EXPLODE_4_PVT(_this,_parentPath,_action,_sPos,_angles); EXPLODE_3_PVT(_action,_actionData,_activeChildren,_actionObject); diff --git a/addons/interact_menu/functions/fnc_renderSelector.sqf b/addons/interact_menu/functions/fnc_renderSelector.sqf index 5afcf63cc6..569fa79198 100644 --- a/addons/interact_menu/functions/fnc_renderSelector.sqf +++ b/addons/interact_menu/functions/fnc_renderSelector.sqf @@ -15,21 +15,29 @@ EXPLODE_2_PVT(_this,_sPos,_icon); +private ["_displayNum", "_ctrl", "_pos"]; + if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then { _displayNum = [[46, 12] select visibleMap,91919] select (uiNamespace getVariable [QGVAR(cursorMenuOpened),false]); GVAR(iconCtrls) pushBack ((findDisplay _displayNum) ctrlCreate ["RscStructuredText", 54021+GVAR(iconCount)]); }; -private "_ctrl"; _ctrl = GVAR(iconCtrls) select GVAR(iconCount); GVAR(iconCount) = GVAR(iconCount) + 1; +_pos = []; if (GVAR(UseListMenu)) then { - _ctrl ctrlSetStructuredText (parseText format ["", _icon]); - _ctrl ctrlSetPosition [(_sPos select 0)-(0.014*SafeZoneW), (_sPos select 1)-(0.014*SafeZoneW), 0.05*SafeZoneW, 0.035*SafeZoneW]; + [_ctrl, GVAR(iconCount), format ["", _icon]] call FUNC(ctrlSetParsedTextCached); + _pos = [(_sPos select 0)-(0.014*SafeZoneW), (_sPos select 1)-(0.014*SafeZoneW), 0.05*SafeZoneW, 0.035*SafeZoneW]; } else { - _ctrl ctrlSetStructuredText (parseText format ["", _icon]); - _ctrl ctrlSetPosition [(_sPos select 0)-(0.050*SafeZoneW), (_sPos select 1)-(0.014*SafeZoneW), 0.1*SafeZoneW, 0.035*SafeZoneW]; + [_ctrl, GVAR(iconCount), format ["", _icon]] call FUNC(ctrlSetParsedTextCached); + _pos = [(_sPos select 0)-(0.050*SafeZoneW), (_sPos select 1)-(0.014*SafeZoneW), 0.1*SafeZoneW, 0.035*SafeZoneW]; }; -//_ctrl ctrlSetBackgroundColor [1, 0, 0, 0.1]; + +if (GVAR(cursorKeepCentered) && {uiNamespace getVariable [QGVAR(cursorMenuOpened),false]}) then { + _pos set [0, ((_pos select 0) - (GVAR(cursorPos) select 0) + 0.5)]; + _pos set [1, ((_pos select 1) - (GVAR(cursorPos) select 1) + 0.5)]; +}; + +_ctrl ctrlSetPosition _pos; _ctrl ctrlCommit 0; diff --git a/addons/interact_menu/functions/fnc_setupTextColors.sqf b/addons/interact_menu/functions/fnc_setupTextColors.sqf index 5df9c589da..58f9995985 100644 --- a/addons/interact_menu/functions/fnc_setupTextColors.sqf +++ b/addons/interact_menu/functions/fnc_setupTextColors.sqf @@ -12,7 +12,7 @@ */ #include "script_component.hpp" -private ["_mixColor", "_rowT", "_rowS", "_menuDepth", "_pathCount", "_menuInSelectedPath", "_color", "_path"]; +private ["_mixColor", "_rowT", "_rowS", "_menuDepth", "_pathCount"]; //Mixes 2 colors (number arrays) and makes a color string "#AARRGGBB" for structured text _mixColor = { diff --git a/addons/interact_menu/functions/fnc_splitPath.sqf b/addons/interact_menu/functions/fnc_splitPath.sqf index 935e947b30..790ae83466 100644 --- a/addons/interact_menu/functions/fnc_splitPath.sqf +++ b/addons/interact_menu/functions/fnc_splitPath.sqf @@ -13,7 +13,7 @@ */ #include "script_component.hpp" -private ["_parentPath","_actionName"]; +private ["_parentPath","_actionName", "_i"]; _parentPath = []; for [{_i = 0},{_i < (count _this) - 1},{_i = _i + 1}] do { _parentPath pushBack (_this select _i); diff --git a/addons/interact_menu/script_component.hpp b/addons/interact_menu/script_component.hpp index a086b02613..3117065ca2 100644 --- a/addons/interact_menu/script_component.hpp +++ b/addons/interact_menu/script_component.hpp @@ -1,6 +1,8 @@ #define COMPONENT interact_menu #include "\z\ace\addons\main\script_mod.hpp" +// #define DEBUG_MODE_FULL + #ifdef DEBUG_ENABLED_INTERACT_MENU #define DEBUG_MODE_FULL #endif diff --git a/addons/interact_menu/stringtable.xml b/addons/interact_menu/stringtable.xml index d9e2e1366b..5761815af1 100644 --- a/addons/interact_menu/stringtable.xml +++ b/addons/interact_menu/stringtable.xml @@ -11,12 +11,16 @@ Toujours afficher le curseur pour les interactions sur soi-même Mindig legyen a saját cselekvés kurzorja látható Mostra sempre il cursore per le auto interazioni + Sempre mostrar cursor para interação pessoal
Always display cursor for interaction Mostrar siempre el cursor para la interacción Toujours afficher le curseur pour les interactions Mostra sempre il cursore per le interazioni + Zawsze wyświetlaj kursor dla interakcji + Показывать курсор (взаимодействие) + Immer den Cursor für Fremd-Interaktionen anzeigen Display interaction menus as lists @@ -37,6 +41,7 @@ Touche d'interaction Cselekvő gomb Tasto interazione + Tecla de Interação Self Interaction Key @@ -48,6 +53,7 @@ Touche d'interaction personnelle Saját cselekvő gomb Tasto per auto interazioni + Tecla de Interação Pessoal Self Actions @@ -59,6 +65,7 @@ Interaction personnelle Saját cselekvések Auto interazioni + Ações Pessoais Vehicle Actions @@ -70,18 +77,49 @@ Interaction véhicule Járműves cselekvések Interazioni con veicoli + Ações de Veículos Interaction - Text Max + Interakcja - Tekst max + Interaction - Texte Max + Interaktionstextfarbe Max + Interazioni - Testo Massimo + Взаимодействие - Текст Макс. Interaction - Text Min + Interakcja - Tekst min + Interaction - Texte Min + Interaktionstextfarbe Min + Interazioni - Testo Minimo + Взаимодействие - Текст Мин. Interaction - Shadow Max + Interakcja - Cień max + Interaction - Ombre Max + Interaktionstextschatten Max + Interazioni - Ombra Massima + Взаимодействие - Тень Макс. Interaction - Shadow Min + Interakcja - Cień min + Interaction - Ombre Min + Interaktionstextschatten Min + Interazioni - Ombra Minima + Взаимодействие - Тень Мин. + + + Keep cursor centered + Garder le curseur au centre + Центрировать курсор + + + Keeps cursor centered and pans the option menu around. Useful if screen size is limited. + Garde le curseur au milieu et dispose le menu des options autour. Utile si la taille de l'écran est limitée. + Центрирует курсор и двигает само меню опций. Полезно при ограниченном размере экрана. Do action when releasing menu key diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 0408192919..96165d63e3 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -35,7 +35,7 @@ class CfgVehicles { class ACE_TeamManagement { displayName = "$STR_ACE_Interaction_TeamManagement"; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {GVAR(EnableTeamManagement)}); + condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {GVAR(EnableTeamManagement)}); statement = ""; showDisabled = 0; priority = 3.2; @@ -44,7 +44,7 @@ class CfgVehicles { class ACE_JoinTeamRed { displayName = "$STR_ACE_Interaction_JoinTeamRed"; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); statement = QUOTE([ARR_2(_target,'RED')] call DFUNC(joinTeam)); showDisabled = 1; icon = PATHTOF(UI\team\team_red_ca.paa); @@ -53,7 +53,7 @@ class CfgVehicles { }; class ACE_JoinTeamGreen { displayName = "$STR_ACE_Interaction_JoinTeamGreen"; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); statement = QUOTE([ARR_2(_target,'GREEN')] call DFUNC(joinTeam)); showDisabled = 1; icon = PATHTOF(UI\team\team_green_ca.paa); @@ -62,7 +62,7 @@ class CfgVehicles { }; class ACE_JoinTeamBlue { displayName = "$STR_ACE_Interaction_JoinTeamBlue"; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); statement = QUOTE([ARR_2(_target,'BLUE')] call DFUNC(joinTeam)); showDisabled = 1; icon = PATHTOF(UI\team\team_blue_ca.paa); @@ -71,7 +71,7 @@ class CfgVehicles { }; class ACE_JoinTeamYellow { displayName = "$STR_ACE_Interaction_JoinTeamYellow"; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam)); statement = QUOTE([ARR_2(_target,'YELLOW')] call DFUNC(joinTeam)); showDisabled = 1; icon = PATHTOF(UI\team\team_yellow_ca.paa); @@ -81,7 +81,7 @@ class CfgVehicles { class ACE_LeaveTeam { displayName = "$STR_ACE_Interaction_LeaveTeam"; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {assignedTeam _player != 'MAIN'}); + condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinTeam) && {assignedTeam _player != 'MAIN'}); statement = QUOTE([ARR_2(_target,'MAIN')] call DFUNC(joinTeam)); showDisabled = 1; icon = PATHTOF(UI\team\team_white_ca.paa); @@ -92,8 +92,8 @@ class CfgVehicles { class ACE_JoinGroup { displayName = "$STR_ACE_Interaction_JoinGroup"; - condition = QUOTE(side group _player == side group _target && {group _player != group _target}); - statement = QUOTE([_player] joinSilent group _target;); + condition = QUOTE([ARR_2(_player,_target)] call DFUNC(canJoinGroup)); + statement = QUOTE([_player] joinSilent group _target); showDisabled = 0; priority = 2.6; icon = PATHTOF(UI\team\team_management_ca.paa); @@ -223,7 +223,7 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_JoinTeamBlue"; condition = QUOTE(true); exceptions[] = {"isNotInside"}; - statement = QUOTE([ARR_2(_player,'BLUE')] call FUNC(joinTeam)); + statement = QUOTE([ARR_2(_player,'BLUE')] call DFUNC(joinTeam)); showDisabled = 1; priority = 2.2; icon = PATHTOF(UI\team\team_blue_ca.paa); @@ -233,7 +233,7 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_JoinTeamYellow"; condition = QUOTE(true); exceptions[] = {"isNotInside"}; - statement = QUOTE([ARR_2(_player,'YELLOW')] call FUNC(joinTeam)); + statement = QUOTE([ARR_2(_player,'YELLOW')] call DFUNC(joinTeam)); showDisabled = 1; priority = 2.1; icon = PATHTOF(UI\team\team_yellow_ca.paa); @@ -244,7 +244,7 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_LeaveTeam"; condition = QUOTE(assignedTeam _player != 'MAIN'); exceptions[] = {"isNotInside"}; - statement = QUOTE([ARR_2(_player,'MAIN')] call FUNC(joinTeam)); + statement = QUOTE([ARR_2(_player,'MAIN')] call DFUNC(joinTeam)); showDisabled = 1; priority = 2.5; icon = PATHTOF(UI\team\team_white_ca.paa); @@ -252,9 +252,9 @@ class CfgVehicles { }; class ACE_BecomeLeader { displayName = "$STR_ACE_Interaction_BecomeLeader"; - condition = QUOTE(_this call FUNC(canBecomeLeader)); + condition = QUOTE(_this call DFUNC(canBecomeLeader)); exceptions[] = {"isNotInside"}; - statement = QUOTE(_this call FUNC(doBecomeLeader)); + statement = QUOTE(_this call DFUNC(doBecomeLeader)); showDisabled = 1; priority = 1.0; icon = PATHTOF(UI\team\team_white_ca.paa); @@ -398,6 +398,12 @@ class CfgVehicles { selection = ""; distance = 10; condition = "true"; + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); + }; }; }; class ACE_SelfActions { @@ -405,7 +411,7 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_Passengers"; condition = "true"; statement = ""; - insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; }; }; @@ -416,6 +422,12 @@ class CfgVehicles { selection = ""; distance = 10; condition = "true"; + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); + }; }; }; class ACE_SelfActions { @@ -423,7 +435,7 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_Passengers"; condition = "true"; statement = ""; - insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; }; }; @@ -436,6 +448,12 @@ class CfgVehicles { selection = ""; distance = 10; condition = "true"; + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); + }; }; }; class ACE_SelfActions { @@ -443,7 +461,7 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_Passengers"; condition = "true"; statement = ""; - insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; }; }; @@ -454,6 +472,12 @@ class CfgVehicles { selection = ""; distance = 10; condition = "true"; + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); + }; }; }; class ACE_SelfActions { @@ -461,7 +485,7 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_Passengers"; condition = "true"; statement = ""; - insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; }; }; @@ -479,10 +503,16 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_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 FUNC(push);); + statement = QUOTE([ARR_2(_target, [ARR_3(2 * (vectorDir _player select 0), 2 * (vectorDir _player select 1), 0.5)])] call DFUNC(push);); showDisabled = 0; priority = -1; }; + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); + }; }; }; class ACE_SelfActions { @@ -490,7 +520,7 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_Passengers"; condition = "true"; statement = ""; - insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; }; }; @@ -502,6 +532,12 @@ class CfgVehicles { selection = "gunnerview"; distance = 2; condition = "true"; + class ACE_Passengers { + displayName = "$STR_ACE_Interaction_Passengers"; + condition = "true"; + statement = ""; + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); + }; }; }; class ACE_SelfActions { @@ -509,7 +545,7 @@ class CfgVehicles { displayName = "$STR_ACE_Interaction_Passengers"; condition = "true"; statement = ""; - insertChildren = QUOTE(_this call FUNC(addPassengersActions)); + insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; }; }; diff --git a/addons/interaction/XEH_preInit.sqf b/addons/interaction/XEH_preInit.sqf index 6f10a4e834..34c225c8f0 100644 --- a/addons/interaction/XEH_preInit.sqf +++ b/addons/interaction/XEH_preInit.sqf @@ -8,6 +8,8 @@ PREP(addSelectableItem); PREP(applyButtons); PREP(canBecomeLeader); PREP(canInteractWithCivilian); +PREP(canJoinGroup); +PREP(canJoinTeam); PREP(canTapShoulder); PREP(doBecomeLeader); PREP(getDoor); diff --git a/addons/interaction/functions/fnc_canJoinGroup.sqf b/addons/interaction/functions/fnc_canJoinGroup.sqf new file mode 100644 index 0000000000..d299524925 --- /dev/null +++ b/addons/interaction/functions/fnc_canJoinGroup.sqf @@ -0,0 +1,12 @@ +// by commy2 +#include "script_component.hpp" + +private ["_unit", "_target"]; + +_unit = _this select 0; +_target = _this select 1; + +alive _target +&& {!(_target getVariable ["ACE_isUnconscious", false])} +&& {side group _unit == side group _target} +&& {group _unit != group _target} diff --git a/addons/interaction/functions/fnc_canJoinTeam.sqf b/addons/interaction/functions/fnc_canJoinTeam.sqf new file mode 100644 index 0000000000..45f96393a9 --- /dev/null +++ b/addons/interaction/functions/fnc_canJoinTeam.sqf @@ -0,0 +1,12 @@ +// by commy2 +#include "script_component.hpp" + +private ["_unit", "_target"]; + +_unit = _this select 0; +_target = _this select 1; + +alive _target +&& {!(_target getVariable ["ACE_isUnconscious", false])} +&& {!([_target] call EFUNC(common,isPlayer))} +&& {_target in units group _unit} diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 38902f80cf..a0d96bbeb0 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -11,6 +11,7 @@ Взаимодействия Cselekvések Interazioni + Interaçãoes Torso @@ -22,6 +23,7 @@ Торс Testtörzs Torso + Torso Head @@ -33,6 +35,7 @@ Голова Fej Testa + Cabeça Left Arm @@ -44,6 +47,7 @@ Левая рука Bal kar Braccio sinistro + Braço Esquerdo Right Arm @@ -55,6 +59,7 @@ Правая рука Jobb kar Braccio destro + Braço Direito Left Leg @@ -66,6 +71,7 @@ Левая нога Bal láb Gamba sinistra + Perna Esquerda Right Leg @@ -77,6 +83,7 @@ Правая нога Jobb láb Gamba destra + Perna Direita Weapon @@ -88,6 +95,7 @@ Оружие Fegyver Arma + Arma Interaction Menu @@ -552,7 +560,7 @@ Jaune Żółty Žlutý - Желтый + Жёлтый Amarela Giallo Sárga @@ -564,7 +572,7 @@ Rejoindre<br/>Rouge Dołącz do drużyny<br/>czerwonej Připojit do<br/>Červeného týmu - Присоединиться<br/>к красной группе + Присоединиться<br/>к Красной группе Unir-se à<br/>Equipe Vermelha Entra nella<br/>Squadra Rossa Csatlakozás a<br/>piros csapathoz @@ -576,7 +584,7 @@ Rejoindre<br/>Vert Dołącz do<br/>drużyny zielonej Připojit do<br/>Zeleného týmu - Присоединиться<br/>к зеленой группе + Присоединиться<br/>к Зеленой группе Unir-se à<br/>Equipe Verde Entra nella<br/>Squadra Verde Csatlakozás a<br/>zöld csapathoz @@ -588,7 +596,7 @@ Rejoindre<br/>Bleu Dołącz do<br/>drużyny niebieskiej Připojit do<br/>Modrého týmu - Присоединиться<br/>к синей группе + Присоединиться<br/>к Синей группе Unir-se à<br/>Equipe Azul Entra nella<br/>Squadra Blu Csatlakozás a<br/>kék csapathoz @@ -600,7 +608,7 @@ Rejoindre<br/>Jaune Dołącz do<br/>drużyny żółtej Připojit do<br/>Žlutého týmu - Присоединиться<br/>к желтой группе + Присоединиться<br/>к Жёлтой группе Unir-se à<br/>Equipe Amarela Entra nella<br/>Squadra Gialla Csatlakozás a<br/>sárga csapathoz @@ -699,6 +707,7 @@ Felszerelés Снаряжение Equipaggiamento + Equipamento Push @@ -710,6 +719,7 @@ Tolás Толкать Spingi + Empurrar Interact @@ -721,6 +731,7 @@ Interactuar Cselekvés Interagisci + Interagir Passengers @@ -732,6 +743,7 @@ Passagers Utasok Passeggeri + Passageiros diff --git a/addons/inventory/stringtable.xml b/addons/inventory/stringtable.xml index da132cc3f1..6ad5ec0408 100644 --- a/addons/inventory/stringtable.xml +++ b/addons/inventory/stringtable.xml @@ -11,6 +11,7 @@ Agrandir la taille d'affichage de l'inventaire Legyen a felszerelés menüje nagyobb Ingrandisci il menù inventario + Aumentar o Tamanho da Tela do Inventário Normally inventory display is scaled by UI size. This allows scaling the Inventory UI size up, but doesn't increase font size allowing more rows displayed. @@ -22,6 +23,7 @@ L'inventaire est normalement affiché en fonction de la taille de l'UI. Cette option permet d'agrandir l'affichage de l'inventaire, mais n'a aucun effet sur la taille des polices permettant d'afficher plus de ligne Alaphelyzetben a kezelőfelület mérete skálázza a felszerelési menüt. Ez az opció engedélyezi a menü felskálázását, de megtartja a betűméreteket, így növelve a láthatóságot. Normalmente il menù inventario è scalato in base alle dimensioni interfaccia. Questa opzione di permette di ingrandirlo ulteriormente ma senza aumentare la dimensione del testo. + Normalmente o tamanho da tela do inventário é ditada pelo tamanho da UI. Isso permite aumentar o tamanho da tela de inventário, mas não aumenta o tamanho da fonte, permitindo que mais linhas sejam visualizadas. diff --git a/addons/javelin/functions/fnc_onOpticDraw.sqf b/addons/javelin/functions/fnc_onOpticDraw.sqf index 6da8353126..505953d877 100644 --- a/addons/javelin/functions/fnc_onOpticDraw.sqf +++ b/addons/javelin/functions/fnc_onOpticDraw.sqf @@ -130,7 +130,7 @@ FUNC(disableFire) = { if(_firedEH < 0 && difficulty > 0) then { _firedEH = [ACE_player, "DefaultAction", {true}, { - _canFire = _currentShooter getVariable["ace_missileguidance_target", nil]; + _canFire = (_this select 0) getVariable["ace_missileguidance_target", nil]; if(!isNil "_canFire") exitWith { false }; true }] call EFUNC(common,addActionEventHandler); @@ -289,4 +289,4 @@ _args set[3, _lockTime]; _args set[4, _soundTime]; _args set[6, _fireDisabledEH]; -uiNamespace setVariable[QGVAR(arguments), _args ]; \ No newline at end of file +uiNamespace setVariable[QGVAR(arguments), _args ]; diff --git a/addons/javelin/stringtable.xml b/addons/javelin/stringtable.xml index 33abcc1e49..3032cd013f 100644 --- a/addons/javelin/stringtable.xml +++ b/addons/javelin/stringtable.xml @@ -11,6 +11,7 @@ Célpontra állás (Lenyomva tartott) Aggangia il bersagio Fijar objetivo (Mantener) + Travar Alvo(Segurar) Cycle Fire Mode @@ -22,6 +23,7 @@ Tüzelési mód váltása Alterna le modalità di fuoco Cambiar modo de disparo + Alterar Modo de Disparo - \ No newline at end of file + diff --git a/addons/kestrel4500/stringtable.xml b/addons/kestrel4500/stringtable.xml index 2703e34e9f..15808311d9 100644 --- a/addons/kestrel4500/stringtable.xml +++ b/addons/kestrel4500/stringtable.xml @@ -20,6 +20,8 @@ Station météo portable Kestrel 4500 Kestrel 4500 Pocket Weather Tracker Kestrel 4500 Taschenwettermessgerät + Kestrel 4500 Indicatore Meteorologico Tascabile + Kestrel 4500 Medidor Balístico Ativo Open Kestrel 4500 @@ -30,6 +32,7 @@ Accendi Kestrel 4500 Abrir Kestrel 4500 Kestrel 4500 öffnen + Abrir Kestrel 4500 Show Kestrel 4500 @@ -68,4 +71,4 @@ Kestrel 4500 anzeigen - \ No newline at end of file + diff --git a/addons/laser_selfdesignate/stringtable.xml b/addons/laser_selfdesignate/stringtable.xml index f587763bce..287aaec4ed 100644 --- a/addons/laser_selfdesignate/stringtable.xml +++ b/addons/laser_selfdesignate/stringtable.xml @@ -11,6 +11,7 @@ Désignateur laser allumé Lézeres Megjelölő Be Designatore laser acceso + Desiginador Laser Ligado Laser Designator Off @@ -22,6 +23,7 @@ Désignateur laser éteint Lézeres Megjelölő Ki Designatore laser spento + Desiginador Laser Desligado - \ No newline at end of file + diff --git a/addons/laserpointer/stringtable.xml b/addons/laserpointer/stringtable.xml index 8fa38e24dd..c3c227d8e3 100644 --- a/addons/laserpointer/stringtable.xml +++ b/addons/laserpointer/stringtable.xml @@ -11,6 +11,7 @@ Lézer-pointer (piros) Puntero láser (rojo) Puntatore laser (rosso) + Laser (vermelho) Laser Pointer (green) @@ -22,6 +23,7 @@ Lézer-pointer (zöld) Puntero láser (verde) Puntatore laser (verde) + Laser (verde) Emits visible light. @@ -33,6 +35,7 @@ Látható fényt bocsát ki. Emite luz visible. Emette luce visibile + Emite luz visível. <t color='#9cf953'>Use: </t>Turn Laser ON/OFF @@ -53,6 +56,7 @@ Лазер Laser Laser + Laser IR Laser @@ -61,6 +65,7 @@ ИК-лазер Laser IR Laser IR + Laser IR Switch Laser / IR Laser @@ -72,4 +77,4 @@ Cambiar Laser / Laser IR - \ No newline at end of file + diff --git a/addons/logistics_uavbattery/stringtable.xml b/addons/logistics_uavbattery/stringtable.xml index 23588586cf..fecf4754da 100644 --- a/addons/logistics_uavbattery/stringtable.xml +++ b/addons/logistics_uavbattery/stringtable.xml @@ -9,7 +9,7 @@ Dron jest naładowany A drón fel van töltve Dron je nabitý - O VANT está cheio + O UAV está cheio Il drone è pieno БПЛА полностью заряжен @@ -21,7 +21,7 @@ Potrzebujesz baterii UAV Szükséged van egy UAV akkumulátorra Potřebuješ UAV baterii - Você precisa de uma Bateria para VANT + Você precisa de uma bateria para UAVs Hai bisogno di una Batteria UAV Требуется аккумулятор для БПЛА @@ -45,7 +45,7 @@ Bateria UAV UAV akkumulátor UAV baterie - Bateria para VANT + Bateria para UAV Batteria UAV Аккумулятор БПЛА @@ -57,7 +57,7 @@ Używana do naładowania baterii przenośnego UAV Hordozható UAV-k feltöltéséhez való akkumulátor Používané k dobíjení UAV - Usada para reabastecer VANT + Usada para reabastecer o UAV Usata per ricaricare la Batteria dell'UAV Используется для зарядки переносных БПЛА diff --git a/addons/logistics_wirecutter/stringtable.xml b/addons/logistics_wirecutter/stringtable.xml index 129075f001..fb31506665 100644 --- a/addons/logistics_wirecutter/stringtable.xml +++ b/addons/logistics_wirecutter/stringtable.xml @@ -10,6 +10,8 @@ Štípací kleště Nożyce do cięcia drutu Drótvágó + Pinze da Taglio + Cortador de Arame Wirecutter @@ -20,6 +22,8 @@ Służą do cięcia drutu i płotów Pince coupante Drótok, huzalok, és kábelek vágására alkalmas olló. + Pinze da Taglio + Cortador de Arame Cut Fence diff --git a/addons/magazinerepack/stringtable.xml b/addons/magazinerepack/stringtable.xml index 9ea10924ac..0389d72d91 100644 --- a/addons/magazinerepack/stringtable.xml +++ b/addons/magazinerepack/stringtable.xml @@ -1,5 +1,4 @@  - @@ -84,6 +83,7 @@ Przepakowywanie zakończone Újratárazás befejezve Riempi caricatore + Reorganização Terminada Repacking Interrupted @@ -95,6 +95,7 @@ Przepakowywanie przerwane Újratárazás megszakítva Riempimento interrotto + Reorganização Interrompida %1 Full and %2 Partial @@ -106,6 +107,7 @@ Pełnych: %1.<br/>Częściowo pełnych: %2. %1 teljes és %2 részleges %1 pieno e %2 parziale + %1 Total e %2 Parcial diff --git a/addons/main/script_macros.hpp b/addons/main/script_macros.hpp index fce9ec526a..d4b6739918 100644 --- a/addons/main/script_macros.hpp +++ b/addons/main/script_macros.hpp @@ -1,6 +1,11 @@ #include "\x\cba\addons\main\script_macros_common.hpp" #include "\x\cba\addons\xeh\script_xeh.hpp" +//Faster Array Unwraping (skips the IS_ARRAY check normaly found in EXPLODE_1_SYS) +#undef EXPLODE_2_SYS +#define EXPLODE_1_SYS_FAST(ARRAY,A) A =(ARRAY) select 0 +#define EXPLODE_2_SYS(ARRAY,A,B) EXPLODE_1_SYS_FAST(ARRAY,A); B = (ARRAY) select 1 + // Default versioning level #define DEFAULT_VERSIONING_LEVEL 2 diff --git a/addons/map/stringtable.xml b/addons/map/stringtable.xml index e3e2a6fe93..4423bbcfb4 100644 --- a/addons/map/stringtable.xml +++ b/addons/map/stringtable.xml @@ -1,5 +1,4 @@  - diff --git a/addons/maptools/stringtable.xml b/addons/maptools/stringtable.xml index 0c19581779..f2a14e8b33 100644 --- a/addons/maptools/stringtable.xml +++ b/addons/maptools/stringtable.xml @@ -143,6 +143,7 @@ Irány: %1 Направление: %1° Direzione : %1° + Direção: %1 diff --git a/addons/markers/stringtable.xml b/addons/markers/stringtable.xml index 343f4c9d2a..44d64eb1e0 100644 --- a/addons/markers/stringtable.xml +++ b/addons/markers/stringtable.xml @@ -11,6 +11,7 @@ Направление: %1° Irány: %1° Direzione: %1° + Direção %1 diff --git a/addons/medical/ACE_Medical_Actions.hpp b/addons/medical/ACE_Medical_Actions.hpp index ed5670f814..70e286f7d8 100644 --- a/addons/medical/ACE_Medical_Actions.hpp +++ b/addons/medical/ACE_Medical_Actions.hpp @@ -3,6 +3,7 @@ class ACE_Head { displayName = "$STR_ACE_Interaction_Head"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,0,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); @@ -65,16 +66,23 @@ class ACE_Head { EXCEPTIONS }; class CheckResponse: CheckPulse { - displayName = "Check Response"; + displayName = "$STR_ACE_MEDICAL_CHECK_RESPONSE"; condition = QUOTE([ARR_4(_player, _target, 'head', 'CheckResponse')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckResponse')] call DFUNC(treatment)); EXCEPTIONS }; + class Diagnose: CheckPulse { + displayName = "$STR_ACE_MEDICAL_ACTIONS_Diagnose"; + condition = QUOTE([ARR_4(_player, _target, 'head', 'Diagnose')] call DFUNC(canTreatCached)); + statement = QUOTE([ARR_4(_player, _target, 'head', 'Diagnose')] call DFUNC(treatment)); + EXCEPTIONS + }; }; class ACE_Torso { displayName = "$STR_ACE_Interaction_Torso"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,1,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); @@ -103,7 +111,7 @@ class ACE_Torso { enableInside = 1; }; class TriageCard { - displayName = "Triage Card"; + displayName = "$STR_ACE_MEDICAL_ACTIONS_TriageCard"; distance = 2.0; condition = "true"; statement = QUOTE([ARR_2(_target, true)] call DFUNC(displayTriageCard)); @@ -150,21 +158,21 @@ class ACE_Torso { icon = PATHTOF(UI\icons\bandage.paa); }; class SurgicalKit: fieldDressing { - displayName = "Use Surgical Kit"; + displayName = "$STR_ACE_MEDICAL_USE_SURGICALKIT"; condition = QUOTE([ARR_4(_player, _target, 'body', 'SurgicalKit')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'SurgicalKit')] call DFUNC(treatment)); EXCEPTIONS icon = PATHTOF(UI\icons\surgicalKit.paa); }; class PersonalAidKit: fieldDressing { - displayName = "Use Personal Aid Kit"; + displayName = "$STR_ACE_MEDICAL_USE_AID_KIT"; condition = QUOTE([ARR_4(_player, _target, 'body', 'PersonalAidKit')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'PersonalAidKit')] call DFUNC(treatment)); EXCEPTIONS icon = ""; }; class CPR: fieldDressing { - displayName = "CPR"; + displayName = "$STR_ACE_MEDICAL_ACTIONS_CPR"; condition = QUOTE([ARR_4(_player, _target, 'body', 'CPR')] call DFUNC(canTreatCached)); statement = QUOTE([ARR_4(_player, _target, 'body', 'CPR')] call DFUNC(treatment)); EXCEPTIONS @@ -175,6 +183,7 @@ class ACE_ArmLeft { displayName = "$STR_ACE_Interaction_ArmLeft"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,2,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); @@ -332,6 +341,7 @@ class ACE_ArmRight { displayName = "$STR_ACE_Interaction_ArmRight"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,3,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); @@ -486,6 +496,7 @@ class ACE_LegLeft { displayName = "$STR_ACE_Interaction_LegLeft"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,4,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); @@ -628,6 +639,7 @@ class ACE_LegRight { displayName = "$STR_ACE_Interaction_LegRight"; runOnHover = 1; statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,5,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; EXCEPTIONS icon = PATHTOF(UI\icons\medical_cross.paa); diff --git a/addons/medical/ACE_Medical_SelfActions.hpp b/addons/medical/ACE_Medical_SelfActions.hpp index 9c79503f3d..add07c8262 100644 --- a/addons/medical/ACE_Medical_SelfActions.hpp +++ b/addons/medical/ACE_Medical_SelfActions.hpp @@ -12,6 +12,7 @@ class Medical { icon = PATHTOF(UI\icons\medical_cross.paa); exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,0,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; runOnHover = 1; @@ -80,6 +81,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 1)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,1,_this select 3)] call FUNC(modifyMedicalAction)); showDisabled = 1; priority = 2; hotkey = ""; @@ -148,6 +150,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 2)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,2,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); @@ -249,6 +252,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 3)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,3,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); @@ -346,6 +350,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 4)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,4,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); @@ -432,6 +437,7 @@ class Medical { runOnHover = 1; exceptions[] = {"isNotInside"}; statement = QUOTE([ARR_3(_target, true, 5)] call DFUNC(displayPatientInformation)); + modifierFunction = QUOTE([ARR_4(_target,_player,5,_this select 3)] call FUNC(modifyMedicalAction)); condition = "true"; icon = PATHTOF(UI\icons\medical_cross.paa); diff --git a/addons/medical/ACE_Medical_Treatments.hpp b/addons/medical/ACE_Medical_Treatments.hpp index 5b5e0b6abd..fced8c93bf 100644 --- a/addons/medical/ACE_Medical_Treatments.hpp +++ b/addons/medical/ACE_Medical_Treatments.hpp @@ -71,14 +71,14 @@ class ACE_Medical_Actions { itemConsumed = 1; litter[] = {}; }; - class CheckPulse: Bandage { - displayName = ""; - displayNameProgress = ""; + class Diagnose: Bandage { + displayName = "$STR_ACE_MEDICAL_ACTIONS_Diagnose"; + displayNameProgress = "$STR_ACE_MEDICAL_ACTIONS_Diagnosing"; treatmentLocations[] = {"All"}; requiredMedic = 0; - treatmentTime = 2; + treatmentTime = 1; items[] = {}; - callbackSuccess = QUOTE(DFUNC(actionCheckPulse)); + callbackSuccess = QUOTE(DFUNC(actionDiagnose)); callbackFailure = ""; callbackProgress = ""; animationPatient = ""; @@ -86,12 +86,6 @@ class ACE_Medical_Actions { itemConsumed = 0; litter[] = {}; }; - class CheckBloodPressure: CheckPulse { - callbackSuccess = QUOTE(DFUNC(actionCheckBloodPressure)); - }; - class CheckResponse: CheckPulse { - callbackSuccess = QUOTE(DFUNC(actionCheckResponse)); - }; }; class Advanced { @@ -202,7 +196,7 @@ class ACE_Medical_Actions { }; class SurgicalKit: fieldDressing { displayName = ""; - displayNameProgress = ""; + displayNameProgress = "$STR_ACE_Medical_TreatmentAction"; items[] = {"ACE_surgicalKit"}; treatmentLocations[] = {QGVAR(useLocation_SurgicalKit)}; requiredMedic = QGVAR(medicSetting_SurgicalKit); @@ -214,7 +208,7 @@ class ACE_Medical_Actions { }; class PersonalAidKit: fieldDressing { displayName = ""; - displayNameProgress = ""; + displayNameProgress = "$STR_ACE_Medical_TreatmentAction"; items[] = {"ACE_personalAidKit"}; treatmentLocations[] = {QGVAR(useLocation_PAK)}; requiredMedic = QGVAR(medicSetting_PAK); @@ -231,7 +225,7 @@ class ACE_Medical_Actions { }; class CheckPulse: fieldDressing { displayName = ""; - displayNameProgress = ""; + displayNameProgress = "$STR_ACE_MEDICAL_CHECK_PULSE_CONTENT"; treatmentLocations[] = {"All"}; requiredMedic = 0; treatmentTime = 2; @@ -246,9 +240,11 @@ class ACE_Medical_Actions { }; class CheckBloodPressure: CheckPulse { callbackSuccess = QUOTE(DFUNC(actionCheckBloodPressure)); + displayNameProgress = "$STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_CONTENT"; }; class CheckResponse: CheckPulse { callbackSuccess = QUOTE(DFUNC(actionCheckResponse)); + displayNameProgress = "$STR_ACE_MEDICAL_CHECK_RESPONSE_CONTENT"; }; class RemoveTourniquet: CheckPulse { treatmentTime = 2.5; @@ -256,8 +252,8 @@ class ACE_Medical_Actions { condition = QUOTE([ARR_2(_this select 1, _this select 2)] call FUNC(hasTourniquetAppliedTo)); }; class CPR: fieldDressing { - displayName = "CPR"; - displayNameProgress = "Performing CPR"; + displayName = "$STR_ACE_MEDICAL_ACTIONS_CPR"; + displayNameProgress = "$STR_ACE_MEDICAL_ACTIONS_PerformingCPR"; treatmentLocations[] = {"All"}; requiredMedic = 0; treatmentTime = 15; @@ -303,23 +299,26 @@ class ACE_Medical_Advanced { // Source: Scarle // Also called scrapes, they occur when the skin is rubbed away by friction against another rough surface (e.g. rope burns and skinned knees). class Abrasion { - name = "Scrape"; + name = "$STR_ACE_Medical_Wounds_Abrasion"; selections[] = {"All"}; bleedingRate = 0.0001; pain = 0.01; causes[] = {"falling", "ropeburn", "vehiclecrash", "unknown"}; minDamage = 0.01; class Minor { + name = "$STR_ACE_Medical_Wounds_Abrasion_Minor"; minDamage = 0.01; maxDamage = 0.2; bleedingRate = 0.0001; }; class Medium { + name = "$STR_ACE_Medical_Wounds_Abrasion_Medium"; minDamage = 0.2; maxDamage = 0.3; bleedingRate = 0.00015; }; class Large { + name = "$STR_ACE_Medical_Wounds_Abrasion_Large"; minDamage = 0.3; bleedingRate = 0.0002; }; @@ -327,23 +326,26 @@ class ACE_Medical_Advanced { // Occur when an entire structure or part of it is forcibly pulled away, such as the loss of a permanent tooth or an ear lobe. Explosions, gunshots, and animal bites may cause avulsions. class Avulsions { - name = "Avulsion"; + name = "$STR_ACE_Medical_Wounds_Avulsion"; selections[] = {"All"}; bleedingRate = 0.01; pain = 0.3; causes[] = {"explosive", "vehiclecrash", "grenade", "shell", "bullet", "backblast", "bite"}; minDamage = 0.2; class Minor { + name = "$STR_ACE_Medical_Wounds_Avulsion_Minor"; minDamage = 0.2; maxDamage = 0.3; bleedingRate = 0.01; }; class Medium { + name = "$STR_ACE_Medical_Wounds_Avulsion_Medium"; minDamage = 0.3; maxDamage = 0.6; bleedingRate = 0.02; }; class Large { + name = "$STR_ACE_Medical_Wounds_Avulsion_Large"; minDamage = 0.5; bleedingRate = 0.05; }; @@ -351,22 +353,25 @@ class ACE_Medical_Advanced { // Also called bruises, these are the result of a forceful trauma that injures an internal structure without breaking the skin. Blows to the chest, abdomen, or head with a blunt instrument (e.g. a football or a fist) can cause contusions. class Contusion { - name = "Bruise"; + name = "$STR_ACE_Medical_Wounds_Contusion"; selections[] = {"All"}; bleedingRate = 0.0; pain = 0.05; - causes[] = {"bullet", "backblast", "punch","vehiclecrash","falling"}; + causes[] = {"bullet", "backblast", "punch", "vehiclecrash", "falling"}; minDamage = 0.01; maxDamage = 0.1; class Minor { + name = "$STR_ACE_Medical_Wounds_Contusion_Minor"; minDamage = 0.01; maxDamage = 0.1; }; class Medium { + name = "$STR_ACE_Medical_Wounds_Contusion_Medium"; minDamage = 0.1; maxDamage = 0.15; }; class Large { + name = "$STR_ACE_Medical_Wounds_Contusion_Large"; minDamage = 0.15; maxDamage = 0.2; }; @@ -374,23 +379,26 @@ class ACE_Medical_Advanced { // Occur when a heavy object falls onto a person, splitting the skin and shattering or tearing underlying structures. class CrushWound { - name = "Crushed tissue"; + name = "$STR_ACE_Medical_Wounds_Crush"; selections[] = {"All"}; bleedingRate = 0.01; pain = 0.1; causes[] = {"falling", "vehiclecrash", "punch", "unknown"}; minDamage = 0.1; class Minor { + name = "$STR_ACE_Medical_Wounds_Crush_Minor"; minDamage = 0.1; maxDamage = 0.45; bleedingRate = 0.005; }; class Medium { + name = "$STR_ACE_Medical_Wounds_Crush_Medium"; minDamage = 0.4; maxDamage = 0.7; bleedingRate = 0.007; }; class Large { + name = "$STR_ACE_Medical_Wounds_Crush_Large"; minDamage = 0.6; bleedingRate = 0.0095; }; @@ -398,23 +406,26 @@ class ACE_Medical_Advanced { // Slicing wounds made with a sharp instrument, leaving even edges. They may be as minimal as a paper cut or as significant as a surgical incision. class Cut { - name = "Cut"; + name = "$STR_ACE_Medical_Wounds_Cut"; selections[] = {"All"}; bleedingRate = 0.01; pain = 0.075; causes[] = {"vehiclecrash", "grenade", "explosive", "shell", "backblast", "stab", "unknown"}; minDamage = 0.1; class Minor { + name = "$STR_ACE_Medical_Wounds_Cut_Minor"; minDamage = 0.1; maxDamage = 0.3; bleedingRate = 0.005; }; class Medium { + name = "$STR_ACE_Medical_Wounds_Cut_Medium"; minDamage = 0.3; maxDamage = 0.65; bleedingRate = 0.02; }; class Large { + name = "$STR_ACE_Medical_Wounds_Cut_Large"; minDamage = 0.65; bleedingRate = 0.05; }; @@ -422,23 +433,26 @@ class ACE_Medical_Advanced { // Also called tears, these are separating wounds that produce ragged edges. They are produced by a tremendous force against the body, either from an internal source as in childbirth, or from an external source like a punch. class Laceration { - name = "Tear"; + name = "$STR_ACE_Medical_Wounds_Laceration"; selections[] = {"All"}; bleedingRate = 0.01; pain = 0.075; causes[] = {"vehiclecrash", "punch"}; minDamage = 0.01; class Minor { + name = "$STR_ACE_Medical_Wounds_Laceration_Minor"; minDamage = 0.1; maxDamage = 0.5; bleedingRate = 0.005; }; class Medium { + name = "$STR_ACE_Medical_Wounds_Laceration_Medium"; minDamage = 0.5; maxDamage = 0.7; bleedingRate = 0.01; }; class Large { + name = "$STR_ACE_Medical_Wounds_Laceration_Large"; minDamage = 0.7; bleedingRate = 0.03; }; @@ -446,22 +460,25 @@ class ACE_Medical_Advanced { // Also called velocity wounds, they are caused by an object entering the body at a high speed, typically a bullet or small peices of shrapnel. class velocityWound { - name = "Velocity Wound"; + name = "$STR_ACE_Medical_Wounds_VelocityWound"; selections[] = {"All"}; bleedingRate = 0.01; pain = 0.2; causes[] = {"bullet", "grenade","explosive", "shell", "unknown"}; minDamage = 0.15; class Minor { + name = "$STR_ACE_Medical_Wounds_VelocityWound_Minor"; minDamage = 0.15; maxDamage = 0.3; bleedingRate = 0.025; }; class Medium { + name = "$STR_ACE_Medical_Wounds_VelocityWound_Medium"; minDamage = 0.3; bleedingRate = 0.05; }; class Large { + name = "$STR_ACE_Medical_Wounds_VelocityWound_Large"; minDamage = 0.75; bleedingRate = 0.1; }; @@ -469,23 +486,26 @@ class ACE_Medical_Advanced { // Deep, narrow wounds produced by sharp objects such as nails, knives, and broken glass. class punctureWound { - name = "Puncture Wound"; + name = "$STR_ACE_Medical_Wounds_PunctureWound"; selections[] = {"All"}; bleedingRate = 0.01; pain = 0.075; causes[] = {"stab", "grenade"}; minDamage = 0.01; class Minor { + name = "$STR_ACE_Medical_Wounds_PunctureWound_Minor"; minDamage = 0.01; maxDamage = 0.5; bleedingRate = 0.01; }; class Medium { + name = "$STR_ACE_Medical_Wounds_PunctureWound_Medium"; minDamage = 0.5; maxDamage = 0.75; bleedingRate = 0.03; }; class Large { + name = "$STR_ACE_Medical_Wounds_PunctureWound_Large"; minDamage = 0.65; bleedingRate = 0.08; }; @@ -493,7 +513,7 @@ class ACE_Medical_Advanced { }; class fractures { class Femur { - name = "Broken Femur"; + name = "$STR_ACE_Medical_Wounds_Femur"; selections[] = {"Head", "Torso"}; pain = 0.2; causes[] = {"Bullet", "VehicleCrash", "Backblast", "Explosive", "Shell", "Grenade"}; diff --git a/addons/medical/ACE_Settings.hpp b/addons/medical/ACE_Settings.hpp index e7f60a14e8..1d87803f43 100644 --- a/addons/medical/ACE_Settings.hpp +++ b/addons/medical/ACE_Settings.hpp @@ -59,6 +59,11 @@ class ACE_Settings { typeName = "BOOL"; value = 0; }; + class GVAR(enableRevive) { + typeName = "SCALAR"; + value = 0; + values[] = {"Disabled", "Players only", "Players and AI"}; + }; class GVAR(maxReviveTime) { typeName = "SCALAR"; value = 120; diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index 2b1f7c9468..179daae742 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -37,47 +37,38 @@ class CfgVehicles { }; }; }; - class enableFor { - displayName = "Enabled for"; - description = "Select what units the medical system will be enabled for (Adv only)"; + class medicSetting { + displayName = "Medics setting"; + description = "What is the level of detail prefered for medics?"; typeName = "NUMBER"; class values { - class playableUnits { - name = "Players only."; + class disable { + name = "Disable medics"; value = 0; + }; + class normal { + name = "Normal"; + value = 1; default = 1; }; - class playableUnitsAndAI { - name = "Players and AI"; - value = 1; + class full { + name = "Advanced"; + value = 2; }; }; }; - // TODO Disabled until the features are implemented - /*class enableAirway { - displayName = "Enable Airway"; - description = "Enable Advanced medical Airway (Adv only)"; - typeName = "BOOL"; - defaultValue = 0; - }; - class enableFractures { - displayName = "Enable Fractures"; - description = "Enable Advanced medical Fractures (Adv only)"; - typeName = "BOOL"; - defaultValue = 0; - };*/ - class enableAdvancedWounds { - displayName = "Enable Advanced wounds"; - description = "Allow reopening of bandaged wounds? (Adv only)"; - typeName = "BOOL"; - defaultValue = 0; - }; - class enableVehicleCrashes { - displayName = "Vehicle Crashes"; - description = "Do units take damage from a vehicle crash?"; + class allowLitterCreation { + displayName = "Enable Litter"; + description = "Enable litter being created upon treatment"; typeName = "BOOL"; defaultValue = 1; }; + class litterCleanUpDelay { + displayName = "Life time of litter objects"; + description = "How long should litter objects stay? In seconds. -1 is forever."; + typeName = "NUMBER"; + defaultValue = 1800; + }; class enableScreams { displayName = "Enable Screams"; description = "Enable screaming by injuried units"; @@ -141,80 +132,58 @@ class CfgVehicles { }; }; - class ACE_moduleTreatmentSettings: ACE_Module { + class ACE_moduleAdvancedMedicalSettings: ACE_Module { scope = 2; - displayName = "Treatment Settings [ACE]"; + displayName = "Advanced Medical Settings [ACE]"; icon = QUOTE(PATHTOF(UI\Icon_Module_Medical_ca.paa)); category = "ACE_medical"; - function = QUOTE(FUNC(moduleTreatmentConfiguration)); + function = QUOTE(FUNC(moduleAdvancedMedicalSettings)); functionPriority = 10; isGlobal = 2; isTriggerActivated = 0; isDisposable = 0; author = "$STR_ACE_Common_ACETeam"; class Arguments { - class medicSetting { - displayName = "Medics setting"; - description = "What is the level of detail prefered for medics?"; + class enableFor { + displayName = "Enabled for"; + description = "Select what units the advanced medical system will be enabled for"; typeName = "NUMBER"; class values { - class disable { - name = "Disable medics"; + class playableUnits { + name = "Players only."; value = 0; - }; - class normal { - name = "Normal"; - value = 1; default = 1; }; - class full { - name = "Advanced"; - value = 2; + class playableUnitsAndAI { + name = "Players and AI"; + value = 1; }; }; }; - class maxReviveTime { - displayName = "Max Revive time"; - description = "Max amount of seconds a unit can spend in revive state"; - typeName = "NUMBER"; - defaultValue = 120; + class enableAdvancedWounds { + displayName = "Enable Advanced wounds"; + description = "Allow reopening of bandaged wounds?"; + typeName = "BOOL"; + defaultValue = 0; }; - class amountOfReviveLives { - displayName = "Max Revive lives"; - description = "Max amount of lives a unit. 0 or -1 is disabled."; - typeName = "NUMBER"; - defaultValue = -1; - }; - class enableOverdosing { - displayName = "Enable Overdosing"; - description = "Enable overdosing of medications"; + class enableVehicleCrashes { + displayName = "Vehicle Crashes"; + description = "Do units take damage from a vehicle crash?"; typeName = "BOOL"; defaultValue = 1; }; - class allowLitterCreation { - displayName = "Enable Litter"; - description = "Enable litter being created upon treatment"; - typeName = "BOOL"; - defaultValue = 1; - }; - class litterCleanUpDelay { - displayName = "Life time of litter objects"; - description = "How long should litter objects stay? In seconds. -1 is forever."; - typeName = "NUMBER"; - defaultValue = 1800; - }; class medicSetting_PAK { - displayName = "Allow PAK (Adv)"; + displayName = "Allow PAK"; description = "Who can use the PAK for full heal?"; typeName = "NUMBER"; class values { class anyone { name = "Anyone"; value = 0; }; class Medic { name = "Medics only"; value = 1; default = 1; }; - class Special { name = "Doctors only (Adv)"; value = 2; }; + class Special { name = "Doctors only"; value = 2; }; }; }; class consumeItem_PAK { - displayName = "Remove PAK on use (Adv)"; + displayName = "Remove PAK on use"; description = "Should PAK be removed on usage?"; typeName = "NUMBER"; class values { @@ -223,7 +192,7 @@ class CfgVehicles { }; }; class useLocation_PAK { - displayName = "Locations PAK (Adv)"; + displayName = "Locations PAK"; description = "Where can the personal aid kit be used?"; typeName = "NUMBER"; class values { @@ -254,6 +223,47 @@ class CfgVehicles { }; }; + + class ACE_moduleReviveSettings: ACE_Module { + scope = 2; + displayName = "Revive Settings [ACE]"; + icon = QUOTE(PATHTOF(UI\Icon_Module_Medical_ca.paa)); + category = "ACE_medical"; + function = QUOTE(DFUNC(moduleReviveSettings)); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = "$STR_ACE_Common_ACETeam"; + class Arguments { + class enableRevive { + displayName = "Enable Revive"; + description = "Enable a basic revive system"; + typeName = "NUMBER"; + defaultValue = 0; + class values { + class disable { name = "Disabled"; value = 0; default = 1;}; + class playerOnly { name = "Player only"; value = 1; }; + class playerAndAI { name = "Player & AI"; value = 2; }; + }; + }; + class maxReviveTime { + displayName = "Max Revive time"; + description = "Max amount of seconds a unit can spend in revive state"; + typeName = "NUMBER"; + defaultValue = 120; + }; + class amountOfReviveLives { + displayName = "Max Revive lives"; + description = "Max amount of lives a unit. 0 or -1 is disabled."; + typeName = "NUMBER"; + defaultValue = -1; + }; + }; + class ModuleDescription { + description = "Provides a medical system for both players and AI."; + sync[] = {}; + }; + }; class ACE_moduleAssignMedicRoles: Module_F { scope = 2; displayName = "Set Medic Class [ACE]"; @@ -436,7 +446,7 @@ class CfgVehicles { displayName = "$STR_ACE_MEDICAL_ACTIONS_Medical"; runOnHover = 1; exceptions[] = {"isNotInside"}; - condition = QUOTE(vehicle _target != _target); + condition = QUOTE(vehicle _target != _target && vehicle _target == vehicle _player); statement = QUOTE([ARR_3(_target, true, 0)] call DFUNC(displayPatientInformation)); icon = PATHTOF(UI\icons\medical_cross.paa); @@ -462,7 +472,7 @@ class CfgVehicles { showDisabled = 0; priority = 2; icon = PATHTOF(UI\icons\medical_cross.paa); - exceptions[] = {"isNotDragging", "isNotCarrying"}; + exceptions[] = {"isNotDragging", "isNotCarrying", "isNotInside"}; }; }; }; diff --git a/addons/medical/CfgWeapons.hpp b/addons/medical/CfgWeapons.hpp index 8fd58e2571..8c45b6906c 100644 --- a/addons/medical/CfgWeapons.hpp +++ b/addons/medical/CfgWeapons.hpp @@ -33,9 +33,6 @@ class CfgWeapons { }; class ACE_packingBandage: ACE_ItemCore { scope = 2; - value = 1; - count = 1; - type = 16; displayName = $STR_ACE_MEDICAL_PACKING_BANDAGE_DISPLAY; picture = QUOTE(PATHTOF(ui\items\packingBandage_x_ca.paa)); model = QUOTE(PATHTOF(data\packingbandage.p3d)); @@ -47,9 +44,6 @@ class CfgWeapons { }; class ACE_elasticBandage: ACE_ItemCore { scope = 2; - value = 1; - count = 1; - type = 16; displayName = $STR_ACE_MEDICAL_BANDAGE_ELASTIC_DISPLAY; picture = QUOTE(PATHTOF(ui\items\elasticBandage_x_ca.paa)); model = "\A3\Structures_F_EPA\Items\Medical\Bandage_F.p3d"; @@ -61,9 +55,6 @@ class CfgWeapons { }; class ACE_tourniquet: ACE_ItemCore { scope = 2; - value = 1; - count = 1; - type = 16; displayName = $STR_ACE_MEDICAL_TOURNIQUET_DISPLAY; picture = QUOTE(PATHTOF(ui\items\tourniquet_x_ca.paa)); model = QUOTE(PATHTOF(data\tourniquet.p3d)); @@ -75,9 +66,6 @@ class CfgWeapons { }; class ACE_morphine: ACE_ItemCore { scope = 2; - value = 1; - count = 1; - type = 16; displayName = $STR_ACE_MEDICAL_MORPHINE_DISPLAY; picture = QUOTE(PATHTOF(ui\items\morphine_x_ca.paa)); model = QUOTE(PATHTOF(data\morphine.p3d)); @@ -89,9 +77,6 @@ class CfgWeapons { }; class ACE_atropine: ACE_ItemCore { scope = 2; - value = 1; - count = 1; - type = 16; displayName = $STR_ACE_MEDICAL_ATROPINE_DISPLAY; picture = QUOTE(PATHTOF(ui\items\atropine_x_ca.paa)); model = QUOTE(PATHTOF(data\atropine.p3d)); @@ -104,9 +89,6 @@ class CfgWeapons { }; class ACE_epinephrine: ACE_ItemCore { scope = 2; - value = 1; - count = 1; - type = 16; displayName = $STR_ACE_MEDICAL_EPINEPHRINE_DISPLAY; picture = QUOTE(PATHTOF(ui\items\epinephrine_x_ca.paa)); model = QUOTE(PATHTOF(data\epinephrine.p3d)); @@ -118,8 +100,6 @@ class CfgWeapons { }; class ACE_plasmaIV: ACE_ItemCore { scope = 2; - value = 1; - count = 1; displayName = $STR_ACE_MEDICAL_PLASMA_IV; picture = QUOTE(PATHTOF(ui\items\plasmaIV_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_PLASMA_IV_DESC_SHORT; @@ -142,8 +122,6 @@ class CfgWeapons { }; class ACE_bloodIV: ACE_ItemCore { scope = 2; - value = 1; - count = 1; model = "\A3\Structures_F_EPA\Items\Medical\BloodBag_F.p3d"; displayName = $STR_ACE_MEDICAL_BLOOD_IV; picture = QUOTE(PATHTOF(ui\items\bloodIV_x_ca.paa)); @@ -167,8 +145,6 @@ class CfgWeapons { }; class ACE_salineIV: ACE_ItemCore { scope = 2; - value = 1; - count = 1; displayName = $STR_ACE_MEDICAL_SALINE_IV; picture = QUOTE(PATHTOF(ui\items\salineIV_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_SALINE_IV_DESC_SHORT; @@ -191,9 +167,6 @@ class CfgWeapons { }; class ACE_quikclot: ACE_ItemCore { scope = 2; - value = 1; - count = 1; - type = 16; displayName = $STR_ACE_MEDICAL_QUIKCLOT_DISPLAY; picture = QUOTE(PATHTOF(ui\items\quickclot_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_QUIKCLOT_DESC_SHORT; @@ -204,9 +177,6 @@ class CfgWeapons { }; class ACE_personalAidKit: ACE_ItemCore { scope = 2; - value = 1; - count = 1; - type = 16; displayName = $STR_ACE_MEDICAL_AID_KIT_DISPLAY; picture = QUOTE(PATHTOF(ui\items\personal_aid_kit_x_ca.paa)); descriptionShort = $STR_ACE_MEDICAL_AID_KIT_DESC_SHORT; diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 526990709b..386eb4de93 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -14,6 +14,7 @@ GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"]; ["medical_onUnconscious", { if (local (_this select 0)) then { + private ["_unit"]; _unit = _this select 0; if (_this select 1) then { _unit setVariable ["tf_globalVolume", 0.4]; @@ -36,7 +37,7 @@ GVAR(heartBeatSounds_Slow) = ["ACE_heartbeat_slow_1", "ACE_heartbeat_slow_2"]; // Initialize all effects _fnc_createEffect = { - private ["_type", "_layer", "_default"]; + private ["_type", "_layer", "_default", "_effect"]; _type = _this select 0; _layer = _this select 1; _default = _this select 2; @@ -91,6 +92,7 @@ GVAR(effectTimeBlood) = time; // MAIN EFFECTS LOOP [{ + private["_bleeding", "_blood"]; // Zeus interface is open or player is dead; disable everything if (!(isNull (findDisplay 312)) or !(alive ACE_player)) exitWith { GVAR(effectUnconsciousCC) ppEffectEnable false; @@ -155,6 +157,7 @@ GVAR(lastHeartBeatSound) = time; // HEARTRATE BASED EFFECTS [{ + private["_heartRate", "_interval", "_minTime", "_sound", "_strength"]; _heartRate = ACE_player getVariable [QGVAR(heartRate), 70]; if (GVAR(level) == 1) then { _heartRate = 60 + 40 * (ACE_player getVariable [QGVAR(pain), 0]); @@ -266,6 +269,12 @@ if (USE_WOUND_EVENT_SYNC) then { [ACE_player] call FUNC(itemCheck); }] call EFUNC(common,addEventHandler); - // Networked litter [QGVAR(createLitter), FUNC(handleCreateLitter), GVAR(litterCleanUpDelay)] call EFUNC(common,addSyncedEventHandler); + +if (hasInterface) then { + ["PlayerJip", { + diag_log format["[ACE] JIP Medical init for player"]; + [player] call FUNC(init); + }] call FUNC(addEventHandler); +}; diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 107952c54b..4f4ff5bc30 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -7,6 +7,7 @@ PREP(actionCheckBloodPressureLocal); PREP(actionCheckPulse); PREP(actionCheckPulseLocal); PREP(actionCheckResponse); +PREP(actionDiagnose); PREP(actionPlaceInBodyBag); PREP(actionRemoveTourniquet); PREP(actionLoadUnit); @@ -55,6 +56,7 @@ PREP(isInMedicalVehicle); PREP(isMedic); PREP(isMedicalVehicle); PREP(itemCheck); +PREP(modifyMedicalAction); PREP(onMedicationUsage); PREP(onWoundUpdateRequest); PREP(onPropagateWound); @@ -78,8 +80,10 @@ PREP(treatmentAdvanced_medication); PREP(treatmentAdvanced_medicationLocal); PREP(treatmentBasic_bandage); PREP(treatmentBasic_bloodbag); +PREP(treatmentBasic_bloodbagLocal); PREP(treatmentBasic_epipen); PREP(treatmentBasic_morphine); +PREP(treatmentBasic_morphineLocal); PREP(treatmentIV); PREP(treatmentIVLocal); PREP(treatmentTourniquet); @@ -90,10 +94,11 @@ PREP(displayPatientInformation); PREP(displayTriageCard); PREP(dropDownTriageCard); PREP(moduleMedicalSettings); +PREP(moduleAdvancedMedicalSettings); +PREP(moduleReviveSettings); PREP(moduleAssignMedicRoles); PREP(moduleAssignMedicalVehicle); PREP(moduleAssignMedicalFacility); -PREP(moduleTreatmentConfiguration); PREP(copyDeadBody); PREP(requestWoundSync); PREP(unconsciousPFH); diff --git a/addons/medical/config.cpp b/addons/medical/config.cpp index 4dca8bdeca..de99778c11 100644 --- a/addons/medical/config.cpp +++ b/addons/medical/config.cpp @@ -2,7 +2,7 @@ class CfgPatches { class ADDON { - units[] = {"ACE_medicalSupplyCrate", "ACE_fieldDressingItem", "ACE_packingBandageItem", "ACE_elasticBandageItem", "ACE_tourniquetItem", "ACE_morphineItem", "ACE_atropineItem", "ACE_epinephrineItem", "ACE_plasmaIVItem", "ACE_bloodIVItem", "ACE_salineIVItem", "ACE_quikclotItem", "ACE_personalAidKitItem", "ACE_surgicalKitItem", "ACE_bodyBagItem", "ACE_bodyBagObject"}; + units[] = {"ACE_medicalSupplyCrate", "ACE_medicalSupplyCrate_advanced", "ACE_fieldDressingItem", "ACE_packingBandageItem", "ACE_elasticBandageItem", "ACE_tourniquetItem", "ACE_morphineItem", "ACE_atropineItem", "ACE_epinephrineItem", "ACE_plasmaIVItem", "ACE_bloodIVItem", "ACE_salineIVItem", "ACE_quikclotItem", "ACE_personalAidKitItem", "ACE_surgicalKitItem", "ACE_bodyBagItem", "ACE_bodyBagObject"}; weapons[] = {"ACE_fieldDressing", "ACE_packingBandage", "ACE_elasticBandage", "ACE_tourniquet", "ACE_morphine", "ACE_atropine", "ACE_epinephrine", "ACE_plasmaIV", "ACE_plasmaIV_500", "ACE_plasmaIV_250", "ACE_bloodIV", "ACE_bloodIV_500", "ACE_bloodIV_250", "ACE_salineIV", "ACE_salineIV_500", "ACE_salineIV_250", "ACE_quikclot", "ACE_personalAidKit", "ACE_surgicalKit", "ACE_bodyBag"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction","ace_modules"}; diff --git a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf index 28ed10c83c..d686515308 100644 --- a/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckBloodPressureLocal.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" -private ["_caller","_target","_bloodPressure","_bloodPressureHigh","_bloodPressureLow","_title","_content"]; +private ["_caller","_target","_bloodPressure","_bloodPressureHigh","_bloodPressureLow", "_logOutPut", "_output"]; _caller = _this select 0; _target = _this select 1; @@ -33,20 +33,20 @@ if ([_caller] call FUNC(isMedic)) then { } else { if (_bloodPressureHigh > 20) then { _output = "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_2"; - _logOutPut = "Low"; + _logOutPut = localize "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_LOW"; if (_bloodPressureHigh > 100) then { _output = "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_3"; - _logOutPut = "Normal"; + _logOutPut = localize "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_NORMAL"; if (_bloodPressureHigh > 160) then { _output = "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_4"; - _logOutPut = "High"; + _logOutPut = localize "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_HIGH"; }; }; } else { if (random(10) > 3) then { _output = "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_5"; - _logOutPut = "No Blood Pressure"; + _logOutPut = localize "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_NOBLOODPRESSURE"; } else { _output = "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_OUTPUT_6"; }; @@ -56,5 +56,5 @@ if ([_caller] call FUNC(isMedic)) then { ["displayTextStructured", [_caller], [[_output, [_target] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)], 1.75, _caller]] call EFUNC(common,targetEvent); if (_logOutPut != "") then { - [_target,"activity", "%1 checked Blood Pressure: %2", [[_caller] call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); + [_target,"activity", localize "STR_ACE_MEDICAL_CHECK_BLOODPRESSURE_LOG", [[_caller] call EFUNC(common,getName), _logOutPut]] call FUNC(addToLog); }; diff --git a/addons/medical/functions/fnc_actionCheckPulse.sqf b/addons/medical/functions/fnc_actionCheckPulse.sqf index f545c11144..fd96321e8f 100644 --- a/addons/medical/functions/fnc_actionCheckPulse.sqf +++ b/addons/medical/functions/fnc_actionCheckPulse.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" -private ["_caller","_target","_title","_content"]; +private ["_caller","_target"]; _caller = _this select 0; _target = _this select 1; [[_caller, _target], 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 73d1d07190..f035ae18ad 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" -private ["_caller","_unit", "_heartRateOutput", "_heartRate","_logOutPut","_content"]; +private ["_caller", "_unit", "_heartRateOutput", "_heartRate", "_logOutPut"]; _caller = _this select 0; _unit = _this select 1; @@ -33,14 +33,14 @@ if (_heartRate > 1.0) then { } else { // non medical personel will only find a pulse/HR _heartRateOutput = "STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_2"; - _logOutPut = "Weak"; + _logOutPut = localize "STR_ACE_MEDICAL_CHECK_PULSE_WEAK"; if (_heartRate > 60) then { if (_heartRate > 100) then { _heartRateOutput = "STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_3"; - _logOutPut = "Strong"; + _logOutPut = localize "STR_ACE_MEDICAL_CHECK_PULSE_STRONG"; } else { _heartRateOutput = "STR_ACE_MEDICAL_CHECK_PULSE_OUTPUT_4"; - _logOutPut = "Normal"; + _logOutPut = localize "STR_ACE_MEDICAL_CHECK_PULSE_NORMAL"; }; }; }; @@ -49,5 +49,5 @@ if (_heartRate > 1.0) then { ["displayTextStructured", [_caller], [[_heartRateOutput, [_unit] call EFUNC(common,getName), round(_heartRate)], 1.5, _caller]] call EFUNC(common,targetEvent); if (_logOutPut != "") then { - [_unit,"activity","%1 checked Heart Rate: %2",[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); + [_unit,"activity", localize "STR_ACE_MEDICAL_CHECK_PULSE_LOG",[[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToLog); }; diff --git a/addons/medical/functions/fnc_actionCheckResponse.sqf b/addons/medical/functions/fnc_actionCheckResponse.sqf index c483706274..babd93bf92 100644 --- a/addons/medical/functions/fnc_actionCheckResponse.sqf +++ b/addons/medical/functions/fnc_actionCheckResponse.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" -private ["_caller","_target"]; +private ["_caller","_target", "_output"]; _caller = _this select 0; _target = _this select 1; diff --git a/addons/medical/functions/fnc_actionDiagnose.sqf b/addons/medical/functions/fnc_actionDiagnose.sqf new file mode 100644 index 0000000000..692414027a --- /dev/null +++ b/addons/medical/functions/fnc_actionDiagnose.sqf @@ -0,0 +1,45 @@ +/* +* Author: Glowbal +* Action for diagnosing in basic medical +* +* Arguments: +* 0: The medic +* 1: The patient +* +* Return Value: +* NONE +* +* Public: No +*/ + +#include "script_component.hpp" + +private ["_caller", "_target", "_genericMessages"]; +_caller = _this select 0; +_target = _this select 1; + +_genericMessages = ["STR_ACE_MEDICAL_diagnoseMessage"]; + +_genericMessages pushBack ([_target] call EFUNC(common,getName)); +if (alive _target) then { + _genericMessages pushback "STR_ACE_MEDICAL_diagnoseAlive"; +} else { + _genericMessages pushback "STR_ACE_MEDICAL_diagnoseDead"; +}; +if (_target getvariable[QGVAR(hasLostBlood), 0] > 0) then { + if (_target getvariable[QGVAR(hasLostBlood), 0] > 1) then { + _genericMessages pushback "STR_ACE_MEDICAL_lostBloodALot"; + } else { + _genericMessages pushback "STR_ACE_MEDICAL_lostBlood"; + }; +} else { + _genericMessages pushback "STR_ACE_MEDICAL_noBloodloss"; +}; + +if (_target getvariable[QGVAR(hasPain), false]) then { + _genericMessages pushback "STR_ACE_MEDICAL_inPain"; +} else { + _genericMessages pushback "STR_ACE_MEDICAL_noPain"; +}; + +["displayTextStructured", [_caller], [_genericMessages, 3.0, _caller]] call EFUNC(common,targetEvent); diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf index 990467521a..03d9a3ef54 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical/functions/fnc_actionLoadUnit.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" -private ["_caller", "_target","_vehicle", "_loaded"]; +private ["_caller", "_target","_vehicle"]; _caller = _this select 0; _target = _this select 1; @@ -23,16 +23,10 @@ if ([_target] call EFUNC(common,isAwake)) exitwith { ["displayTextStructured", [_caller], [["This person (%1) is awake and cannot be loaded", [_target] call EFUNC(common,getName)], 1.5, _caller]] call EFUNC(common,targetEvent); }; if ([_target] call FUNC(isBeingCarried)) then { - [_caller, _target] call FUNC(dropObject_carry); + [_caller, _target] call EFUNC(dragging,dropObject_carry); }; if ([_target] call FUNC(isBeingDragged)) then { - [_caller, _target] call FUNC(dropObject); + [_caller, _target] call EFUNC(dragging,dropObject); }; _vehicle = [_caller, _target] call EFUNC(common,loadPerson); -if (!isNull _vehicle) then { - if (!isnil QGVAR(DROP_ADDACTION)) then { - _caller removeAction GVAR(DROP_ADDACTION); - GVAR(DROP_ADDACTION) = nil; - }; -}; diff --git a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf index 2eafe36732..a14dbc3bcd 100644 --- a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf +++ b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" -private ["_caller","_target","_part","_selectionName","_removeItem","_tourniquets", "_output"]; +private ["_caller", "_target", "_part", "_selectionName", "_tourniquets", "_output"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_actionUnloadUnit.sqf b/addons/medical/functions/fnc_actionUnloadUnit.sqf index 8c05a43fc9..fd56e6d6bd 100644 --- a/addons/medical/functions/fnc_actionUnloadUnit.sqf +++ b/addons/medical/functions/fnc_actionUnloadUnit.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" -private ["_caller", "_target","_vehicle", "_drag", "_handle"]; +private ["_caller", "_target", "_drag"]; _caller = _this select 0; _target = _this select 1; _drag = if (count _this > 2) then {_this select 2} else {false}; diff --git a/addons/medical/functions/fnc_addToInjuredCollection.sqf b/addons/medical/functions/fnc_addToInjuredCollection.sqf index cbe146d701..c95db059df 100644 --- a/addons/medical/functions/fnc_addToInjuredCollection.sqf +++ b/addons/medical/functions/fnc_addToInjuredCollection.sqf @@ -13,7 +13,7 @@ #include "script_component.hpp" -private "_unit"; +private ["_unit", "_force"]; _unit = _this select 0; _force = if (count _this > 1) then {_this select 1} else {false}; diff --git a/addons/medical/functions/fnc_addToLog.sqf b/addons/medical/functions/fnc_addToLog.sqf index c36d57b482..46bacf2349 100644 --- a/addons/medical/functions/fnc_addToLog.sqf +++ b/addons/medical/functions/fnc_addToLog.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_unit", "_type", "_message", "_arguments", "_lastNumber", "_moment", "_logVarName", "_log","_newLog"]; +private ["_unit", "_type", "_message", "_arguments", "_lastNumber", "_moment", "_logVarName", "_log","_newLog", "_logs"]; _unit = _this select 0; _type = _this select 1; _message = _this select 2; diff --git a/addons/medical/functions/fnc_addToTriageCard.sqf b/addons/medical/functions/fnc_addToTriageCard.sqf index 49e642cfc4..61add24cfc 100644 --- a/addons/medical/functions/fnc_addToTriageCard.sqf +++ b/addons/medical/functions/fnc_addToTriageCard.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" -private ["_unit","_caller","_newItem","_log", "_inList","_amount"]; +private ["_unit", "_newItem", "_log", "_inList", "_amount"]; _unit = _this select 0; _newItem = _this select 1; diff --git a/addons/medical/functions/fnc_addUnloadPatientActions.sqf b/addons/medical/functions/fnc_addUnloadPatientActions.sqf index c792746d47..13a4177859 100644 --- a/addons/medical/functions/fnc_addUnloadPatientActions.sqf +++ b/addons/medical/functions/fnc_addUnloadPatientActions.sqf @@ -16,7 +16,7 @@ EXPLODE_3_PVT(_this,_vehicle,_player,_parameters); -private ["_actions"]; +private ["_actions", "_unit"]; _actions = []; { diff --git a/addons/medical/functions/fnc_canTreat.sqf b/addons/medical/functions/fnc_canTreat.sqf index 5f52759f54..062a696fcd 100644 --- a/addons/medical/functions/fnc_canTreat.sqf +++ b/addons/medical/functions/fnc_canTreat.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_config", "_availableLevels", "_medicRequired", "_items", "_locations", "_return", "_condition"]; +private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_condition"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_copyDeadBody.sqf b/addons/medical/functions/fnc_copyDeadBody.sqf index 8e476b8662..36bcd91487 100644 --- a/addons/medical/functions/fnc_copyDeadBody.sqf +++ b/addons/medical/functions/fnc_copyDeadBody.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" -private ["_oldBody","_newUnit","_class","_group","_position","_side","_allVariables"]; +private ["_oldBody","_newUnit","_class","_group","_position","_side", "_caller", "_name"]; _oldBody = _this select 0; _caller = _this select 1; diff --git a/addons/medical/functions/fnc_createLitter.sqf b/addons/medical/functions/fnc_createLitter.sqf index 5299fbb244..253a3ed315 100644 --- a/addons/medical/functions/fnc_createLitter.sqf +++ b/addons/medical/functions/fnc_createLitter.sqf @@ -16,7 +16,7 @@ #define MIN_ENTRIES_LITTER_CONFIG 3 -private ["_target", "_className", "_config", "_litter", "_createLitter", "_litterObject", "_position", "_createdLitter"]; +private ["_target", "_className", "_config", "_litter", "_createLitter", "_position", "_createdLitter", "_caller", "_selectionName", "_usersOfItems"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_determineIfFatal.sqf b/addons/medical/functions/fnc_determineIfFatal.sqf index aedcf161ee..bad15dbcad 100644 --- a/addons/medical/functions/fnc_determineIfFatal.sqf +++ b/addons/medical/functions/fnc_determineIfFatal.sqf @@ -10,7 +10,7 @@ #include "script_component.hpp" -private ["_unit","_part","_damageThreshold", "_withDamage"]; +private ["_unit","_part","_damageThreshold", "_withDamage", "_damageBodyPart"]; _unit = _this select 0; _part = _this select 1; _withDamage = if (count _this > 2) then { _this select 2} else {0}; diff --git a/addons/medical/functions/fnc_displayPatientInformation.sqf b/addons/medical/functions/fnc_displayPatientInformation.sqf index ecd2218c2b..f3385c7d51 100644 --- a/addons/medical/functions/fnc_displayPatientInformation.sqf +++ b/addons/medical/functions/fnc_displayPatientInformation.sqf @@ -14,7 +14,9 @@ #include "script_component.hpp" -private ["_target", "_show", "_selectionN"]; +// Exit for basic medical +if (GVAR(level) < 2) exitWith {}; +private ["_target", "_show", "_selectionN", "_amountOfGeneric", "_bandagedwounds", "_logCtrl", "_part", "_partText", "_pointDamage", "_severity", "_total", "_totalIvVolume", "_triageStatus", "_type"]; _target = _this select 0; _show = if (count _this > 1) then {_this select 1} else {true}; _selectionN = if (count _this > 2) then {_this select 2} else {0}; @@ -55,7 +57,7 @@ if (_show) then { if (_target getvariable[QGVAR(isBleeding), false]) then { _genericMessages pushback [localize "STR_ACE_MEDICAL_STATUS_BLEEDING", [1, 0.1, 0.1, 1]]; }; - if (_target getvariable[QGVAR(hasLostBlood), false]) then { + if (_target getvariable[QGVAR(hasLostBlood), 0] > 1) then { _genericMessages pushback [localize "STR_ACE_MEDICAL_STATUS_LOST_BLOOD", [1, 0.1, 0.1, 1]]; }; @@ -184,13 +186,13 @@ if (_show) then { _lbCtrl lbSetColor [_foreachIndex + _amountOfGeneric, _x select 1]; }foreach _allInjuryTexts; if (count _allInjuryTexts == 0) then { - _lbCtrl lbAdd "No injuries on this bodypart.."; + _lbCtrl lbAdd (localize "STR_ACE_Medical_NoInjuriesBodypart"); }; _logCtrl = (_display displayCtrl 302); lbClear _logCtrl; - private ["_logs", "_log", "_message", "_moment", "_arguments", "_lbCtrl"]; + private ["_logs", "_message", "_moment", "_arguments", "_lbCtrl"]; _logs = _target getvariable [QGVAR(logFile_Activity), []]; { // [_message,_moment,_type, _arguments] diff --git a/addons/medical/functions/fnc_displayTriageCard.sqf b/addons/medical/functions/fnc_displayTriageCard.sqf index 5feb209b44..dd3b44a946 100644 --- a/addons/medical/functions/fnc_displayTriageCard.sqf +++ b/addons/medical/functions/fnc_displayTriageCard.sqf @@ -13,7 +13,7 @@ #include "script_component.hpp" -private ["_target", "_show"]; +private ["_target", "_show", "_amount", "_item", "_log", "_message", "_triageCardTexts", "_triageStatus"]; _target = _this select 0; _show = if (count _this > 1) then {_this select 1} else {true}; @@ -24,7 +24,7 @@ if (_show) then { createDialog QGVAR(triageCard); [{ - private ["_target", "_display", "_alphaLevel", "_damaged", "_availableSelections", "_openWounds", "_selectionBloodLoss", "_red", "_green", "_blue", "_alphaLevel", "_allInjuryTexts", "_lbCtrl", "_genericMessages"]; + private ["_target", "_display", "_alphaLevel", "_alphaLevel", "_lbCtrl"]; _target = (_this select 0) select 0; if (GVAR(TriageCardTarget) != _target) exitwith { [_this select 1] call CBA_fnc_removePerFrameHandler; @@ -58,7 +58,7 @@ if (_show) then { }foreach _log; if (count _triageCardTexts == 0) then { - _lbCtrl lbAdd "No entries on this triage card.."; + _lbCtrl lbAdd (localize "STR_ACE_MEDICAL_TriageCard_NoEntry"); }; { _lbCtrl lbAdd _x; diff --git a/addons/medical/functions/fnc_dropDownTriageCard.sqf b/addons/medical/functions/fnc_dropDownTriageCard.sqf index 6ea910b7af..6f30152c5f 100644 --- a/addons/medical/functions/fnc_dropDownTriageCard.sqf +++ b/addons/medical/functions/fnc_dropDownTriageCard.sqf @@ -13,7 +13,7 @@ #include "script_component.hpp" -private ["_show"]; +private ["_show", "_ctrl", "_display", "_idc", "_pos"]; _show = _this select 0; disableSerialization; diff --git a/addons/medical/functions/fnc_getBloodLoss.sqf b/addons/medical/functions/fnc_getBloodLoss.sqf index f6b26f7686..414b3a47c7 100644 --- a/addons/medical/functions/fnc_getBloodLoss.sqf +++ b/addons/medical/functions/fnc_getBloodLoss.sqf @@ -15,7 +15,7 @@ #define BLOODLOSSRATE_BASIC 0.2 -private ["_totalBloodLoss","_tourniquets","_openWounds", "_value", "_cardiacOutput", "_internalWounds"]; +private ["_totalBloodLoss","_tourniquets","_openWounds", "_cardiacOutput", "_internalWounds"]; // TODO Only use this calculation if medium or higher, otherwise use vanilla calculations (for basic medical). _totalBloodLoss = 0; diff --git a/addons/medical/functions/fnc_getHeartRateChange.sqf b/addons/medical/functions/fnc_getHeartRateChange.sqf index e7bc9407d2..7429d6dd43 100644 --- a/addons/medical/functions/fnc_getHeartRateChange.sqf +++ b/addons/medical/functions/fnc_getHeartRateChange.sqf @@ -15,7 +15,7 @@ #define HEART_RATE_MODIFIER 0.02 -private ["_unit", "_heartRate", "_hrIncrease", "_bloodLoss", "_time", "_values", "_adjustment", "_adjustments", "_additionalIncrease", "_change", "_callBack", "_bloodVolume"]; +private ["_unit", "_heartRate", "_hrIncrease", "_bloodLoss", "_time", "_values", "_adjustment", "_change", "_callBack", "_bloodVolume"]; _unit = _this select 0; _hrIncrease = 0; if (!(_unit getvariable [QGVAR(inCardiacArrest),false])) then { diff --git a/addons/medical/functions/fnc_handleBandageOpening.sqf b/addons/medical/functions/fnc_handleBandageOpening.sqf index 21211c9c1b..a92bf9029c 100644 --- a/addons/medical/functions/fnc_handleBandageOpening.sqf +++ b/addons/medical/functions/fnc_handleBandageOpening.sqf @@ -18,7 +18,7 @@ #include "script_component.hpp" -private ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage", "_classID", "_className", "_reopeningChance", "_reopeningMinDelay", "_reopeningMaxDelay", "_config", "_woundTreatmentConfig", "_bandagedWounds", "_exist", "_injuryId", "_existingInjury", "_delay", "_openWounds", "_selectedInjury"]; +private ["_target", "_impact", "_part", "_injuryIndex", "_injury", "_bandage", "_classID", "_className", "_reopeningChance", "_reopeningMinDelay", "_reopeningMaxDelay", "_config", "_woundTreatmentConfig", "_bandagedWounds", "_exist", "_injuryId", "_existingInjury", "_delay", "_openWounds", "_selectedInjury", "_bandagedInjury"]; _target = _this select 0; _impact = _this select 1; _part = _this select 2; diff --git a/addons/medical/functions/fnc_handleCreateLitter.sqf b/addons/medical/functions/fnc_handleCreateLitter.sqf index ee7e591cd1..617d05e519 100644 --- a/addons/medical/functions/fnc_handleCreateLitter.sqf +++ b/addons/medical/functions/fnc_handleCreateLitter.sqf @@ -5,6 +5,7 @@ if(!hasInterface) exitWith { false }; PARAMS_3(_litterClass,_position,_direction); private["_litterObject", "_maxLitterCount"]; +//IGNORE_PRIVATE_WARNING(_values); if (isNil QGVAR(allCreatedLitter)) then { GVAR(allCreatedLitter) = []; diff --git a/addons/medical/functions/fnc_handleDamage.sqf b/addons/medical/functions/fnc_handleDamage.sqf index c13818bbcd..d457762321 100644 --- a/addons/medical/functions/fnc_handleDamage.sqf +++ b/addons/medical/functions/fnc_handleDamage.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_damageReturn", "_typeOfDamage"]; +private ["_unit", "_selection", "_damage", "_shooter", "_projectile", "_damageReturn", "_typeOfDamage", "_minLethalDamage", "_newDamage", "_typeIndex"]; _unit = _this select 0; _selection = _this select 1; _damage = _this select 2; @@ -37,47 +37,56 @@ if !(_selection in (GVAR(SELECTIONS) + [""])) exitWith {0}; _damageReturn = _damage; if (GVAR(level) < 2) then { _damageReturn = _this call FUNC(handleDamage_basic); -}; - -if (GVAR(level) >= 2) then { +} else { if !([_unit] call FUNC(hasMedicalEnabled)) exitwith { // Because of the config changes, we cannot properly disable the medical system for a unit. // lets use basic for the time being.. _damageReturn = _this call FUNC(handleDamage_basic); }; _newDamage = _this call FUNC(handleDamage_caching); + _typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); - if (_damageReturn > 0.9) then { + _typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); + _minLethalDamage = 0.01; + if (_typeIndex >= 0) then { + _minLethalDamage = GVAR(minLethalDamages) select _typeIndex; + }; - _typeOfDamage = [_projectile] call FUNC(getTypeOfDamage); - - _typeIndex = (GVAR(allAvailableDamageTypes) find _typeOfDamage); - _minLethalDamage = 0.01; - if (_typeIndex >= 0) then { - _minLethalDamage = GVAR(minLethalDamages) select _typeIndex; + if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _shooter} && {_projectile == ""} && {_selection == ""}) then { + if (GVAR(enableVehicleCrashes)) then { + _selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS)))); }; + }; - if (vehicle _unit != _unit && {!(vehicle _unit isKindOf "StaticWeapon")} && {isNull _source} && {_projectile == ""} && {_selection == ""}) then { - if (GVAR(enableVehicleCrashes)) then { - _selection = GVAR(SELECTIONS) select (floor(random(count GVAR(SELECTIONS)))); - }; + if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)} || !alive vehicle _unit) then { + if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)])) exitwith { + _damageReturn = 0.9; }; - - if ((_minLethalDamage <= _newDamage) && {[_unit, [_selection] call FUNC(selectionNameToNumber), _newDamage] call FUNC(determineIfFatal)} && {_selection in ["", "head", "body"]}) then { - if ([_unit] call FUNC(setDead)) then { - _damageReturn = 1; - } else { - _damageReturn = 0.89; - }; + if ([_unit] call FUNC(setDead)) then { + _damageReturn = 1; } else { - _damageReturn = 0.89; + _damageReturn = _damageReturn min 0.89; }; + } else { + _damageReturn = _damageReturn min 0.89; }; }; [_unit] call FUNC(addToInjuredCollection); -if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) && {_damageReturn >= 0.9} && {_selection in ["", "head", "body"]}) exitWith { - if (vehicle _unit != _unit and {damage _vehicle >= 1}) then { +if (_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) exitWith { + if (_damageReturn >= 0.9 && {_selection in ["", "head", "body"]}) exitWith { + if (_unit getvariable ["ACE_isUnconscious", false]) exitwith { + [_unit] call FUNC(setDead); + 0.89 + }; + [{ [_this select 0, true] call FUNC(setUnconscious); }, [_unit]] call EFUNC(common,execNextFrame); + 0.89 + }; + _damageReturn min 0.89; +}; + +if (((_unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]) > 0) && {_damageReturn >= 0.9} && {_selection in ["", "head", "body"]}) exitWith { + if (vehicle _unit != _unit and {damage (vehicle _unit) >= 1}) then { // @todo // [_unit] call FUNC(unload); }; diff --git a/addons/medical/functions/fnc_handleDamage_basic.sqf b/addons/medical/functions/fnc_handleDamage_basic.sqf index aa9c2f61df..1647cc8442 100644 --- a/addons/medical/functions/fnc_handleDamage_basic.sqf +++ b/addons/medical/functions/fnc_handleDamage_basic.sqf @@ -24,7 +24,7 @@ #define ARMDAMAGETRESHOLD2 1.7 #define UNCONSCIOUSNESSTRESHOLD 0.7 -private ["_unit", "_selectionName", "_damage", "_shooter", "_projectile", "_damage"]; +private ["_unit", "_selectionName", "_damage", "_shooter", "_projectile", "_damage", "_armdamage", "_hitPoint", "_index", "_legdamage", "_newDamage", "_otherDamage", "_pain", "_restore"]; _unit = _this select 0; _selectionName = _this select 1; diff --git a/addons/medical/functions/fnc_handleDamage_wounds.sqf b/addons/medical/functions/fnc_handleDamage_wounds.sqf index b45a974166..9172304dd2 100644 --- a/addons/medical/functions/fnc_handleDamage_wounds.sqf +++ b/addons/medical/functions/fnc_handleDamage_wounds.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage", "_bodyPartn", "_woundType", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd"]; +private ["_unit", "_selectionName", "_damage", "_typeOfProjectile", "_typeOfDamage", "_bodyPartn", "_injuryTypeInfo", "_allInjuriesForDamageType", "_allPossibleInjuries", "_highestPossibleDamage", "_highestPossibleSpot", "_minDamage", "_openWounds", "_woundID", "_toAddInjury", "_painToAdd", "_bloodLoss", "_bodyPartNToAdd", "_classType", "_damageLevels", "_foundIndex", "_i", "_injury", "_maxDamage", "_pain", "_painLevel", "_selections", "_toAddClassID", "_woundsCreated"]; _unit = _this select 0; _selectionName = _this select 1; _damage = _this select 2; diff --git a/addons/medical/functions/fnc_handleKilled.sqf b/addons/medical/functions/fnc_handleKilled.sqf index ce0f087836..5003ec189c 100644 --- a/addons/medical/functions/fnc_handleKilled.sqf +++ b/addons/medical/functions/fnc_handleKilled.sqf @@ -13,7 +13,7 @@ #include "script_component.hpp" -private["_unit"]; +private["_unit", "_openWounds"]; _unit = _this select 0; if (!local _unit) exitwith {}; diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 411f64b49e..aff3b48945 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -13,7 +13,7 @@ #include "script_component.hpp" -private ["_unit", "_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues"]; +private ["_unit", "_heartRate","_bloodPressure","_bloodVolume","_painStatus", "_lastTimeValuesSynced", "_syncValues", "_airwayStatus", "_blood", "_bloodPressureH", "_bloodPressureL", "_interval"]; _unit = _this select 0; _interval = time - (_unit getVariable [QGVAR(lastMomentVitalsHandled), 0]); @@ -33,13 +33,19 @@ _bloodVolume = _bloodVolume max 0; _unit setvariable [QGVAR(bloodVolume), _bloodVolume, _syncValues]; // Set variables for synchronizing information across the net -if (_bloodVolume < 90) then { - if !(_unit getvariable [QGVAR(hasLostBlood), false]) then { - _unit setvariable [QGVAR(hasLostBlood), true, true]; - }; +if (_bloodVolume < 100) then { + if ((_bloodVolume < 90 && (GVAR(level) == 2)) || _bloodVolume <= 45) then { + if (_unit getvariable [QGVAR(hasLostBlood), 0] != 2) then { + _unit setvariable [QGVAR(hasLostBlood), 2, true]; + }; + } else { + if (_unit getvariable [QGVAR(hasLostBlood), 0] != 1) then { + _unit setvariable [QGVAR(hasLostBlood), 1, true]; + }; + } } else { - if (_unit getvariable [QGVAR(hasLostBlood),false]) then { - _unit setvariable [QGVAR(hasLostBlood), false, true]; + if (_unit getvariable [QGVAR(hasLostBlood), 0] != 0) then { + _unit setvariable [QGVAR(hasLostBlood), 0, true]; }; }; @@ -66,13 +72,13 @@ if (_painStatus > 0) then { if (GVAR(level) == 1) then { // reduce pain - if (_unit getVariable [QGVAR(pain), 0] > 0) then { - _unit setVariable [QGVAR(pain), ((_unit getVariable QGVAR(pain)) - 0.001 * _interval) max 0, _syncValues]; + if (_painStatus > 0) then { + _unit setVariable [QGVAR(pain), (_painStatus - 0.001 * _interval) max 0, _syncValues]; }; // reduce painkillers if (_unit getVariable [QGVAR(morphine), 0] > 0) then { - _unit setVariable [QGVAR(morphine), ((_unit getVariable QGVAR(morphine)) - 0.0015 * _interval) max 0, _syncValues]; + _unit setVariable [QGVAR(morphine), ((_unit getVariable [QGVAR(morphine), 0]) - 0.0015 * _interval) max 0, _syncValues]; }; // bleeding diff --git a/addons/medical/functions/fnc_hasItem.sqf b/addons/medical/functions/fnc_hasItem.sqf index 551d532ae4..cfec633b55 100644 --- a/addons/medical/functions/fnc_hasItem.sqf +++ b/addons/medical/functions/fnc_hasItem.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" -private ["_medic", "_patient", "_item", "_return"]; +private ["_medic", "_patient", "_item", "_return", "_crew"]; _medic = _this select 0; _patient = _this select 1; _item = _this select 2; diff --git a/addons/medical/functions/fnc_init.sqf b/addons/medical/functions/fnc_init.sqf index d01a63b3a5..0ec6ce3ce2 100644 --- a/addons/medical/functions/fnc_init.sqf +++ b/addons/medical/functions/fnc_init.sqf @@ -13,7 +13,7 @@ #include "script_component.hpp" -private ["_unit", "_allUsedMedication", "_logs", "_forceNew"]; +private ["_unit", "_allUsedMedication", "_logs"]; _unit = _this select 0; @@ -60,7 +60,7 @@ _unit setvariable [QGVAR(airwayCollapsed), false]; _unit setvariable [QGVAR(addedToUnitLoop), false, true]; _unit setvariable [QGVAR(inCardiacArrest), false, true]; _unit setVariable ["ACE_isUnconscious", false, true]; -_unit setvariable [QGVAR(hasLostBlood), false, true]; +_unit setvariable [QGVAR(hasLostBlood), 0, true]; _unit setvariable [QGVAR(isBleeding), false, true]; _unit setvariable [QGVAR(hasPain), false, true]; _unit setvariable [QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives), true]; diff --git a/addons/medical/functions/fnc_isMedic.sqf b/addons/medical/functions/fnc_isMedic.sqf index cc07948f4b..122d261238 100644 --- a/addons/medical/functions/fnc_isMedic.sqf +++ b/addons/medical/functions/fnc_isMedic.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" -private ["_unit","_class","_return"]; +private ["_unit", "_class", "_medicN"]; _unit = _this select 0; _medicN = if (count _this > 1) then {_this select 1} else {1}; diff --git a/addons/medical/functions/fnc_modifyMedicalAction.sqf b/addons/medical/functions/fnc_modifyMedicalAction.sqf new file mode 100644 index 0000000000..179ae9eb83 --- /dev/null +++ b/addons/medical/functions/fnc_modifyMedicalAction.sqf @@ -0,0 +1,40 @@ +/* + * Author: esteldunedain + * Modify the visuals of a medical action point. + * On Basic medical: modify the icon color based on damage on that body part. + * + * Arguments: + * 0: The Patient Unit + * 1: The Diagnosing Unit + * 2: Selection Number + * 3: The action to modify + * + * ReturnValue: + * nil + * + * Public: No + */ + +#include "script_component.hpp" + +EXPLODE_4_PVT(_this,_target,_player,_selectionN,_actionData); +if (GVAR(level) < 2) exitwith { + private ["_pointDamage"]; + _pointDamage = _target getHitPointDamage (["HitHead", "HitBody", "HitLeftArm", "HitRightArm", "HitLeftLeg", "HitRightLeg"] select _selectionN); + + if (_pointDamage >= 0.8) exitWith { + _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))]; + }; + if (_pointDamage > 0) exitWith { + _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossYellow.paa))]; + }; +}; + +private ["_openWounds", "_amountOf"]; +_openWounds = _target getvariable [QGVAR(openWounds), []]; +{ + _amountOf = _x select 3; + if (_amountOf > 0 && {(_selectionN == (_x select 2))}) exitwith { + _actionData set [2, QUOTE(PATHTOF(UI\icons\medical_crossRed.paa))]; + }; +} foreach _openWounds; diff --git a/addons/medical/functions/fnc_moduleTreatmentConfiguration.sqf b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf similarity index 64% rename from addons/medical/functions/fnc_moduleTreatmentConfiguration.sqf rename to addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf index 5d88fa0f0a..cf884e0ab0 100644 --- a/addons/medical/functions/fnc_moduleTreatmentConfiguration.sqf +++ b/addons/medical/functions/fnc_moduleAdvancedMedicalSettings.sqf @@ -22,12 +22,11 @@ _activated = _this select 2; if !(_activated) exitWith {}; -[_logic, QGVAR(medicSetting), "medicSetting"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(maxReviveTime), "maxReviveTime"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(amountOfReviveLives), "amountOfReviveLives"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableOverdosing), "enableOverdosing"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(allowLitterCreation), "allowLitterCreation"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(litterCleanUpDelay), "litterCleanUpDelay"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(enableFor), "enableFor"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(enableAdvancedWounds), "enableAdvancedWounds"] call EFUNC(common,readSettingFromModule); +// TODO disabled until implemented +// [_logic, QGVAR(enableAirway), "enableAirway"] call EFUNC(common,readSettingFromModule); +// [_logic, QGVAR(enableFractures), "enableFractures"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(medicSetting_PAK), "medicSetting_PAK"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(medicSetting_SurgicalKit), "medicSetting_SurgicalKit"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(consumeItem_PAK), "consumeItem_PAK"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_moduleMedicalSettings.sqf b/addons/medical/functions/fnc_moduleMedicalSettings.sqf index 34dd063a4d..0d514aee27 100644 --- a/addons/medical/functions/fnc_moduleMedicalSettings.sqf +++ b/addons/medical/functions/fnc_moduleMedicalSettings.sqf @@ -23,11 +23,9 @@ _activated = _this select 2; if !(_activated) exitWith {}; [_logic, QGVAR(level), "level"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableFor), "enableFor"] call EFUNC(common,readSettingFromModule); -// TODO disabled until implemented -// [_logic, QGVAR(enableAirway), "enableAirway"] call EFUNC(common,readSettingFromModule); -// [_logic, QGVAR(enableFractures), "enableFractures"] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(enableAdvancedWounds), "enableAdvancedWounds"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(medicSetting), "medicSetting"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(allowLitterCreation), "allowLitterCreation"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(litterCleanUpDelay), "litterCleanUpDelay"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(enableScreams), "enableScreams"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(playerDamageThreshold), "playerDamageThreshold"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(AIDamageThreshold), "AIDamageThreshold"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_moduleReviveSettings.sqf b/addons/medical/functions/fnc_moduleReviveSettings.sqf new file mode 100644 index 0000000000..c96b1eb67c --- /dev/null +++ b/addons/medical/functions/fnc_moduleReviveSettings.sqf @@ -0,0 +1,27 @@ +/* + * Author: Glowbal + * Module for adjusting the medical revive settings + * + * Arguments: + * 0: The module logic + * 1: units + * 2: activated + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic", "_units", "_activated"]; +_logic = _this select 0; +_units = _this select 1; +_activated = _this select 2; + +if !(_activated) exitWith {}; + +[_logic, QGVAR(maxReviveTime), "maxReviveTime"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(amountOfReviveLives), "amountOfReviveLives"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(enableRevive), "enableRevive"] call EFUNC(common,readSettingFromModule); diff --git a/addons/medical/functions/fnc_onWoundUpdateRequest.sqf b/addons/medical/functions/fnc_onWoundUpdateRequest.sqf index ccbb373648..3c99496d7b 100644 --- a/addons/medical/functions/fnc_onWoundUpdateRequest.sqf +++ b/addons/medical/functions/fnc_onWoundUpdateRequest.sqf @@ -13,7 +13,7 @@ */ #include "script_component.hpp" -private ["_unit", "_openWounds"]; +private ["_unit", "_openWounds", "_originOfrequest"]; _unit = _this select 0; _originOfrequest = _this select 1; diff --git a/addons/medical/functions/fnc_parseConfigForInjuries.sqf b/addons/medical/functions/fnc_parseConfigForInjuries.sqf index c624b1af1b..503ff9833e 100644 --- a/addons/medical/functions/fnc_parseConfigForInjuries.sqf +++ b/addons/medical/functions/fnc_parseConfigForInjuries.sqf @@ -12,7 +12,7 @@ #include "script_component.hpp" -private ["_injuriesRootConfig", "_woundsConfig", "_allWoundClasses", "_amountOf", "_entry","_classType", "_selections", "_bloodLoss", "_pain","_minDamage","_causes", "_damageTypesConfig", "_thresholds", "_typeThresholds", "_selectionSpecific", "_selectionSpecificType", "_classDisplayName", "_subClassDisplayName", "_maxDamage", "_subClassmaxDamage", "_defaultMinLethalDamage", "_minLethalDamage"]; +private ["_injuriesRootConfig", "_woundsConfig", "_allWoundClasses", "_amountOf", "_entry","_classType", "_selections", "_bloodLoss", "_pain","_minDamage","_causes", "_damageTypesConfig", "_thresholds", "_typeThresholds", "_selectionSpecific", "_selectionSpecificType", "_classDisplayName", "_subClassDisplayName", "_maxDamage", "_subClassmaxDamage", "_defaultMinLethalDamage", "_minLethalDamage", "_allFoundDamageTypes", "_classID", "_configDamageTypes", "_i", "_parseForSubClassWounds", "_subClass", "_subClassConfig", "_subClassbloodLoss", "_subClasscauses", "_subClassminDamage", "_subClasspain", "_subClassselections", "_subClasstype", "_type", "_varName", "_woundTypes"]; _injuriesRootConfig = (configFile >> "ACE_Medical_Advanced" >> "Injuries"); _allFoundDamageTypes = []; diff --git a/addons/medical/functions/fnc_playInjuredSound.sqf b/addons/medical/functions/fnc_playInjuredSound.sqf index 16a7d69116..c48e3d0a4c 100644 --- a/addons/medical/functions/fnc_playInjuredSound.sqf +++ b/addons/medical/functions/fnc_playInjuredSound.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" -private ["_unit","_amountOfDamage","_bodyPartStatus","_availableSounds_A","_availableSounds_B","_availableSounds_C","_sound"]; +private ["_unit","_availableSounds_A","_availableSounds_B","_availableSounds_C","_sound", "_pain"]; _unit = _this select 0; _pain = _this select 1; if (!local _unit || !GVAR(enableScreams)) exitwith{}; diff --git a/addons/medical/functions/fnc_requestWoundSync.sqf b/addons/medical/functions/fnc_requestWoundSync.sqf index 7144c49684..74fd3e230d 100644 --- a/addons/medical/functions/fnc_requestWoundSync.sqf +++ b/addons/medical/functions/fnc_requestWoundSync.sqf @@ -14,7 +14,7 @@ #include "script_component.hpp" -private [ "_target", "_caller", "_openWounds"]; +private [ "_target", "_caller"]; _target = _this select 0; _caller = _this select 1; diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index 334a2d8b97..411fd6dc06 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -13,7 +13,7 @@ #include "script_component.hpp" -private ["_unit", "_force"]; +private ["_unit", "_force", "_reviveVal", "_lifesLeft"]; _unit = _this select 0; _force = false; if (count _this >= 2) then { @@ -26,7 +26,8 @@ if (!local _unit) exitwith { false; }; -if ((_unit getVariable [QGVAR(preventInstaDeath), GVAR(preventInstaDeath)]) && !_force) exitwith { +_reviveVal = _unit getVariable [QGVAR(enableRevive), GVAR(enableRevive)]; +if (((_reviveVal == 1 && {[_unit] call EFUNC(common,isPlayer)} || _reviveVal == 2)) && !_force) exitwith { if (_unit getvariable [QGVAR(inReviveState), false]) exitwith { if (GVAR(amountOfReviveLives) > 0) then { _lifesLeft = _unit getvariable[QGVAR(amountOfReviveLives), GVAR(amountOfReviveLives)]; diff --git a/addons/medical/functions/fnc_setHitPointDamage.sqf b/addons/medical/functions/fnc_setHitPointDamage.sqf index d71edc94df..18d4fc616e 100644 --- a/addons/medical/functions/fnc_setHitPointDamage.sqf +++ b/addons/medical/functions/fnc_setHitPointDamage.sqf @@ -21,7 +21,7 @@ #define ARMDAMAGETRESHOLD1 1 #define ARMDAMAGETRESHOLD2 1.7 -private ["_unit", "_selection", "_damage", "_selections", "_damages", "_damageOld", "_damageSumOld", "_damageNew", "_damageSumNew", "_damageFinal"]; +private ["_unit", "_selection", "_damage", "_selections", "_damages", "_damageOld", "_damageSumOld", "_damageNew", "_damageSumNew", "_damageFinal", "_armdamage", "_legdamage"]; _unit = _this select 0; _selection = _this select 1; diff --git a/addons/medical/functions/fnc_setUnconscious.sqf b/addons/medical/functions/fnc_setUnconscious.sqf index c5809f8c8e..82e93eb1fb 100644 --- a/addons/medical/functions/fnc_setUnconscious.sqf +++ b/addons/medical/functions/fnc_setUnconscious.sqf @@ -17,7 +17,7 @@ #define DEFAULT_DELAY (round(random(10)+5)) -private ["_unit", "_set", "_animState", "_originalPos", "_captiveSwitch", "_startingTime","_minWaitingTime"]; +private ["_unit", "_set", "_animState", "_originalPos", "_startingTime","_minWaitingTime"]; _unit = _this select 0; _set = if (count _this > 1) then {_this select 1} else {true}; _minWaitingTime = if (count _this > 2) then {_this select 2} else {DEFAULT_DELAY}; @@ -26,7 +26,7 @@ if !(_set) exitwith { _unit setvariable ["ACE_isUnconscious", false, true]; }; -if !(!(isNull _unit) && {(_unit isKindOf "CaManBase") && ([_unit] call EFUNC(common,isAwake))}) exitwith{}; +if !(!(isNull _unit) && {(_unit isKindOf "CAManBase") && ([_unit] call EFUNC(common,isAwake))}) exitwith{}; if (!local _unit) exitwith { [[_unit], QUOTE(DFUNC(setUnconscious)), _unit, false] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ @@ -86,4 +86,7 @@ _startingTime = time; [DFUNC(unconsciousPFH), 0.1, [_unit,_animState, _originalPos, _startingTime, _minWaitingTime, false, vehicle _unit isKindOf "ParachuteBase"] ] call CBA_fnc_addPerFrameHandler; +// unconscious can't talk +[_unit, "isUnconscious"] call EFUNC(common,muteUnit); + ["medical_onUnconscious", [_unit, true]] call EFUNC(common,globalEvent); diff --git a/addons/medical/functions/fnc_treatment.sqf b/addons/medical/functions/fnc_treatment.sqf index df6cc173d0..f50ff505e0 100644 --- a/addons/medical/functions/fnc_treatment.sqf +++ b/addons/medical/functions/fnc_treatment.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_config", "_availableLevels", "_medicRequired", "_items", "_locations", "_return", "_callbackSuccess", "_callbackFailure", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems"]; +private ["_caller", "_target", "_selectionName", "_className", "_config", "_medicRequired", "_items", "_locations", "_return", "_callbackProgress", "_treatmentTime", "_callerAnim", "_patientAnim", "_iconDisplayed", "_return", "_usersOfItems", "_consumeItems", "_condition", "_displayText", "_wpn"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf index ee3f51f549..0a49420783 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_CPR.sqf @@ -16,7 +16,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_items", "_removeItem"]; +private ["_caller", "_target", "_selectionName", "_className", "_items"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf index 146e996d25..42ca38cd0a 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandage.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_items", "_removeItem"]; +private ["_caller", "_target", "_selectionName", "_className", "_items", "_specificSpot"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf index 2884503599..d6c490d3c6 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_bandageLocal.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" -private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit", "_specificClass", "_classID", "_effectivenessFound"]; +private ["_target", "_bandage", "_part", "_selectionName", "_openWounds", "_config", "_effectiveness","_mostEffectiveInjury", "_mostEffectiveSpot", "_woundEffectivenss", "_mostEffectiveInjury", "_impact", "_exit", "_specificClass", "_classID", "_effectivenessFound", "_className", "_hitPoints", "_hitSelections", "_point", "_woundTreatmentConfig"]; _target = _this select 0; _bandage = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf index 807be828e8..37627a8c5d 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_fullHeal.sqf @@ -10,7 +10,7 @@ #include "script_component.hpp" -private ["_unit", "_caller", "_selectionName", "_className", "_items"]; +private ["_target", "_caller", "_selectionName", "_className", "_items"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf index 77f6d7f44c..e385c5f7c0 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_fullHealLocal.sqf @@ -55,7 +55,7 @@ if (alive _target) exitwith { _target setvariable [QGVAR(inCardiacArrest), false, true]; _target setvariable [QGVAR(inReviveState), false, true]; _target setVariable ["ACE_isUnconscious", false, true]; - _target setvariable [QGVAR(hasLostBlood), false, true]; + _target setvariable [QGVAR(hasLostBlood), 0, true]; _target setvariable [QGVAR(isBleeding), false, true]; _target setvariable [QGVAR(hasPain), false, true]; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf index 508040b8af..55057f1758 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_medication.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_items", "_removeItem"]; +private ["_caller", "_target", "_selectionName", "_className", "_items"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf index bbf5aea6c0..934bc9239a 100644 --- a/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf +++ b/addons/medical/functions/fnc_treatmentAdvanced_medicationLocal.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" -private ["_target", "_className", "_currentInSystem", "_medicationConfig", "_painReduce", "_hrIncreaseLow", "_hrIncreaseNorm", "_hrIncreaseHigh", "_maxDose", "_inCompatableMedication", "_timeInSystem", "_heartRate", "_pain", "_resistance", "_hrCallback"]; +private ["_target", "_className", "_currentInSystem", "_medicationConfig", "_painReduce", "_hrIncreaseLow", "_hrIncreaseNorm", "_hrIncreaseHigh", "_maxDose", "_inCompatableMedication", "_timeInSystem", "_heartRate", "_pain", "_resistance", "_hrCallback", "_varName", "_viscosityChange"]; _target = _this select 0; _className = _this select 1; @@ -77,9 +77,9 @@ if (_painReduce > 0) then { _target setvariable [QGVAR(pain), (_pain - (_pain * _painReduce)) max 0]; }; -_resistance = _unit getvariable [QGVAR(peripheralResistance), 100]; +_resistance = _target getvariable [QGVAR(peripheralResistance), 100]; _resistance = _resistance + _viscosityChange; -_unit setvariable [QGVAR(peripheralResistance), _resistance max 0]; +_target setvariable [QGVAR(peripheralResistance), _resistance max 0]; // Call back to ensure that the medication is decreased over time [_target, _classname, _varName, _maxDose, _timeInSystem, _inCompatableMedication, _viscosityChange] call FUNC(onMedicationUsage); diff --git a/addons/medical/functions/fnc_treatmentBasic_bandage.sqf b/addons/medical/functions/fnc_treatmentBasic_bandage.sqf index 4b07e989aa..75b0b6bfdd 100644 --- a/addons/medical/functions/fnc_treatmentBasic_bandage.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_bandage.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" #define BANDAGEHEAL 0.8 -private ["_caller", "_target","_selection","_className","_target","_hitSelections","_hitPoints","_point"]; +private ["_caller", "_target","_selection","_className","_target","_hitSelections","_hitPoints","_point", "_damage"]; _caller = _this select 0; _target = _this select 1; _selection = _this select 2; diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf index 57563ad8fc..9d2c12280d 100644 --- a/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_bloodbag.sqf @@ -15,12 +15,9 @@ */ #include "script_component.hpp" -#define BLOODBAGHEAL 70 -private ["_caller", "_target","_className","_blood"]; +private ["_caller", "_target"]; _caller = _this select 0; _target = _this select 1; -_className = _this select 3; -_blood = ((_target getVariable [QGVAR(bloodVolume), 100]) + BLOODBAGHEAL) min 100; -_target setVariable [QGVAR(bloodVolume), _blood, true]; +[[_target], QUOTE(DFUNC(treatmentBasic_bloodbagLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf new file mode 100644 index 0000000000..9bbe04b35f --- /dev/null +++ b/addons/medical/functions/fnc_treatmentBasic_bloodbagLocal.sqf @@ -0,0 +1,21 @@ +/* + * Author: KoffeinFlummi + * Local callback when the bloodbag treatment is complete + * + * Arguments: + * 0: The patient + * + * Return Value: + * nil + * + * Public: No + */ + +#include "script_component.hpp" +#define BLOODBAGHEAL 70 + +private ["_target","_blood"]; +_target = _this select 0; + +_blood = ((_target getVariable [QGVAR(bloodVolume), 100]) + BLOODBAGHEAL) min 100; +_target setVariable [QGVAR(bloodVolume), _blood, true]; diff --git a/addons/medical/functions/fnc_treatmentBasic_morphine.sqf b/addons/medical/functions/fnc_treatmentBasic_morphine.sqf index d8d793d0bc..048b314781 100644 --- a/addons/medical/functions/fnc_treatmentBasic_morphine.sqf +++ b/addons/medical/functions/fnc_treatmentBasic_morphine.sqf @@ -17,15 +17,8 @@ #include "script_component.hpp" #define MORPHINEHEAL 0.4 -private ["_caller", "_target","_className","_blood","_morphine","_pain"]; +private ["_caller", "_target"]; _caller = _this select 0; _target = _this select 1; -_className = _this select 3; -// reduce pain, pain sensitivity -_morphine = ((_target getVariable [QGVAR(morphine), 0]) + MORPHINEHEAL) min 1; -_target setVariable [QGVAR(morphine), _morphine, true]; -_pain = ((_target getVariable [QGVAR(pain), 0]) - MORPHINEHEAL) max 0; -_target setVariable [QGVAR(pain), _pain, true]; - -// @todo overdose +[[_target], QUOTE(DFUNC(treatmentBasic_morphineLocal)), _target] call EFUNC(common,execRemoteFnc); /* TODO Replace by event system */ diff --git a/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf b/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf new file mode 100644 index 0000000000..9dddf743e2 --- /dev/null +++ b/addons/medical/functions/fnc_treatmentBasic_morphineLocal.sqf @@ -0,0 +1,27 @@ +/* + * Author: KoffeinFlummi + * Local callback when the morphine treatment is complete + * + * Arguments: + * 0: The medic + * 1: The patient + * + * Return Value: + * nil + * + * Public: No + */ + +#include "script_component.hpp" +#define MORPHINEHEAL 0.4 + +private ["_target", "_morphine", "_pain"]; +_target = _this select 0; + +// reduce pain, pain sensitivity +_morphine = ((_target getVariable [QGVAR(morphine), 0]) + MORPHINEHEAL) min 1; +_target setVariable [QGVAR(morphine), _morphine, true]; +_pain = ((_target getVariable [QGVAR(pain), 0]) - MORPHINEHEAL) max 0; +_target setVariable [QGVAR(pain), _pain, true]; + +// @todo overdose diff --git a/addons/medical/functions/fnc_treatmentIV.sqf b/addons/medical/functions/fnc_treatmentIV.sqf index c171d7364f..3a62b9e657 100644 --- a/addons/medical/functions/fnc_treatmentIV.sqf +++ b/addons/medical/functions/fnc_treatmentIV.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_caller", "_target", "_selectionName", "_className", "_items", "_removeItem", "_attributes"]; +private ["_caller", "_target", "_selectionName", "_className", "_items", "_removeItem"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_treatmentIVLocal.sqf b/addons/medical/functions/fnc_treatmentIVLocal.sqf index 66ecdf9d90..04708b965f 100644 --- a/addons/medical/functions/fnc_treatmentIVLocal.sqf +++ b/addons/medical/functions/fnc_treatmentIVLocal.sqf @@ -15,7 +15,7 @@ #include "script_component.hpp" -private ["_target", "_ivItem", "_config", "_volumeAdded", "_typeOf", "_varName"]; +private ["_target", "_ivItem", "_config", "_volumeAdded", "_typeOf", "_varName", "_bloodVolume"]; _target = _this select 0; _ivItem = _this select 1; @@ -27,8 +27,8 @@ _config = (configFile >> "ACE_Medical_Advanced" >> "Treatment" >> "IV"); _volumeAdded = getNumber (_config >> "volume"); _typeOf = getText (_config >> "type"); -if (isClass (_config >> _className)) then { - _config = (_config >> _className); +if (isClass (_config >> _ivItem)) then { + _config = (_config >> _ivItem); if (isNumber (_config >> "volume")) then { _volumeAdded = getNumber (_config >> "volume");}; if (isText (_config >> "type")) then { _typeOf = getText (_config >> "type"); }; }; diff --git a/addons/medical/functions/fnc_treatmentTourniquet.sqf b/addons/medical/functions/fnc_treatmentTourniquet.sqf index da50c5c1bf..731797f1f9 100644 --- a/addons/medical/functions/fnc_treatmentTourniquet.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquet.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_caller","_target","_part","_selectionName","_removeItem", "_tourniquets", "_items", "_output"]; +private ["_caller","_target","_part","_selectionName","_removeItem", "_tourniquets", "_items", "_output", "_className"]; _caller = _this select 0; _target = _this select 1; _selectionName = _this select 2; diff --git a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf index 289f852a06..02484bbca6 100644 --- a/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf +++ b/addons/medical/functions/fnc_treatmentTourniquetLocal.sqf @@ -29,7 +29,7 @@ _tourniquets set[_part, _applyingTo]; _target setvariable [QGVAR(tourniquets), _tourniquets, true]; [{ - private ["_args","_target","_applyingTo","_part", "_tourniquets"]; + private ["_args","_target","_applyingTo","_part", "_tourniquets", "_time"]; _args = _this select 0; _target = _args select 0; _applyingTo = _args select 1; diff --git a/addons/medical/functions/fnc_treatment_failure.sqf b/addons/medical/functions/fnc_treatment_failure.sqf index 33712956a0..c329bf724c 100644 --- a/addons/medical/functions/fnc_treatment_failure.sqf +++ b/addons/medical/functions/fnc_treatment_failure.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_caller", "_target","_selectionName","_className","_config","_callback", "_usersOfItems", "_weaponSelect"]; +private ["_args", "_caller", "_target","_selectionName","_className","_config","_callback", "_usersOfItems", "_weaponSelect"]; _args = _this select 0; _caller = _args select 0; diff --git a/addons/medical/functions/fnc_treatment_success.sqf b/addons/medical/functions/fnc_treatment_success.sqf index 66406a180a..0178ea78fd 100644 --- a/addons/medical/functions/fnc_treatment_success.sqf +++ b/addons/medical/functions/fnc_treatment_success.sqf @@ -17,7 +17,7 @@ #include "script_component.hpp" -private ["_caller", "_target","_selectionName","_className","_config","_callback", "_weaponSelect"]; +private ["_args", "_caller", "_target","_selectionName","_className","_config","_callback", "_weaponSelect"]; _args = _this select 0; _caller = _args select 0; _target = _args select 1; diff --git a/addons/medical/functions/fnc_unconsciousPFH.sqf b/addons/medical/functions/fnc_unconsciousPFH.sqf index 1d7558e5fc..bf328648d5 100644 --- a/addons/medical/functions/fnc_unconsciousPFH.sqf +++ b/addons/medical/functions/fnc_unconsciousPFH.sqf @@ -13,7 +13,7 @@ #include "script_component.hpp" -private ["_unit", "_vehicleOfUnit","_minWaitingTime", "_oldAnimation", "_captiveSwitch", "_hasMovedOut", "_parachuteCheck"]; +private ["_unit", "_minWaitingTime", "_oldAnimation", "_hasMovedOut", "_parachuteCheck", "_args", "_originalPos", "_startingTime"]; _args = _this select 0; _unit = _args select 0; _oldAnimation = _args select 1; @@ -31,6 +31,8 @@ if (!alive _unit) exitwith { [_unit, false] call EFUNC(common,disableAI); //_unit setUnitPos _originalPos; _unit setUnconscious false; + + [_unit, "isUnconscious"] call EFUNC(common,unmuteUnit); ["medical_onUnconscious", [_unit, false]] call EFUNC(common,globalEvent); [(_this select 1)] call cba_fnc_removePerFrameHandler; @@ -71,6 +73,8 @@ if !(_unit getvariable ["ACE_isUnconscious",false]) exitwith { _unit setUnconscious false; + [_unit, "isUnconscious"] call EFUNC(common,unmuteUnit); + // ensure this statement runs only once _args set [5, true]; }; diff --git a/addons/medical/stringtable.xml b/addons/medical/stringtable.xml index 53c587bec0..17f1ec2402 100644 --- a/addons/medical/stringtable.xml +++ b/addons/medical/stringtable.xml @@ -1,15 +1,37 @@  + + INJURIES + VERLETZUNGEN + LESIONI + ТРАВМЫ + BLESSURES + OBRAŻENIA + + + No injuries on this bodypart ... + Körperteil nicht verletzt ... + Non ci sono lesioni in questa parte del corpo ... + Данная часть тела не повреждена ... + Aucune blessures sur cette partie du corps + Brak obrażeń na tej części ciała ... + Litter Simulation Detail Detale zużytych medykamentów Detalle de simulación de basura + Количество мусора от медицины + Dettagli Simulazione Rifiuti + Niveau de simulation des détritus Litter simulation detail level sets the number of litter items which will be locally spawned in the client. Excessive amounts in local areas could cause FPS lag, so this is a client only setting. Opcja ta ustawia liczbę zużytych medykamentów, jakie pojawiają się lokalnie wokół gracza. Ich zbyt duża ilość może spowodować spadki FPS, dlatego jest to ustawienie tylko po stronie klienta. Detalle simulación de basura establece el número de artículos de basura que se generan a nivel local en el cliente. Las cantidades excesivas en áreas locales podrían causar caída de rendimiento, así que esto es un ajuste de cliente únicamente. + Устанавливает количество мусора, который появляется после использования мед. препаратов. Большое количество мусора может уменьшить производительность, поэтому данная настройка локальна для клиента. + Il livello di dettagli della simulazione dei rifiuti indica il numero di rifiuti che verranno creati localmente nel client. La creazione di troppi rifiuti in aree locali potrebbe causare lag e calo di FPS. Questo è un settaggio client. + Le nieau de simulation des détritus règle la quantité de déchets qui vont être créer localement dans le client. Des quantitées excessive dans certaines zones locales aurait pu causer des chutes D'IPS, donc c'est une option client uniquement. Inject Atropine @@ -21,6 +43,7 @@ Ввести атропин Atropin beadása Inietta atropina + Injetar Atropina Inject Epinephrine @@ -41,7 +64,7 @@ Wstrzyknij morfinę Aplikovat morfin Ввести морфин - Morphine + Injecter de la morphine Morfium beadása Injetar Morfina Inietta Morfina @@ -68,6 +91,7 @@ Перелить плазму Infúzió (vérplazma) Effettua trasfusione di plasma + Transfundir Plasma Transfuse Saline @@ -79,16 +103,18 @@ Перелить физраствор Infúzió (sós víz) Effettua trasfusione di soluzione salina + Transfundir Soro Apply Tourniquet - Aderpresse anwenden + Tourniquet anwenden Aplicar torniquete Aplikovat škrtidlo Załóż stazę Appliquer un garrot Наложить жгут Applica laccio emostatico + Aplicar Torniquete Bandage @@ -208,6 +234,7 @@ Введение атропина ... Atropin beadása ... Inietto l'atropina ... + Injetando Atropina Transfusing Blood ... @@ -231,6 +258,7 @@ Переливание физраствора ... Infúzió sós vizzel ... Effettuo la rasfusione di salina + Transfundindo Soro... Transfusing Plasma ... @@ -242,6 +270,7 @@ Переливание плазмы ... Infúzió vérplazmával ... Effettu la trasfusione di plasma ... + Transfundindo Plasma... Bandaging ... @@ -257,7 +286,7 @@ Applying Tourniquet ... - Setze Aderpresse an ... + Setze Tourniquet an ... Aplicando torniquete ... Aplikuji škrtidlo Zakładanie stazy ... @@ -265,6 +294,7 @@ Наложение жгута ... Érszorító felhelyezése ... Sto applicando il laccio emostatico ... + Applicando Torniquete Medical @@ -288,6 +318,7 @@ Bandage rapide Zárókötszer Bendaggio rapido + Curativo de Campo Packing Bandage @@ -298,6 +329,7 @@ Nyomókötszer Bendaggio compressivo Bandage gauze + Bandagem de Compressão Elastic Bandage @@ -309,17 +341,19 @@ Pansement élastique Rögzitő kötszer Bendaggio elastico + Bandagem Elástica QuikClot QuikClot QuikClot - QuickClot + QuikClot Opatrunek QuikClot QuikClot Hémostatique QuikClot QuikClot(polvere emostatica) + QuikClot Check Pulse @@ -328,9 +362,10 @@ Проверить пульс Zkontrolovat pulz Sprawdź tętno - Vérifier les pulsations + Vérifier le pouls Pulzus ellenőrzése Controlla il polso + Checar Pulso Check Blood Pressure @@ -342,10 +377,11 @@ Vérification de la tension Vérnyomás megmérése Controlla pressionsa sanguigna + Chegar Pressão Sanguínea Triage Card - Verletztenanhängekarte + Triagekarte Tarjeta de triaje Медкарта Karta segregacyjna @@ -353,28 +389,71 @@ Carte de triage Orvosi lap Triage Card + Cartão de Triagem + + + No entries on this triage card. + Keine Einträge auf der Triagekarte + Nessuna voce sulla Triage Card + Нет записей. + Aucune entrée sur cette carte de triage + Brak wpisów w tej karcie segregacyjnej. Tourniquet - Aderpresse + Tourniquet Torniquete Жгут Škrtidlo Staza - Garrot + Tourniquet Érszorító Laccio emostatico + Torniquete Remove Tourniquet - Aderpresse entfernen + Tourniquet entfernen Quitar torniquete Снять жгут Sundat škrtidlo Zdejmij stazę - Enlever le garrot + Enlever le Tourniquet Érszorító leszedése Rimuovi laccio emostatico + Remover Torniquete + + + Diagnose + Diagnose + Diagnosi + Диагностика + Diagnostiquer + Diagnoza + + + Diagnosing ... + Diagnostizieren ... + Diagnosi in corso... + Диагностика ... + Diagnostic en cours + Diagnozowanie ... + + + CPR + HLW + RCP + Сердечно-лёгочная реанимация + RPC + RKO + + + Performing CPR ... + HLW durchführen ... + Eseguendo RCP... + Сердечно-лёгочная реанимация ... + RPC en cours + Przeprowadzanie RKO ... Give Blood IV (1000ml) @@ -386,6 +465,7 @@ Podat krev. transfúzi (1000ml) Vér adása intravénásan (1000ml) Effettua trasfusione sangue IV (1000ml) + Administrar Sangue IV (1000ml) Give Blood IV (500ml) @@ -397,6 +477,7 @@ Podat krev. transfúzi (500ml) Vér adása intravénásan (500ml) Effettua trasfusione sangue IV (500ml) + Administrar Sangue IV (500ml) Give Blood IV (250ml) @@ -408,6 +489,7 @@ Podat krev. transfúzi (250ml) Vér adása intravénásan (250ml) Effettua trasfusione sangue IV (250ml) + Administrar Sangue IV (250ml) Give Plasma IV (1000ml) @@ -419,6 +501,7 @@ Podat plazmu (1000ml) Vérplazma adása intravénásan (1000ml) Effettua trasfusione plasma IV (1000ml) + Administrar Plasma IV (1000ml) Give Plasma IV (500ml) @@ -430,6 +513,7 @@ Podat plazmu (500ml) Vérplazma adása intravénásan (500ml) Effettua trasfusione plasma IV (500ml) + Administrar Plasma IV (500ml) Give Plasma IV (250ml) @@ -441,10 +525,11 @@ Podat plazmu (250ml) Vérplazma adása intravénásan (250ml) Effettua trasfusione plasma IV (250ml) + Administrar Plasma IV (250ml) Give Saline IV (1000ml) - Kochsaltzlösung IV (1000ml) + Kochsalzlösung IV (1000ml) Dar Salino IV (1000ml) Перелить пакет физраствора (1000 мл) Podaj sól fizjologiczną IV (1000ml) @@ -452,10 +537,11 @@ Podaz fyz. roztok (1000ml) Sós víz adása intravénásan (1000ml) Effettua trasfusione salina IV (1000ml) + Administrar Soro IV (1000ml) Give Saline IV (500ml) - Kochsaltzlösung IV (500ml) + Kochsalzlösung IV (500ml) Dar Salino IV (500ml) Перелить пакет физраствора (500 мл) Podaj sól fizjologiczną IV (500ml) @@ -463,10 +549,11 @@ Podaz fyz. roztok (500ml) Sós víz adása intravénásan (500ml) Effettua trasfusione salina IV (500ml) + Administrar Soro IV (500ml) Give Saline IV (250ml) - Kochsaltzlösung IV (250ml) + Kochsalzlösung IV (250ml) Dar Salino IV (250ml) Перелить пакет физраствора (250 мл) Podaj sól fizjologiczną IV (250ml) @@ -474,6 +561,7 @@ Podaz fyz. roztok (250ml) Sós víz adása intravénásan (250ml) Effettua trasfusione salina IV (250ml) + Administrar Soro IV (250ml) Minor @@ -481,10 +569,11 @@ Menor Несрочная помощь Normalny - Léger + Mineur Minimální Enyhe Minore + Leve Delayed @@ -496,6 +585,7 @@ Odložitelný Késleltetett Differito + Atrasado Immediate @@ -507,6 +597,7 @@ Okamžiý Azonnali Immediata + Imediato Deceased @@ -518,6 +609,7 @@ Mrtvý Elhalálozott Deceduto + Falecido None @@ -529,6 +621,7 @@ Nic Semmi Nessuna + Nenhum Normal breathing @@ -540,6 +633,7 @@ Dýchá normálně Normális légzés Respiro normale + Respiração normal No breathing @@ -551,6 +645,7 @@ Nedýchá Nincs légzés Mancanza di respiro + Não respira Difficult breathing @@ -562,6 +657,7 @@ Dýchá s obtížemi Nehéz légzés Difficoltà a respirare + Dificuldade para respirar Almost no breathing @@ -573,6 +669,7 @@ Skoro nedýchá Alig van légzés Respira a fatica + Quase não respira Bleeding @@ -584,6 +681,7 @@ Krvácí Vérzik Sanguinando + Sangrando In Pain @@ -595,6 +693,7 @@ V bolestech Fájdalom alatt Con dolore + Com dor Lost a lot of Blood @@ -606,17 +705,19 @@ Ztratil hodně krve Sok vért vesztett Ha perso parecchio sangue + Perdeu muito sangue Tourniquet [CAT] - Aderpresse [CAT] + Tourniquet [CAT] Жгут Torniquete [CAT] - Garrot [CAT] + Tourniquet [CAT] Staza [typ. CAT] Škrtidlo [CAT] Érszorító [CAT] Laccio emostatico [CAT] + Torniquete [CAT] Receiving IV [%1ml] @@ -628,6 +729,7 @@ Přijímání transfúze [%1ml] Infúzióra kötve [%1ml] Ricevendo IV [%1ml] + Recebendo IV [%1ml] Bandage (Basic) @@ -639,6 +741,7 @@ Bandáž (standartní) Kötszer (Általános) Bendaggio (base) + Bandagem(Básico) Used to cover a wound @@ -649,6 +752,7 @@ Verwendet, um Wunden abzudecken Sebesülések befedésére alkalmas Usato per coprire una ferita + Usado para cobrir um ferimento A dressing, that is a particular material used to cover a wound, which is applied over the wound once bleeding has been stemmed. @@ -658,7 +762,8 @@ Bandage fait d'un matériel spécial utilisé pour couvrir une blessure, qui peut etre appliqué dès que le saignement a été stoppé. Opatrunek materiałowy, używany do przykrywania ran, zakładany na ranę po zatamowaniu krwawienia. Egy különleges anyagú kötszer sebek betakarására, amelyet a vérzés elállítása után helyeznek fel. - Una benda apposta, utilizzata per coprire una ferita, la quale è applicato sopra di essa una volta fermata l'emorragia. + Una benda apposita, utilizzata per coprire una ferita, la quale è applicata sopra di essa una volta fermata l'emorragia. + Uma curativo, material específico para cobrir um ferimento que é aplicado assim que o sangramento é estancando. Packing Bandage @@ -669,25 +774,29 @@ Bandaż (uciskowy) Nyomókötszer Bendaggio compressivo + Bandagem de Compressão Used to pack medium to large wounds and stem the bleeding - Verwendet, um mittlere bis große Wunden abzudecken und Blutungen zu stoppen + Wird verwendet, um mittlere bis große Wunden abzudecken und Blutungen zu stoppen Для тампонирования ран среднего и большого размера и остановки кровотечения. 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. Közepestől nagyig terjedő sebek betakarására és vérzés elállítására használt kötszer Usato su medie o larghe ferite per fermare emorragie. + Usado para o preenchimento de cavidades geradas por ferimentos médios e grandes e estancar o sangramento. A bandage used to pack the wound to stem bleeding and facilitate wound healing. Packing a wound is an option in large polytrauma injuries. - Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжелых сочетанных ранениях возможно тампонирование раны. + Повязка для тампонирования раны, остановки кровотечения и лучшего заживления. При тяжёлых сочетанных ранениях возможно тампонирование раны. Se utiliza para detener la hemorragia de una herida y favorecer su cicatrización. Se usa en grandes lesiones o politraumatismos. Bandage servant à recouvrir les blessures pour arrêter les hémmoragies et faciliter la guérisson. Recouvrir une blessure est optionnel dans le cas de blessures polytraumatiques Opatrunek stosowany w celu zatrzymania krwawienia i osłony większych ran. Egy kötszerfajta, melyet a sebek nyomására használnak a vérzés elállítása és sebgyógyulás érdekében. A nyomókötés egy lehetőség nagyobb polytraumatikus sérülések esetén. - Un bendaggio usato per bendare ferite con emorragie e facilitare la guarigione. Bendare una ferita è una opzione su ferite di vario tipo. + Un bendaggio usato per coprire la ferita, fermare il sanguinamento e facilitarne la guarigione. Questa tecnica è opzionale su ferite multiple. + Ein Verband, um die Wunde abzudecken und die Wundheilung zu fördern. Wunden abdecken ist eine Option bei größeren Polytraumen + Uma bandagem usada para preencher o ferimento para estancar o sangramento e facilitar a cicatrização. Preenchimento de feridas é uma opção em ferimentos de politrauma grandes. Bandage (Elastic) @@ -699,6 +808,7 @@ Bandáž (elastická) Rögzító kötszer Benda (Elastica) + Bandagem (Elástica) Bandage kit, Elastic @@ -709,27 +819,30 @@ Zestaw bandaży elastycznych. Rugalmas kötszercsomag, "rögzítő" Kit bendaggio, elastico + Kit de Bandagem, Elástica Allows an even compression and extra support to the injured area. - - Давящая повязка обеспечивает равномерное сжатие и дополнительную поддержку поврежденной области + Ermöglicht eine gleichmäßige Kompression und zusätzliche Unterstützung für den verletzten Bereich. + Давящая повязка обеспечивает равномерное сжатие и дополнительную поддержку повреждённой области Ce bandage peut être utilisé pour compresser la plaie afin de ralentir le saignement et assurer la tenue du bandage lors de mouvement. Elastyczna opaska podtrzymująca opatrunek oraz usztywniająca okolice stawów. Brinda una compresión uniforme y ofrece soporte extra a una zona lesionada Egyenletes nyomást és támogatást biztosít a sebesült felületnek. Permette di comprimevere e aiutare la zone ferita. + Esta bandagem pode ser utilizada para comprimir o ferimento e diminuir o sangramento e garantir que o ferimento não abra em movimento. Tourniquet (CAT) - Aderpresse (CAT) + Tourniquet [CAT] Жгут Torniquete (CAT) - Garrot (CAT) + Tourniquet (CAT) Staza (typ. CAT) Škrtidlo (CAT) Érszorító (CAT) Laccio emostatico (CAT) + Torniquete (CAT) Slows down blood loss when bleeding @@ -740,6 +853,7 @@ 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 + Reduz a velocidade da perda de sangue A constricting device used to compress venous and arterial circulation in effect inhibiting or slowing blood flow and therefore decreasing loss of blood. @@ -750,6 +864,7 @@ Ein Gerät, das Druck auf Venen und Arterien ausübt und so den Blutfluss verringert. Egy szűkítőeszköz, mely a vénás és artériás nyomás keringés helyi összenyomására szolgál, ezzel lelassítva vagy megállítva az adott területen a vérkeringést. Ez csökkenti a vérvesztés mértékét. Un laccio emostatico usato per comprimere le vene e arterie per bloccare o rallentare la circolazione del sangue e quindi rallentare dissanguamenti. + A aparelho que comprime as artérias e veias para diminuir a perda de sangue. Morphine autoinjector @@ -761,6 +876,7 @@ Autoinjektor morfin Morfium autoinjektor Autoiniettore di morfina + Auto-injetor de morfina Used to combat moderate to severe pain experiences @@ -771,6 +887,7 @@ Morfina. Ma silne działanie przeciwbólowe. Mérsékelttől erős fájdalomig, ellene alkalmazandó termék Usato per combattere il dolore. + Usado para combater dores moderadas e severas An analgesic used to combat moderate to severe pain experiences. @@ -781,6 +898,7 @@ Ein Schmerzmittel um mäßige bis starke Schmerzen zu behandeln Egy fájdalomcsillapító anyag, jellemzően mérsékelt vagy erős fájdalom esetén alkalmazandó. Un analgesico usato per combattere il dolore. + Um analgésico usado para combater dores moderadas e fortes. Atropin autoinjector @@ -792,6 +910,7 @@ Autoinjektor atropin Atropin autoinjektor Autoiniettore di Atropina + Auto-injetor de Atropina Used in NBC scenarios @@ -802,6 +921,7 @@ Verwendet bei ABC Kontamination NBK helyzetek esetén használandó Usato in situazioni con gas nervino. + Usado em casos de ataque QBRN A drug used by the Military in NBC scenarios. @@ -812,6 +932,7 @@ Ein Medikament, das vom Militär bei ABC Kontamination verwendet wird. Egy instabil alkaloid, NBK helyzetek esetén a katonai szervezetek veszik használatba. E' un farmaco usato in ambito militare in scenari con presenza di gas nervino. + Uma droga usada por militares em casos de ataque QBRN. Epinephrine autoinjector @@ -823,6 +944,7 @@ Autoinjektor adrenalin Epinefrin autoinjektor Autoiniettore di Epinefrina + Auto-injetor de epinefrina Increase heart rate and counter effects given by allergic reactions @@ -830,9 +952,10 @@ 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 - Steigert die Herzfrequenz, um den Effekt von allergischen Reaktionen zu bekämpfen + 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. + Aumenta a frequência cardíaca e combate efeitos causados por reações alérgicas A drug that works on a sympathetic response to dilate the bronchi, increase heart rate and counter such effects given by allergic reactions (anaphylaxis). Used in sudden cardiac arrest scenarios with decreasing positive outcomes. @@ -841,6 +964,8 @@ Medicament qui fonctionne sur le système nerveux sympathique créant une dilatation des bronches, augmente la fréquence cardiaque et annule les effets d'une réaction allergique (anaphylaxie). Utilisé lors d'arrêt cardio-respiratoire pour augmenter les chances de retrouver un pouls. EpiPen z adrenaliną ma działanie sympatykomimetyczne, tj. pobudza receptory alfa- i beta-adrenergiczne. Pobudzenie układu współczulnego prowadzi do zwiększenia częstotliwości pracy serca, zwiększenia pojemności wyrzutowej serca i przyśpieszenia krążenia wieńcowego. Pobudzenie oskrzelowych receptorów beta-adrenergicznych wywołuje rozkurcz mięśni gładkich oskrzeli, co w efekcie zmniejsza towarzyszące oddychaniu świsty i duszności. Una sostanza che permette di dilatare i bronchi, aumentare il battito cardiaco e combattere effetti di reazioni allergiche. Usato anche in casi di arresto cardiaco. + Ein Medikament, dass die Bronchien erweitert, die Herzfrequenz erhöht und Symptome von allergischen Reaktionen(Anaphylaxie) bekämpft. Wird bei plötzlichem Herzstillstand verabreicht. + Uma droga trabalha dilatando os bronquios, aumentando a frequência cardíaca e combate efeitos de reações alérgicas(anáfilaticas). Usado em casos de parada cardiaca com poucas changes de recuperação. Plasma IV (1000ml) @@ -851,6 +976,7 @@ Plasma IV (1000ml) Vérplazma-infúzió (1000ml) Plasma IV (1000ml) + Plasma IV (1000ml) A volume-expanding blood supplement. @@ -860,6 +986,8 @@ Składnik krwi, używany do zwiększenia jej objętości. Egy térfogatnövelő vérkiegészítmény. Aiuta ad aumentare il volume sanguigno. + Volumenerweiterungsmittel (künstliches Blutvolumen) + Suplemento para expandir o volume sanguíneo. A volume-expanding blood supplement. @@ -869,6 +997,8 @@ Składnik krwi, używany do zwiększenia jej objętości. Egy térfogatnövelő vérkiegészítmény. Aiuta ad aumentare il volume sanguigno. + Volumenerweiterungsmittel (künstliches Blutvolumen) + Suplemento para expandir o volume sanguíneo. Plasma IV (500ml) @@ -879,6 +1009,7 @@ Plasma IV (500ml) Vérplazma-infúzió (500ml) Plasma IV (500ml) + Plasma IV (500ml) Plasma IV (250ml) @@ -889,6 +1020,7 @@ Plasma IV (250ml) Vérplazma-infúzió (250ml) Plasma IV (250ml) + Plasma IV (250ml) Blood IV (1000ml) @@ -899,15 +1031,18 @@ Blut IV (1000ml) Vér-infúzió (1000ml) Sangue IV (1000ml) + Sangue IV (1000ml) Blood IV, for restoring a patients blood (keep cold) - Пакет крови для возмещения объема потерянной крови (хранить в холодильнике) + Пакет крови для возмещения объёма потерянной крови (хранить в холодильнике) 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 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) + Sangue intravenoso, para restaurar o volume sanguinio do paciente.(Manter frio) O Negative infusion blood used in strict and rare events to replenish blood supply usually conducted in the transport phase of medical care. @@ -916,6 +1051,8 @@ Utilice sólo durante gran pérdida de sangre para reemplazar el volumen de sangre perdida. Uso habitual durante el transporte de heridos. Sangue 0 negativo usato per ripristinare sangue in pazienti in cui si è verificata una perdita di sangue. Cullot sanguin O- utilisé dans de rares et stricts cas pour compléter une perte de sang importante. Administré normalement lors d'un MEDEVAC + O Negative Blutinfusion wird nur in seltenen Fällen verwendet, um den Bluthaushalt des Patienten zu ergänzen. Wird in der Regel wärend der Transportphase durchgeführt. + Sangue O- , utilizado em casos raros para rapidamente repor o sangue. Uso habitual ocorre durante o transporte ou em estações de tratamento. Blood IV (500ml) @@ -926,6 +1063,7 @@ Blut IV (500ml) Vér-infúzió (500ml) Sangue IV (500ml) + Sangue IV (500ml) Blood IV (250ml) @@ -936,6 +1074,7 @@ Blut IV (250ml) Vér-infúzió (250ml) Samgue IV (250ml) + Sangue IV (250ml) Saline IV (1000ml) @@ -946,24 +1085,29 @@ Kochsalzlösung (1000ml) 0,9%-os sósvíz-infúzió (1000ml) Soluzione salina IV (1000ml) + Soro IV (1000ml) Saline IV, for restoring a patients blood - Пакет физраствора для возмещения объема потерянной крови + Пакет физраствора для возмещения объёма потерянной крови 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 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 + Solução Salina Intravenosa 0.9%, para restaurar o volume de sangue temporariamente. A medical volume-replenishing agent introduced into the blood system through an IV infusion. - Пакет физиологического раствора для возмещения объема потерянной крови путем внутривенного вливания + Пакет физиологического раствора для возмещения объёма потерянной крови путем внутривенного вливания Suero fisiológico inoculado al torrente sanguíneo de forma intravenosa. Un remplacant temporaire pour rétablir la tension artérielle lors de perte sanguine, administré par intra-veineuse 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). Egy orvosi térfogat-helyreállító készítmény, melyet intravénás módon lehet a szervezetbe juttatni. Una soluzione medica per ripristinare il volume del sangue introdotta tramite trasfusione IV. + Ein medizinisches Volumenersatzmittel, dass durch einen intravenösen Zugang in den Blutkreislauf verabreicht wird. + Uma reposição temporaria para restaurar a pressão arterial perdida por perda de sangue. Saline IV (500ml) @@ -974,6 +1118,7 @@ Kochsalzlösung (500ml) 0,9%-os sósvíz-infúzió (500ml) Soluzione salina IV (500ml) + Soro IV (1000ml) Saline IV (250ml) @@ -984,6 +1129,7 @@ Kochsalzlösung (250ml) 0,9%-os sósvíz-infúzió (250ml) Soluzione salina IV (250ml) + Soro IV (1000ml) Basic Field Dressing (QuikClot) @@ -994,6 +1140,7 @@ Verbandpäckchen(Gerinnungsmittel) Általános zárókötszer (QuikClot) Bendaggio emostatico (QuikClot) + Bandagem básica (Coagulante) QuikClot bandage @@ -1004,6 +1151,7 @@ Bandage mit Gerinnungsmittel QuikClot kötszer Bendaggio emostatico (QuikClot) + Bandagem com agente coagulante Hemostatic bandage with coagulant that stops bleeding. @@ -1014,16 +1162,18 @@ Verband mit Gerinnungsmittel, um starke Blutung zu behandeln. Hemostatikus kötszer egy vérzésgátló anyaggal. Bendaggio emostatico con coagulante che permette di arrestare perdite di sangue + Bandagem Hemostática com coagulante que controla hemorragia médias e grandes com risco de vida. Personal Aid Kit Аптечка Botiquín de primeros auxilios - Équipement de support vital + Trousse de premiers soins Apteczka osobista Persönliches Verbandpäckchen Elsősegélycsomag Pronto soccorso personale + Kit De Primeiros Socorros Pessoal Includes various treatment kit needed for stitching or advanced treatment @@ -1034,14 +1184,21 @@ 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. + Inclui vários tratamentos materiais para custura e tratamento avançado - - - - + 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. + Trousse de premiers soins pour coudre sur le terrain et traitements avancés. + + + Use Personal Aid Kit + Verbandpäckchen benutzen + Использовать аптечку + Utiliser la Trousse de premier soins + Użyj apteczki osobistej Surgical Kit @@ -1052,6 +1209,7 @@ Operationsset Sebészeti készlet Kit chirurgico + Kit Cirurgico Surgical Kit for in field advanced medical treatment @@ -1062,6 +1220,7 @@ Operationsset für fortgeschrittene medizinische Feldversorgung Sebészeti készlet komplex orvosi feladatok terepen való ellátására Kit chirurgico per trattamenti avanzati sul campo. + Kit Cirurgico para uso de tratamento médico avançado em campo Surgical Kit for in field advanced medical treatment @@ -1072,6 +1231,15 @@ Trousse chirurgicale pour le traitement sur le terrain Sebészeti készlet komplex orvosi feladatok terepen való ellátására Kit chirurgico per trattamenti avanzati sul campo. + Kit Cirurgico para uso de tratamento médico avançado em campo. + + + Use Surgical Kit + Operationsset benutzen + Usa kit chirurgico + Использовать хирургический набор + Utiliser la trousse chirugicale + Zszyj rany Bodybag @@ -1082,6 +1250,7 @@ Leichensack Hullazsák Sacca per corpi + Saco para cadáver A bodybag for dead bodies @@ -1092,6 +1261,7 @@ Ein Leichensack für Tote Egy hullazsák a holttestek számára Una sacca nera per trasportare cadaveri. + Um saco para corpos mortos A bodybag for dead bodies @@ -1102,6 +1272,7 @@ Ein Leichensack für Tote Egy hullazsák a holttestek számára Una sacca nera per trasportare cadaveri. + Um saco para corpos mortos. Blood Pressure @@ -1112,6 +1283,7 @@ Blutdruck Vérnyomás Pressione sanguigna + Pressão Arterial Checking Blood Pressure.. @@ -1122,6 +1294,15 @@ Blutdruck kontrollieren... Vérnyomás megmérése... Controllando la pressione sanguigna.. + Aferindo Pressão Arterial... + + + %1 checked Blood Pressure: %2 + %1 kontrollierte Blutdruck: %2 + %1 controllata pressione sanguigna: %2 + %1 проверил артериальное давление: %2 + %1 à vérifié la tension: %2 + %1 sprawdził ciśnienie krwi: %2 You checked %1 @@ -1132,6 +1313,7 @@ Kontrolliert %1 A %1 ellenőrizve Hai diagnosticato %1 + Você aferiu o paciente %1 You find a blood pressure of %2/%3 @@ -1141,6 +1323,8 @@ A vérnyomás %2/%3 Hai riscontrato una pressione di %2/%3 Wyczuwasz ciśnienie krwi o wartości %2/%3 + Der Blutdruck liegt bei %2/%3 + A Pressão Arterial é de %2/%3 You find a low blood pressure @@ -1151,6 +1335,7 @@ Blutdruck ist niedrig A vérnyomás alacsony La pressione sanguigna è bassa + Pressão Arterial baixa You find a normal blood pressure @@ -1161,6 +1346,7 @@ Blutdruck ist normal A vérnyomás normális La pressione sanguigna è normale + Pressão Arterial normal You find a high blood pressure @@ -1171,6 +1357,7 @@ Blutdruck ist hoch A vérnyomás magas La pressione sanguigna è alta + Pressão Arterial Alta You find no blood pressure @@ -1181,6 +1368,7 @@ Patient hat keinen Blutdruck Nem észlelhető vérnyomás La pressione sanguigna è assente + Sem Pressão Arterial You fail to find a blood pressure @@ -1191,6 +1379,39 @@ Blutdruck konnte nicht gefunden werden Nem sikerült a vérnyomás megmérése Manca strumento per misurare pressione sanguigna + Você falhou em aferir a Pressão Arterial + + + Low + Niedrig + Basso + Низкое + Faible + Niskie + + + Normal + Normal + Normale + Нормальное + Normale + Normalne + + + High + Hoch + Alto + Высокое + Haute + Wysokie + + + No Blood Pressure + Kein Blutdruck + Nessuna Pressione Sanguigna + Артериальное давление отсутствует + Aucune tension + Brak ciśnienia krwi Pulse @@ -1201,16 +1422,18 @@ Puls Pulzus Polso + Pulso - Checking Heart Rate.. + Checking Heart Rate ... Vérification du rythme cardiaque ... Проверка пульса ... - Comprobando ritmo cardíaco... - Sprawdzanie tętna... - Kontrolliere Herzfrequenz + Comprobando ritmo cardíaco ... + Sprawdzanie tętna ... + Kontrolliere Herzfrequenz ... Szívverés-szám mérése... - Controllando il battito cardiaco.. + Controllando il battito cardiaco ... + Aferindo Pulso ... You checked %1 @@ -1218,19 +1441,53 @@ Vous examinez %1 Examinando a %1 Zbadałeś %1 - Kontrolliertt %1 + Kontrolliert %1 A %1 ellenőrizve Hai diagnosticato %1 + Você aferiu o paciente %1 + + + %1 checked Heart Rate: %2 + %1 kontrollierte Herzfrequenz: %2 + %1 Controllata Frequenza Cardiaca: %2 + %1 проверил пульс: %2 + %1 à vérifié le rythme cardiaque: %2 + %1 sprawdził tętno: %2 + + + Weak + Schwach + Lento + Слабый + Faible + Słabe + + + Normal + Normal + Normale + Нормальный + Normal + Normalne + + + Strong + Stark + Veloce + Сильный + Fort + Silne You find a Heart Rate of %2 - Rythme carquiaque de %2 + Rythme cardiaque de %2 Пульс %2 уд./мин. El ritmo cardíaco es de %2 Wyczuwasz tętno o wartości %2 Herzfrequenz ist %2 A szívverés-szám %2 Il battito cardiaco è %2 + A Freqüência Cardíaca é de %2 You find a weak Heart Rate @@ -1241,6 +1498,7 @@ Schwacher Puls A szívverés-szám alacsony Hai riscontrato un debole battito cardiaco + Freqüência Cardíaca baixa You find a strong Heart Rate @@ -1251,6 +1509,7 @@ Starker Puls A szívverés-szám magas Hai riscontrato un forte battito cardiaco + Freqüência Cardíaca normal You find a normal Heart Rate @@ -1261,6 +1520,7 @@ Normaler Puls A szívverés-szám normális Hai riscontrato un normale battito cardiaco + Freqüência Cardíaca alta You find no Heart Rate @@ -1271,6 +1531,7 @@ Kein Puls gefunden Nem észlelhető szívverés Hai riscontrato una assenza di battito cardiaco + Sem Freqüência Cardíaca Response @@ -1281,6 +1542,7 @@ Ansprechbarkeit Reagálóképesség Risposta + Reação You check response of patient @@ -1291,6 +1553,7 @@ Du prüfst ob der Patient ansprechbar ist Ellenőrzöd a páciens reagálóképességét Controlli la risposta del paziente + Aferindo se o paciente tem reação... %1 is responsive @@ -1301,6 +1564,7 @@ %1 ist anprechbar %1 reakcióképes %1 e' cosciente + %1 está respondendo %1 is not responsive @@ -1311,6 +1575,7 @@ %1 ist nicht ansprechbar %1 nem reagál %1 e' incosciente + %1 não está respondendo You checked %1 @@ -1318,9 +1583,69 @@ Vous avez examiné %1 Examinas a %1 Zbadałeś %1 - Du versucht %1 anzusprechen + Du hast versucht, %1 anzusprechen Megnézted %1-t Hai controllato %1 + Você aferiu o paciente %1 + + + Patient %1<br/>is %2.<br/>%3.<br/>%4 + Paziente %1<br/>è %2.<br/>%3.<br/>%4 + Пациент %1<br/>%2.<br/>%3.<br/>%4 + Patient %1<br/>ist %2.<br/>%3.<br/>%4 + Patient %1<br/>est %2.<br/>%3.<br/> + Pacjent %1<br/>jest %2.<br/>%3.<br/>%4 + + + alive + Vivo + жив + lebendig + vivant + żywy + + + dead + Morto + мёртв + tot + mort + martwy + + + He's lost some blood + Ha perso molto sangue + Есть кровопотеря + Er hat etwas Blut verloren + Il à perdu du sang + Stracił trochę krwi + + + He's lost a lot of blood + + + He hasn't lost blood + Non ha perso sangue + Нет кровопотери + Er hat kein Blut verloren + il n'a pas perdu de sang + Nie stracił krwi + + + He is in pain + è affetto da dolore + Испытывает боль + Er hat Schmerzen + il souffre + Odczuwa ból + + + He is not in pain + Non è affetto da dolore + Не испытывает боли + Er hat keine Schmerzen + Il ne souffre pas + Nie odczuwa bólu Bandaged @@ -1330,6 +1655,8 @@ Zabandażowano Bekötözve Bendato + verbunden + Enfaixado You bandage %1 (%2) @@ -1339,6 +1666,8 @@ Bandażujesz %1 (%2) Bekötözöd %1-t (%2) Stai bendando %1 (%2) + Du verbindest %1 (%2) + Você aplica bandagem no paciente %1 (%2) %1 is bandaging you @@ -1348,33 +1677,41 @@ %1 bandażuje Ciebie %1 bekötöz téged %1 ti sta bendando + %1 verbindet dich + %1 está aplicando uma bandagem em você - You start stitching injures from %1 (%2) + You start stitching injuries from %1 (%2) Вы зашиваете ранения от %1 (%2) + Du nähst die Wunden von %1 (%2) Vous suturez %1 (%2) Estás suturando heridas de %1 en %2 Zszywasz rany %1 (%2) Elkezded összevarni %1 sérüléseit (%2) Stai suturando le ferite di %1 (%2) + Você começa a suturar os ferimentos do %1 (%2) Stitching Наложение швов - Sutures Suturando + Nähen + Sutures Szycie Összevarrás Suturando + Suturando... You treat the airway of %1 Вы интубируете раненого %1 - Vous traitez les voies respiratoires de %1 Estás intubando a %1 + Du behandelst die Atemwege von %1 + Vous traitez les voies respiratoires de %1 Udrażniasz drogi oddechowe %1 Kezeled %1 légútját Controlli le vie respiratorie di %1 + Você entuba o %1 Airway @@ -1385,6 +1722,7 @@ Voies respiratoires Légút Vie respiratorie + Vias Aéreas %1 is treating your airway @@ -1392,8 +1730,10 @@ %1 traite vos voies respiratoires %1 te está intubando %1 udrażnia Twoje drogi oddechowe + %1 behandelt deine Atemwege %1 kezeli a légútadat %1 ti sta trattando le vie respiratorie + %1 está te entubando Drag @@ -1428,7 +1768,7 @@ Отпустить Déposer Elengedés - Largar + Soltar Rrilascia @@ -1459,73 +1799,89 @@ Unload patient Descargar el paciente Выгрузить пациента + Patient Ausladen Wyładuj pacjenta Débarquer le patient Sebesült kihúzása Scarica il paziente + Descarregar Paciente Load patient Cargar el paciente en Погрузить пациента + Patient Einladen Załaduj pacjenta Embarquer le patient Sebesült berakása Carica il paziente + Carregar Paciente Em Place body in bodybag Colocar cuerpo en bolsa para cadáveres Поместить тело в мешок для трупов + Körper in Leichesack verstauen Zapakuj ciało do worka na zwłoki Mettre le corps dans la housse mortuaire Test hullazsákba helyezése Metti il corpo nella sacca per cadaveri + Colocar corpo dentro do saco para cadáver Placing body in bodybag Colocando cuerpo en bolsa para cadáveres Упаковка тела ... + Verstaue Körper in Leichensack 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 + Colocando corpo dentro do saco para cadáver... %1 has bandaged patient %1 has vendado al paciente %1 перевязал пациента + %1 hat den Patienten verbunden %1 zabandażował pacjenta %1 a pansé le patient %1 bekötözte a pácienst %1 ha bendato il paziente + %1 aplicou bandagem no paciente %1 used %2 %1 usó %2 + %1 benutzt %2 %1 использовал %2 %1 użył %2 %1 utilise %2 %1 használta a %2-t %1 ha usato %2 + %1 usou %2 %1 has given an IV %1 has puesto una IV - %1 провел переливание + %1 провёл переливание + %1 hat eine Infusion verabreicht %1 podał IV %1 a administré une IV %1 infúziót adott %1 ha somministrato una IV + %1 aplicou um intravenoso %1 applied a tourniquet %1 aplicado torniquete %1 наложил жгут + %1 hat einen Tourniquet angelegt %1 założył stazę %1 a appliqué un garrot %1 felhelyezett egy érszorítót %1 ha applicato un laccio emostatico + %1 aplicou um torniquete Heavily wounded @@ -1635,5 +1991,272 @@ Aberración cromática Aberration chromatique + + Scrape + Kratzer + Scorticatura + Ссадина + Eraflure + Draśnięcie + + + Minor Scrape + Kleiner Kratzer + Minima Scorticatura + Малая ссадина + Eraflure Mineure + Pomniejsze draśnięcie + + + Medium Scrape + Mittlerer Kratzer + Media Scorticatura + Средняя ссадина + Moyenne Eraflure + Średnie draśnięcie + + + Large Scrape + Großer Kratzer + Alta Scorticatura + Большая ссадина + Large Eraflure + Duże draśnięcie + + + Avulsion + Avulsion + Avulsione + Рваная рана + Avulsion + Rana płatowa + + + Minor Avulsion + Kleine Avulsion + Minima Avulsione + Малая рваная рана + Avulsion Mineure + Pomniejsza rana płatowa + + + Medium Avulsion + Mittlere Avulsion + Media Avulsione + Средняя рваная рана + Avulsion Moyenne + Średnia rana płatowa + + + Large Avulsion + Große Avulsion + Alta Avulsione + Большая рваная рана + Large Avulsion + Duża rana płatowa + + + Bruise + Prellung + Contusione + Ушиб + Hématome + Stłuczenie + + + Minor Bruise + Kleine Prellung + Minima Contusione + Малый ушиб + Hématome Mineur + Pomniejsze stłuczenie + + + Medium Bruise + Mittlere Prellung + Media Contusione + Средний ушиб + Hématome Moyen + Średnie stłuczenie + + + Large Bruise + Große Prellung + Alta Contusione + Большой ушиб + Large Hématome + Duże stłuczenie + + + Crushed tissue + Quetschverletzung + Tessuto Schiacciato + Компресионная травма + Tissu écrasé + Zgniecienie tkanek miękkich + + + Minor crushed tissue + Kleine Quetschverletzung + Minimo Tessuto Schiacciato + Малая компрессионная травма + Tissu écrasé Mineur + Pomniejsze zgniecienie tkanek miękkich + + + Medium crushed tissue + Mittlere Quetschverletzung + Medio Tessuto Schiacciato + Средняя компрессионная травма + Tissu écrasé Moyen + Średnie zgniecienie tkanek miękkich + + + Large crushed tissue + Große Quetschverletzung + Alto Tessuto Schiacciato + Большая компрессионная травма + Tissu écrasé Large + Duże zgniecienie tkanek miękkich + + + Cut + Schnittwunde + Taglio + Резаная рана + Coupure + Rana cięta + + + Small Cut + Kleine Schnittwunde + Piccolo Taglio + Малая резаная рана + Pomniejsza rana cięta + Petite Coupure + + + Medium Cut + Mittlere Schnittwunde + Medio Taglio + Средняя резаная рана + Średnia rana cięta + Moyenne Coupure + + + Large Cut + Große Schnittwunde + Grande Taglio + Большая резаная рана + Duża rana cięta + Large Coupure + + + Tear + Riss + Strappo + Рваная рана + Rozerwanie skóry + Déchirure + + + Small Tear + Kleiner Riss + Piccolo Strappo + Малая рваная рана + Pomniejsze rozerwanie skóry + Petite Déchirure + + + Medium Tear + Mittlerer Riss + Medio Strappo + Средняя рваная рана + Średnie rozerwanie skóry + Moyenne Déchirure + + + Large Tear + Großer Riss + Grande Strappo + Большая рваная рана + Duże rozerwanie skóry + Large Déchirure + + + Velocity Wound + Ballistisches Trauma + Velocità Ferita + Огнестрельная рана + Rana postrzałowa + Blessure de vélocité + + + Smal Velocity Wound + Kleines Ballistisches Trauma + Lenta Velocità Ferita + Малая огнестрельная рана + Pomniejsza rana postrzałowa + Petite Bessure de vélocité + + + Medium Velocity Wound + Mittleres Ballistisches Trauma + Media Velocità Ferita + Средняя огнестрельная рана + Średnia rana postrzałowa + Moyenne Blessure de vélocité + + + Large Velocity Wound + Großes Ballistisches Trauma + Alta Velocità Ferita + Большая огнестрельная рана + Duża rana postrzałowa + Large Blessure de vélocité + + + Puncture Wound + Stichwunde + Puntura Ferita + Колотая рана + Rana kłuta + Blessure de perforation + + + Minor Puncture Wound + Kleine Stichwunde + Piccola Puntura Ferita + Малая колотая рана + Pomniejsza rana kłuta + Blessure de perforation Mineure + + + Medium Puncture Wound + Mittlere Stichwunde + Media Puntura Ferita + Средняя колотая рана + Średnia rana kłuta + Blessure de perforation Moyenne + + + Large Puncture Wound + Große Stichwunde + Grande Puntura Ferita + Большая колотая рана + Duża rana kłuta + Large Blessure de perforation + + + Broken Femur + Gebrochener Oberschenkelknochen + Femore Rotto + Перелом + Zkłamana kość udowa + Femur Cassé + + + Treating... + - \ No newline at end of file + diff --git a/addons/medical/ui/RscTitles.hpp b/addons/medical/ui/RscTitles.hpp index 1962daec80..dece0e0a8d 100644 --- a/addons/medical/ui/RscTitles.hpp +++ b/addons/medical/ui/RscTitles.hpp @@ -60,7 +60,7 @@ class Rsctitles { font = "PuristaMedium"; colorText[] = {0.95, 0.95, 0.95, 0.75}; colorBackground[] = {"(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])","(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])","(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", "(profilenamespace getvariable ['GUI_BCG_RGB_A',0.9])"}; - text = "INJURIES"; + text = "$STR_ACE_Medical_Injuries"; }; class InjuryList: ACE_gui_listBoxBase { idc = 200; diff --git a/addons/medical/ui/icons/medical_crossRed.paa b/addons/medical/ui/icons/medical_crossRed.paa new file mode 100644 index 0000000000..5a0c8e9f9c Binary files /dev/null and b/addons/medical/ui/icons/medical_crossRed.paa differ diff --git a/addons/medical/ui/icons/medical_crossYellow.paa b/addons/medical/ui/icons/medical_crossYellow.paa new file mode 100644 index 0000000000..74ddefd837 Binary files /dev/null and b/addons/medical/ui/icons/medical_crossYellow.paa differ diff --git a/addons/medical/ui/triagecard.hpp b/addons/medical/ui/triagecard.hpp index f1b98f1e2d..a93440d13a 100644 --- a/addons/medical/ui/triagecard.hpp +++ b/addons/medical/ui/triagecard.hpp @@ -49,7 +49,7 @@ class GVAR(triageCard) { font = "PuristaMedium"; colorText[] = {0,0,0,1}; colorBackground[] = {0,0,0,0}; - text = "TRIAGE CARD"; + text = "$STR_ACE_MEDICAL_ACTIONS_TriageCard"; }; class TriageList: ACE_gui_listBoxBase { idc = 200; diff --git a/addons/microdagr/stringtable.xml b/addons/microdagr/stringtable.xml index 91d83646b4..f9ca634fd2 100644 --- a/addons/microdagr/stringtable.xml +++ b/addons/microdagr/stringtable.xml @@ -11,6 +11,7 @@ MicroDAGR GPS MicroDAGR GPS MicroDAGR GPS + GPS MicroDAGR MicroDAGR advanced GPS receiver @@ -22,6 +23,7 @@ MicroDAGR pokročílá GPS příjímač MicroDAGR fejlett GPS vevőegység MicroDAGR ricevitore GPS avanzato + Recepitor GPS avançado MicroDAGR Angular Unit: @@ -33,6 +35,7 @@ Úhlová jednotka: Szögmértékegység: Unità angolare: + Unidade Angular: Mils @@ -44,6 +47,7 @@ Mils Mil Miglia + Mils: Show Waypoints On Map: @@ -55,6 +59,7 @@ Ukázat waypointy na mapě: Útvonalpontok mutatása a térképen: Mostra waypoint sulla mappa: + Mostrar Waypoints no mapa: Degrees @@ -66,6 +71,7 @@ Stupně Fok Gradi + Graus On @@ -101,6 +107,7 @@ Napiš souřadnice: Add meg a rácskoordinátákat: Introduci griglia coordinate: + Digite as Ccords. do Grid Name of [%1] @@ -112,6 +119,7 @@ Název [%1] [%1] neve Nome di [%1] + Nome do [%1] MGRS-New @@ -123,6 +131,7 @@ MGRS-Nový MGRS-új Nuovo MGRS + MGRS-Novo WGD @@ -134,17 +143,19 @@ WGD WGD WGD + WGD Range: Distancia: - Reichweite: + Distanz: Дистанция: Dystans: Distance: Vzdálenost: Távolság: Distanza: + Distância: Compass Direction @@ -156,6 +167,7 @@ Azimut: Irányszög Azimut + Direção na bússula Mark @@ -167,6 +179,7 @@ Označit Jelölés Marca + Marca Waypoints @@ -178,6 +191,7 @@ Point de passage Útvonalpontok waypoints + Waypoints Connect To @@ -189,6 +203,7 @@ Connecter Csatlakozás Collega a + Conectar à Settings @@ -200,6 +215,7 @@ Ustawienia Beállítások Impostaizoni + Opções SetWP @@ -211,6 +227,7 @@ Définir point de passage UP Beállítása Definisci WayPoints + Definir WP Add @@ -222,6 +239,7 @@ Ajouter Hozzáadás Aggiungi + Adicionar Delete @@ -236,7 +254,7 @@ Toggle MicroDAGR Display Mode - MicoDAGR Anzeigemodus Wechseln + MicoDAGR Anzeigemodus wechseln Conmutar modo de pantalla del MicroDAGR Сменить режим показа MicroDAGR Przełącz GUI MicroDAGR @@ -244,6 +262,7 @@ Přepnout zobrazení MircroDAGRu MicroDAGR kijelzési mód váltása Alterna modalità display MicroDAGR + Alternar Modo de Display do MicroDAGR Show MicoDAGR @@ -255,10 +274,11 @@ Afficher MicroDAGR MicroDAGR mutatása Mostra MicroDAGR + Mostrar MicroDAGR Configure MicroDAGR - MicroDAGR Konfiguriere + Konfiguriere MicroDAGR Configurar MicroDAGR Настроить MicroDAGR Konfigurovat MicroDAGR GPS @@ -266,6 +286,7 @@ Configurer MicroDAGR MicroDAGR konfigurálása ConfiguraMicroDAGR + Configurar MicroDAGR Close MicroDAGR @@ -277,6 +298,7 @@ Fermer MicroDAGR MicroDAGR elrejtése Chiudi MicroDAGR + Fechar MicroDAGR diff --git a/addons/missileguidance/stringtable.xml b/addons/missileguidance/stringtable.xml index 59a80df0dc..00ada46a41 100644 --- a/addons/missileguidance/stringtable.xml +++ b/addons/missileguidance/stringtable.xml @@ -1,5 +1,4 @@  - @@ -18,6 +17,10 @@ Advanced missile guidance, or AMG, provides multiple enhancements to missile locking and firing. It is also a framework required for missile weapon types. Zaawansowane namierzanie rakiet, lub ZNR, dostarcza wiele poprawek do systemu namierzania rakiet oraz dodaje nowe tryby strzału. Jest to wymagana opcja dla broni rakietowych. Guía de misiles avanzada, o AMG en sus siglas en inglés, ofrece múltiples mejoras en el fijado y disparo de misiles. Es también un framework requerido para armas de tipo misil. + Guida dei missili avanzata, o AMG, offre diversi miglioramenti alla teleguida di missili. E' anche un sistema necessario per i tipi di armi missile. + Продвинутое наведение ракет, или ПНР, обеспечивает множество усовершествований для наведения и стрельбы ракет. Также, это система, необходимая для всех ракетных типов оружия. + Das Erweiterte Raketenlenksystem, auch AMG genannt, bietet viele Verbesserungen zum Aufschalten und Feuern mittels gelenkten Raketen. + Le guidage avancé de missile, ou AMG en anglais, apporte de multiple améliorations au verouillage et au tir de missiles. C'est aussi un framework requis pour tout arme de type missile. Hydra-70 DAGR Missile @@ -46,7 +49,7 @@ Hydra-70 DAGR Laser Guided Missile - Missile à guidage Hydra-70 DAGR + Missile à guidage laser Hydra-70 DAGR Laserowo naprowadzana rakieta Hydra-70 DAGR Hydra-70 DAGR lasergelenkte Rakete Hydra-70 DAGR laserem naváděná střela diff --git a/addons/mk6mortar/$PBOPREFIX$ b/addons/mk6mortar/$PBOPREFIX$ new file mode 100644 index 0000000000..a21eaf95f0 --- /dev/null +++ b/addons/mk6mortar/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\Addons\mk6mortar \ No newline at end of file diff --git a/addons/mk6mortar/CfgEventHandlers.hpp b/addons/mk6mortar/CfgEventHandlers.hpp new file mode 100644 index 0000000000..34c6ecc22c --- /dev/null +++ b/addons/mk6mortar/CfgEventHandlers.hpp @@ -0,0 +1,17 @@ +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; +class Extended_PostInit_EventHandlers { + class ADDON { + clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); + }; +}; +class Extended_FiredBIS_EventHandlers { + class Mortar_01_base_F { + class ADDON { + firedBIS = QUOTE(_this call FUNC(handleFired)); + }; + }; +}; diff --git a/addons/mk6mortar/CfgVehicles.hpp b/addons/mk6mortar/CfgVehicles.hpp new file mode 100644 index 0000000000..1c90842d5f --- /dev/null +++ b/addons/mk6mortar/CfgVehicles.hpp @@ -0,0 +1,83 @@ +class CfgVehicles { + class Man; + class CAManBase: Man { + class ACE_SelfActions { + class ACE_Equipment { + class GVAR(rangetable) { + displayName = "$STR_ACE_MK6MORTAR_rangetable_action"; + condition = QUOTE(_this call FUNC(rangeTableCanUse)); + statement = QUOTE(_this call FUNC(rangeTableOpen)); + priority = 0; + icon = QUOTE(PATHTOF(UI\icon_rangeTable.paa)); + exceptions[] = {"notOnMap", "isNotInside"}; + }; + }; + }; + }; + + class LandVehicle; + class StaticWeapon: LandVehicle { + class Turrets { + class MainTurret; + }; + }; + class StaticMortar: StaticWeapon { + class Turrets: Turrets { + class MainTurret: MainTurret { + }; + }; + }; + class Mortar_01_base_F: StaticMortar { + class Turrets: Turrets { + class MainTurret: MainTurret { + turretInfoType = "ACE_Mk6_RscWeaponRangeArtillery"; + }; + }; + class ACE_SelfActions { + class GVAR(toggleMils) { + displayName = "Toggle MILS"; + condition = QUOTE(true); + statement = QUOTE(_this call FUNC(toggleMils)); + exceptions[] = {}; + }; + }; + }; + + class Logic; + class Module_F: Logic { + class ModuleDescription {}; + }; + class GVAR(module): Module_F { + author = "$STR_ACE_Common_ACETeam"; + category = "ACE"; + displayName = "MK6 Settings"; + function = QFUNC(moduleInit); + scope = 2; + isGlobal = 0; + icon = QUOTE(PATHTOF(UI\Icon_Module_mk6_ca.paa)); + functionPriority = 0; + class Arguments { + class airResistanceEnabled { + displayName = "Air Resitance"; + description = "For Player Shots, Model Air Restiance and Wind Effects"; + typeName = "BOOL"; + defaultValue = 1; + }; + class allowComputerRangefinder { + displayName = "Allow MK6 Computer"; + description = "Show the Computer and Rangefinder (these NEED to be removed if you enable air resistance)"; + typeName = "BOOL"; + defaultValue = 0; + }; + class allowCompass { + displayName = "Allow MK6 Compass"; + description = "Show the MK6 Digital Compass"; + typeName = "BOOL"; + defaultValue = 1; + }; + }; + class ModuleDescription: ModuleDescription { + description = ""; + }; + }; +}; diff --git a/addons/mk6mortar/CfgWeapons.hpp b/addons/mk6mortar/CfgWeapons.hpp new file mode 100644 index 0000000000..7d5153e9ad --- /dev/null +++ b/addons/mk6mortar/CfgWeapons.hpp @@ -0,0 +1,15 @@ +class CfgWeapons { + class ACE_ItemCore; + class InventoryItem_Base_F; + + class ACE_RangeTable_82mm: ACE_ItemCore { + author = "$STR_ACE_Common_ACETeam"; + scope = 2; + displayName = "$STR_ACE_MK6MORTAR_rangetable_name"; + descriptionShort = "$STR_ACE_MK6MORTAR_rangetable_description"; + picture = QUOTE(PATHTOF(UI\icon_rangeTable.paa)); + class ItemInfo: InventoryItem_Base_F { + mass = 0.5; + }; + }; +}; diff --git a/addons/mk6mortar/README.md b/addons/mk6mortar/README.md new file mode 100644 index 0000000000..84c7a6e984 --- /dev/null +++ b/addons/mk6mortar/README.md @@ -0,0 +1,10 @@ +ace_mk6mortar +========== + +Tweaks the mk6 mortar from Arma3 + +## Maintainers + +The people responsible for merging changes to this component or answering potential questions. + +- [PabstMirror](https://github.com/PabstMirror) diff --git a/addons/mk6mortar/RscInGameUI.hpp b/addons/mk6mortar/RscInGameUI.hpp new file mode 100644 index 0000000000..102362216a --- /dev/null +++ b/addons/mk6mortar/RscInGameUI.hpp @@ -0,0 +1,44 @@ +class RscInGameUI { + class RscWeaponRangeArtillery { + class CA_IGUI_elements_group: RscControlsGroup {}; + }; + class ACE_Mk6_RscWeaponRangeArtillery: RscWeaponRangeArtillery { + onLoad = QUOTE(uiNamespace setVariable [ARR_2('ACE_Mk6_RscWeaponRangeArtillery',(_this select 0))]; _this call FUNC(turretDisplayLoaded);); + controls[] = {"ACE_MILS_GROUP", "CA_IGUI_elements_group","CA_RangeElements_group"}; + class ACE_MILS_GROUP: CA_IGUI_elements_group { + idc = 80170; + class controls { + class CA_Heading_MILS: RscText { + idc = 80156; + style = 2; + colorText[] = {0.706,0.0745,0.0196,1}; + sizeEx = "0.028*SafezoneH"; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "015"; + x = "25.0 * (0.01875 * SafezoneH)"; + y = "6.3 * (0.025 * SafezoneH)"; + w = "3.3333 * (0.01875 * SafezoneH)"; + h = "1 * (0.025 * SafezoneH)"; + }; + class CA_Elev_MILS: RscText { + idc = 80175; + style = 1; + sizeEx = "0.038*SafezoneH"; + colorText[] = {0.706,0.0745,0.0196,1}; + shadow = 0; + font = "EtelkaMonospacePro"; + text = "80.5"; + x = "36.8 * (0.01875 * SafezoneH)"; + y = "29.3 * (0.025 * SafezoneH)"; + w = "5.2 * (0.01875 * SafezoneH)"; + h = "1.2 * (0.025 * SafezoneH)"; + }; + class CA_Elev_Need_MILS: CA_Elev_MILS { + idc = 80176; + y = "30.8 * (0.025 * SafezoneH)"; + }; + }; + }; + }; +}; diff --git a/addons/mk6mortar/RscRangeTable.hpp b/addons/mk6mortar/RscRangeTable.hpp new file mode 100644 index 0000000000..6bf0e51619 --- /dev/null +++ b/addons/mk6mortar/RscRangeTable.hpp @@ -0,0 +1,87 @@ +class ACE_82mm_RangeTable_Dialog { + idd = -1; + movingEnable = 1; + onLoad = "uiNamespace setVariable ['ACE_82mm_RangeTable_Dialog', _this select 0];"; + objects[] = {}; + + class ControlsBackground { + class TableBackground: RscPicture { + idc = -1; + text = QUOTE(PATHTOF(UI\RangeTable_background.paa)); + x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "16.2634559672906 * (safeZoneH / 40)"; + h = "23 * ((safeZoneH / 1.2) / 25)"; + colorBackground[] = {1,1,1,1}; + }; + class ChargeBackground: RscText { + idc = -1; + x = "14 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "4 * (safeZoneH / 40)"; + h = "5 * ((safeZoneH / 1.2) / 25)"; + colorBackground[] = {0,0,0,1}; + }; + }; + class controls { + class TheTable: RscListNBox { + idc = 20001; + // style = ST_CENTER + ST_MULTI + LB_TEXTURES; + // style = ST_LEFT + ST_MULTI + LB_TEXTURES; + // style = LB_MULTI + ST_LEFT; // Style + x = "18 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "3.76 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "16.2634559672906 * (safeZoneH / 40)"; + h = "20.24 * ((safeZoneH / 1.2) / 25)"; + columns[] = {(10/867),(86/867),(171/867),(238/867),(320/867),(405/867), + (485/867),(546/867),(607/867),(668/867),(729/867),(790/867)}; + rowHeight = 0.015 * safeZoneH; + sizeEx = "0.014 * safeZoneH"; + font = "EtelkaMonospacePro"; + drawSideArrows = 1; + idcLeft = 14124; + idcRight = 412343243; + colorText[] = {0, 0, 0, 1}; + shadow = "0"; + // colorBorder[] = {1,0,0,1}; + // colorBackground[] = {1, 0, 0, 1}; + colorSelectBackground[] = {0, 0, 0, 0.025}; + colorSelectBackground2[] = {0, 0, 0, 0.025}; + colorScrollbar[] = {0.95,0,0.95,1}; + class ListScrollBar: ScrollBar{ + color[] = {0,0,0,0.6}; + }; + }; + class ChargeListBox: RscListbox { + idc = 1501; + style = ST_RIGHT; + x = "14 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "4 * (safeZoneH / 40)"; + h = "5 * ((safeZoneH / 1.2) / 25)"; + onLBSelChanged = QUOTE(_this call FUNC(rangeTablePageChange)); + }; + class CloseBackground: RscText { + idc = -1; + x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "0.5 * (safeZoneH / 40)"; + h = "0.5 * ((safeZoneH / 1.2) / 25)"; + colorBackground[] = {0,0,0,0.5}; + }; + class CloseActiveText: RscActiveText { + idc = -1; + style = 48; + color[] = {1,1,1,0.7}; + text = "A3\Ui_f\data\GUI\Rsc\RscDisplayArcadeMap\icon_exit_cross_ca.paa"; + x = "33.7634559672906 *(safeZoneH / 40) + (safezoneX + (safezoneW - safeZoneH)/2)"; + y = "1 * ((safeZoneH / 1.2) / 25) + (safezoneY + (safezoneH - (safeZoneH / 1.2))/2)"; + w = "0.5 * (safeZoneH / 40)"; + h = "0.5 * ((safeZoneH / 1.2) / 25)"; + colorText[] = {1,1,1,0.7}; + colorActive[] = {1,1,1,1}; + tooltip = "Close"; + onButtonClick = "closeDialog 0"; + }; + }; +}; diff --git a/addons/mk6mortar/UI/Icon_Module_mk6_ca.paa b/addons/mk6mortar/UI/Icon_Module_mk6_ca.paa new file mode 100644 index 0000000000..8abfb4bdd3 Binary files /dev/null and b/addons/mk6mortar/UI/Icon_Module_mk6_ca.paa differ diff --git a/addons/mk6mortar/UI/RangeTable_background.paa b/addons/mk6mortar/UI/RangeTable_background.paa new file mode 100644 index 0000000000..bf4b5ee044 Binary files /dev/null and b/addons/mk6mortar/UI/RangeTable_background.paa differ diff --git a/addons/mk6mortar/UI/icon_rangeTable.paa b/addons/mk6mortar/UI/icon_rangeTable.paa new file mode 100644 index 0000000000..9273b849d7 Binary files /dev/null and b/addons/mk6mortar/UI/icon_rangeTable.paa differ diff --git a/addons/mk6mortar/UI/ui_charges.paa b/addons/mk6mortar/UI/ui_charges.paa new file mode 100644 index 0000000000..7041c654e0 Binary files /dev/null and b/addons/mk6mortar/UI/ui_charges.paa differ diff --git a/addons/mk6mortar/XEH_clientInit.sqf b/addons/mk6mortar/XEH_clientInit.sqf new file mode 100644 index 0000000000..973772c96a --- /dev/null +++ b/addons/mk6mortar/XEH_clientInit.sqf @@ -0,0 +1,5 @@ +#include "script_component.hpp" + +if (!hasInterface) exitWith {}; + +["playerVehicleChanged", {_this call FUNC(handlePlayerVehicleChanged);}] call EFUNC(common,addEventHandler); diff --git a/addons/mk6mortar/XEH_preInit.sqf b/addons/mk6mortar/XEH_preInit.sqf new file mode 100644 index 0000000000..9af89ccb35 --- /dev/null +++ b/addons/mk6mortar/XEH_preInit.sqf @@ -0,0 +1,21 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(dev_buildTable); +PREP(dev_formatNumber); +PREP(dev_simulateCalcRangeTableLine); +PREP(dev_simulateFindSolution); +PREP(dev_simulateShot); + +PREP(handleFired); +PREP(handlePlayerVehicleChanged); +PREP(moduleInit); +PREP(rangeTableCanUse); +PREP(rangeTableOpen); +PREP(rangeTablePageChange); +PREP(rangeTablePreCalculatedValues); +PREP(toggleMils); +PREP(turretDisplayLoaded); + +ADDON = true; diff --git a/addons/mk6mortar/config.cpp b/addons/mk6mortar/config.cpp new file mode 100644 index 0000000000..6751cea5fb --- /dev/null +++ b/addons/mk6mortar/config.cpp @@ -0,0 +1,47 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {"ACE_RangeTable_82mm"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_interaction"}; + author[] = {"PabstMirror"}; + authorUrl = "https://github.com/acemod"; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgVehicles.hpp" +#include "CfgWeapons.hpp" + +class RscText; +class RscListbox; +class RscListNBox; +class RscPicture; +class RscControlsGroup; +class ScrollBar; +class RscActiveText; + +#include "RscInGameUI.hpp" +#include "RscRangeTable.hpp" + +class ACE_Settings { + //These settings effect gameplay difficutly: defaults will leave the mortar the same as vanilla + class GVAR(airResistanceEnabled) { + value = 0; + typeName = "BOOL"; + isClientSetable = 0; + }; + class GVAR(allowComputerRangefinder) { + value = 1; + typeName = "BOOL"; + isClientSetable = 0; + }; + class GVAR(allowCompass) { + value = 1; + typeName = "BOOL"; + isClientSetable = 0; + }; +}; diff --git a/addons/mk6mortar/functions/fnc_dev_buildTable.sqf b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf new file mode 100644 index 0000000000..7a60e91e68 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_buildTable.sqf @@ -0,0 +1,87 @@ +/* + * Author: PabstMirror + * DEV function to build mortar tables, very cpu intensive (never used durring normal gameplay) + * + * Arguments: + * 0: Muzzle Velocity + * 1: Air Friction + * + * Return Value: + * + * + * Example: + * [100, -0.0001] spawn ace_mk6mortar_fnc_dev_buildTable; //spawn (scheduled) is slower + * [100, -0.0001] call ace_mk6mortar_fnc_dev_buildTable; //faster, but will lock while processing + * + * Public: No + */ +#include "script_component.hpp" + + +private ["_muzzleVelocity", "_airFriction", "_stillInRange", "_currentRange", "_increasePerRow", "_outputArray", "_rangeToHit", "_lineElevation", "_lineHeightElevation", "_lineTimeOfFlight", "_lineCrosswindDeg", "_lineHeadwindMeters", "_lineTailWindMeters", "_lineTempDec", "_lineTempInc", "_lineAirDensDec", "_lineAirDensInc", "_result", "_outputString"]; + +_muzzleVelocity = _this select 0; +_airFriction = _this select 1; +_stillInRange = true; +_currentRange = 100; +_increasePerRow = 50; +_outputArray = []; + + +//[_rangeToHit, _lineElevation, _lineHeightElevation, _lineHeightTimeDelta, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] + +while {_stillInRange} do { + _result = [_muzzleVelocity, _currentRange, _airFriction] call FUNC(dev_simulateCalcRangeTableLine); + if (_result isEqualTo []) then { + _stillInRange = false; + } else { + if (_airFriction == 0) then { + _result set [4, 0]; + _result set [5, 0]; + _result set [6, 0]; + _result set [7, 0]; + _result set [8, 0]; + _result set [9, 0]; + _result set [10, 0]; + }; + if ((_result select 1) < 88) then { + _outputArray pushBack [ + ([(_result select 0), "meters", false] call FUNC(dev_formatNumber)), + ([(_result select 1), "mil", true] call FUNC(dev_formatNumber)), + ([(_result select 2), "mil", true] call FUNC(dev_formatNumber)), + ([(_result select 3), "sec", false] call FUNC(dev_formatNumber)), + ([(_result select 4), "sec", false] call FUNC(dev_formatNumber)), + ([(_result select 5), "milPrecise", true] call FUNC(dev_formatNumber)), + ([(_result select 6), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 7), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 8), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 9), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 10), "metersprecise", false] call FUNC(dev_formatNumber)), + ([(_result select 11), "metersprecise", false] call FUNC(dev_formatNumber)) + ]; + }; + _currentRange = _currentRange + _increasePerRow; + }; + hintSilent str _currentRange; +}; + +//handle floating point rounding errors +_outputString = format ["case ((abs(_muzzleVelocity - %1) < 0.00001) && {(abs(_airFriction - %2) < 0.00001)}): { +[ +", _muzzleVelocity, _airFriction]; + +{ + if (_forEachIndex < ((count _outputArray) - 1)) then { + _outputString = _outputString + format ["%1, + ", _x]; + } else { + _outputString = _outputString + format ["%1 + ] + };", _x]; + }; +} forEach _outputArray; + +copyToClipboard _outputString; +rangeTableOutput = _outputString; + +hint "done"; \ No newline at end of file diff --git a/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf new file mode 100644 index 0000000000..f89c3a1b8f --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_formatNumber.sqf @@ -0,0 +1,80 @@ +/* +Author: Pabst Mirror + +Description: +Converts numbers into nicely formated strings. + +Parameters: +0: NUMBER - Input number +1: STRING - Output type (see case statement) +2: BOOL - If output type is mil, convert input type from deg->mil + +Returns: +STRING - Formatted number + +Example: +[45, "mil4", true] call ace_mk6mortar_fnc_dev_formatNumber = "0800" + */ +#include "script_component.hpp" + +private ["_theNumber", "_inputType", "_convertToMils", "_decimalPlaces", "_integerPlaces", "_prefix", "_return"]; + +_theNumber = _this select 0; +_inputType = _this select 1; +_convertToMils = _this select 2; + +_decimalPlaces = -1; +_integerPlaces = -1; + +switch (toLower _inputType) do { +case ("meters"): { + _decimalPlaces = 0; + _integerPlaces = 1; + }; +case ("metersprecise"): { + _decimalPlaces = 1; + _integerPlaces = 1; + }; +case ("meters4"): { + _decimalPlaces = 0; + _integerPlaces = 4; + }; +case ("deg3precise"): { + _decimalPlaces = 2; + _integerPlaces = 3; + }; +case ("mil"): { + _decimalPlaces = 0; + _integerPlaces = 1; + if (_convertToMils) then { + _theNumber = _theNumber * (6400 / 360); + }; + }; +case ("mil4"): { + _decimalPlaces = 0; + _integerPlaces = 4; + if (_convertToMils) then { + _theNumber = _theNumber * (6400 / 360); + }; + }; +case ("milprecise"): { + _decimalPlaces = 1; + _integerPlaces = 1; + if (_convertToMils) then { + _theNumber = _theNumber * (6400 / 360); + }; + }; +case ("sec"): { + _decimalPlaces = 1; + _integerPlaces = 1; + }; + default {systemChat format ["badtype %1", _inputType];}; +}; + +//CBA_fnc_formatNumber is silly: [-9.58545, 1, 1, false] call CBA_fnc_formatNumber == "-9.-6" + +_prefix = if (_theNumber < 0) then {"-"} else {""}; + +_return = [abs (_theNumber), _integerPlaces, _decimalPlaces, false] call CBA_fnc_formatNumber; + +(_prefix + _return) diff --git a/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf new file mode 100644 index 0000000000..d1e0a8dd05 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_simulateCalcRangeTableLine.sqf @@ -0,0 +1,79 @@ +/* +Author: Pabst Mirror + +Description: +Builds a rangeTable line for a certian range, given muzzle velocity and air friction, returns [] if out of range. + +Parameters: +0: NUMBER - Muzzle Velocity +1: NUMBER - Air Friction +2: NUMBER - Range To Hit + +Returns: +ARRAY - Range Table Line Data (see return line) + +Example: +[300, -0.0001, 3000] call ace_mk6mortar_fnc_simulateCalcRangeTableLine + */ +#include "script_component.hpp" + +#define TIME_STEP (1/50) + +private ["_startTime", "_muzzleVelocity", "_rangeToHit", "_airFriction", "_vacElevation", "_radicand", "_maxElev", "_minElev", "_error", "_solutionElevation", "_lastTestResult", "_numberOfAttempts", "_lineElevation", "_lineTimeOfFlight", "_lineHeightElevation", "_lineHeightTimeDelta", "_lineCrosswindDeg", "_lineHeadwindMeters", "_lineTailWindMeters", "_result"]; + +_startTime = diag_tickTime; + +_muzzleVelocity = _this select 0; +_rangeToHit = _this select 1; +_airFriction = _this select 2; + +//Run Binary search for correct elevation +_solution = [_rangeToHit, 0, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(dev_simulateFindSolution); +if (_solution isEqualTo []) exitWith {[]}; + +//Real Elevation +_lineElevation = _solution select 0; + +//Time Of Flight: +_lineTimeOfFlight = _solution select 1; + +//Height Adjustment for -100m (another binary search) +_solution = [_rangeToHit, -100, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(dev_simulateFindSolution); +if (_solution isEqualTo []) exitWith {[]};//should never be triggered (lower elevation easier to hit) + +_lineHeightElevation = ((_solution select 0) - _lineElevation); +_lineHeightTimeDelta = (_solution select 1) - _lineTimeOfFlight; + +//Compute for 10x and divide to minimize rounding errors + +//Crosswind +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1, 0, 10, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineCrosswindDeg = (_lastTestResult select 2) / 10; + +//Headwind: +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1, -10, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineHeadwindMeters = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//TailWind: +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1, 10, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineTailWindMeters = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//Air Temp Dec +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, (15 - 10), 1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineTempDec = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//Air Temp Inc +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, (15 + 10), 1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineTempInc = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//Air Density Dec +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 0.9, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineAirDensDec = (_rangeToHit - (_lastTestResult select 0)) / 10; + +//Air Density Inc +_lastTestResult = [_lineElevation, _muzzleVelocity, _airFriction, 15, 1.1, 0, 0, 0, TIME_STEP] call FUNC(dev_simulateShot); +_lineAirDensInc = (_rangeToHit - (_lastTestResult select 0)) / 10; + +// systemChat format ["debug: Range %1 - in %2 sec", _rangeToHit, (diag_tickTime - _startTime)]; + +[_rangeToHit, _lineElevation, _lineHeightElevation, _lineHeightTimeDelta, _lineTimeOfFlight, _lineCrosswindDeg, _lineHeadwindMeters, _lineTailWindMeters, _lineTempDec, _lineTempInc, _lineAirDensDec, _lineAirDensInc] diff --git a/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf new file mode 100644 index 0000000000..a45c415b40 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_simulateFindSolution.sqf @@ -0,0 +1,55 @@ +/* + * Author: PabstMirror + * DEV to find a firing solution for a given range + * + * Arguments: + * 0: Range to Hit (Meters) + * 1: Height To Hit (Meters) + * 2: Muzzle Velocity (M/S) + * 3: Air Friction + * 4: Time Step (seconds) (eg 1/50 will simulate 50 cycles per second) + * + * Return Value: + * ARRAY - [NUMBER - Elevation In Degrees, NUMBER - Shot Durration] + * + * Example: + * [_rangeToHit, _heightToHit, _muzzleVelocity, _airFriction, TIME_STEP] call FUNC(simulateFindSolution); + * + * Public: No + */ +#include "script_component.hpp" + +private ["_rangeToHit", "_heightToHit", "_muzzleVelocity", "_airFriction", "_maxElev", "_minElev", "_error", "_solutionElevation", "_lastTestResult", "_numberOfAttempts"]; + +#define MAX_ATTEMPTS 22 + +_rangeToHit = _this select 0; +_heightToHit = _this select 1; +_muzzleVelocity = _this select 2; +_airFriction = _this select 3; +_timeStep = _this select 4; + +_maxElev = 90; +_minElev = 45; //todo - Low Angle Howitzers??? + +_error = 10000; +_solutionElevation = -1; +_lastTestResult = []; +_numberOfAttempts = 0; + +//(binary search) +while {(_numberOfAttempts < MAX_ATTEMPTS) && {(abs _error) > 0.2}} do { + _numberOfAttempts = _numberOfAttempts + 1; + _solutionElevation = (_maxElev + _minElev) / 2; + _lastTestResult = [_solutionElevation, _muzzleVelocity, _airFriction, 15, 1, 0, 0, _heightToHit, _timeStep] call FUNC(dev_simulateShot); + _error = _rangeToHit - (_lastTestResult select 0); + if (_error > 0) then { + _maxElev = _solutionElevation; //test range was short + } else { + _minElev = _solutionElevation; //test range was long + }; +}; +if (_numberOfAttempts >= MAX_ATTEMPTS) exitWith {[]}; + +//return the elevation and time required +[_solutionElevation, (_lastTestResult select 1)] diff --git a/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf new file mode 100644 index 0000000000..0e53807a6b --- /dev/null +++ b/addons/mk6mortar/functions/fnc_dev_simulateShot.sqf @@ -0,0 +1,73 @@ +/* + * Author: PabstMirror + * DEV function to build mortar tables, very cpu intensive (never used durring normal gameplay) + * + * Arguments: + * 0: Shot Angle (degrees) + * 1: Muzzle Velocity (m/s) + * 2: Air Friction + * 3: Tempeture (degres celcius) + * 4: Relative Air Denisty + * 5: Tail Wind (m/s) + * 6: Cross Wind (m/s) + * 7: Height Of Target (M) + * 8: Time Step (fraction of a second) + * + * Return Value: + * [Distance Traveled, Shot Time, Offset (degrees)] + * + * Example: + * [45, 180, -0.0001, 15, 1, 10, 0, 0, 1/50] call ace_mk6mortar_fnc_dev_simulateShot; + * + * Public: No + */ +#include "script_component.hpp" + +private ["_angleDeg", "_muzzleVelocity", "_airFriction", "_temp", "_relDensity", "_tailWind", "_crosswind", "_heightOfTarget", "_timeStep", "_wind", "_gravity", "_currentPos", "_currentVelocity", "_currentTime", "_lastPos", "_kCoefficent", "_aparentWind", "_changeInVelocity", "_linConversion", "_middlePos", "_middlePosOld", "_middleTotalTravelTime", "_offsetDeg"]; + +_angleDeg = _this select 0; +_muzzleVelocity = _this select 1; +_airFriction = _this select 2; +_temp = _this select 3; +_relDensity = _this select 4; +_tailWind = _this select 5; +_crosswind = _this select 6; +_heightOfTarget = _this select 7; +_timeStep = _this select 8; + +_wind = [_crosswind, _tailWind, 0]; +_gravity = [0,0,-9.8]; + +_currentPos = [0,0,0]; +_muzzleVelocity = _muzzleVelocity * (((_temp + 273.13) / 288.13 - 1) / 40 + 1); +_currentVelocity = [0, (_muzzleVelocity * cos _angleDeg), (_muzzleVelocity * sin _angleDeg)]; + +_currentTime = 0; +_lastPos = _currentPos; + +_kCoefficent = -1 * _relDensity * _airFriction; //save time in the loop and compute once + +while {((_currentVelocity select 2) > 0) || ((_currentPos select 2) >= _heightOfTarget)} do { + _lastPos = _currentPos; + + _aparentWind = _wind vectorDiff _currentVelocity; + _changeInVelocity = _gravity vectorAdd (_aparentWind vectorMultiply ((vectorMagnitude _aparentWind) * _kCoefficent)); + + _currentVelocity = _currentVelocity vectorAdd (_changeInVelocity vectorMultiply _timeStep); + + _currentPos = _currentPos vectorAdd (_currentVelocity vectorMultiply _timeStep); + _currentTime = _currentTime + _timeStep; +}; + +//Uses linearConversion to get a weighted average betwen points before and after dropping below target height +_linConversion = linearConversion [(_lastPos select 2), (_currentPos select 2), _heightOfTarget, 0, 1, true]; +_middlePos = (_lastPos vectorMultiply (1 - _linConversion)) vectorAdd (_currentPos vectorMultiply (_linConversion)); +// _middlePosOld = (_lastPos vectorAdd _currentPos) vectorMultiply 0.5; + +//Same to find travel time +_middleTotalTravelTime = _currentTime - (_timeStep * (1-_linConversion)); + +//Find shot offset (from crosswind), in degrees +_offsetDeg = (_middlePos select 0) aTan2 (_middlePos select 1); + +[(_middlePos select 1), _middleTotalTravelTime, _offsetDeg] diff --git a/addons/mk6mortar/functions/fnc_handleFired.sqf b/addons/mk6mortar/functions/fnc_handleFired.sqf new file mode 100644 index 0000000000..e2b440c520 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_handleFired.sqf @@ -0,0 +1,89 @@ +/* + * Author: PabstMirror + * Called when the mortar is fired. + * + * Arguments: + * 0: mortar - Object the event handler is assigned to + * 1: weapon - Fired weapon + * 2: muzzle - Muzzle that was used + * 3: mode - Current mode of the fired weapon + * 4: ammo - Ammo used + * 5: magazine - magazine name which was used + * 6: projectile - Object of the projectile that was shot + * + * Return Value: + * Nothing + * + * Example: + * [clientFiredBIS-XEH] call ace_mk6mortar_fnc_handleFired + * + * Public: No + */ +#include "script_component.hpp" + +private ["_shooterMan", "_bisAirFriction", "_temperature", "_newMuzzleVelocityCoefficent", "_bulletVelocity", "_bulletSpeed", "_muzzleVelocity", "_muzzleVelocityShift"]; + +disableSerialization; + +PARAMS_7(_vehicle,_weapon,_muzzle,_mode,_ammo,_magazine,_projectile); + +if (!GVAR(airResistanceEnabled)) exitWith {}; +// Large enough distance to not simulate any wind deflection +if (_vehicle distance ACE_player > 8000) exitWith {false}; + +//AI will have no clue how to use: +_shooterMan = gunner _vehicle; +if (!([_shooterMan] call EFUNC(common,isPlayer))) exitWith {false}; + +//Should be zero, just make sure: +_bisAirFriction = getNumber (configFile >> "CfgAmmo" >> _ammo >> "airFriction"); +if (_bisAirFriction != 0) exitWith {ERROR("Non zero base airFriction");}; + + +//Calculate air density: +_altitude = (getPosASL _vehicle) select 2; +#define GET_TEMPERATURE_AT_HEIGHT(h) (EGVAR(weather,currentTemperature) - 0.0065 * (h)) +_temperature = GET_TEMPERATURE_AT_HEIGHT(_altitude); +_pressure = _altitude call EFUNC(weather,calculateBarometricPressure); +_relativeHumidity = EGVAR(weather,currentHumidity); +_airDensity = [_temperature, _pressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity); +_relativeDensity = _airDensity / 1.225; + +TRACE_5("FiredWeather",_temperature,_pressure,_relativeHumidity,_airDensity,_relativeDensity); + +//powder effects: +_newMuzzleVelocityCoefficent = (((_temperature + 273.13) / 288.13 - 1) / 40 + 1); +if (_newMuzzleVelocityCoefficent != 1) then { + _bulletVelocity = velocity _projectile; + _bulletSpeed = vectorMagnitude _bulletVelocity; + _bulletVelocity = (vectorNormalized _bulletVelocity) vectorMultiply (_bulletSpeed * _newMuzzleVelocityCoefficent); + _projectile setVelocity _bulletVelocity; + _muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift; +}; + + +[{ + private ["_deltaT", "_bulletVelocity", "_bulletSpeed", "_trueVelocity", "_trueSpeed", "_dragRef", "_accelRef", "_drag", "_accel"]; + PARAMS_2(_args,_pfID); + EXPLODE_4_PVT(_args,_shell,_airFriction,_time,_relativeDensity); + + if (isNull _shell || {!alive _shell}) exitwith { + [_pfID] call cba_fnc_removePerFrameHandler; + }; + + _deltaT = time - _time; + _args set[2, time]; + + _bulletVelocity = velocity _shell; + _bulletSpeed = vectorMagnitude _bulletVelocity; + + _trueVelocity = _bulletVelocity vectorDiff ACE_wind; + _trueSpeed = vectorMagnitude _trueVelocity; + + _drag = _deltaT * _airFriction * _trueSpeed * _relativeDensity; + _accel = _trueVelocity vectorMultiply (_drag); + _bulletVelocity = _bulletVelocity vectorAdd _accel; + + _shell setVelocity _bulletVelocity; + +}, 0, [_projectile, MK6_82mm_AIR_FRICTION, time, _relativeDensity]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf new file mode 100644 index 0000000000..91657fdbe2 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_handlePlayerVehicleChanged.sqf @@ -0,0 +1,108 @@ +/* + * Author: PabstMirror + * Handles player getting into new vehicle. Loads PFEG for mortar display if it is a mortar. + * + * Arguments: + * 0:Player + * 1: New Vehicle + * + * Return Value: + * No + * + * Example: + * [bob, mortar] call ace_mk6mortar_fnc_handlePlayerVehicleChanged; + * + * Public: No + */ +#include "script_component.hpp" + +private ["_chargeText", "_xPos", "_yPos", "_wPos", "_hPos", "_tubeWeaponName", "_fireModes"]; + +PARAMS_2(_player,_newVehicle); + +if (isNull _newVehicle) exitWith {}; +if (!(_newVehicle isKindOf "Mortar_01_base_F")) exitWith {}; + +_chargeText = (findDisplay 46) ctrlCreate ["RscStructuredText", 80085]; + +_xPos = (profilenamespace getvariable ["IGUI_GRID_WEAPON_X", ((safezoneX + safezoneW) - (12.4 * (((safezoneW / safezoneH) min 1.2) / 40)) - 0.5 * (((safezoneW / safezoneH) min 1.2) / 40))]); +_yPos = 2.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (profilenamespace getvariable ["IGUI_GRID_WEAPON_Y", (safezoneY + 0.5 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))]); +_wPos = 10 * (((safezoneW / safezoneH) min 1.2) / 40); +_hPos = 1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25); + +_chargeText ctrlSetPosition [_xPos, _yPos, _wPos, _hPos]; +_chargeText ctrlCommit 0; + +_tubeWeaponName = (weapons _newVehicle) select 0; +_fireModes = getArray (configFile >> "CfgWeapons" >> _tubeWeaponName >> "modes"); + +[{ + PARAMS_2(_args,_pfID); + EXPLODE_3_PVT(_args,_mortarVeh,_chargeText,_fireModes); + + if ((vehicle ACE_player) != _mortarVeh) then { + [_pfID] call CBA_fnc_removePerFrameHandler; + ctrlDelete _chargeText; + } else { + + _useMils = _mortarVeh getVariable [QGVAR(useMils), true]; + + //Compute: 'charge' from weaponstate + _currentFireMode = (weaponState [_mortarVeh, [0]]) select 2; + _currentChargeMode = _fireModes find _currentFireMode; + + _text = format ["%1: %2 ", (localize "STR_ACE_MK6MORTAR_rangetable_charge"), _currentChargeMode, QUOTE(PATHTOF(UI\ui_charges.paa))]; + _chargeText ctrlSetStructuredText parseText _text; + if (shownArtilleryComputer && {!GVAR(allowComputerRangefinder)}) then { + //Don't like this solution, but it works + closeDialog 0; + [parseText "Computer Disabled"] call EFUNC(common,displayTextStructured); + }; + + _display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; + if (isNull _display) exitWith {}; //It may be null for the first frame + + //Hud should hidden in 3rd person + _notGunnerView = cameraView != "GUNNER"; + + //Update CurrentElevation Display: + if (_notGunnerView) then { + (_display displayCtrl 80175) ctrlSetText ""; + } else { + _elevDeg = parseNumber ctrlText (_display displayCtrl 175); + if (_useMils) then { + (_display displayCtrl 80175) ctrlSetText str round (_elevDeg * 6400 / 360); + } else { + (_display displayCtrl 80175) ctrlSetText str _elevDeg; + }; + }; + + //Update ElevationNeeded Display: + if (_notGunnerView || (!GVAR(allowComputerRangefinder))) then { + (_display displayCtrl 80176) ctrlSetText ""; + } else { + _elevDeg = parseNumber ctrlText (_display displayCtrl 176); + if (_elevDeg <= 0) then { //Bad data means "----" out of range + (_display displayCtrl 80176) ctrlSetText (ctrlText (_display displayCtrl 176)); + } else { + if (_useMils) then { + (_display displayCtrl 80176) ctrlSetText str round (_elevDeg * 6400 / 360); + } else { + (_display displayCtrl 80176) ctrlSetText str _elevDeg; + }; + }; + }; + + //Update Heading Display: + if (_notGunnerView || (!GVAR(allowCompass))) then { + (_display displayCtrl 80156) ctrlSetText ""; + } else { + _rotationDegrees = ((getDir _mortarVeh) + (((-180 / PI) * (_mortarVeh animationPhase "mainTurret")) + 360)) % 360; + if (_useMils) then { + (_display displayCtrl 80156) ctrlSetText str round (_rotationDegrees * 6400 / 360); + } else { + (_display displayCtrl 80156) ctrlSetText (ctrlText (_display displayCtrl 156)); + }; + }; + }; +}, 0, [_newVehicle, _chargeText,_fireModes]] call CBA_fnc_addPerFrameHandler; diff --git a/addons/mk6mortar/functions/fnc_moduleInit.sqf b/addons/mk6mortar/functions/fnc_moduleInit.sqf new file mode 100644 index 0000000000..75bab4cee9 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_moduleInit.sqf @@ -0,0 +1,27 @@ +/* + * Author: PabstMirror + * Loads settings from the module. + * + * Arguments: + * 0: The Module Logic Object + * 1: synced objects + * 2: Activated + * + * Return Value: + * None + * + * Example: + * [fromModule] call ace_mk6mortar_fnc_moduleInit + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_3(_logic,_syncedUnits,_activated); + +if (!_activated) exitWith {WARNING("Module - placed but not active");}; +if (!isServer) exitWith {}; + +[_logic, QGVAR(airResistanceEnabled), "airResistanceEnabled"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(allowComputerRangefinder), "allowComputerRangefinder"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(allowCompass), "allowCompass"] call EFUNC(common,readSettingFromModule); diff --git a/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf b/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf new file mode 100644 index 0000000000..04ca9c3278 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_rangeTableCanUse.sqf @@ -0,0 +1,21 @@ +/* + * Author: PabstMirror + * Can player open 82mm rangetable. + * + * Arguments: + * 0: Vehicle + * 1: Player + * + * Return Value: + * Can Open + * + * Example: + * [bob, bob] call ace_mk6mortar_fnc_rangeTableCanUse + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_vehicle,_player); + +"ACE_RangeTable_82mm" in (items _player); \ No newline at end of file diff --git a/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf new file mode 100644 index 0000000000..dfb53842ab --- /dev/null +++ b/addons/mk6mortar/functions/fnc_rangeTableOpen.sqf @@ -0,0 +1,48 @@ +/* + * Author: PabstMirror + * Opens the rangetable and fills the charge listbox. + * + * Arguments: + * No + * + * Return Value: + * No + * + * Example: + * [] call ace_mk6mortar_fnc_rangeTableOpen + * + * Public: No + */ +#include "script_component.hpp" + +#define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) + +private ["_weaponName", "_magazines", "_initSpeed", "_fireModes", "_muzzleVelocities", "_showToPlayer", "_artilleryCharge"]; + +_weaponName = "mortar_82mm"; //todo: work on other weapons + +createDialog "ACE_82mm_RangeTable_Dialog"; +if (isNull (uiNamespace getVariable ["ACE_82mm_RangeTable_Dialog", displayNull])) exitWith {ERROR("Dialog failed to open");}; + +//Get Magazine Types +_magazines = getArray (configFile >> "CfgWeapons" >> _weaponName >> "magazines"); + +//For now just get settings from first mag, all rounds have same flight characteristics: +if ((count _magazines) < 1) exitWith {ERROR("No Magazines for weapon");}; +_initSpeed = getNumber (configFile >> "CfgMagazines" >> (_magazines select 0) >> "initSpeed"); + +//Get Charge Modes +_fireModes = getArray (configFile >> "CfgWeapons" >> _weaponName >> "modes"); + +_muzzleVelocities = []; +{ + _showToPlayer = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "showToPlayer"); + if (_showToPlayer == 1) then { + _artilleryCharge = getNumber (configFile >> "CfgWeapons" >> _weaponName >> _x >> "artilleryCharge"); + LIST_CHARGE lbAdd format ["%1: %2", (localize "STR_ACE_MK6MORTAR_rangetable_charge"), (count _muzzleVelocities)]; + LIST_CHARGE lbSetData [(count _muzzleVelocities), str (_artilleryCharge * _initSpeed)]; + _muzzleVelocities pushBack _artilleryCharge; + }; +} forEach _fireModes; + +LIST_CHARGE lbSetCurSel 0; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf new file mode 100644 index 0000000000..c0cc40ccdc --- /dev/null +++ b/addons/mk6mortar/functions/fnc_rangeTablePageChange.sqf @@ -0,0 +1,37 @@ +/* + * Author: PabstMirror + * Called when listbox selection changes. Updates the rangetable with new values. + * + * Arguments: + * No + * + * Return Value: + * No + * + * Example: + * [] call ace_mk6mortar_fnc_rangeTablePageChange + * + * Public: No + */ +#include "script_component.hpp" + +#define RANGE_TABLE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 20001) +#define LIST_CHARGE ((uiNamespace getVariable "ACE_82mm_RangeTable_Dialog") displayCtrl 1501) + +private ["_listBoxData", "_muzzleVelocity", "_airFriction", "_precalcArray"]; + +_listBoxData = LIST_CHARGE lbData (lbCurSel LIST_CHARGE); +if (isNil "_listBoxData" || {_listBoxData == ""}) exitWith {ERROR("lbCurSel out of bounds or no data");}; +_muzzleVelocity = parseNumber _listBoxData; + +_airFriction = if (GVAR(airResistanceEnabled)) then {MK6_82mm_AIR_FRICTION} else {0}; + +_precalcArray = [_muzzleVelocity, _airFriction] call FUNC(rangeTablePreCalculatedValues); + +lnbClear RANGE_TABLE; +{ + RANGE_TABLE lnbAddRow _x; +} forEach _precalcArray; + +//put dummy line at end because scrolling is fucked and can't see last line +RANGE_TABLE lnbAddRow ["", "", "", "", "", "", "", "", "", "", ""]; diff --git a/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf new file mode 100644 index 0000000000..d775b87365 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_rangeTablePreCalculatedValues.sqf @@ -0,0 +1,271 @@ +/* + * Author: PabstMirror + * Simple Lookup Table for various muzzle velocities and air frictions. + * Use ace_mk6mortar_fnc_dev_buildTable to build + * + * Arguments: + * 0: Muzzle Velocity + * 1: Air Friction + * + * Return Value: + * + * + * Example: + * [200, 0] call ace_mk6mortar_fnc_rangeTablePreCalculatedValues + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_muzzleVelocity,_airFriction); + +switch (true) do { + +case ((abs(_muzzleVelocity - 70) < 0.00001) && {(abs(_airFriction - -0.0001) < 0.00001)}): { + [ + ["100","1493","9","1.4","14.0","3.7","0.4","-0.3","0.0","-0.0","-0.0","0.0"], + ["150","1438","14","1.4","13.9","2.5","0.4","-0.4","0.0","-0.0","-0.1","0.0"], + ["200","1381","20","1.4","13.8","1.9","0.5","-0.4","0.0","-0.0","-0.1","0.1"], + ["250","1321","27","1.5","13.6","1.5","0.5","-0.4","0.0","-0.0","-0.1","0.1"], + ["300","1256","36","1.6","13.3","1.3","0.6","-0.5","0.0","-0.1","-0.1","0.1"], + ["350","1183","49","1.7","12.9","1.1","0.6","-0.5","0.1","-0.1","-0.1","0.1"], + ["400","1097","70","1.9","12.4","0.9","0.6","-0.5","0.1","-0.1","-0.2","0.1"], + ["450","979","113","2.3","11.6","0.8","0.6","-0.5","0.1","-0.1","-0.2","0.2"] + ] + }; +case ((abs(_muzzleVelocity - 140) < 0.00001) && {(abs(_airFriction - -0.0001) < 0.00001)}): { + [ + ["150","1556","1","0.8","27.2","16.3","2.5","-2.4","0.0","-0.0","-0.2","0.2"], + ["200","1541","1","0.8","27.2","12.3","2.5","-2.4","0.0","-0.0","-0.3","0.2"], + ["250","1527","2","0.8","27.2","9.9","2.6","-2.4","0.0","-0.0","-0.3","0.3"], + ["300","1512","2","0.8","27.2","8.3","2.7","-2.4","0.1","-0.0","-0.4","0.4"], + ["350","1497","3","0.8","27.1","7.1","2.7","-2.5","0.0","-0.1","-0.5","0.4"], + ["400","1482","3","0.8","27.1","6.2","2.7","-2.5","0.1","-0.1","-0.5","0.5"], + ["450","1467","3","0.8","27.0","5.6","2.8","-2.5","0.1","-0.1","-0.6","0.6"], + ["500","1451","4","0.8","27.0","5.0","2.9","-2.6","0.1","-0.1","-0.6","0.6"], + ["550","1436","4","0.8","26.9","4.6","2.9","-2.6","0.1","-0.1","-0.7","0.7"], + ["600","1420","5","0.8","26.8","4.2","3.0","-2.7","0.1","-0.1","-0.8","0.8"], + ["650","1404","5","0.8","26.8","3.9","3.0","-2.7","0.1","-0.1","-0.9","0.8"], + ["700","1388","6","0.8","26.7","3.6","3.1","-2.8","0.1","-0.1","-0.9","0.9"], + ["750","1372","6","0.8","26.6","3.4","3.2","-2.8","0.1","-0.1","-1.0","1.0"], + ["800","1355","7","0.8","26.5","3.2","3.2","-2.9","0.1","-0.1","-1.1","1.1"], + ["850","1338","8","0.8","26.4","3.0","3.3","-2.9","0.1","-0.1","-1.1","1.1"], + ["900","1321","8","0.8","26.2","2.8","3.4","-3.0","0.1","-0.1","-1.2","1.2"], + ["950","1303","9","0.9","26.1","2.7","3.4","-3.1","0.1","-0.2","-1.3","1.2"], + ["1000","1285","10","0.9","26.0","2.6","3.5","-3.1","0.2","-0.1","-1.4","1.3"], + ["1050","1266","11","0.9","25.8","2.4","3.5","-3.2","0.1","-0.2","-1.4","1.4"], + ["1100","1247","12","0.9","25.7","2.3","3.6","-3.3","0.1","-0.2","-1.5","1.4"], + ["1150","1228","13","0.9","25.5","2.2","3.7","-3.3","0.2","-0.2","-1.6","1.5"], + ["1200","1207","14","1.0","25.3","2.1","3.7","-3.4","0.2","-0.2","-1.7","1.6"], + ["1250","1186","15","1.0","25.1","2.0","3.8","-3.4","0.2","-0.2","-1.7","1.7"], + ["1300","1163","17","1.0","24.8","1.9","3.8","-3.5","0.2","-0.2","-1.8","1.7"], + ["1350","1140","19","1.0","24.6","1.9","3.9","-3.5","0.2","-0.2","-1.9","1.8"], + ["1400","1115","21","1.1","24.3","1.8","3.9","-3.6","0.2","-0.2","-1.9","1.9"], + ["1450","1088","24","1.1","23.9","1.7","4.0","-3.6","0.2","-0.2","-2.0","1.9"], + ["1500","1060","27","1.2","23.6","1.6","4.0","-3.7","0.2","-0.2","-2.1","2.0"], + ["1550","1028","32","1.3","23.1","1.5","4.0","-3.7","0.2","-0.2","-2.1","2.1"], + ["1600","991","38","1.4","22.6","1.5","4.0","-3.7","0.2","-0.2","-2.2","2.1"], + ["1650","947","49","1.7","21.9","1.4","4.0","-3.7","0.2","-0.3","-2.3","2.2"], + ["1700","888","71","2.1","21.0","1.3","3.9","-3.6","0.3","-0.3","-2.3","2.2"] + ] + }; +case ((abs(_muzzleVelocity - 200) < 0.00001) && {(abs(_airFriction - -0.0001) < 0.00001)}): { + [ + ["250","1559","1","0.6","37.3","23.8","6.1","-5.9","0.0","-0.0","-0.6","0.5"], + ["300","1551","1","0.6","37.3","20.0","6.1","-5.9","0.1","-0.0","-0.7","0.7"], + ["350","1543","1","0.6","37.3","17.2","6.2","-5.9","0.0","-0.1","-0.8","0.7"], + ["400","1535","1","0.6","37.3","15.1","6.2","-5.9","0.1","-0.0","-0.9","0.9"], + ["450","1527","1","0.6","37.3","13.4","6.3","-6.0","0.1","-0.1","-1.0","1.0"], + ["500","1519","1","0.6","37.2","12.1","6.3","-6.0","0.1","-0.1","-1.1","1.1"], + ["550","1510","1","0.6","37.2","11.0","6.4","-6.0","0.1","-0.1","-1.3","1.2"], + ["600","1502","1","0.6","37.2","10.1","6.4","-6.1","0.1","-0.1","-1.4","1.3"], + ["650","1494","1","0.6","37.2","9.4","6.5","-6.1","0.1","-0.1","-1.5","1.4"], + ["700","1485","2","0.6","37.1","8.7","6.5","-6.2","0.1","-0.1","-1.6","1.5"], + ["750","1477","2","0.6","37.1","8.2","6.6","-6.2","0.1","-0.1","-1.7","1.6"], + ["800","1468","2","0.6","37.0","7.7","6.7","-6.3","0.1","-0.1","-1.8","1.8"], + ["850","1460","2","0.6","37.0","7.2","6.7","-6.3","0.1","-0.1","-2.0","1.9"], + ["900","1451","2","0.6","37.0","6.8","6.8","-6.4","0.1","-0.1","-2.1","2.0"], + ["950","1443","2","0.6","36.9","6.5","6.9","-6.4","0.1","-0.1","-2.2","2.1"], + ["1000","1434","2","0.6","36.9","6.2","6.9","-6.5","0.1","-0.1","-2.3","2.2"], + ["1050","1425","2","0.6","36.8","5.9","7.0","-6.6","0.1","-0.2","-2.5","2.3"], + ["1100","1417","3","0.6","36.8","5.6","7.1","-6.6","0.1","-0.2","-2.6","2.4"], + ["1150","1408","3","0.6","36.7","5.4","7.1","-6.7","0.2","-0.2","-2.7","2.5"], + ["1200","1399","3","0.6","36.6","5.2","7.2","-6.7","0.2","-0.2","-2.8","2.7"], + ["1250","1390","3","0.6","36.6","5.0","7.3","-6.8","0.2","-0.2","-2.9","2.8"], + ["1300","1381","3","0.6","36.5","4.8","7.4","-6.9","0.2","-0.2","-3.0","2.9"], + ["1350","1372","3","0.6","36.4","4.6","7.4","-6.9","0.2","-0.2","-3.2","3.0"], + ["1400","1362","4","0.6","36.4","4.4","7.5","-7.0","0.2","-0.2","-3.3","3.1"], + ["1450","1353","4","0.6","36.3","4.3","7.6","-7.1","0.2","-0.2","-3.4","3.2"], + ["1500","1344","4","0.6","36.2","4.2","7.7","-7.1","0.2","-0.2","-3.5","3.4"], + ["1550","1334","4","0.6","36.1","4.0","7.7","-7.2","0.2","-0.2","-3.7","3.5"], + ["1600","1324","4","0.6","36.0","3.9","7.8","-7.3","0.2","-0.2","-3.8","3.6"], + ["1650","1314","4","0.7","35.9","3.8","7.9","-7.3","0.2","-0.2","-3.9","3.7"], + ["1700","1304","5","0.7","35.8","3.7","7.9","-7.4","0.2","-0.2","-4.0","3.8"], + ["1750","1294","5","0.7","35.7","3.6","8.0","-7.5","0.2","-0.2","-4.2","3.9"], + ["1800","1284","5","0.7","35.6","3.5","8.1","-7.6","0.2","-0.3","-4.3","4.0"], + ["1850","1274","5","0.7","35.5","3.4","8.2","-7.6","0.2","-0.3","-4.4","4.2"], + ["1900","1263","6","0.7","35.4","3.3","8.2","-7.7","0.2","-0.3","-4.5","4.3"], + ["1950","1253","6","0.7","35.2","3.2","8.3","-7.8","0.2","-0.3","-4.7","4.4"], + ["2000","1242","6","0.7","35.1","3.1","8.4","-7.8","0.3","-0.3","-4.8","4.5"], + ["2050","1231","7","0.7","35.0","3.0","8.4","-7.9","0.3","-0.3","-4.9","4.7"], + ["2100","1219","7","0.7","34.8","2.9","8.5","-8.0","0.3","-0.3","-5.0","4.8"], + ["2150","1208","7","0.7","34.7","2.9","8.5","-8.0","0.3","-0.3","-5.2","4.9"], + ["2200","1196","8","0.7","34.5","2.8","8.6","-8.1","0.3","-0.3","-5.3","5.0"], + ["2250","1184","8","0.7","34.3","2.7","8.7","-8.2","0.3","-0.3","-5.4","5.1"], + ["2300","1171","9","0.8","34.2","2.7","8.7","-8.2","0.3","-0.3","-5.5","5.2"], + ["2350","1158","9","0.8","34.0","2.6","8.8","-8.3","0.3","-0.3","-5.7","5.4"], + ["2400","1145","10","0.8","33.8","2.5","8.8","-8.3","0.3","-0.3","-5.8","5.5"], + ["2450","1132","10","0.8","33.6","2.5","8.9","-8.4","0.3","-0.3","-5.9","5.6"], + ["2500","1118","11","0.8","33.3","2.4","8.9","-8.4","0.3","-0.3","-6.0","5.7"], + ["2550","1103","12","0.8","33.1","2.4","9.0","-8.5","0.3","-0.3","-6.1","5.8"], + ["2600","1088","13","0.9","32.8","2.3","9.0","-8.5","0.4","-0.3","-6.2","5.9"], + ["2650","1072","14","0.9","32.6","2.2","9.0","-8.6","0.4","-0.4","-6.4","6.0"], + ["2700","1056","15","0.9","32.3","2.2","9.0","-8.6","0.3","-0.4","-6.5","6.1"], + ["2750","1038","16","1.0","31.9","2.1","9.1","-8.6","0.4","-0.4","-6.6","6.3"], + ["2800","1020","18","1.0","31.6","2.1","9.1","-8.6","0.4","-0.4","-6.7","6.4"], + ["2850","1000","20","1.1","31.2","2.0","9.1","-8.6","0.4","-0.4","-6.8","6.5"], + ["2900","978","22","1.1","30.8","1.9","9.0","-8.6","0.4","-0.4","-6.9","6.5"], + ["2950","954","26","1.2","30.3","1.9","9.0","-8.6","0.4","-0.4","-7.0","6.6"], + ["3000","927","31","1.4","29.7","1.8","8.9","-8.5","0.4","-0.4","-7.1","6.7"], + ["3050","894","38","1.6","29.0","1.7","8.8","-8.4","0.4","-0.4","-7.2","6.8"], + ["3100","849","54","2.0","27.9","1.6","8.5","-8.3","0.4","-0.4","-7.2","6.8"] + ] + }; +case ((abs(_muzzleVelocity - 70) < 0.00001) && {(abs(_airFriction - 0) < 0.00001)}): { + [ + ["100","1497","9","1.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["150","1445","14","1.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["200","1390","19","1.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["250","1333","26","1.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["300","1272","34","1.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["350","1204","45","1.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["400","1127","61","1.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["450","1028","91","2.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] + ] + }; +case ((abs(_muzzleVelocity - 140) < 0.00001) && {(abs(_airFriction - 0) < 0.00001)}): { + [ + ["150","1562","1","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["200","1549","1","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["250","1536","2","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["300","1523","2","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["350","1510","2","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["400","1497","3","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["450","1484","3","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["500","1471","3","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["550","1458","4","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["600","1445","4","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["650","1431","4","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["700","1418","5","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["750","1404","5","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["800","1390","6","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["850","1376","6","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["900","1362","6","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["950","1348","7","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1000","1333","7","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1050","1318","8","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1100","1303","9","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1150","1288","9","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1200","1272","10","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1250","1256","11","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1300","1239","12","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1350","1222","13","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1400","1205","13","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1450","1187","15","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1500","1168","16","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1550","1148","18","1.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1600","1127","19","1.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1650","1105","21","1.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1700","1082","24","1.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1750","1057","27","1.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1800","1029","31","1.3","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1850","997","37","1.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1900","960","46","1.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1950","912","63","1.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"] + ] + }; +case ((abs(_muzzleVelocity - 200) < 0.00001) && {(abs(_airFriction - 0) < 0.00001)}): { + [ + ["300","1563","0","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["350","1556","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["400","1550","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["450","1544","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["500","1537","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["550","1531","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["600","1525","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["650","1519","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["700","1512","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["750","1506","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["800","1499","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["850","1493","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["900","1487","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["950","1480","1","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1000","1474","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1050","1467","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1100","1461","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1150","1454","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1200","1448","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1250","1441","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1300","1435","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1350","1428","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1400","1422","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1450","1415","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1500","1408","2","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1550","1402","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1600","1395","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1650","1388","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["1700","1381","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1750","1374","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1800","1367","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1850","1360","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1900","1353","3","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["1950","1346","4","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2000","1339","4","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2050","1332","4","0.5","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2100","1325","4","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2150","1317","4","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2200","1310","4","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2250","1302","4","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2300","1295","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2350","1287","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2400","1280","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2450","1272","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2500","1264","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2550","1256","5","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2600","1248","6","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2650","1240","6","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2700","1232","6","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2750","1223","6","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2800","1215","7","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["2850","1206","7","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2900","1197","7","0.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["2950","1188","7","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3000","1179","8","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3050","1170","8","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3100","1160","8","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3150","1151","9","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3200","1141","9","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3250","1131","10","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3300","1120","10","0.7","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3350","1109","11","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3400","1098","11","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3450","1087","12","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3500","1075","13","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3550","1062","14","0.8","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3600","1049","15","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3650","1036","16","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3700","1021","17","0.9","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3750","1006","19","1.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3800","990","21","1.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3850","971","24","1.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["3900","952","27","1.2","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["3950","929","32","1.4","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"], + ["4000","900","40","1.6","0.0","0.0","0.0","0.0","0.0","0.0","0.0","-0.0"], + ["4050","861","56","2.1","0.0","0.0","0.0","0.0","0.0","0.0","0.0","0.0"] + ] + }; + default { + ERROR("MuzzleVelocity not found in LUT"); + [] + }; +}; \ No newline at end of file diff --git a/addons/mk6mortar/functions/fnc_toggleMils.sqf b/addons/mk6mortar/functions/fnc_toggleMils.sqf new file mode 100644 index 0000000000..923a553f43 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_toggleMils.sqf @@ -0,0 +1,24 @@ +/* + * Author: PabstMirror + * Toggles the mortart to show mils or degrees + * + * Arguments: + * 0: Vehicle + * 1: Player + * + * Return Value: + * No + * + * Example: + * [mortar,bob] call ace_mk6mortar_fnc_toggleMils; + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_mortarVeh,_unit); + +private "_currentSetting"; + +_currentSetting = _mortarVeh getVariable [QGVAR(useMils), true]; +_mortarVeh setVariable [QGVAR(useMils), (!_currentSetting)]; diff --git a/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf new file mode 100644 index 0000000000..c81ff32132 --- /dev/null +++ b/addons/mk6mortar/functions/fnc_turretDisplayLoaded.sqf @@ -0,0 +1,67 @@ +/* + * Author: PabstMirror + * Called when the mk6's in game UI is loaded. Hides rangefinder data if it is disabled. + * + * Arguments: + * None + * + * Return Value: + * None + * + * Example: + * [] call ace_mk6mortar_fnc_turretDisplayLoaded + * + * Public: No + */ +#include "script_component.hpp" + +#define CTRL_CA_OPTICSPITCH (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_OPTICSPITCH") +#define CTRL_CA_OPTICSZOOM (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_OPTICSZOOM") +#define CTRL_CA_SOLUTION_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_SOLUTION_TEXT") +#define CTRL_CA_DISTANCE_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_DISTANCE_TEXT") +#define CTRL_CA_DISTANCE (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_DISTANCE") +#define CTRL_CA_TIME_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_TIME_TEXT") +#define CTRL_CA_TIME (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_TIME") +#define CTRL_CA_ELEV_NEED_TEXT (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV_NEED_TEXT") +#define CTRL_CA_RANGEELEMENTS_GROUP (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_RangeElements_group") + +#define CTRL_CA_HEADING (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_Heading") +#define CTRL_CA_ELEV (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV") +#define CTRL_CA_ELEV_NEED (configFile >> "RscInGameUI" >> "ACE_Mk6_RscWeaponRangeArtillery" >> "CA_IGUI_elements_group" >> "controls" >> "CA_ELEV_NEED") + +private ["_display", "_fnc_hideControl"]; + +disableSerialization; + +_display = uiNamespace getVariable ["ACE_Mk6_RscWeaponRangeArtillery", displayNull]; +if (isNull _display) exitWith {}; + +_fnc_hideControl = { + private "_idc"; + PARAMS_2(_path,_hideCtrl); + _idc = getNumber (_path >> "IDC"); + _pos = []; + if (_hideCtrl) then { + _pos = [-9,-9,0,0]; + } else { + { + if (isNumber (_path >> _x)) then { + _pos pushBack (getNumber (_path >> _x)); + } else { + _pos pushBack (call compile (getText (_path >> _x))); + }; + } forEach ["x", "y", "w", "h"]; + }; + (_display displayCtrl _idc) ctrlSetPosition _pos; + (_display displayCtrl _idc) ctrlCommit 0; +}; + +{ + [_x, (!GVAR(allowComputerRangefinder))] call _fnc_hideControl; +} forEach [CTRL_CA_OPTICSPITCH, CTRL_CA_OPTICSZOOM, CTRL_CA_SOLUTION_TEXT, CTRL_CA_DISTANCE_TEXT, CTRL_CA_DISTANCE, CTRL_CA_TIME_TEXT, CTRL_CA_TIME, CTRL_CA_ELEV_NEED_TEXT, CTRL_CA_RANGEELEMENTS_GROUP]; + +//Always hide these, handled by the mil convertions PFEH in handlePlayerVehChanged +[CTRL_CA_HEADING, true] call _fnc_hideControl; +[CTRL_CA_ELEV, true] call _fnc_hideControl; +[CTRL_CA_ELEV_NEED, true] call _fnc_hideControl; + diff --git a/addons/mk6mortar/functions/script_component.hpp b/addons/mk6mortar/functions/script_component.hpp new file mode 100644 index 0000000000..9980d4fc88 --- /dev/null +++ b/addons/mk6mortar/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\mk6mortar\script_component.hpp" \ No newline at end of file diff --git a/addons/mk6mortar/script_component.hpp b/addons/mk6mortar/script_component.hpp new file mode 100644 index 0000000000..cb74d552de --- /dev/null +++ b/addons/mk6mortar/script_component.hpp @@ -0,0 +1,14 @@ +#define COMPONENT mk6mortar +#include "\z\ace\Addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_MK6MORTAR + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MK6MORTAR + #define DEBUG_SETTINGS DEBUG_SETTINGS_MK6MORTAR +#endif + +#include "\z\ace\Addons\main\script_macros.hpp" + +#define MK6_82mm_AIR_FRICTION -0.0001 \ No newline at end of file diff --git a/addons/mk6mortar/stringtable.xml b/addons/mk6mortar/stringtable.xml new file mode 100644 index 0000000000..fe08d320e5 --- /dev/null +++ b/addons/mk6mortar/stringtable.xml @@ -0,0 +1,33 @@ + + + + + 82mm Rangetable + 82mm Distanztabelle + Tabela strzelnicza 82mm + table de tir 82mm + 82 мм Таблица дальностей и прицелов + + + Range Table for the MK6 82mm Mortar + Distanztabelle für den Mk6 82mm Mortar + Tabela strzelnicza dla moździerza 82mm MK6 + Table de tir pour le mortier MK6 82mm + Таблица дальностей и прицелов для MK6 82 мм мортиры + + + Open 82mm Rangetable + Öffne 82mm Distanztabelle + Otwórz tabelę strzelniczą 82mm + ouvrir la table de tir 82mm + Открыть 82 мм Таблицу дальностей и прицелов + + + Charge + Ladung + Charge + Ładunek + Зарядить + + + diff --git a/addons/modules/XEH_preInit.sqf b/addons/modules/XEH_preInit.sqf index a8b9bd061e..dfbbe2c2b9 100644 --- a/addons/modules/XEH_preInit.sqf +++ b/addons/modules/XEH_preInit.sqf @@ -3,6 +3,8 @@ ADDON = false; PREP(moduleInit); +PREP(bi_moduleProjectile); + GVAR(moduleInitCollection) = []; ADDON = true; diff --git a/addons/modules/config.cpp b/addons/modules/config.cpp index bffcec4faf..4fc3b8b60d 100644 --- a/addons/modules/config.cpp +++ b/addons/modules/config.cpp @@ -23,6 +23,9 @@ class CfgVehicles { init = QUOTE(_this call DFUNC(moduleInit)); }; }; + class ModuleOrdnance_F: Module_F { + function = "ace_modules_fnc_bi_moduleProjectile"; + }; }; #include "CfgEventHandlers.hpp" diff --git a/addons/modules/functions/fnc_bi_moduleProjectile.sqf b/addons/modules/functions/fnc_bi_moduleProjectile.sqf new file mode 100644 index 0000000000..56e3eb9883 --- /dev/null +++ b/addons/modules/functions/fnc_bi_moduleProjectile.sqf @@ -0,0 +1,191 @@ +/* + * Author: Bohemia Interactive + * Module function for spawning projectiles + * Used by Curator artillery modules etc + * + * Arguments: + * 0: The logic object + * + * Return Value: + * nil + * + * Public: No + */ + +_fnc_scriptNameParentTemp = if !(isnil '_fnc_scriptName') then {_fnc_scriptName} else {'BIS_fnc_moduleProjectile'}; +private ['_fnc_scriptNameParent']; +_fnc_scriptNameParent = _fnc_scriptNameParentTemp; +_fnc_scriptNameParentTemp = nil; + +private ['_fnc_scriptName']; +_fnc_scriptName = 'BIS_fnc_moduleProjectile'; +scriptname _fnc_scriptName; + +private ["_logic", "_units", "_activated"]; +_logic = _this select 0; +_units = _this select 1; +_activated = _this select 2; + +if ({local _x} count (objectcurators _logic) > 0) then { + //--- Reveal the circle to curators + _logic hideobject false; + _logic setpos position _logic; +}; +if !(isserver) exitwith {}; + +if (_activated) then { + _ammo = _logic getvariable ["type",gettext (configfile >> "cfgvehicles" >> typeof _logic >> "ammo")]; + if (_ammo != "") then { + _cfgAmmo = configfile >> "cfgammo" >> _ammo; + //if !(isclass _cfgAmmo) exitwith {["CfgAmmo class '%1' not found.",_ammo] call bis_fnc_error;}; + _dirVar = _fnc_scriptname + typeof _logic; + _logic setdir (missionnamespace getvariable [_dirVar,direction _logic]); //--- Restore custom direction + _pos = getposatl _logic; + _posAmmo = +_pos; + _posAmmo set [2,0]; + _dir = direction _logic; + _simulation = tolower gettext (configfile >> "cfgammo" >> _ammo >> "simulation"); + _altitude = 0; + _velocity = []; + _attach = false; + _radio = ""; + _delay = 60; + _sound = ""; + _soundSourceClass = ""; + _hint = []; + _shakeStrength = 0; + _shakeRadius = 0; + switch (_simulation) do { + case "shotshell": { + _altitude = 1000; + _velocity = [0,0,-100]; + _radio = "SentGenIncoming"; + _sounds = if (getnumber (_cfgAmmo >> "hit") < 200) then {["mortar1","mortar2"]} else {["shell1","shell2","shell3","shell4"]}; + _sound = _sounds call bis_fnc_selectrandom; + _hint = ["Curator","PlaceOrdnance"]; + _shakeStrength = 0.01; + _shakeRadius = 300; + }; + case "shotsubmunitions": { + _posAmmo = [_posAmmo,500,_dir + 180] call bis_fnc_relpos; + _altitude = 1000 - ((getterrainheightasl _posAmmo) - (getterrainheightasl _pos)); + _posAmmo set [2,_altitude]; + _velocity = [sin _dir * 68,cos _dir * 68,-100]; + _radio = "SentGenIncoming"; + _hint = ["Curator","PlaceOrdnance"]; + _shakeStrength = 0.02; + _shakeRadius = 500; + }; + case "shotilluminating": { + _altitude = 66; + _velocity = [wind select 0,wind select 1,30]; + _sound = "SN_Flare_Fired_4"; + _soundSourceClass = "SoundFlareLoop_F"; + }; + case "shotnvgmarker"; + case "shotsmokex": { + _altitude = 0; + _velocity = [0,0,0]; + _attach = true; + }; + default {["Ammo simulation '%1' is not supported",_simulation] call bis_fnc_error;}; + }; + _fnc_playRadio = { + if (_radio != "") then { + _entities = (getposatl _logic) nearentities ["All",100]; + _sides = []; + { + if (isplayer _x) then { + _side = side group _x; + if (_side in [east,west,resistance,civilian]) then { + //--- Play radio (only if it wasn't played recently) + if (time > _x getvariable ["BIS_fnc_moduleProjectile_radio",-_delay]) then { + [[_side,_radio,"side"],"bis_fnc_sayMessage",_x] call bis_fnc_mp; + _x setvariable ["BIS_fnc_moduleProjectile_radio",time + _delay]; + }; + }; + }; + } foreach _entities; + }; + }; + if (count _hint > 0) then { + [[_hint,nil,nil,nil,nil,nil,nil,true],"bis_fnc_advHint",objectcurators _logic] call bis_fnc_mp; + }; + if (count _velocity == 3) then { + _altitude = (_logic getvariable ["altitude",_altitude]) call bis_fnc_parsenumber; + _radio = _logic getvariable ["radio",_radio]; + + //--- Create projectile + _posAmmo set [2,_altitude]; + _projectile = createvehicle [_ammo,_posAmmo,[],0,"none"]; + _projectile setpos _posAmmo; + _projectile setvelocity _velocity; + if (_attach) then {_projectile attachto [_logic,[0,0,_altitude]];}; + + // This is our addition to this function + if (!isnil "ace_frag_fnc_addManualTrack") then { + [_projectile] call ace_frag_fnc_addManualTrack + }; + + //--- Play sound + if (_sound != "") then {[[_logic,_sound,"say3D"],"bis_fnc_sayMessage"] call bis_fnc_mp;}; + + //--- Create sound source + _soundSource = if (_soundSourceClass != "") then {createSoundSource [_soundSourceClass,_pos,[],0]} else {objnull}; + + //--- Play radio warning + [] call _fnc_playRadio; + + //--- Update + if (_attach) then { + waituntil { + _soundSource setposatl getposatl _projectile; + sleep 1; + isnull _projectile || isnull _logic + }; + } else { + waituntil { + _soundSource setposatl getposatl _projectile; + + if (getposatl _logic distance _pos > 0 || direction _logic != _dir) then { + _posNew = getposasl _logic; + _dirDiff = direction _logic - _dir; + _posNew = [_posNew,[getposasl _projectile,_pos] call bis_fnc_distance2d,direction _logic + 180] call bis_fnc_relpos; + _posNew set [2,getposasl _projectile select 2]; + _projectile setvelocity ([velocity _projectile,-_dirDiff] call bis_fnc_rotatevector2d); + _projectile setposasl _posNew; + _pos = getposatl _logic; + _dir = direction _logic; + missionnamespace setvariable [_dirVar,_dir]; + }; + sleep 0.1; + isnull _projectile || isnull _logic + }; + }; + deletevehicle _projectile; + deletevehicle _soundSource; + if (count objectcurators _logic > 0) then { + + //--- Delete curator spawned logic + if (_shakeStrength > 0) then { + if (_simulation == "shotsubmunitions") then {sleep 0.5;}; + [[_shakeStrength,0.7,[position _logic,_shakeRadius]],"bis_fnc_shakeCuratorCamera"] call bis_fnc_mp; + }; + deletevehicle _logic; + } else { + + //--- Repeat to achieve permanent effect + _repeat = _logic getvariable ["repeat",0] > 0; + if (_repeat) then { + [_logic,_units,_activated] call bis_fnc_moduleprojectile; + } else { + deletevehicle _logic; + }; + }; + } else { + deletevehicle _logic; + }; + } else { + ["Cannot create projectile, 'ammo' config attribute is missing in %1",typeof _logic] call bis_fnc_error; + }; +}; diff --git a/addons/movement/stringtable.xml b/addons/movement/stringtable.xml index efed949036..af5ce71af4 100644 --- a/addons/movement/stringtable.xml +++ b/addons/movement/stringtable.xml @@ -35,6 +35,7 @@ Взобраться Mászás Arrampicati + Subir Can't climb here @@ -46,6 +47,7 @@ Здесь невозможно взобраться Itt nem tudsz mászni Non puoi arrampicarti qui + Não se pode subir aqui diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index e224ce61e4..773e34a9c8 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -11,6 +11,7 @@ Nevek mutatása Показать имена Mostra i nomi + Mostrar nomes Show player names @@ -46,6 +47,7 @@ Játékosnevek mutatása csak gombnyomásra (a nevek mutatása szükséges) Показать имена игроков только по нажатию клавиши (при включенных именах) Mostra i nomi solo se si preme il tasto (richiede mostra nomi abilitato) + Mostrar nomes somente ao pressionar teclar (requer nome de jogadores) Show player ranks (requires player names) @@ -62,17 +64,18 @@ Show vehicle crew info Afficher les informations de l'équipage - Zeige Fahrzeugbesatzung + Fahrzeugbesatzung anzeigen Mostrar tripulantes Pokaż załogę pojazdu Zobrazit info o posádce vozidla Показывать информацию об экипаже Jármű-legénység adatainak mutatása Mostra le informazioni sull'equipaggio del veicolo + Mostrar tripulantes Show name tags for AI units - Zeige Namen für KI Einheiten + Namen für KI Einheiten anzeigen Mostrar etiquetas de nombre para unidades IA Показывать имена ботов Zobrazit jména AI @@ -80,10 +83,11 @@ Afficher les noms des IA Névcímkék mutatása MI-egységeknél Mostra le tag nomi per le unità AI + Mostrar nomes para unidades de IA Show SoundWaves (requires player names) - Zeigen Schallwellen (benötigt Spielernamen) + Schallwellen anzeigen (benötigt Spielernamen) Mostrar onda sonora (requiere Mostrar nombres de jugadores) Индикатор разговора (при вкл. именах) Zobrazit SoundWaves (vyžaduje jména hráčů) @@ -91,6 +95,7 @@ Afficher "qui parle" (si noms affichés) "Hanghullámok" mutatása (a nevek mutatása szükséges) Mostra barra movimento audio (richiede mostra nomi abilitato) + Mostrar onda sonora (requer nome de jogadores) Default Nametag Color (Non Group Members) @@ -102,6 +107,7 @@ Standardní barva jmenovek (pro nečleny jednotky) Alap névcímke-szín (csoporton kívüli személyek) Colore nametag di default (membri non del gruppo) + Cor padrão do nome (unidades fora do grupo) diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml index a2e24d79df..fd088c1e08 100644 --- a/addons/nightvision/stringtable.xml +++ b/addons/nightvision/stringtable.xml @@ -94,6 +94,7 @@ ПНВ (Широкоугольный) JVN (Large) Éjjellátó szemüveg (széles látószögű) + Óculos de visão noturna (Panorâmico) Brightness: %1 @@ -132,4 +133,4 @@ Riduci la luminosità dell'NVG - \ No newline at end of file + diff --git a/addons/optics/stringtable.xml b/addons/optics/stringtable.xml index 28530ecf1e..f9964c4310 100644 --- a/addons/optics/stringtable.xml +++ b/addons/optics/stringtable.xml @@ -1,5 +1,4 @@  - @@ -58,7 +57,7 @@ MRCO (2D) MRCO (2D) MRCO (2D) - Прицел MRCO (2D) + MRCO (2D) MRCO (2D) MRCO (2D) @@ -70,7 +69,7 @@ MRCO (PIP) MRCO (PIP) MRCO (PIP) - Прицел MRCO (PIP) + MRCO (PIP) MRCO (PIP) MRCO (PIP) diff --git a/addons/optionsmenu/stringtable.xml b/addons/optionsmenu/stringtable.xml index bc8d6dcdec..ccb39c93c8 100644 --- a/addons/optionsmenu/stringtable.xml +++ b/addons/optionsmenu/stringtable.xml @@ -1,5 +1,4 @@  - @@ -24,10 +23,11 @@ Corriger animation Animációk kijavítása Fixa l'animazione + Arrumar Animação Reset All - Alles Zurücksetzen + Alles zurücksetzen Reiniciar todo Полный сброс Vyresetovat vše @@ -35,6 +35,7 @@ Défaut Minden visszaállítása Resetta tutto + Resetar Tudo Colors @@ -46,6 +47,7 @@ Kolory Színek Colori + Cores Options @@ -69,6 +71,7 @@ Werte Értékek Valori + Valores Yes @@ -104,6 +107,7 @@ Paramètres Opció: Parametri: + Opção: Export @@ -115,6 +119,7 @@ Exporter Exportálás Esporta + Exportar Open Export Menu @@ -126,16 +131,18 @@ Ouvrir le menu d'exportation Exportálási menü megnyitása Apri menù esportazione + Abrir menu de exportação String input. - String input. + Zeichenketteneingabe Introducir frase Строчный ввод. Wpisywanie tekstu. Entrée String bevitel. Stringa di unput. + Input de String Array. Seperate elements by using ,. @@ -147,10 +154,11 @@ Tabulka. Odděl elementy použitím ,. Array. Válasszad el az elemeket vesszővel. Array. Separa gli elementi usando ,. + Vetor. Separe elementos usando *,*. Number - Nummer + Zahl Numero Число Číslo @@ -158,6 +166,7 @@ Nombre Szám Numero + Número Uknown input type @@ -169,6 +178,7 @@ Type d'entrée inconnue Ismeretlen beviteli típus Input inserito sconosciuto + Tipo desonhecido de input Save input @@ -180,10 +190,11 @@ Sauvegarder Bevitel elmentése Salva input + Salvar input Include Client Settings - Beinhalte Client-Einstellungen + Schließe Client-Einstellungen ein Incluir configuración de cliente Включить настройки клиента Zahrnout nastavení klienta @@ -191,6 +202,7 @@ Inclure paramètres client Kliens-beállítások melléklése Includi i parametri del client + Incluir opções do cliente Exclude Client Settings @@ -202,6 +214,7 @@ Exclure paramètres client Kliens-beállítások elhagyása Escludi i parametri del client + Excluir opções do cliente Settings exported to clipboard @@ -213,12 +226,15 @@ Paramètres exportés dans le presse papier Beállítások exportálva a vágólapba Parametri esportati alla clipboard + Opções exportadas para o clipboard. Option Menu UI Scaling Menu option: taille de l'UI Skalowanie UI menu ustawień Opción de escalado del menú UI + Размер интерфейса меню настройки + UI Skalierung - \ No newline at end of file + diff --git a/addons/overheating/stringtable.xml b/addons/overheating/stringtable.xml index 89993dee62..05234a6874 100644 --- a/addons/overheating/stringtable.xml +++ b/addons/overheating/stringtable.xml @@ -10,6 +10,8 @@ Wyświetl tekst przy zacięciu broni Affiche texte si enrayé Szöveges értesítés kijelzése a fegyver elakadásakor + Mostrar texto quando trava acontecer + Visualizza testo in caso di inceppamento Display a notification whenever your weapon gets jammed @@ -20,6 +22,8 @@ Wyświetl powiadomienie za każdym razem, kiedy Twoja broń ulegnie zacięciu Affiche une notification lors d'un enrayement Egy szöveges értesítés jelenik meg, amikor a fegyver megakad + Mostra uma notificação quando sua arma sofre um travamento. + Visualizza una notifica in caso la tua arma si inceppasse Spare barrel @@ -94,15 +98,15 @@ Sostiuisci la canna - Swapping barrel... - Lauf wird gewechselt... - Cambiando el cañón... - Wymienianie lufy... + Swapping barrel ... + Lauf wird gewechselt ... + Cambiando el cañón ... + Wymienianie lufy ... Vyměňuji hlaveň ... - Changement du canon... + Changement du canon ... Смена ствола ... - Cső kicserélése folyamatban... - Substituindo cano... + Cső kicserélése folyamatban ... + Substituindo cano ... Sto sostituendo la canna ... @@ -112,13 +116,13 @@ Lufa wymieniona Hlaveň vyměněna Canon changé - Ствол сменен + Ствол сменён Cső kicserélve Cano substituído Canna sostituita - Check weapons temperature + Check weapon temperature Temperatur der Waffe prüfen Verificar temperatura del arma Sprawdź temperaturę broni @@ -131,13 +135,15 @@ Check weapon temperature + Waffentemperatur prüfen Verificar temperatura del arma Sprawdź temperaturę broni Zkontrolovat teplotu zbraně Vérifier la température Fegyverhő ellenőrzése Проверить температуру оружия - Waffentemperatur prüfen + Conferir temperatura + Controlla la temperatura della canna Checking temperature ... diff --git a/addons/parachute/stringtable.xml b/addons/parachute/stringtable.xml index a1de714331..d3cdbd9a7d 100644 --- a/addons/parachute/stringtable.xml +++ b/addons/parachute/stringtable.xml @@ -1,5 +1,4 @@  - @@ -12,6 +11,7 @@ Magasságmérő Высотомер Altimetro + Altímetro Altimeter Watch @@ -23,6 +23,7 @@ Magasságmérős karóra Часы с высотомером Controlla l'altimetro + Relógio Altímetro Used to show height, descent rate and the time. @@ -34,6 +35,7 @@ Mutatja a magasságot, a zuhanási sebességet, és az időt. Используется для определения высоты, скорости снижения и времени. Usato per mostrare l'altitudine, la velocità di discesa e l'ora. + Usado para mostrar altura, taxa de descida e o tempo. Non-Steerable Parachute @@ -45,6 +47,7 @@ Irányíthatatlan ejtőernyő Неуправляемый парашют Paracadute non manovrabile + Para-querdas não controlável diff --git a/addons/realisticnames/CfgWeapons.hpp b/addons/realisticnames/CfgWeapons.hpp index 3cbe03f465..8eb3c04577 100644 --- a/addons/realisticnames/CfgWeapons.hpp +++ b/addons/realisticnames/CfgWeapons.hpp @@ -193,7 +193,7 @@ class CfgWeapons { }; // marksmen marksman - /*class DMR_02_base_F: Rifle_Long_Base_F { + class DMR_02_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_DMR_02"; //MAR-10 .338"; }; @@ -208,7 +208,6 @@ class CfgWeapons { class srifle_DMR_02_sniper_F: srifle_DMR_02_F { displayName = "$STR_ACE_RealisticNames_srifle_DMR_02_sniper"; //MAR-10 .338 (Sand)"; }; - */ class DMR_03_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_DMR_03"; //Mk-I EMR 7.62 mm"; }; @@ -236,7 +235,6 @@ class CfgWeapons { class srifle_DMR_03_spotter_F: srifle_DMR_03_F { displayName = "$STR_ACE_RealisticNames_srifle_DMR_03_spotter"; //NATO DMR (provisional) spotter"; }; - /* class DMR_04_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_DMR_04"; //ASP-1 Kir 12.7 mm"; }; @@ -264,7 +262,6 @@ class CfgWeapons { class srifle_DMR_05_tan_f: srifle_DMR_05_blk_F { displayName = "$STR_ACE_RealisticNames_srifle_DMR_05_tan"; //Cyrus 9.3 mm (Tan)"; }; - */ class DMR_06_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_DMR_06"; //Mk14 7.62 mm"; }; @@ -278,7 +275,6 @@ class CfgWeapons { }; // marksmen mgs - /* class MMG_01_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_MMG_01"; //Navid 9.3 mm"; }; @@ -290,7 +286,6 @@ class CfgWeapons { class MMG_01_tan_F: MMG_01_hex_F { displayName = "$STR_ACE_RealisticNames_MMG_01_tan"; //Navid 9.3 mm (Tan)"; }; - */ class MMG_02_base_F: Rifle_Long_Base_F { displayName = "$STR_ACE_RealisticNames_MMG_02"; //SPMG .338"; }; diff --git a/addons/realisticnames/stringtable.xml b/addons/realisticnames/stringtable.xml index 341b2a383f..868da182a2 100644 --- a/addons/realisticnames/stringtable.xml +++ b/addons/realisticnames/stringtable.xml @@ -118,6 +118,7 @@ YABHON-R3 (штурмовик) YABHON-R3 (CAS) YABHON-R3 (Légitámogató) + YABHON-R3 (CAS) M-ATV @@ -138,7 +139,7 @@ M-ATV (CKM) M-ATV (TK) M-ATV (HMG) - M-ATV (Пулемет) + M-ATV (Пулемёт) M-ATV (HMG) M-ATV (nehézgéppuska) M-ATV (HMG) @@ -150,7 +151,7 @@ M-ATV (GMG) M-ATV (Granátomet) M-ATV (GMG) - M-ATV (Гранатомет) + M-ATV (Гранатомёт) M-ATV (GMG) M-ATV (gránátgéppuska) M-ATV (GMG) @@ -305,7 +306,7 @@ HEMTT médico HEMTT Medyczny HEMTT Zdravotnický - HEMTT Sanitaire + HEMTT Médical HEMTT Медицинский HEMTT Médico HEMTT (egészségügyi) @@ -366,7 +367,7 @@ Fennek (CKM) Fennek (TK) Fennek (HMG) - Феннек (Пулемет) + Феннек (Пулемёт) Fennek (HMG) Fennek (nehézgéppuska) Fennek (HMG) @@ -378,7 +379,7 @@ Fennek (GMG) Fennek (granátomet) Fennek (GMG) - Феннек (Гранатомет) + Феннек (Гранатомёт) Fennek (GMG) Fennek (gránátgéppuska) Fennek (GMG) @@ -438,7 +439,7 @@ KamAZ Transportowy (zakryty) KAMAZ Valník (krytý) KamAZ Transport (bâché) - КамАЗ Траспортный (Крытый) + КамАЗ Траспортный (крытый) KamAZ Transporte (coberto) KamAZ szállítójármű (ponyvás) KamAZ da trasporto (coperto) @@ -485,7 +486,7 @@ KamAZ médico KamAZ Medyczny KAMAZ Zdravotnický - KamAZ Sanitaire + KamAZ Médical КамАЗ Медицинский KamAZ Médico KamAZ (egészségügyi) @@ -510,7 +511,7 @@ Punisher (CKM) Punisher (TK) Punisher (HMG) - Kаратель (Пулемет) + Kаратель (Пулемёт) Punisher (HMG) Punisher (nehézgéppuska) Punisher (HMG) @@ -519,10 +520,10 @@ Punisher (GMG) Punisher (GMW) Punisher (GMG) - Punisher (CKM) + Punisher (GMG) Punisher (granátomet) Punisher (GMG) - Kаратель (Гранатомет) + Kаратель (Гранатомёт) Punisher (GMG) Punisher (gránátgéppuska) Punisher (GMG) @@ -534,7 +535,7 @@ T100 Black Eagle T100 Black Eagle T100 Black Eagle - T100 Черный Орел + T100 Чёрный Орел T100 Black Eagle T100 Fekete Sas T100 Black Eagle @@ -606,7 +607,7 @@ Typhoon Transportowy (przykryty) Typhoon valník (krytý) Typhoon Transport (bâché) - Тайфун Транспортный (kрытый) + Тайфун Транспортный (крытый) Typhoon Transporte (coberto) Typhoon szállítójármű (ponyvás) Typhoon da trasporto (coperto) @@ -665,7 +666,7 @@ Typhoon médico Typhoon Medyczny Typhoon zdravotnický - Typhoon Sanitaire + Typhoon Médical Тайфун Медицинский Typhoon Médico Typhoon (egészségügyi) @@ -726,8 +727,9 @@ CH-47I Chinook (nieuzbrojony) CH-47I Chinook (невооруженный) CH-47I Chinook (neozbrojený) - CH-47I Chinook (Neozbrojený) + CH-47I Chinook (non-armé) CH-47I Chinook (fegyvertelen) + CH-47I Chinook (disarmato) A-10D Thunderbolt II @@ -867,7 +869,7 @@ M18A1 Claymore Mina kierunkowa M18A1 Claymore Mina Claymore M18A1 - M18A1 Claymore Mine antipersonnel à effet dirigé + M18A1 Claymore M18A1 Клеймор M18A1 Claymore M18A1 Claymore akna @@ -891,7 +893,7 @@ Bloque de demolición M112 Ładunek burzący M112 Výbušná nálož M112 - Pétard M112 + M112 Block de Démolition M112 подрывной заряд M112 Carga de Demolição M112 romboló tömb @@ -988,7 +990,7 @@ Granat dymny M18 (Żółty) M18 Kouřový Granát (žlutý) M18 Grenade fumigène (Jaune) - M183 дымовая граната (Жёлтые) + M183 дымовая граната (Жёлтый) M18 Granada de fumaça (Amarela) M18 füstgránát (Sárga) M18 Granata fumogena (Giallo) @@ -1011,7 +1013,7 @@ Mina antipersona VS-50 Mina przeciwpiechotna VS-50 Protipěchotní mina VS-50 - VS-50 Mine antipersonnel à pression + VS-50 Mine AP VS-50 Противопехотная мина VS-50 Mina antipessoal VS-50 gyalogsági taposóakna @@ -1023,7 +1025,7 @@ Mina antipersona M26 Mina przeciwpiechotna M26 Šrapnelová mina M26 - M26 Mine antipersonnel bondissante + M26 Mine AP bondissante M26 Противопехотная мина M26 Mina saltadora antipessoal M26 gyalogsági ugróakna @@ -1035,7 +1037,7 @@ Mina antipersona de alambre PMR-3 Mina przeciwpiechotna PMR-3 Nástražná mina PMR-3 - PMR-3 Mine antipersonnel à traction + PMR-3 Mine AP à traction PMR-3 Противопехотная мина PMR-3 Mina antipessoal (armadilha) PMR-3 botlódrótos gyalogsági akna @@ -1050,6 +1052,8 @@ P99 P99 P99 + P99 + P99 MP-443 Grach @@ -1060,16 +1064,20 @@ MP-443 Grach MP-443 Grach МР-443 "Грач" + MP-443 Grach + MP-443 Grach - ACP-C2 - ACP-C2 - ACP-C2 - ACP-C2 - ACP-C2 - ACP-C2 - ACP-C2 - ACP-C2 + Custom Covert II + Custom Covert II + Custom Covert II + Custom Covert II + Custom Covert II + Custom Covert II + Custom Covert II + Custom Covert II + Custom Covert II + ACP-C2 FNX-45 Tactical @@ -1080,6 +1088,8 @@ FNX-45 Tactical FNX-45 Tactical FNX-45 Tactical + FNX-45 Tactical + FNX-45 Tactical Chiappa Rhino 60DS @@ -1090,6 +1100,8 @@ Chiappa Rhino 6DS Chiappa Rhino 60DS Chiappa Rhino 60DS + Chiappa Rhino 60DS + Chiappa Rhino 6DS Taurus Judge @@ -1100,6 +1112,8 @@ Taurus Judge Taurus Judge Taurus Judge + Taurus Judge + Taurus Judge NLAW @@ -1110,6 +1124,8 @@ NLAW NLAW NLAW + NLAW + NLAW RPG-32 @@ -1120,6 +1136,8 @@ RPG-32 RPG-32 РПГ-32 + RPG-32 + RPG-32 Mini-Spike (AA) @@ -1130,16 +1148,20 @@ Mini-Spike (Repülő-elhárító) Mini-Spike (AA) Mini-Spike (AA) + Mini-Spike (AA) + Mini-Spike (AA) Mini-Spike (AT) Mini-Spike (PALR) Mini-Spike (PT) Mini-Spike (AT) - Mini-Spike (AT) + Mini-Spike (AC) Mini-Spike (Tankelhárító) Mini-Spike (AT) Mini-Spike (AT) + Mini-Spike (AT) + Mini-Spike (AT) MX @@ -1150,16 +1172,20 @@ MX MX MX + MX + MX MX (Black) MX (Schwarz) MX (Czarny) MX (černý) - MX ( Noir) + MX (Noir) MX (Fekete) MX (Negro) - MX (черный) + MX (Чёрный) + MX (Preto) + MX (Nero) MXC @@ -1170,6 +1196,8 @@ MXC MXC MXC + MXC + MXC MXC (Black) @@ -1179,7 +1207,9 @@ MXC (Noir) MXC (Fekete) MXC (Negro) - MXC (черный) + MXC (Чёрный) + MXC (Preto) + MXC (Nero) MX 3GL @@ -1190,16 +1220,20 @@ MX 3GL MX 3GL MX 3GL + MX 3GL + MX 3GL MX 3GL (Black) MX 3GL (Schwarz) MX 3GL (Czarny) MX 3GL (černý) - MX 3 GL (Noir) + MX 3GL (Noir) MX 3GL (Fekete) MX 3GL (Negro) - MX 3GL (черный) + MX 3GL (Чёрный) + MX 3GL (Preto) + MX 3GL (Nero) MX LSW @@ -1210,6 +1244,8 @@ MX LSW MX LSW MX LSW + MX LSW + MX LSW MX LSW (Black) @@ -1219,7 +1255,9 @@ MX LSW (Noir) MX LSW (Fekete) MX LSW (Negro) - MX LSW (черный) + MX LSW (Чёрный) + MX LSW (Preto) + MX LSW (Nero) MXM @@ -1230,6 +1268,8 @@ MXM MXM MXM + MXM + MXM MXM (Black) @@ -1239,37 +1279,45 @@ MXM (Noir) MXM (Fekete) MXM (Negro) - MXM (черный) + MXM (Чёрный) + MXM (Preto) + MXM (Nero) - KT2002 Katiba - KT2002 Katiba - KT2002 Katiba - KT2002 Katiba - KT2002 Katiba - KT2002 Katiba - KT2002 Katiba - KT2002 Катиба + KH2002 Sama + KH2002 Sama + KH2002 Sama + KH2002 Sama + KH2002 Sama + KH2002 Sama + KH2002 Sama + KH2002 Сама + KT2002 Sama + KT2002 Katiba - KT2002C Katiba - KT2002C Katiba - KT2002C Katiba - KT2002C Katiba - KT2002C Katiba - KT2002C Katiba - KT2002C Katiba - KT2002C Катиба + KH2002C Sama + KH2002C Sama + KH2002C Sama + KH2002C Sama + KH2002C Sama + KH2002C Sama + KH2002C Sama + KH2002C Сама + KT2002C Sama + KT2002C Katiba - KT2002 Katiba KGL - KT2002 Katiba KGL - KT2002 Katiba KGL - KT2002 Katiba KGL - KT2002 Katiba KGL - KT2002 Katiba KGL - KT2002 Katiba KGL - KT2002 Катиба KGL + KH2002 Sama KGL + KH2002 Sama KGL + KH2002 Sama KGL + KH2002 Sama KGL + KH2002 Sama KGL + KH2002 Sama KGL + KH2002 Sama KGL + KH2002 Сама KGL + KT2002 Sama KGL + KT2002 Katiba KGL F2000 (Camo) @@ -1279,7 +1327,9 @@ F2000 (Camo) F2000 (Terepmintás) F2000 (Camuflaje) - F2000 (камо) + F2000 (Камо) + F2000 (Camo) + F2000 (Camo) F2000 @@ -1290,6 +1340,8 @@ F2000 F2000 F2000 + F2000 + F2000 F2000 Tactical (Camo) @@ -1299,7 +1351,9 @@ F2000 Tactical (Camo) F2000 Tactical (Terepmintás) F2000 Tactical (Camuflaje) - F2000 Tactical (камо) + F2000 Tactical (Камо) + F2000 Tactical (Camo) + F2000 Tactical (Camo) F2000 Tactical @@ -1310,6 +1364,8 @@ F2000 Tactical F2000 Tactical F2000 Tactical + F2000 Tactical + F2000 Tactical F2000 EGLM (Camo) @@ -1319,7 +1375,9 @@ F2000 EGLM (Camo) F2000 EGLM (Terepmintás) F2000 EGLM (Camuflaje) - F2000 EGLM (камо) + F2000 EGLM (Камо) + F2000 EGLM (Camo) + F2000 EGLM (Camo) F2000 EGLM @@ -1330,6 +1388,8 @@ F2000 EGLM F2000 EGLM F2000 EGLM + F2000 EGLM + F2000 EGLM TAR-21 @@ -1340,6 +1400,8 @@ TAR-21 TAR-21 TAR-21 + TAR-21 + TAR-21 CTAR-21 @@ -1350,6 +1412,8 @@ CTAR-21 CTAR-21 CTAR-21 + CTAR-21 + CTAR-21 TAR-21 EGLM @@ -1360,6 +1424,8 @@ TAR-21 EGLM TAR-21 EGLM TAR-21 EGLM + TAR-21 EGLM + TAR-21 EGLM Vector SMG @@ -1370,6 +1436,8 @@ Vector SMG Vector SMG Vector SMG + Vector SMG + Vector SMG Scorpion Evo 3 A1 @@ -1380,6 +1448,8 @@ Scorpion Evo 3 A1 Scorpion Evo 3 A1 Scorpion Evo 3 A1 + Scorpion Evo 3 A1 + Scorpion Evo 3 A1 CPW @@ -1390,6 +1460,8 @@ CPW CPW CPW + CPW + CPW RFB SDAR @@ -1400,6 +1472,8 @@ RFB SDAR RFB SDAR RFB SDAR + RFB SDAR + RFB SDAR Stoner 99 LMG @@ -1410,6 +1484,8 @@ Stoner 99 Könnyűgéppuska Stoner 99 LMG Stoner 99 LMG + Stoner 99 LMG + Stoner 99 LMG Negev NG7 @@ -1420,6 +1496,8 @@ Negev NG7 Negev NG7 Negev NG7 + Negev NG7 + Negev NG7 Mk14 Mod 1 EBR @@ -1430,6 +1508,8 @@ Mk14 Mod 1 EBR Mk14 Mod 1 EBR Mk14 Mod 1 EBR + Mk14 Mod 1 EBR + Mk14 Mod 1 EBR GM6 Lynx @@ -1440,6 +1520,8 @@ GM6 Gepárd GM6 Lynx GM6 Lynx + GM6 Lynx + GM6 Lynx GM6 Lynx (Camo) @@ -1450,6 +1532,8 @@ GM6 Gepárd (Terepmintás) GM6 Lynx (Camuflaje) GM6 Lynx (камо) + GM6 Lynx (Camo) + GM6 Lynx (Camo) M200 Intervention @@ -1460,6 +1544,8 @@ M200 Intervention M200 Intervention M200 Intervention + M200 Intervention + M200 Intervention M200 Intervention (Camo) @@ -1470,6 +1556,8 @@ M200 Intervention (Terepmintás) M200 Intervention (Camuflaje) M200 Intervention (камо) + M200 Intervention (Camo) + M200 Intervention (Camo) VS-121 @@ -1480,202 +1568,288 @@ VS-121 VS-121 VS-121 + VS-121 + VS-121 - TODO: MAR-10 .338 - TODO: MAR-10 .338 - MAR-10 .338 - TODO: MAR-10 .338 - TODO: MAR-10 .338 + Noreen "Bad News" ULR + Noreen "Bad News" ULR + Noreen "Bad News" ULR + Noreen "Bad News" ULR + Noreen "Bad News" ULR + Noreen "Bad News" ULR + Noreen "Bad News" ULR + Noreen "Bad News" ULR - TODO: MAR-10 .338 (Black) - TODO: MAR-10 .338 (Black) - MAR-10 .338 (Noir) - TODO: MAR-10 .338 (Negro) - TODO: MAR-10 .338 (черный) + Noreen "Bad News" ULR (Black) + Noreen "Bad News" ULR (Black) + Noreen "Bad News" ULR (Noir) + Noreen "Bad News" ULR (Negro) + Noreen "Bad News" ULR (Чёрный) + Noreen "Bad News" ULR (Schwarz) + Noreen "Bad News" ULR (czarny) + Noreen "Bad News" ULR (Nero) - TODO: MAR-10 .338 (Camo) - TODO: MAR-10 .338 (Camo) - MAR-10 .338 (Camo) - TODO: MAR-10 .338 (Camuflaje) - TODO: MAR-10 .338 (камо) + Noreen "Bad News" ULR (Camo) + Noreen "Bad News" ULR (Camo) + Noreen "Bad News" ULR (Camo) + Noreen "Bad News" ULR (Camuflaje) + Noreen "Bad News" ULR (Камо) + Noreen "Bad News" ULR (Camo) + Noreen "Bad News" ULR (kamuflaż) + Noreen "Bad News" ULR (Camo) - TODO: MAR-10 .338 (Sand) - TODO: MAR-10 .338 (Sand) - MAR-10 .338 (Beige) - TODO: MAR-10 .338 (Arena) - TODO: MAR-10 .338 (песочный) + Noreen "Bad News" ULR (Sand) + Noreen "Bad News" ULR (Sand) + Noreen "Bad News" ULR (Beige) + Noreen "Bad News" ULR (Arena) + Noreen "Bad News" ULR (Песочный) + Noreen "Bad News" ULR (Sand) + Noreen "Bad News" ULR (piaskowy) + Noreen "Bad News" ULR (Sabbia) - SG 556 7.62 mm - SG 556 7.62 mm - SG 556 7.62 mm - SG 556 7.62 mm - SG 556 7.62 мм + SIG 556 + SIG 556 + SIG 556 + SIG 556 + SIG 556 + SIG 556 + SIG 556 + SIG 556 - SG 556 7.62 mm (Black) - SG 556 7.62 mm (Black) - SG 556 7.62 mm (Noir) - SG 556 7.62 mm (Negro) - SG 556 7.62 мм (черный) + SIG 556 (Black) + SIG 556 (Black) + SIG 556 (Noir) + SIG 556 (Negro) + SIG 556 (Чёрный) + SIG 556 (czarny) + SIG 556 (Schwarz) + SIG 556 (Nero) - SG 556 7.62 mm (Khaki) - SG 556 7.62 mm (Khaki) - SG 556 7.62 mm (Kaki) - SG 556 7.62 mm (Caqui) - SG 556 7.62 мм (хаки) + SIG 556 (Khaki) + SIG 556 (Khaki) + SIG 556 (Kaki) + SIG 556 (Caqui) + SIG 556 (Хаки) + SIG 556 (khaki) + SIG 556 (Khaki) + SIG 556 (Khaki) - SG 556 7.62 mm (Sand) - SG 556 7.62 mm (Sand) - SG 556 7.62 mm (Beige) - SG 556 7.62 mm (Arena) - SG 556 7.62 мм (песочный) + SIG 556 (Sand) + SIG 556 (Sand) + SIG 556 (Beige) + SIG 556 (Arena) + SIG 556 (Песочный) + SIG 556 (piaskowy) + SIG 556 (Sand) + SIG 556 (Sabbia) - SG 556 7.62 mm (Camo) - SG 556 7.62 mm (Camo) - SG 556 7.62 mm (Camo) - SG 556 7.62 mm (Camuflaje) - SG 556 7.62 мм (камо) + SIG 556 (Camo) + SIG 556 (Camo) + SIG 556 (Camo) + SIG 556 (Camuflaje) + SIG 556 (Камо) + SIG 556 (kamuflaż) + SIG 556 (Camo) + SIG 556 (Camo) - SG 556 7.62 mm (Woodland) - SG 556 7.62 mm (Woodland) - SG 556 7.62 mm (Woodland) - SG 556 7.62 mm (Bosque) - SG 556 7.62 мм (лесной) + SIG 556 (Woodland) + SIG 556 (Woodland) + SIG 556 (Woodland) + SIG 556 (Bosque) + SIG 556 (Лесной) + SIG 556 (leśny) + SIG 556 (Woodland) + SIG 556 (Woodland) - SG 556 7.62 mm (provisional) spotter - SG 556 7.62 mm (provisional) spotter - SG 556 7.62 mm (provisoire) Observateur - SG 556 7.62 mm (provisional) observador - SG 556 7.62 мм (provisional) корректировщик + SIG 556 (provisional) spotter + SIG 556 (provisional) spotter + SIG 556 (provisoire) Observateur + SIG 556 (provisional) observador + SIG 556 (provisional) корректировщик + SIG 556 (prowizoryczny) obserwator + SIG 556 (provisorisch) Beobachter + SIG 556 (provisional) spotter - TODO: ASP-1 Kir 12.7 mm - TODO: ASP-1 Kir 12.7 mm - ASP-1 Kir 12.7 mm - TODO: ASP-1 Kir 12.7 mm - TODO: ASP-1 Kir 12.7 мм + ASP-1 Kir + ASP-1 Kir + ASP-1 Kir + ASP-1 Kir + ASP-1 Kir + ASP-1 Kir + ASP-1 Kir + ASP-1 Kir - TODO: ASP-1 Kir 12.7 mm (Black) - TODO: ASP-1 Kir 12.7 mm (Black) - ASP-1 Kir 12.7 mm (Noir) - TODO: ASP-1 Kir 12.7 mm (Negro) - TODO: ASP-1 Kir 12.7 мм (черный) + ASP-1 Kir (Black) + ASP-1 Kir (Black) + ASP-1 Kir (Noir) + ASP-1 Kir (Negro) + ASP-1 Kir (Чёрный) + ASP-1 Kir (Schwarz) + ASP-1 Kir (czarny) + ASP-1 Kir (Nero) - TODO: ASP-1 Kir 12.7 mm (Tan) - TODO: ASP-1 Kir 12.7 mm (Tan) - ASP-1 Kir 12.7 mm (Tan) - TODO: ASP-1 Kir 12.7 mm (Tan) - TODO: ASP-1 Kir 12.7 мм (бронзовый) + ASP-1 Kir (Tan) + ASP-1 Kir (Tan) + ASP-1 Kir (Tan) + ASP-1 Kir (Tan) + ASP-1 Kir (Бронзовый) + ASP-1 Kir (Hellbraun) + ASP-1 Kir (Tan) + ASP-1 Kir (Tan) - TODO: Cyrus 9.3 mm - TODO: Cyrus 9.3 mm - Cyrus 9.3 mm - TODO: Cyrus 9.3 mm - TODO: Cyrus 9.3 мм + Cyrus + Cyrus + Cyrus + Cyrus + Cyrus + Cyrus + Cyrus + Cyrus - TODO: Cyrus 9.3 mm (Black) - TODO: Cyrus 9.3 mm (Black) - Cyrus 9.3 mm (Noir) - TODO: Cyrus 9.3 mm (Negro) - TODO: Cyrus 9.3 мм (черный) + Cyrus (Black) + Cyrus (Black) + Cyrus (Noir) + Cyrus (Negro) + Cyrus (Чёрный) + Cyrus (Schwarz) + Cyrus (czarny) + Cyrus (Nero) - TODO: Cyrus 9.3 mm (Hex) - TODO: Cyrus 9.3 mm (Hex) - Cyrus 9.3 mm (Hex) - TODO: Cyrus 9.3 mm (Hex) - TODO: Cyrus 9.3 мм (гекс) + Cyrus (Hex) + Cyrus (Hex) + Cyrus (Hex) + Cyrus (Hex) + Cyrus (Гекс) + Cyrus (Hex) + Cyrus (hex) + Cyrus (Hex) - TODO: Cyrus 9.3 mm (Tan) - TODO: Cyrus 9.3 mm (Tan) - Cyrus 9.3 mm (Tan) - TODO: Cyrus 9.3 mm (Tan) - TODO: Cyrus 9.3 мм (бронза) + Cyrus (Tan) + Cyrus (Tan) + Cyrus (Tan) + Cyrus (Tan) + Cyrus (Бронза) + Cyrus (Hellbraun) + Cyrus (podpalany) + Cyrus (Tan) - M14 7.62 mm - M14 7.62 mm - M14 7.62 mm - M14 7.62 mm - M14 7.62 мм + M14 + M14 + M14 + M14 + M14 + M14 + M14 + M14 - M14 7.62 mm (Camo) - M14 7.62 mm (Camo) - M14 7.62 mm (Camo) - M14 7.62 mm (Camuflaje) - M14 7.62 мм (Камо) + M14 (Camo) + M14 (Camo) + M14 (Camo) + M14 (Camuflaje) + M14 (Камо) + M14 (kamuflaż) + M14 (Camo) + M14 (Camo) - M14 7.62 mm (Olive) - M14 7.62 mm (Olive) - M14 7.62 mm (Olive) - M14 7.62 mm (Oliva) - M14 7.62 мм (Олива) + M14 (Olive) + M14 (Olive) + M14 (Olive) + M14 (Oliva) + M14 (Олива) + M14 (oliwkowy) + M14 (Olive) + M14 (Olive) - TODO: Navid 9.3 mm - TODO: Navid 9.3 mm - Navid 9.3 mm - TODO: Navid 9.3 mm - TODO: Navid 9.3 мм + HK121 + HK121 + HK121 + HK121 + HK121 + HK121 + HK121 + HK121 - TODO: Navid 9.3 mm (Hex) - TODO: Navid 9.3 mm (Hex) - Navid 9.3 mm (Hex) - TODO: Navid 9.3 mm (Hex) - TODO: Navid 9.3 мм (гекс) + HK121 (Hex) + HK121 (Hex) + HK121 (Hex) + HK121 (Hex) + HK121 (Гекс) + HK121 (Hex) + HK121 (hex) + HK121 (Hex) - TODO: Navid 9.3 mm (Tan) - TODO: Navid 9.3 mm (Tan) - Navid 9.3 mm (Tan) - TODO: Navid 9.3 mm (Tan) - TODO: Navid 9.3 мм (бронза) + HK121 (Tan) + HK121 (Tan) + HK121 (Tan) + HK121 (Tan) + HK121 (Бронза) + HK121 (Hellbraun) + HK121 (podpalany) + HK121 (Tan) - LWMMG .338 - LWMMG .338 - LWMMG .338 - LWMMG .338 - LWMMG .338 + LWMMG + LWMMG + LWMMG + LWMMG + LWMMG + LWMMG + LWMMG + LWMMG - LWMMG .338 (MTP) - LWMMG .338 (MTP) - LWMMG .338 (MTP) - LWMMG .338 (MTP) - LWMMG .338 (MTP) + LWMMG (MTP) + LWMMG (MTP) + LWMMG (MTP) + LWMMG (MTP) + LWMMG (MTP) + LWMMG (MTP) + LWMMG (MTP) + LWMMG (MTP) - LWMMG .338 (Black) - LWMMG .338 (Black) - LWMMG .338 (Noir) - LWMMG .338 (Negro) - LWMMG .338 (Черный) + LWMMG (Black) + LWMMG (Black) + LWMMG (Noir) + LWMMG (Negro) + LWMMG (Чёрный) + LWMMG (czarny) + LWMMG (Schwarz) + LWMMG (Nero) - LWMMG .338 (Sand) - LWMMG .338 (Sand) - SPMG .338 (Beige) - LWMMG .338 (Arena) - LWMMG .338 (Песочный) + LWMMG (Sand) + LWMMG (Sand) + SPMG (Beige) + LWMMG (Arena) + LWMMG (Песочный) + LWMMG (piaskowy) + LWMMG (Sand) + LWMMG (Sabbia) - + \ No newline at end of file diff --git a/addons/recoil/CfgEventHandlers.hpp b/addons/recoil/CfgEventHandlers.hpp new file mode 100644 index 0000000000..60fc3892fc --- /dev/null +++ b/addons/recoil/CfgEventHandlers.hpp @@ -0,0 +1,14 @@ + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; + +class Extended_FiredBIS_EventHandlers { + class CAManBase { + class ADDON { + clientFiredBIS = QUOTE(if (_this select 0 == ACE_player) then {_this call FUNC(camshake)};); + }; + }; +}; diff --git a/addons/recoil/CfgMoves.hpp b/addons/recoil/CfgMoves.hpp new file mode 100644 index 0000000000..ecad382cb5 --- /dev/null +++ b/addons/recoil/CfgMoves.hpp @@ -0,0 +1,85 @@ + +// Completely disable BI's camshake on fire. +#define ACE_CAMSHAKEFIRE_BASE 0 +#define ACE_CAMSHAKEFIRE_LESS 0 +#define ACE_CAMSHAKEFIRE_MORE 0 + +// Go through all modes that have a camshakefire defined and change it to ours. +class CfgMovesBasic { + class Default { + camShakeFire = ACE_CAMSHAKEFIRE_NORMAL; + }; +}; + +class CfgMovesMaleSdr: CfgMovesBasic { + class States { + class AmovPercMstpSlowWrflDnon; + class AmovPknlMstpSlowWrflDnon: AmovPercMstpSlowWrflDnon { + camShakeFire = ACE_CAMSHAKEFIRE_LESS; + }; + + class AmovPercMstpSrasWrflDnon; + class AmovPpneMstpSrasWrflDnon: AmovPercMstpSrasWrflDnon { + camShakeFire = ACE_CAMSHAKEFIRE_LESS; + }; + + class AmovPknlMstpSrasWlnrDnon: Default { + camShakeFire = ACE_CAMSHAKEFIRE_LESS; + }; + + class AmovPknlMrunSlowWrflDf; + class AmovPknlMtacSlowWrflDf: AmovPknlMrunSlowWrflDf { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + + class AmovPknlMrunSlowWrflDfl; + class AmovPknlMtacSlowWrflDfl: AmovPknlMrunSlowWrflDfl { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + + class AmovPknlMrunSlowWrflDl; + class AmovPknlMtacSlowWrflDl: AmovPknlMrunSlowWrflDl { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + + class AmovPknlMrunSlowWrflDbl; + class AmovPknlMtacSlowWrflDbl: AmovPknlMrunSlowWrflDbl { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + + class AmovPknlMrunSlowWrflDb; + class AmovPknlMtacSlowWrflDb: AmovPknlMrunSlowWrflDb { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + + class AmovPknlMrunSlowWrflDbr; + class AmovPknlMtacSlowWrflDbr: AmovPknlMrunSlowWrflDbr { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + + class AmovPknlMrunSlowWrflDr; + class AmovPknlMtacSlowWrflDr: AmovPknlMrunSlowWrflDr { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + + class AmovPknlMrunSlowWrflDfr; + class AmovPknlMtacSlowWrflDfr: AmovPknlMrunSlowWrflDfr { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + + class AmovPknlMstpSrasWrflDnon; + class AmovPknlMwlkSrasWrflDf: AmovPknlMstpSrasWrflDnon { + camShakeFire = ACE_CAMSHAKEFIRE_NORMAL; + }; + + class AmovPknlMrunSrasWrflDf; + class AmovPknlMtacSrasWrflDf: AmovPknlMrunSrasWrflDf { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + + class AmovPknlMwlkSrasWpstDf; + class AmovPknlMtacSrasWpstDf: AmovPknlMwlkSrasWpstDf { + camShakeFire = ACE_CAMSHAKEFIRE_MORE; + }; + }; +}; diff --git a/addons/recoil/CfgRecoils.hpp b/addons/recoil/CfgRecoils.hpp index 56a28f1dc1..4b473919d5 100644 --- a/addons/recoil/CfgRecoils.hpp +++ b/addons/recoil/CfgRecoils.hpp @@ -1,11 +1,11 @@ -#define KICKBACK 1.6 +#define KICKBACK 1.4 -#define MUZZLETEMP 1 -#define MUZZLEPERM 0.1 +#define MUZZLETEMP 1.2 +#define MUZZLEPERM 0.4 #define MUZZLECLIMB_POS 1 -#define MUZZLERIGHT_POS 0.4 +#define MUZZLERIGHT_POS 0.2 #define MUZZLECLIMB_MAG 1 #define MUZZLERIGHT_MAG 1 @@ -70,7 +70,7 @@ class CfgRecoils { class recoil_sw: recoil_default { muzzleOuter[] = {0.3*MUZZLERIGHT_POS,0.8*MUZZLECLIMB_POS,0.5*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; kickBack[] = {0.02*KICKBACK,0.04*KICKBACK}; - temporary = 0.005*MUZZLETEMP; + temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; }; class recoil_mxm: recoil_default { @@ -178,13 +178,13 @@ class CfgRecoils { class recoil_mk200: recoil_default { muzzleOuter[] = {0.4*MUZZLERIGHT_POS,0.6*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.2*MUZZLECLIMB_MAG}; kickBack[] = {0.03*KICKBACK,0.06*KICKBACK}; - temporary = 0.005*MUZZLETEMP; + temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; }; class recoil_zafir: recoil_default { muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1*MUZZLECLIMB_POS,0.7*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; kickBack[] = {0.02*KICKBACK,0.08*KICKBACK}; - temporary = 0.005*MUZZLETEMP; + temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; }; class recoil_m320: recoil_default { @@ -244,12 +244,12 @@ class CfgRecoils { class recoil_mmg_01: recoil_default { muzzleOuter[] = {0.6*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.8*MUZZLERIGHT_MAG,0.3*MUZZLECLIMB_MAG}; kickBack[] = {0.02*KICKBACK,0.08*KICKBACK}; - temporary = 0.005*MUZZLETEMP; + temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; }; class recoil_mmg_02: recoil_default { muzzleOuter[] = {0.5*MUZZLERIGHT_POS,1.5*MUZZLECLIMB_POS,0.6*MUZZLERIGHT_MAG,0.4*MUZZLECLIMB_MAG}; kickBack[] = {0.04*KICKBACK,0.08*KICKBACK}; - temporary = 0.005*MUZZLETEMP; + temporary = 0.01*MUZZLETEMP; //0.005*MUZZLETEMP; }; }; diff --git a/addons/recoil/XEH_preInit.sqf b/addons/recoil/XEH_preInit.sqf new file mode 100644 index 0000000000..f6d04886c1 --- /dev/null +++ b/addons/recoil/XEH_preInit.sqf @@ -0,0 +1,8 @@ +// by commy2 +#include "script_component.hpp" + +ADDON = false; + +PREP(camshake); + +ADDON = true; diff --git a/addons/recoil/config.cpp b/addons/recoil/config.cpp index 1e2ce69fae..5b8002bc37 100644 --- a/addons/recoil/config.cpp +++ b/addons/recoil/config.cpp @@ -12,4 +12,12 @@ class CfgPatches { }; }; +#include "CfgEventHandlers.hpp" + +#include "CfgMoves.hpp" #include "CfgRecoils.hpp" + +class CfgCameraShake { + // What does this do, really? It seems like the engine no longer respects it. + defaultCaliberCoefWeaponFire = 0; +}; diff --git a/addons/recoil/functions/fnc_camshake.sqf b/addons/recoil/functions/fnc_camshake.sqf new file mode 100644 index 0000000000..806d48760b --- /dev/null +++ b/addons/recoil/functions/fnc_camshake.sqf @@ -0,0 +1,67 @@ +// TMR: Small Arms - Recoil initialization and functions +// (C) 2013 Ryan Schultz. See LICENSE. +// Edited prefixes for compatability in AGM_Realism by KoffeinFlummi +// Edited by commy2 +#include "script_component.hpp" + +#define BASE_POWER 0.40 +#define BASE_TIME 0.19 +#define BASE_FREQ 13 +#define RECOIL_COEF 40 + +private ["_unit", "_weapon", "_muzzle"]; + +_unit = _this select 0; +_weapon = _this select 1; +_muzzle = _this select 2; + +if (toLower _weapon in ["throw", "put"]) exitWith {}; + +private ["_powerMod", "_timeMod", "_freqMod"]; + +_powerMod = ([0, -0.1, -0.1, 0, -0.2] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find stance _unit)) + ([0, -1, 0, -1] select (["INTERNAL", "EXTERNAL", "GUNNER", "GROUP"] find cameraView)); +_timeMod = 0; +_freqMod = 0; + +// to get camshake read kickback +private ["_config", "_recoil"]; + +_config = configFile >> "CfgWeapons" >> _weapon; +_recoil = if (_muzzle == _weapon) then { + getText (_config >> "recoil") +} else { + getText (_config >> _muzzle >> "recoil") +}; + +if (isClass (configFile >> "CfgRecoils" >> _recoil)) then { + _recoil = getArray (configFile >> "CfgRecoils" >> _recoil >> "kickBack"); + if (count _recoil < 2) then { + _recoil = [0, 0]; + }; +} else { + _recoil = [0, 0]; +}; + +// parse numbers +_recoil set [0, call compile format ["%1", _recoil select 0]]; +_recoil set [1, call compile format ["%1", _recoil select 1]]; + +private "_powerCoef"; +_powerCoef = RECOIL_COEF * linearConversion [0, 1, random 1, _recoil select 0, _recoil select 1, false]; + +if (isWeaponRested _unit) then {_powerMod = _powerMod - 0.07}; +if (isWeaponDeployed _unit) then {_powerMod = _powerMod - 0.11}; + +private "_camshake"; +_camshake = [ + _powerCoef * (BASE_POWER + _powerMod) max 0, + BASE_TIME + _timeMod max 0, + BASE_FREQ + _freqMod max 0 +]; + +/* + systemChat str _camshake; + copyToClipboard format ["addCamShake %1;", _camshake]; +*/ + +addCamShake _camshake; diff --git a/addons/recoil/functions/script_component.hpp b/addons/recoil/functions/script_component.hpp new file mode 100644 index 0000000000..24cb1ba776 --- /dev/null +++ b/addons/recoil/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\recoil\script_component.hpp" \ No newline at end of file diff --git a/addons/reload/stringtable.xml b/addons/reload/stringtable.xml index ceaf32c2d8..1bad20f53a 100644 --- a/addons/reload/stringtable.xml +++ b/addons/reload/stringtable.xml @@ -11,6 +11,7 @@ Vérification des munitions au rechargement Lőszer ellenőrzése a fegyver újratöltésekor Controlla le munizioni ricaricando + Conferir munição ao recarregar a arma Check the ammo in your new magazine on magazine reload. @@ -22,6 +23,7 @@ Vérification du nombre de munition au rechargement A lőszer ellenőrzése az új tárad behelyezésekor újratöltés közben. Controlla le munizioni rimanenti nel caricatore in fase di cambio caricatore. + Confere a munição no seu novo carregador ao recarregar a arma Check Ammo @@ -57,6 +59,7 @@ Gurt anhängen Töltényheveder összekötése Attacca la tracolla + Ligar cintos de munição Linking belt... @@ -68,6 +71,7 @@ Gurt anhängen ... Töltényheveder összekötése folyamatban... Attacco la tracolla... + Ligando cintos... diff --git a/addons/reloadlaunchers/stringtable.xml b/addons/reloadlaunchers/stringtable.xml index 7716050334..acb16bc92c 100644 --- a/addons/reloadlaunchers/stringtable.xml +++ b/addons/reloadlaunchers/stringtable.xml @@ -1,5 +1,4 @@  - @@ -12,6 +11,7 @@ Charger lanceur Kilövö betöltése Carica lanciamissili + Recarregar lançador Loading launcher ... @@ -23,17 +23,19 @@ Ładowanie wyrzutni ... Kilövő betöltés alatt ... Carico il lanciamissili ... + Recarregando lançador... Launcher loaded Lanceur chargé Panzerabwehr geladen Lanzador cargado - ПУ заряжено + ПУ заряжена Odpalovač nabit Wyrzutnia załadowana Kilövő betöltve Lanciamissili caricato + Lançador Carregado Load %1 @@ -45,6 +47,7 @@ Załadowano %1 %1 betöltése Caricato %1 + Recarregar %1 diff --git a/addons/respawn/functions/fnc_module.sqf b/addons/respawn/functions/fnc_module.sqf index 4f22bdfcd4..3f1ef89a1f 100644 --- a/addons/respawn/functions/fnc_module.sqf +++ b/addons/respawn/functions/fnc_module.sqf @@ -1,19 +1,19 @@ /* - Name: ACE_Respawn_fnc_module + Name: ACE_Respawn_fnc_module - Author(s): - KoffeinFlummi, bux578, esteldunedain, commy2 + Author(s): + KoffeinFlummi, bux578, esteldunedain, commy2 - Description: - initializes the respawn module + Description: + initializes the respawn module - Parameters: - 0: OBJECT - logic - 1: ARRAY - synced units - 2: BOOLEAN - activated + Parameters: + 0: OBJECT - logic + 1: ARRAY - synced units + 2: BOOLEAN - activated - Returns: - VOID + Returns: + VOID */ #include "script_component.hpp" @@ -31,21 +31,17 @@ GVAR(Module) = true; if (isServer) then { if (GVAR(RemoveDeadBodiesDisconnected)) then { - private "_fnc_deleteDisconnected"; - _fnc_deleteDisconnected = { - _this spawn { + addMissionEventHandler ["HandleDisconnect", { + [{ PARAMS_1(_unit); - sleep 4; - if (!alive _unit) then { deleteVehicle _unit; }; - }; + }, + _this, 4, 1] call EFUNC(common,waitAndExecute); false - }; - - addMissionEventHandler ["HandleDisconnect", _fnc_deleteDisconnected]; + }]; }; }; diff --git a/addons/respawn/functions/fnc_moveRallypoint.sqf b/addons/respawn/functions/fnc_moveRallypoint.sqf index 2453c68344..da9054e6aa 100644 --- a/addons/respawn/functions/fnc_moveRallypoint.sqf +++ b/addons/respawn/functions/fnc_moveRallypoint.sqf @@ -1,47 +1,51 @@ /* - Name: ACE_Respawn_fnc_moveRallypoint - - Author(s): - commy2 - - Description: - Moves a rallypoint to the player's location - - Parameters: - 0: OBJECT - unit - 1: OBJECT - side - - Returns: - VOID + Name: ACE_Respawn_fnc_moveRallypoint + + Author(s): + commy2 + + Description: + Moves a rallypoint to the player's location + + Parameters: + 0: OBJECT - unit + 1: OBJECT - side + + Returns: + VOID */ #include "script_component.hpp" -_this spawn { - PARAMS_2(_unit,_side); - - private ["_rallypoint", "_position"]; - - // rallypoint names are defined in CfgVehicles.hpp +PARAMS_2(_unit,_side); - _rallypoint = [ - objNull, - missionNamespace getVariable ["ACE_Rallypoint_West", objNull], - missionNamespace getVariable ["ACE_Rallypoint_East", objNull], - missionNamespace getVariable ["ACE_Rallypoint_Independent", objNull] - ] select ([west, east, independent] find _side) + 1; +private ["_rallypoint", "_position"]; - if (isNull _rallypoint) exitWith {}; +// rallypoint names are defined in CfgVehicles.hpp - _position = getPosATL _unit; - _position = _position findEmptyPosition [0, 2, typeOf _rallypoint]; - if (count _position == 0) then {_position = getPosATL _unit}; +_rallypoint = [ + objNull, + missionNamespace getVariable ["ACE_Rallypoint_West", objNull], + missionNamespace getVariable ["ACE_RallypointExit_East", objNull], + missionNamespace getVariable ["ACE_RallypointExit_Independent", objNull] +] select ([west, east, independent] find _side) + 1; - _position set [2, 0]; +if (isNull _rallypoint) exitWith {}; - [localize "STR_ACE_Respawn_Deploy"] call EFUNC(common,displayTextStructured); +_position = getPosATL _unit; +_position = _position findEmptyPosition [0, 2, typeOf _rallypoint]; +if (count _position == 0) then {_position = getPosATL _unit}; + +_position set [2, 0]; + +[localize "STR_ACE_Respawn_Deploy"] call EFUNC(common,displayTextStructured); + +[{ + _rallypoint = _this select 0; + _unit = _this select 1; + _position = _this select 2; + _rallypoint = _this select 3; - sleep 5; _rallypoint setPosATL _position; _unit reveal _rallypoint; @@ -50,4 +54,5 @@ _this spawn { ["rallypointMoved", [_rallypoint, _side, _position]] call EFUNC(common,globalEvent); [localize "STR_ACE_Respawn_Deployed"] call EFUNC(common,displayTextStructured); -}; +}, +[_rallypoint, _unit, _position, _rallypoint], 5, 1] call EFUNC(common,waitAndExecute); diff --git a/addons/respawn/functions/fnc_removeBody.sqf b/addons/respawn/functions/fnc_removeBody.sqf index 5c3ed14988..e00f633e6c 100644 --- a/addons/respawn/functions/fnc_removeBody.sqf +++ b/addons/respawn/functions/fnc_removeBody.sqf @@ -1,22 +1,22 @@ /* Name: ACE_Respawn_fnc_removeBody - + Author(s): bux578 - + Description: removes a given body - + Parameters: 0: OBJECT - body 1: BOOLEAN - forceRemove // not used atm - + Returns: VOID */ #include "script_component.hpp" - + private ["_body", "_forceRemove", "_bodyRemoveTimer"]; _body = _this select 0; @@ -29,9 +29,8 @@ if (_forceRemove) then { _bodyRemoveTimer = 2; }; -[_body, _bodyRemoveTimer] spawn { - sleep (_this select 1); +[{ // hideBody takes ~20s till body is fully underground // a better hideBody would make this more aesthetic - deleteVehicle (_this select 0); -}; + deleteVehicle _this; +}, _body, _bodyRemoveTimer, 1] call EFUNC(common,waitAndExecute); diff --git a/addons/respawn/stringtable.xml b/addons/respawn/stringtable.xml index 75f711e20e..cfd1d51bb9 100644 --- a/addons/respawn/stringtable.xml +++ b/addons/respawn/stringtable.xml @@ -11,6 +11,7 @@ Respawn za 5 sekund... Kihelyezés 5 másodperc múlva ... Dispiegamento in 5 secondi ... + Será posicionado em 5 segundos ... Rallypoint deployed @@ -22,6 +23,7 @@ Rallypoint umístěn Gyülekezőpont elhelyezve Rallypoint dispiegato + Rallypoints posicionado Teleported to Base @@ -33,6 +35,7 @@ Odteleportován na základnu Bázisra teleportálva Teleportato alla base + Teletransportado para a Base Teleported to Rallypoint @@ -44,6 +47,7 @@ Odteleportován na rallypoint Gyülekezőpontra teleportálva Teleportato al rallypoint + Teletransportado para o Rallypoints Rallypoint West (Base) @@ -52,6 +56,7 @@ Точка сбора Синих (База) Punkt zbiórki Zachodu (Baza) Point de ralliement OUEST (Base) + Rallypoint West (Base) Rallypoint East (Base) @@ -60,6 +65,7 @@ Точка сбора Красных (База) Punkt zbiórki Wschodu (Baza) Point de ralliement EST (Base) + Rallypoint East (Base) Rallypoint Independent (Base) @@ -68,6 +74,7 @@ Точка сбора Независимых (База) Punkt zbiórki Ruchu oporu (Baza) Point de ralliement Indépendant (Base) + Rallypoint Independent (Base) Rallypoint West @@ -76,6 +83,7 @@ Точка сбора Синих Punkt zbiórki Zachodu Point de ralliement OUEST + Rallypoint West Rallypoint East @@ -84,6 +92,7 @@ Точка сбора Красных Punkt zbiórki Wschodu Point de ralliement EST + Rallypoint East Rallypoint Independent @@ -92,6 +101,7 @@ Точка сбора Независимых Punkt zbiórki Ruchu oporu Point de ralliement Indépendant + Rallypoint Independent diff --git a/addons/safemode/stringtable.xml b/addons/safemode/stringtable.xml index 521651999a..f39ca84614 100644 --- a/addons/safemode/stringtable.xml +++ b/addons/safemode/stringtable.xml @@ -11,6 +11,7 @@ Предохранитель Sécurité Sicura inserita + Modo de segurança Take off Safety @@ -22,6 +23,7 @@ Снять с предохранителя Enlever sécurité Togli la sicura + Tirar segurança Put on Safety @@ -33,6 +35,7 @@ Поставить на предохранитель Sécurité mise Inserisci la sicura + Colocar Segurança Took off Safety @@ -44,6 +47,7 @@ Снят с предохранителя Sécurité enlevée Togli la sicura + Tirou Segurança diff --git a/addons/scopes/CfgWeapons.hpp b/addons/scopes/CfgWeapons.hpp index 6ca522ced7..526282a1b6 100644 --- a/addons/scopes/CfgWeapons.hpp +++ b/addons/scopes/CfgWeapons.hpp @@ -71,4 +71,18 @@ class CfgWeapons { }; }; }; + + class optic_KHS_old : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class KHS { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; }; diff --git a/addons/scopes/functions/fnc_adjustScope.sqf b/addons/scopes/functions/fnc_adjustScope.sqf index d13ff57ffc..31b85f309e 100644 --- a/addons/scopes/functions/fnc_adjustScope.sqf +++ b/addons/scopes/functions/fnc_adjustScope.sqf @@ -17,6 +17,7 @@ PARAMS_3(_unit,_turretAndDirection,_majorStep); if (!(_unit isKindOf "Man")) exitWith {false}; +if (currentMuzzle _unit != currentWeapon _unit) exitWith {false}; private ["_weaponIndex", "_zeroing", "_optic", "_increment", "_maxVertical", "_maxHorizontal", "_elevation", "_windage", "_zero", "_adjustment"]; @@ -37,7 +38,7 @@ _increment = getNumber (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust _maxVertical = getArray (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust_Vertical"); _maxHorizontal = getArray (configFile >> "CfgWeapons" >> _optic >> "ACE_ScopeAdjust_Horizontal"); -if ((count _maxHorizontal < 2) or (count _maxVertical < 2)) exitWith {false}; +if ((_increment == 0) or (count _maxHorizontal < 2) or (count _maxVertical < 2)) exitWith {false}; _zeroing = _adjustment select _weaponIndex; _elevation = _zeroing select 0; diff --git a/addons/switchunits/stringtable.xml b/addons/switchunits/stringtable.xml index 58b0b46d6d..16ce6ae281 100644 --- a/addons/switchunits/stringtable.xml +++ b/addons/switchunits/stringtable.xml @@ -11,6 +11,7 @@ Unité changée Egység átváltva Cambia unità + Trocado de unidade This unit is too close to the enemy. @@ -22,6 +23,7 @@ Cette unité est trop proche des ennemis Ez az egység túl közel van az ellenséghez. Questa unità è troppo vicina al nemico. + Essa unidade está muito perta do inimigo. diff --git a/addons/vector/stringtable.xml b/addons/vector/stringtable.xml index 05289d189f..edef7a7bea 100644 --- a/addons/vector/stringtable.xml +++ b/addons/vector/stringtable.xml @@ -1,18 +1,17 @@  - - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV - Vector IV + Vector 21 + Vector 21 + Vector 21 + Vector 21 + Vector 21 + Vector 21 + Vector 21 + Vector 21 + Vector 21 + Vector 21 Rangefinder diff --git a/addons/vehiclelock/CfgEventHandlers.hpp b/addons/vehiclelock/CfgEventHandlers.hpp index cf704d000c..6fbbd5c243 100644 --- a/addons/vehiclelock/CfgEventHandlers.hpp +++ b/addons/vehiclelock/CfgEventHandlers.hpp @@ -15,3 +15,20 @@ class Extended_InventoryOpened_EventHandlers { }; }; }; +class Extended_InitPost_EventHandlers { + class Car { + class ADDON { + serverInit = QUOTE(_this call FUNC(handleVehicleInitPost)); + }; + }; + class Tank { + class ADDON { + serverInit = QUOTE(_this call FUNC(handleVehicleInitPost)); + }; + }; + class Helicopter { + class ADDON { + serverInit = QUOTE(_this call FUNC(handleVehicleInitPost)); + }; + }; +}; diff --git a/addons/vehiclelock/CfgVehicles.hpp b/addons/vehiclelock/CfgVehicles.hpp index 65ad0568d6..94bcf34317 100644 --- a/addons/vehiclelock/CfgVehicles.hpp +++ b/addons/vehiclelock/CfgVehicles.hpp @@ -1,50 +1,65 @@ #define MACRO_LOCK_ACTIONS \ - class ACE_MainActions { \ + class ACE_SelfActions { \ class ACE_unlockVehicle { \ displayName = "$STR_ACE_Vehicle_Action_UnLock"; \ - distance = 4; \ condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \ statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \ - showDisabled = 0; \ priority = 0.3; \ icon = QUOTE(PATHTOF(UI\key_menuIcon_ca.paa)); \ }; \ class ACE_lockVehicle { \ displayName = "$STR_ACE_Vehicle_Action_Lock"; \ - distance = 4; \ condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \ statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \ - showDisabled = 0; \ priority = 0.2; \ icon = QUOTE(PATHTOF(UI\key_menuIcon_ca.paa)); \ }; \ class ACE_lockpickVehicle { \ displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \ - distance = 4; \ condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \ statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \ - showDisabled = 0; \ priority = 0.1; \ }; \ + }; \ + class ACE_Actions { \ + class ACE_MainActions { \ + class ACE_unlockVehicle { \ + displayName = "$STR_ACE_Vehicle_Action_UnLock"; \ + distance = 4; \ + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \ + statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \ + priority = 0.3; \ + icon = QUOTE(PATHTOF(UI\key_menuIcon_ca.paa)); \ + }; \ + class ACE_lockVehicle { \ + displayName = "$STR_ACE_Vehicle_Action_Lock"; \ + distance = 4; \ + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \ + statement = QUOTE([ARR_3('VehicleLock_SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \ + priority = 0.2; \ + icon = QUOTE(PATHTOF(UI\key_menuIcon_ca.paa)); \ + }; \ + class ACE_lockpickVehicle { \ + displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \ + distance = 4; \ + condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \ + statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \ + priority = 0.1; \ + }; \ + }; \ }; class CfgVehicles { class LandVehicle; class Car: LandVehicle { - class ACE_Actions { - MACRO_LOCK_ACTIONS - }; + MACRO_LOCK_ACTIONS }; class Tank: LandVehicle { - class ACE_Actions { - MACRO_LOCK_ACTIONS - }; + MACRO_LOCK_ACTIONS }; class Air; class Helicopter: Air { - class ACE_Actions { - MACRO_LOCK_ACTIONS - }; + MACRO_LOCK_ACTIONS }; class Logic; @@ -55,7 +70,7 @@ class CfgVehicles { author = "$STR_ACE_Common_ACETeam"; category = "ACE"; displayName = "Vehicle Lock Setup"; - function = QUOTE(DFUNC(moduleInit)); + function = QFUNC(moduleInit); scope = 2; isGlobal = 0; icon = QUOTE(PATHTOF(UI\Icon_Module_VehicleLock_ca.paa)); @@ -67,9 +82,9 @@ class CfgVehicles { typeName = "BOOL"; defaultValue = 0; }; - class SetLockState { - displayName = "Set Lock State"; // Argument label - description = "Set lock state for all vehicles on map at start"; // Tooltip description + class VehicleStartingLockState { + displayName = "Vehicle Starting Lock State"; // Argument label + description = "Set lock state for all vehicles (removes ambiguous lock states)"; // Tooltip description typeName = "NUMBER"; // Value type, can be "NUMBER", "STRING" or "BOOL" class values { class None {name = "As Is"; value = 0; default = 1;}; @@ -93,7 +108,7 @@ class CfgVehicles { author = "$STR_ACE_Common_ACETeam"; category = "ACE"; displayName = "Vehicle Key Assign"; - function = QUOTE(DFUNC(moduleSync)); + function = QFUNC(moduleSync); scope = 2; isGlobal = 0; icon = QUOTE(PATHTOF(UI\Icon_Module_VehicleKey_ca.paa)); diff --git a/addons/vehiclelock/XEH_preInit.sqf b/addons/vehiclelock/XEH_preInit.sqf index bdab28fc75..18a7062c24 100644 --- a/addons/vehiclelock/XEH_preInit.sqf +++ b/addons/vehiclelock/XEH_preInit.sqf @@ -4,6 +4,7 @@ ADDON = false; PREP(addKeyForVehicle); PREP(getVehicleSideKey); +PREP(handleVehicleInitPost); PREP(hasKeyForVehicle); PREP(lockpick); PREP(moduleInit); diff --git a/addons/vehiclelock/config.cpp b/addons/vehiclelock/config.cpp index 248a1e7ca0..76d5817d8d 100644 --- a/addons/vehiclelock/config.cpp +++ b/addons/vehiclelock/config.cpp @@ -7,7 +7,7 @@ class CfgPatches { requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_interaction"}; author[] = {"PabstMirror"}; - authorUrl = "https://github.com/PabstMirror/"; + authorUrl = "https://github.com/acemod/ACE3"; VERSION_CONFIG; }; }; @@ -20,6 +20,10 @@ class ACE_Settings { class GVAR(LockVehicleInventory) { value = 0; typeName = "BOOL"; + }; + class GVAR(VehicleStartingLockState) { + value = -1; + typeName = "SCALAR"; }; }; diff --git a/addons/vehiclelock/functions/fnc_handleVehicleInitPost.sqf b/addons/vehiclelock/functions/fnc_handleVehicleInitPost.sqf new file mode 100644 index 0000000000..5a2bc3f7bd --- /dev/null +++ b/addons/vehiclelock/functions/fnc_handleVehicleInitPost.sqf @@ -0,0 +1,41 @@ +/* + * Author: PabstMirror + * For every lockable vehicle, sets the starting lock state to a sane value. + * Only run if the InitModule is placed. + * + * Arguments: + * 0: Vehicle + * + * Return Value: + * None + * + * Example: + * [car] call ACE_VehicleLock_fnc_handleVehicleInitPost + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_1(_vehicle); + +if (!isServer) exitWith {}; + +[{ + //If the module wasn't placed, just exit (needs to be in wait because objectInitEH is before moduleInit) + if (GVAR(VehicleStartingLockState) == -1) exitWith {}; + private ["_lock"]; + PARAMS_1(_vehicle); + if ((_vehicle isKindOf "Car") || {_vehicle isKindOf "Tank"} || {_vehicle isKindOf "Helicopter"}) then { + //set lock state (eliminates the ambigious 1-"Default" and 3-"Locked for Player" states) + _lock = switch (GVAR(VehicleStartingLockState)) do { + case (0): {(locked _vehicle) in [2, 3]}; + case (1):{true}; + case (2):{false}; + }; + if (((_lock) && {(locked _vehicle) != 2}) || {(!_lock) && {(locked _vehicle) != 0}}) then { + TRACE_3("Setting Lock State",_lock,(typeOf _vehicle),_vehicle); + ["VehicleLock_SetVehicleLock", [_vehicle], [_vehicle, _lock]] call EFUNC(common,targetEvent); + }; + }; + //Delay call until mission start (so everyone has the eventHandler's installed) +}, [_vehicle], 0.25, 0.25] call EFUNC(common,waitAndExecute); diff --git a/addons/vehiclelock/functions/fnc_moduleInit.sqf b/addons/vehiclelock/functions/fnc_moduleInit.sqf index c26e8aacbd..510b8ec7be 100644 --- a/addons/vehiclelock/functions/fnc_moduleInit.sqf +++ b/addons/vehiclelock/functions/fnc_moduleInit.sqf @@ -17,8 +17,6 @@ */ #include "script_component.hpp" -private ["_sideKeysAssignment", "_setLockState", "_lock"]; - PARAMS_3(_logic,_syncedUnits,_activated); if (!_activated) exitWith {WARNING("Vehicle Lock Init Module - placed but not active");}; @@ -27,23 +25,4 @@ if (!isServer) exitWith {}; //Set the GVAR for default lockpick strength [_logic, QGVAR(DefaultLockpickStrength), "DefaultLockpickStrength"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(LockVehicleInventory), "LockVehicleInventory"] call EFUNC(common,readSettingFromModule); - -_setLockState = _logic getVariable["SetLockState", 0]; -[{ - PARAMS_1(_setLockState); - { - if ((_x isKindOf "Car") || {_x isKindOf "Tank"} || {_x isKindOf "Helicopter"}) then { - //set lock state (eliminates the ambigious 1-"Default" and 3-"Locked for Player" states) - _lock = switch (_setLockState) do { - case (0): {(locked _x) in [2, 3]}; - case (1):{true}; - case (2):{false}; - }; - if (((_lock) && {(locked _x) != 2}) || {(!_lock) && {(locked _x) != 0}}) then { - TRACE_3("Setting Lock State", _lock, (typeOf _x), _x); - ["VehicleLock_SetVehicleLock", [_x], [_x, _lock]] call EFUNC(common,targetEvent); - }; - }; - } forEach vehicles; - //Delay call until mission start (so everyone has the eventHandler's installed) -}, [_setLockState], 0.25, 0.25] call EFUNC(common,waitAndExecute); +[_logic, QGVAR(VehicleStartingLockState), "VehicleStartingLockState"] call EFUNC(common,readSettingFromModule); diff --git a/addons/vehiclelock/functions/fnc_onOpenInventory.sqf b/addons/vehiclelock/functions/fnc_onOpenInventory.sqf index 65c3068dce..8199f4b850 100644 --- a/addons/vehiclelock/functions/fnc_onOpenInventory.sqf +++ b/addons/vehiclelock/functions/fnc_onOpenInventory.sqf @@ -34,7 +34,7 @@ if (GVAR(LockVehicleInventory) && //if setting not enabled playSound "ACE_Sound_Click"; //don't open the vehicles inventory _handeled = true; - //Just opens a dummy groundContainer + //Just opens a dummy groundContainer (so the player can still see their own inventory) ACE_player action ["Gear", objNull]; }; diff --git a/addons/vehiclelock/stringtable.xml b/addons/vehiclelock/stringtable.xml index e62f9fdc5f..afcbd14559 100644 --- a/addons/vehiclelock/stringtable.xml +++ b/addons/vehiclelock/stringtable.xml @@ -11,6 +11,7 @@ Jármű nyitása Открыть машину Apri il veicolo + Destravar veículo Lock Vehicle @@ -22,6 +23,7 @@ Jármű zárása Закрыть машину Chiudi il veicolo + Travar Veículo Lockpick Vehicle @@ -33,6 +35,7 @@ Jármű feltörése Взломать замок Scassina veicolo + Usar mixa no Veículo Picking Lock.... @@ -44,6 +47,7 @@ Zár feltörése... Взламываем замок... Scassino il veicolo.... + Usando Mixa... A custom key that will open a specific vehicle. @@ -55,6 +59,7 @@ Egy egyedi kulcs, ami egy meghatározott járművet nyit ki. Ключ от конкретной машины. Una chiave personalizzata che apre determinati veicoli. + Uma chave específica que abre um veículo específico. A Master Key will open any lock, no matter what! @@ -66,6 +71,7 @@ Egy főkulcs, ami minden zárat kinyit, helyzettől függetlenül! Универсальный ключ, открывающий любой замок. Una chiave principale che apre qualsiasi serratura! + Uma chave mestre irá abrir qualquer fechadura, não importa qual! A lockpick set that can pick the locks of most vehicles. @@ -77,6 +83,7 @@ Egy tolvajkulcs-készlet, mely a legtöbb jármű zárjait fel tudja törni. Набор отмычек, которым можно взломать почти любую машину. Un grimardello per forzare la maggior parte dei veicoli + Um set de chave mixas que pode abrir a maioria dos veículos. A key that should open most WEST vehicles. @@ -88,6 +95,7 @@ Egy kulcs, ami a NYUGAT egységeinek legtöbb járművét ki tudja nyitni. Ключ для открытия большинства машин Красных. Una chiave che apre la maggior parte dei veicoli WEST + Uma chave que abre a maioria dos veículos ocidentais A key that should open most EAST vehicle. @@ -98,7 +106,8 @@ Egy kulcs, ami a KELET egységeinek legtöbb járművét ki tudja nyitni. Klíč který by měl otevřít vetšinu Východních vozidel. Ключ для открытия большинства машин Синих. - Una chaive che apr ela maggior parte dei veicoli EAST + Una chaive che apre la maggior parte dei veicoli EAST + Uma chave que abre a maioria dos veículos orientais A key that should open most INDEP vehicle. @@ -110,6 +119,7 @@ Klíč který by měl otevřít většinu Nezávislých vozidel. Ключ для открытия большинства машин Независимых. Una chaive che apr ela maggior parte dei veicoli INDEP + Uma chave que abre a maioria dos veículos independentes A key that should open most CIV vehicle. @@ -121,6 +131,7 @@ Egy kulcs, ami a CIVIL járművek többségét ki tudja nyitni. Ключ для открытия большинства машин Гражданских. Una chaive che apr ela maggior parte dei veicoli CIV + Uma chave que abre a maioria dos veículos civis. - + \ No newline at end of file diff --git a/addons/vehicles/stringtable.xml b/addons/vehicles/stringtable.xml index 2312ce6027..603f2563dc 100644 --- a/addons/vehicles/stringtable.xml +++ b/addons/vehicles/stringtable.xml @@ -1,5 +1,4 @@  - diff --git a/addons/weaponselect/stringtable.xml b/addons/weaponselect/stringtable.xml index 6e06025620..edf1413fe1 100644 --- a/addons/weaponselect/stringtable.xml +++ b/addons/weaponselect/stringtable.xml @@ -11,6 +11,7 @@ Afficher texte lors d'un lancé de grenade Szöveg mutatása gránát eldobásakor Mostra indicazioni nel lancio granate + Mostrat texto ao lançar granada Display a hint or text on grenade throw. @@ -22,6 +23,7 @@ Afficher texte/info au lancé de grenade Jelez egy súgót vagy szöveget a gránát eldobásakor. Mostra un suggerimento quando si lanciano granate + Mostra um hint ou texto ao lançar uma granada Select Pistol @@ -53,7 +55,7 @@ Seleccionar lanzador Wybierz wyrzutnię Zvolit Raketomet - Выбрать гранатомет + Выбрать гранатомёт Sélectionner Lanceur Rakétavető Kiválasztása Selecionar Lançador @@ -65,7 +67,7 @@ Seleccionar lanzador de granadas Wybierz granatnik Zvolit Granátomet - Выбрать подствольный гранатомет + Выбрать подствольный гранатомёт Sélectionner Lance-grenades Gránátvető Kiválasztása Selecionar Lança-Granadas diff --git a/addons/weather/ACE_Settings.hpp b/addons/weather/ACE_Settings.hpp new file mode 100644 index 0000000000..d4b5a716cf --- /dev/null +++ b/addons/weather/ACE_Settings.hpp @@ -0,0 +1,38 @@ +class ACE_Settings { + class GVAR(enableServerController) { + displayName = "Weather propagation"; + description = "Enables sever side weather propagation"; + typeName = "BOOL"; + value = 1; + }; + class GVAR(useACEWeather) { + displayName = "ACE Weather"; + description = "Overrides the default weather (editor, mission settings) with ACE weather (map based)"; + typeName = "BOOL"; + value = 1; + }; + class GVAR(syncRain) { + displayName = "Sync Rain"; + description = "Synchronizes rain"; + typeName = "BOOL"; + value = 1; + }; + class GVAR(syncWind) { + displayName = "Sync Wind"; + description = "Synchronizes wind"; + typeName = "BOOL"; + value = 1; + }; + class GVAR(syncMisc) { + displayName = "Sync Misc"; + description = "Synchronizes lightnings, rainbow, fog, ..."; + typeName = "BOOL"; + value = 1; + }; + class GVAR(serverUpdateInterval) { + displayName = "Update Interval"; + description = "Defines the interval (seconds) between weather updates"; + typeName = "SCALAR"; + value = 60; + }; +}; diff --git a/addons/weather/CfgVehicles.hpp b/addons/weather/CfgVehicles.hpp new file mode 100644 index 0000000000..3de925e446 --- /dev/null +++ b/addons/weather/CfgVehicles.hpp @@ -0,0 +1,52 @@ +class CfgVehicles { + class ACE_Module; + class GVAR(ModuleSettings): ACE_Module { + scope = 2; + displayName = "Weather"; + icon = QUOTE(PATHTOF(UI\Icon_Module_Wind_ca.paa)); + category = "ACE"; + function = QUOTE(DFUNC(initModuleSettings)); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = "$STR_ACE_Common_ACETeam"; + class Arguments { + class enableServerController { + displayName = "Weather propagation"; + description = "Enables sever side weather propagation"; + typeName = "BOOL"; + defaultValue = 1; + }; + class useACEWeather { + displayName = "ACE Weather"; + description = "Overrides the default weather (editor, mission settings) with ACE weather (map based)"; + typeName = "BOOL"; + defaultValue = 1; + }; + class syncRain { + displayName = "Sync Rain"; + description = "Synchronizes rain"; + typeName = "BOOL"; + defaultValue = 1; + }; + class syncWind { + displayName = "Sync Wind"; + description = "Synchronizes wind"; + typeName = "BOOL"; + defaultValue = 1; + }; + class syncMisc { + displayName = "Sync Misc"; + description = "Synchronizes lightnings, rainbow, fog, ..."; + typeName = "BOOL"; + defaultValue = 1; + }; + class serverUpdateInterval { + displayName = "Update Interval"; + description = "Defines the interval (seconds) between weather updates"; + typeName = "NUMBER"; + defaultValue = 60; + }; + }; + }; +}; diff --git a/addons/weather/UI/Icon_Module_Wind_ca.paa b/addons/weather/UI/Icon_Module_Wind_ca.paa new file mode 100644 index 0000000000..176fe700a7 Binary files /dev/null and b/addons/weather/UI/Icon_Module_Wind_ca.paa differ diff --git a/addons/weather/XEH_postInit.sqf b/addons/weather/XEH_postInit.sqf index 05cd29c093..1427ff59b1 100644 --- a/addons/weather/XEH_postInit.sqf +++ b/addons/weather/XEH_postInit.sqf @@ -1,5 +1,10 @@ #include "script_component.hpp" +// Randomization +GVAR(temperatureShift) = 3 - random 6; +GVAR(badWeatherShift) = (random 1) ^ 2 * 10; +GVAR(humidityShift) = (5 - random 10) / 100; + GVAR(wind_period_start_time) = time; GVAR(rain_period_start_time) = time; diff --git a/addons/weather/XEH_postServerInit.sqf b/addons/weather/XEH_postServerInit.sqf index 67d536b996..5704212b79 100644 --- a/addons/weather/XEH_postServerInit.sqf +++ b/addons/weather/XEH_postServerInit.sqf @@ -1,10 +1,5 @@ #include "script_component.hpp" -// Randomization -GVAR(temperatureShift) = 3 - random 6; -GVAR(badWeatherShift) = (random 1) ^ 2 * 10; -GVAR(humidityShift) = (5 - random 10) / 100; - // Rain GVAR(rain_next_period) = -1; GVAR(rain_period_count) = 0; @@ -14,7 +9,4 @@ GVAR(rain_current_range) = -1+(random 2); // Wind call FUNC(initWind); -GVAR(overcast_multiplier) = 1; -GVAR(serverUpdateInterval) = 60; - [FUNC(serverController), GVAR(serverUpdateInterval)] call cba_fnc_addPerFrameHandler; diff --git a/addons/weather/XEH_preInit.sqf b/addons/weather/XEH_preInit.sqf index 401ae155c1..0f49226432 100644 --- a/addons/weather/XEH_preInit.sqf +++ b/addons/weather/XEH_preInit.sqf @@ -8,21 +8,15 @@ PREP(calculateBarometricPressure); PREP(displayWindInfo); PREP(getMapData); PREP(getWind); +PREP(initModuleSettings); PREP(initWind); PREP(serverController); +PREP(updateAceWeather); PREP(updateHumidity); PREP(updateRain); PREP(updateTemperature); PREP(updateWind); -// Control server side weather propagation -GVAR(enableServerController) = true; - -// Control client side weather effects -GVAR(syncRain) = true; -GVAR(syncWind) = true; // Wind, Gusts, Waves -GVAR(syncMisc) = true; // Lightnings, Rainbow, Fog - // Make sure this data is read before client/server postInit call FUNC(getMapData); diff --git a/addons/weather/config.cpp b/addons/weather/config.cpp index 13e5a0cab2..39cf223518 100644 --- a/addons/weather/config.cpp +++ b/addons/weather/config.cpp @@ -3,7 +3,7 @@ class CfgPatches { class ADDON { units[] = {}; - weapons[] = {};// "ACE_Kestrel4500" }; + weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; author[] = {"q1184", "Rocko", "esteldunedain","Ruthberg"}; @@ -14,3 +14,5 @@ class CfgPatches { #include "CfgEventhandlers.hpp" #include "CfgWorlds.hpp" #include "RscTitles.hpp" +#include "CfgVehicles.hpp" +#include "ACE_Settings.hpp" \ No newline at end of file diff --git a/addons/weather/functions/fnc_initModuleSettings.sqf b/addons/weather/functions/fnc_initModuleSettings.sqf new file mode 100644 index 0000000000..eb0eaafc31 --- /dev/null +++ b/addons/weather/functions/fnc_initModuleSettings.sqf @@ -0,0 +1,39 @@ +/* + * Author: Glowbal, Ruthberg + * Module for adjusting the wind deflection settings + * + * Arguments: + * 0: The module logic + * 1: units + * 2: activated + * + * Return Value: + * None + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic", "_units", "_activated"]; +_logic = _this select 0; +_units = _this select 1; +_activated = _this select 2; + +if !(_activated) exitWith {}; + +// Control server side weather propagation +[_logic, QGVAR(enableServerController), "enableServerController"] call EFUNC(common,readSettingFromModule); + +// Overrides the default weather (editor, mission settings) with ACE weather (map based) +[_logic, QGVAR(useACEWeather), "useACEWeather"] call EFUNC(common,readSettingFromModule); + +// Control client side weather effects +[_logic, QGVAR(syncRain), "syncRain"] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(syncWind), "syncWind"] call EFUNC(common,readSettingFromModule); // Wind, Gusts, Waves +[_logic, QGVAR(syncMisc), "syncMisc"] call EFUNC(common,readSettingFromModule); // Lightnings, Rainbow, Fog + +// Server weather update interval +[_logic, QGVAR(serverUpdateInterval), "serverUpdateInterval"] call EFUNC(common,readSettingFromModule); + +GVAR(serverUpdateInterval) = 1 max GVAR(serverUpdateInterval) min 600; \ No newline at end of file diff --git a/addons/weather/functions/fnc_serverController.sqf b/addons/weather/functions/fnc_serverController.sqf index a9ceca3815..2cbdeb581e 100644 --- a/addons/weather/functions/fnc_serverController.sqf +++ b/addons/weather/functions/fnc_serverController.sqf @@ -1,7 +1,7 @@ /* - * Author: ACE2 Team, esteldunedain, ruthberg + * Author: Ruthberg * - * Calculate the wind and rain evolution on the server. Broadcasts the current and next values to the clients + * Gather weather parameters and broadcast them to the clients * * Argument: * None @@ -13,95 +13,21 @@ if (!GVAR(enableServerController)) exitWith {}; -private ["_lastRain", "_rainOverCast", "_transitionTime", "_windDirectionVariance", "_windSpeed", "_windSpeedChange", "_windMaxDiff", "_windMinDiff", "_windDirection", "_windDirectionChange", "_ratioMin", "_ratioMax"]; - -// Rain simulation -if (GVAR(syncRain) && GVAR(rain_period_count) > GVAR(rain_next_period)) then { - - GVAR(rain_next_period) = ceil((1 + (random 10)) / GVAR(overcast_multiplier)); - GVAR(rain_period_count) = 0; - - _lastRain = GVAR(current_rain); - - if (overcast >= 0.7) then { - _rainOverCast = (overcast - 0.7) / 0.3; - if (GVAR(current_rain) == 0) then { - // Initialize rain with a random strength depending on the current overcast value - GVAR(current_rain) = 0.25 + (random 0.25) + (random 0.5) * _rainOverCast; - }; - - GVAR(current_rain) = GVAR(current_rain) + GVAR(current_rain) * ((_rainOverCast * GVAR(overcast_multiplier)) / 8) * GVAR(rain_current_range); - GVAR(current_rain) = 0.01 max GVAR(current_rain) min 1; - - GVAR(rain_current_range) = -1 + (random 2); - } else { - _rainOverCast = 1; - - GVAR(current_rain) = 0; +if (GVAR(useACEWeather)) then { + // Use location based real world weather data + [] call FUNC(updateAceWeather); +} else { + // Simply replicate the server weather on the clients + if (GVAR(syncRain)) then { + ACE_RAIN_PARAMS = [rain, rain, GVAR(serverUpdateInterval)]; + publicVariable "ACE_RAIN_PARAMS"; + }; + if (GVAR(syncWind)) then { + ACE_WIND_PARAMS = [wind call CBA_fnc_vectDir, 0, vectorMagnitude wind, 0, GVAR(serverUpdateInterval)]; + publicVariable "ACE_WIND_PARAMS"; + }; + if (GVAR(syncMisc)) then { + ACE_MISC_PARAMS = [lightnings, rainbow, fogParams, GVAR(temperatureShift), GVAR(badWeatherShift), GVAR(humidityShift)]; + publicVariable "ACE_MISC_PARAMS"; }; - - _transitionTime = 1 + (_rainOverCast * 5) + (random (_rainOverCast * 20)); - - ACE_RAIN_PARAMS = [_lastRain, GVAR(current_rain), _transitionTime]; - TRACE_4("",_lastRain,_rainOverCast,_transitionTime,overcast); - - GVAR(rain_period_start_time) = time; - publicVariable "ACE_RAIN_PARAMS"; }; - -// Wind simulation -if (GVAR(syncWind) && GVAR(wind_period_count) > GVAR(wind_next_period)) then { - - GVAR(wind_next_period) = ceil((2 + (random 5)) / GVAR(overcast_multiplier)); - GVAR(wind_period_count) = 0; - - _windDirectionVariance = (90 - (random 180)) * (overcast ^ 2); - _windDirection = (360 + GVAR(wind_direction_reference) + _windDirectionVariance) % 360; - _windDirectionChange = _windDirection - GVAR(current_wind_direction); - if (_windDirectionChange > 180) then { - _windDirectionChange = _windDirectionChange - 360; - }; - if (_windDirectionChange < -180) then { - _windDirectionChange = 360 + _windDirectionChange; - }; - - _windMaxDiff = GVAR(mean_wind_speed) - GVAR(max_wind_speed); - _windMinDiff = GVAR(min_wind_speed) - GVAR(mean_wind_speed); - - _ratioMax = (random 1) ^ 2; - _ratioMin = (random 1) ^ 2; - - _windSpeed = GVAR(current_wind_speed); - _windSpeedChange = 0; - if ((random 1) < (0.3 max overcast)) then { - _windSpeed = GVAR(mean_wind_speed) + _windMaxDiff * _ratioMax + _windMinDiff * _ratioMin; - _windSpeedChange = _windSpeed - GVAR(current_wind_speed); - }; - - _transitionTime = GVAR(wind_next_period) * GVAR(serverUpdateInterval); - - TRACE_5("dirCur/dirNew/spdCur/spdNew/period",GVAR(current_wind_direction),_windDirection,GVAR(current_wind_speed),_windSpeed,_transitionTime); - - ACE_WIND_PARAMS = [GVAR(current_wind_direction), - _windDirectionChange, - GVAR(current_wind_speed), - _windSpeedChange, - _transitionTime]; - - GVAR(current_wind_direction) = _windDirection; - GVAR(current_wind_speed) = _windSpeed; - - GVAR(wind_period_start_time) = time; - publicVariable "ACE_WIND_PARAMS"; -}; - - -if (GVAR(syncMisc)) then { - ACE_MISC_PARAMS = [lightnings, rainbow, fogParams, GVAR(temperatureShift), GVAR(badWeatherShift), GVAR(humidityShift)]; - publicVariable "ACE_MISC_PARAMS"; -}; - -GVAR(rain_period_count) = GVAR(rain_period_count) + 1; -GVAR(wind_period_count) = GVAR(wind_period_count) + 1; - -GVAR(overcast_multiplier) = 1 max (2* overcast) min 2; // 0 (@ overcast 0), 2 (@ overcast 1) \ No newline at end of file diff --git a/addons/weather/functions/fnc_updateAceWeather.sqf b/addons/weather/functions/fnc_updateAceWeather.sqf new file mode 100644 index 0000000000..8ed0bb0d10 --- /dev/null +++ b/addons/weather/functions/fnc_updateAceWeather.sqf @@ -0,0 +1,105 @@ +/* + * Author: ACE2 Team, esteldunedain, ruthberg + * + * Updates the wind and rain evolution on the server. Broadcasts the current and next values to the clients + * + * Argument: + * None + * + * Return value: + * None + */ +#include "script_component.hpp" + +private ["_overcastMultiplier", "_lastRain", "_rainOverCast", "_transitionTime", "_windDirectionVariance", "_windSpeed", "_windSpeedChange", "_windMaxDiff", "_windMinDiff", "_windDirection", "_windDirectionChange", "_ratioMin", "_ratioMax"]; + +_overcastMultiplier = 1 max (2* overcast) min 2; // 0 (@ overcast 0), 2 (@ overcast 1) + +// Rain simulation +if (GVAR(syncRain) && GVAR(rain_period_count) > GVAR(rain_next_period)) then { + + GVAR(rain_next_period) = ceil((1 + (random 10)) / _overcastMultiplier); + GVAR(rain_period_count) = 0; + + _lastRain = GVAR(current_rain); + + if (overcast >= 0.7) then { + _rainOverCast = (overcast - 0.7) / 0.3; + if (GVAR(current_rain) == 0) then { + // Initialize rain with a random strength depending on the current overcast value + GVAR(current_rain) = 0.25 + (random 0.25) + (random 0.5) * _rainOverCast; + }; + + GVAR(current_rain) = GVAR(current_rain) + GVAR(current_rain) * ((_rainOverCast * _overcastMultiplier) / 8) * GVAR(rain_current_range); + GVAR(current_rain) = 0.01 max GVAR(current_rain) min 1; + + GVAR(rain_current_range) = -1 + (random 2); + } else { + _rainOverCast = 1; + + GVAR(current_rain) = 0; + }; + + _transitionTime = 1 + (_rainOverCast * 5) + (random (_rainOverCast * 20)); + + ACE_RAIN_PARAMS = [_lastRain, GVAR(current_rain), _transitionTime]; + TRACE_4("",_lastRain,_rainOverCast,_transitionTime,overcast); + + GVAR(rain_period_start_time) = time; + publicVariable "ACE_RAIN_PARAMS"; +}; + +// Wind simulation +if (GVAR(syncWind) && GVAR(wind_period_count) > GVAR(wind_next_period)) then { + + GVAR(wind_next_period) = ceil((2 + (random 5)) / _overcastMultiplier); + GVAR(wind_period_count) = 0; + + _windDirectionVariance = (90 - (random 180)) * (overcast ^ 2); + _windDirection = (360 + GVAR(wind_direction_reference) + _windDirectionVariance) % 360; + _windDirectionChange = _windDirection - GVAR(current_wind_direction); + if (_windDirectionChange > 180) then { + _windDirectionChange = _windDirectionChange - 360; + }; + if (_windDirectionChange < -180) then { + _windDirectionChange = 360 + _windDirectionChange; + }; + + _windMaxDiff = GVAR(mean_wind_speed) - GVAR(max_wind_speed); + _windMinDiff = GVAR(min_wind_speed) - GVAR(mean_wind_speed); + + _ratioMax = (random 1) ^ 2; + _ratioMin = (random 1) ^ 2; + + _windSpeed = GVAR(current_wind_speed); + _windSpeedChange = 0; + if ((random 1) < (0.3 max overcast)) then { + _windSpeed = GVAR(mean_wind_speed) + _windMaxDiff * _ratioMax + _windMinDiff * _ratioMin; + _windSpeedChange = _windSpeed - GVAR(current_wind_speed); + }; + + _transitionTime = GVAR(wind_next_period) * GVAR(serverUpdateInterval); + + TRACE_5("dirCur/dirNew/spdCur/spdNew/period",GVAR(current_wind_direction),_windDirection,GVAR(current_wind_speed),_windSpeed,_transitionTime); + + ACE_WIND_PARAMS = [GVAR(current_wind_direction), + _windDirectionChange, + GVAR(current_wind_speed), + _windSpeedChange, + _transitionTime]; + + GVAR(current_wind_direction) = _windDirection; + GVAR(current_wind_speed) = _windSpeed; + + GVAR(wind_period_start_time) = time; + publicVariable "ACE_WIND_PARAMS"; +}; + + +if (GVAR(syncMisc)) then { + ACE_MISC_PARAMS = [lightnings, rainbow, fogParams, GVAR(temperatureShift), GVAR(badWeatherShift), GVAR(humidityShift)]; + publicVariable "ACE_MISC_PARAMS"; +}; + +GVAR(rain_period_count) = GVAR(rain_period_count) + 1; +GVAR(wind_period_count) = GVAR(wind_period_count) + 1; \ No newline at end of file diff --git a/addons/winddeflection/ACE_Settings.hpp b/addons/winddeflection/ACE_Settings.hpp index b10b78db0c..0a0cac6b34 100644 --- a/addons/winddeflection/ACE_Settings.hpp +++ b/addons/winddeflection/ACE_Settings.hpp @@ -19,7 +19,7 @@ class ACE_Settings { }; class GVAR(simulationRadius) { displayName = "Simulation Radius"; - description = "Defines the radius (in meters) in which advanced ballistics are applied"; + description = "Defines the radius around the player (in meters) at which projectiles are wind deflected"; typeName = "SCALAR"; value = 3000; }; diff --git a/addons/winddeflection/CfgVehicles.hpp b/addons/winddeflection/CfgVehicles.hpp index 76ac0c13d3..1c24c0a386 100644 --- a/addons/winddeflection/CfgVehicles.hpp +++ b/addons/winddeflection/CfgVehicles.hpp @@ -31,7 +31,7 @@ class CfgVehicles { }; class simulationRadius { displayName = "Simulation Radius"; - description = "Defines the radius (in meters) in which advanced ballistics are applied"; + description = "Defines the radius around the player (in meters) at which projectiles are wind deflected"; typeName = "NUMBER"; defaultValue = 3000; }; diff --git a/addons/winddeflection/stringtable.xml b/addons/winddeflection/stringtable.xml index 83f6c0d589..af6f05a912 100644 --- a/addons/winddeflection/stringtable.xml +++ b/addons/winddeflection/stringtable.xml @@ -12,6 +12,7 @@ Windinformationen Szélinformáció Informazioni sul vento + Informação do vento Direction: %1 @@ -23,6 +24,7 @@ Windrichtung: %1 Irány: %1 Direzione: %1 + Direção: %1 Speed: %1 m/s @@ -31,9 +33,10 @@ Скорость: %1 м/с Rychlost: %1 m/s Vitesse %1 m/s - Geschwindigkeit: %1m/s + Geschwindigkeit: %1 m/s Sebesség: %1 m/s Velocità: %1 m/s + Velocidade: %1 m/s Weather Information @@ -45,6 +48,7 @@ Wetterinformationen Időjárás-Információ Meteo + Informação Meteorológica Humidity: %1% @@ -56,6 +60,7 @@ Luftfeuchtigkeit: %1 Páratartalom: %1% Umidità: %1% + Humidade: %1% diff --git a/documentation/README_DE.md b/documentation/README_DE.md new file mode 100644 index 0000000000..0b5ca4d0ef --- /dev/null +++ b/documentation/README_DE.md @@ -0,0 +1,48 @@ +

+ +

+

+ + ACE version + + + ACE download + + + ACE issues + + + ACE license + +

+

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

+ +**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. + +### 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...*** + +#### 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). + +#### 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. + +Um einen Fehler oder ein Feature zu melden bzw. ein bereits Bestehendes zu ändern - nutze unseren [Issue Tracker](https://github.com/acemod/ACE3/issues). + +#### 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). diff --git a/documentation/README_PL.md b/documentation/README_PL.md new file mode 100644 index 0000000000..d156185908 --- /dev/null +++ b/documentation/README_PL.md @@ -0,0 +1,84 @@ +

+ +

+

+ + ACE version + + + ACE download + + + ACE issues + + + BIF thread + + + ACE license + +

+

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. + +### 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 + +#### 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
+***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) + +#### 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. + +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) + +#### 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. \ No newline at end of file diff --git a/documentation/development/ace3-config-entries.md b/documentation/development/ace3-config-entries.md index cc0104a8b1..78f8022856 100644 --- a/documentation/development/ace3-config-entries.md +++ b/documentation/development/ace3-config-entries.md @@ -46,17 +46,20 @@ ace_gforcecoef ace_protection ace_scopeadjust_horizontal ace_scopeadjust_vertical +ace_scopeadjust_increment ace_isusedlauncher ace_attachable ace_range ace_detonator +ace_barrelTwist +ace_twistDirection +ace_barrelLength ``` ### CfgAmmo ```c++ -ace_bulletmass ace_recoil_shakemultiplier ace_frag_skip ace_frag_force @@ -68,6 +71,17 @@ ace_frag_gurney_k ace_explodeondefuse ace_explosive ace_fcs_airburst +ace_caliber +ace_bulletlength +ace_bulletmass +ace_transonicstabilitycoef +ace_ammotempmuzzlevelocityshifts +ace_ballisticcoefficients +ace_velocityboundaries +ace_standardatmosphere +ace_dragmodel +ace_muzzlevelocities +ace_barrellengths ``` diff --git a/documentation/feature/medical-system.md b/documentation/feature/medical-system.md new file mode 100644 index 0000000000..3d756b70c8 --- /dev/null +++ b/documentation/feature/medical-system.md @@ -0,0 +1,70 @@ +--- +layout: wiki +title: Medical System +group: feature +order: 4 +parent: wiki +--- + +## 1. Overview +ACE provide users with a more realistic medical system and comes in both a basic and advanced version. This page will detail the differences between both systems and what they do. It is split into two parts; basic and advanced. Both versions have overlap but each have their own unique characteristics. + + +## 2. Basic Medical +ACE's basic medical system is quite a bit more complex than Arma's default system, but not really difficult to grasp. ACE basic medical is a mixture between the ACE2 and AGM medical systems. + +The four main elements that basic medical introduces are: + +* damage divided into different zones (head, body, left & right arm, left & right leg) +* bleeding +* unconsciousness +* pain + +All interactions in the medical system are done with the interaction menu. Non-medics can - by default - not perform all actions, and their actions take more time as when performed by trained medics. These actions are using epinephrine and blood IVs. + + +### How it works + +When hit, units start to lose blood depending on the severity of their wounds. Once the level of blood falls below a certain threshold, the unit will fall unconscious and eventually die. Units will also fall unconscious when sustaining large amounts of damage at once. + +To stop the bleeding, the combat life saver needs to bandage every wounded limb. Unconscious units can be "woken up" with Epipens. Should a unit have lost a lot of blood, it might be necessary to replace the lost blood with a blood bag before being able to wake unconscious units up. + +Should a unit be in pain, materializing itself with a chromatic aberration screen effect, he can be given morphine. + +## 3. Advanced Medical +The advanced medical system provides a more complex and detailed medical simulation and is based off the CSE/CMS medical system. It focuses on a more realistic model for injuries and treatment, thus resulting in a more important and prominent role for combat medics, and a bigger incentive to not get shot. + +The system behind advanced medical is designed to attempt to mimic important parts of the human body, as well as react to any injuries sustained and treatments applied in a realistic manner. The available treatments and supplies in advanced medical are based off the Tactical Combat Casualty Care (TCCC) guidelines, which are the same guidelines used by real-life combat medics around the world. + +Besides the 4 elements introduced by basic medical, advanced introduces the following: + +* More detailed wound system +* Accurate blood loss based upon sustained injuries +* Vitals, including heart rate and blood pressure +* Cardiac Arrest +* Various treatment methods such as CPR, different kinds of IVs and tourniquets +* A basic medication simulation + +### How it works + +Same as with basic, when hit an injury is sustained. Different though is that the type of injury and the severity of it are based upon how the damage was done and what caused it. This affects both blood loss and immediate consequences, such as being knocked out or being killed right away. When a player has sustained an injury, this will be indicated by flashing red of the screen; this means the player is bleeding. + +##### Stopping bleeding +In order to stop the bleeding, all injuries on every bodypart requires treatment. This is done by either applying a tourniquet to legs or arms as a temporarly solution, or by using bandages to stop the bleeding as a more permament fix. + +##### Vitals +While a unit is bleeding however, the blood volume decreases which will result in a change of vitals. Depending on the factors such as current blood volume, the blood loss rate, medication used, the blood pressure will start to drop. To counter this drop, also based upon the previously mentioned factors and others, the heart rate will adjust accordingly to attempt to keep blood pressure at safe levels. This means that for any patient it is required to keep an eye on the vitals. This is done through the interaction system by selecting check pulse or blood pressure on either the arms or head. + +##### Medication +To stabalize the vitals and to counter for example pain, a player/medic can use medication. Advanced medical has 3 different medications available: +* Atropine +* Morphine +* Epinephrine + +Atropine is a vagolytic and anticholinergic drug which in low dosages reduces heart rate but in high dosages increases it, countering effects of organophosphate poisoning (in NBC scenarios; anticholinesterase poisoning) and symptomatic bradycardia (in post-ROSC care and resuscitative medicine). + +Morphine is used to alleviate large amounts of pain. Has an effect similar to Heroin due to its opiate properties. Must only ever be given once, and only when bleeding has been reduced to a minimum. Morphine must never be given to a casualty with a low heart rate, as it can stop the heart. + +Epinephrine is used to increase heart rate and blood pressure and alleviate unconsciousness. Epinephrine is a synthetic form of Adrenaline, which is naturally produced in the body. It can also be applied to counter-act the effects of Atropine. Be careful though, as it may only be given once. + +_Epinephrine must never be given to a casualty with a high heart rate or blood pressure._ diff --git a/documentation/framework/fragmentation-configuration.md b/documentation/framework/fragmentation-configuration.md index 1372b2b69a..c8a64b2db4 100644 --- a/documentation/framework/fragmentation-configuration.md +++ b/documentation/framework/fragmentation-configuration.md @@ -15,15 +15,15 @@ The system for the end-developer is easy to use, and only requires minimal resea Below is an example set of explosives configuration properties for sys_frag (in this case an M67 hand grenade): ```c++ -ACE_FRAG_METAL = 210; // metal in grams -ACE_FRAG_CHARGE = 185; // explosive in grams -ACE_FRAG_GURNEY_C = 2843; // Gurney velocity constant for explosive type. See: http://en.wikipedia.org/wiki/Gurney_equations -ACE_FRAG_GURNEY_K = 3/5; // Gurney shape factor, in this case a sphere. See: http://en.wikipedia.org/wiki/Gurney_equations +ace_frag_metal = 210; // metal in grams +ace_frag_charge = 185; // explosive in grams +ace_frag_gurney_c = 2843; // Gurney velocity constant for explosive type. See: http://en.wikipedia.org/wiki/Gurney_equations +ace_frag_gurney_k = 3/5; // Gurney shape factor, in this case a sphere. See: http://en.wikipedia.org/wiki/Gurney_equations ``` -`ACE_FRAG_METAL` is the amount of metal being fragmented (generally taken as the entire weight of the warhead, though in some cases you might want to only include the fragmentation jacket or body. `ACE_FRAG_CHARGE` is the amount of explosive filler in the warhead. `ACE_FRAG_METAL` and `ACE_FRAG_CHARGE` are dimensionless values, as long as they are both in the same unit (for example kg/kg g/g lbs/lbs). +`ace_frag_metal` is the amount of metal being fragmented (generally taken as the entire weight of the warhead, though in some cases you might want to only include the fragmentation jacket or body. `ace_frag_charge` is the amount of explosive filler in the warhead. `ace_frag_metal` and `ace_frag_charge` are dimensionless values, as long as they are both in the same unit (for example kg/kg g/g lbs/lbs). -`ACE_FRAG_GURNEY_C` is the Gurney constant for explosive force. You can find a list of common explosive types below. If you can not find it here, or want more accurate numbers, just google the type of explosive and Gurney constant and you can find substantial information. This is *NOT* the detonation velocity of the explosive, do not confuse them! +`ace_frag_gurney_c` is the Gurney constant for explosive force. You can find a list of common explosive types below. If you can not find it here, or want more accurate numbers, just google the type of explosive and Gurney constant and you can find substantial information. This is *NOT* the detonation velocity of the explosive, do not confuse them! | Type | Speed | |------------------|----------| @@ -42,7 +42,7 @@ ACE_FRAG_GURNEY_K = 3/5; // Gurney shape factor, in this case a sphere. See: ht |Tritonal | 2320 m/s | -`ACE_FRAG_GURNEY_K` is the shape factor for the explosive configuration. You should choose it based on the general configuration of explosives/metal in the warhead. Most grenades for example are a sphere. Artillery and aircraft bombs are a cylinder. Mines generally a flat plate. Below is a list of the three common shapes and their factors. +`ace_frag_gurney_k` is the shape factor for the explosive configuration. You should choose it based on the general configuration of explosives/metal in the warhead. Most grenades for example are a sphere. Artillery and aircraft bombs are a cylinder. Mines generally a flat plate. Below is a list of the three common shapes and their factors. ``` Sphere = 3/5 @@ -52,7 +52,7 @@ Plate = 3/5 There are other configurations but these are the most common. If you are interested in others check out the wikipedia link given above. Most of these will not correctly function in sys_frag though due to additional variables for the equation. -In addition to these variables there are different types of fragmentation fragments to choose from, and they can be defined in the config value `ACE_FRAG_CLASSES[]`. Below are a list of the types. +In addition to these variables there are different types of fragmentation fragments to choose from, and they can be defined in the config value `ace_frag_classes[]`. Below are a list of the types. ``` ACE_frag_tiny @@ -71,6 +71,6 @@ The tinier the piece of fragmentation the shorter the distance of travel. The `_ The final information needed is a couple of entries for forcing or ignoring fragmentation for this ammo. -If you set `ACE_FRAG_SKIP` to 1 then you will skip fragmentation for ammo of this type. This is useful for things that might cause high network load, such as FFAR rockets, or possibly even 40mm grenades from AGLs. Experimentation under network conditions is required. +If you set `ace_frag_skip` to 1 then you will skip fragmentation for ammo of this type. This is useful for things that might cause high network load, such as FFAR rockets, or possibly even 40mm grenades from AGLs. Experimentation under network conditions is required. -If you set `ACE_FRAG_FORCE` to 1 it will force the fragmentation system to use frag on this ammo, ignoring sys_frags internal qualifications based on hit values. +If you set `ace_frag_force` to 1 it will force the fragmentation system to use frag on this ammo, ignoring sys_frags internal qualifications based on hit values. diff --git a/documentation/missionmaker/modules.md b/documentation/missionmaker/modules.md index 0b0f13f8d6..186e99ece4 100644 --- a/documentation/missionmaker/modules.md +++ b/documentation/missionmaker/modules.md @@ -11,8 +11,42 @@ parent: wiki ## 1. Modules -### 1.1 BlueForceTracking -*Part of: ACE_Map* +### 1.1 Advanced Ballistics +*Part of: ace_advanced_ballistics* + +This module allows to enable advanced external- and internal ballistics. + +**Settings:** + +1. **Advanced Ballistics (Boolean)
** +Enables advanced ballistics.
+`Default value: No` +2. **Always Enabled For Snipers (Boolean)
** +Always enables advanced ballistics when high power optics are used.
+`Default value: Yes` +3. **Disabled In FullAuto Mode (Boolean)
** +Disables the advanced ballistics during full auto fire.
+`Default value: No` +4. **Disabled For Non Local Players (Boolean)
** +Disables the advanced ballistics for bullets coming from other players (enable this if you encounter frame drops during heavy firefights in multiplayer).
+`Default value: Yes` +5. **Enable Ammo Temperature Simulation (Boolean)
** +Muzzle velocity varies with ammo temperature.
+`Default value: Yes` +6. **Enable Barrel Length Simulation (Boolean)
** +Muzzle velocity varies with barrel length.
+`Default value: Yes` +7. **Enable Bullet Trace Effect (Boolean)
** +Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics).
+8. **Simulation Interval (Number)
** +Defines the interval between every calculation step.
+`Default value: 0.05` +9. **Simulation Radius (Number)
** +Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles.
+`Default value: 3000` + +### 1.2 BlueForceTracking +*Part of: ace_map* When adding the "BlueForceTracking" module to your mission it adds map markers to every group on the players side and refreshes them in certain configurable interval (in seconds). The module takes the group type into account and uses the proper NATO icon for each marker. @@ -25,8 +59,8 @@ How often the markers should be refreshed (in seconds).
Hide markers for "AI only" groups.
`Default value: No` -### 1.2 Check PBOs -*Part of: ACE_Core* +### 1.3 Check PBOs +*Part of: ace_core* If you are worried that players haven't updated ACE or other mods to the version you're using on the server, you can place the "Check PBOs" module on your map. You can choose one of three posible actions that are being executed when a player joins that has a wrong version of ACE or an other mod: @@ -61,8 +95,8 @@ Example 3: @JSRS + @Blastcore-A3:
[TBD, "warfxpe","blastcore_vep"] ``` -### 1.3 Explosive System -*Part of: ACE_Explosive* +### 1.4 Explosive System +*Part of: ace_explosive* The "Explosive System" module lets you tweak the settings for the new explosive system that ACE introduces. @@ -75,17 +109,17 @@ Require explosive specialists to disable explosives.
Increase the time it takes to complete actions for non-specialists.
`Default value: Yes` -### 1.4 Fatigue System (deprecated) +### 1.5 Fatigue System (deprecated) **Warning:** *This module is deprecated and only in there not to break older missions that have used this module. It will be removed in a future update. It serves no purpose.* -### 1.5 Friendly Fire Messages -*Part of: ACE_Respawn* +### 1.6 Friendly Fire Messages +*Part of: ace_respawn* The "Friendly Fire Messages" module triggers a message when a player kills a friendly or civilian unit. This module isn't needed on servers with a low difficulty setting. -### 1.6 Interaction -*Part of: ACE_Interaction* +### 1.7 Interaction +*Part of: ace_interaction* This module allows you to tweak the settings for player names tags. @@ -95,8 +129,8 @@ This module allows you to tweak the settings for player names tags. Sets the distance (in meters) at which player name tags become visible.
`Default value: 5` -### 1.7 Medical System -*Part of: ACE_Medical* +### 1.8 Medical System +*Part of: ace_medical* When using the medical system ACE offers you probably want to fine tune some aspects of the wounding, healing or gameplay mechanics and fit them to your needs. The "Medical System" module offers a lot of settings to do just that. @@ -133,16 +167,16 @@ Use one bandage to heal the entire body.
Allow all players to use chat while unconcious? Admin can always use the chat regardless.
`Default value: No` -### 1.8 Rallypoint System -*Part of: ACE_Respawn* +### 1.9 Rallypoint System +*Part of: ace_respawn* This module was introduced with 0.94 and enables Mission Makers to specificly enable units to move a rallypoint. Every unit that is synced with that module is able to move a rallypoint. **Note:** It's important to mention that this doesn't work for player who join during a mission (JIP = Join in progress). That's something we can't change because that's the way Bohemia has implemented their module framework. To enable JIP players to move rally points have a look at [3.1 ACE Rallypoints](#31-ace-rallypoints). -### 1.9 Repair System -*Part of: ACE_Logistics* +### 1.10 Repair System +*Part of: ace_logistics* Placing the "Repair System" module makes it possible to define the time it takes for certain repair actions. @@ -161,8 +195,8 @@ Time to replace a track (in seconds).
Limits the amount of damage that can be repaired. 0 = Repair all damage, 1 = Cannot repair any damage.
`Default value: 0` -### 1.10 Respawn System -*Part of: ACE_Respawn* +### 1.11 Respawn System +*Part of: ace_respawn* The "Respawn System" module enables players to respawn with the gear they had before dying and to remove bodies of players after a configurable interval (in seconds). @@ -172,8 +206,8 @@ The "Respawn System" module enables players to respawn with the gear they had be Respawn with the gear a player had just before his death.
`Default value: No` -### 1.11 SwitchUnits System -*Part of: ACE_SwitchUnits* +### 1.12 SwitchUnits System +*Part of: ace_switchunits* The [SwitchUnits System](#32-ace-switchunits) enables players to control certain AI units on the map. @@ -199,8 +233,54 @@ The safe zone around players from a different team (in meters)
`Default value: 200` -### 1.12 LSD Vehicles -*Part of: ACE_Core* +### 1.13 LSD Vehicles +*Part of: ace_core* + +### 1.14 Weather +*Part of: ace_weather* + +This module allows you to customize the weather settings. + +**Settings:** + +1. **Weather propagation (Boolean)
** +Enables sever side weather propagation.
+`Default value: Yes` +2. **ACE Weather (Boolean)
** +Overrides the default weather (editor, mission settings) with ACE weather (map based).
+`Default value: Yes` +3. **Sync Rain (Boolean)
** +Synchronizes rain.
+`Default value: Yes` +3. **Sync Wind (Boolean)
** +Synchronizes wind.
+`Default value: Yes` +3. **Sync Misc (Boolean)
** +Synchronizes lightnings, rainbow, fog, ...
+`Default value: Yes` +4. **Update Interval (Number)
** +Defines the interval (seconds) between weather updates.
+`Default value: 60` + +### 1.15 Wind Deflection +*Part of: ace_winddeflection* + +This module allows you to define when wind deflection is active. + +**Settings:** + +1. **Wind Deflection (Boolean)
** +Enables wind deflection.
+`Default value: Yes` +2. **Vehicle Enabled (Boolean)
** +Enables wind deflection for static/vehicle gunners.
+`Default value: Yes` +3. **Simulation Interval (Number)
** +Defines the interval between every calculation step.
+`Default value: 0.05` +4. **Simulation Radius (Number)
** +Defines the radius around the player (in meters) at which projectiles are wind deflected.
+`Default value: 3000` And then there's the "LSD Vehicles" module … it does 'something' to all vehicles synced to that module. http://youtu.be/X3e0LTexEok diff --git a/documentation/user/getting-started.md b/documentation/user/getting-started.md index 5a9c3f6917..012f307445 100644 --- a/documentation/user/getting-started.md +++ b/documentation/user/getting-started.md @@ -1,20 +1,90 @@ --- layout: wiki -title: Getting Started +title: Getting started group: user order: 0 parent: wiki --- +
+
Note:
+

This page is currently under construction.

+
-**This page will get updated soon.** +Downloaded ACE3 and have no idea where to start? This page serves as a document to help new players get started with things like the medical system, or how to adjust your scope. +### Table of contents +1. [Vector 21](#vector-21) -## Table of Contents +### Vector 21 +*Part of: ace_vector* - 1. [xx](#xx) - 2. [yy](#yy) - 3. [zz](#zz) +ACE3 adds a realistic depiction of the Vector 21 rangefinder to the game. Unlike other rangefinders, it doesn't just magically show you the range to your target, but in exchange allows you to do alot of things with it that the other choices in Arma do not offer. The Vector's functions include, but are not limited to: +- Distance to a target +- Azimuth to a target +- Horizontal and vertical distance to a target +- Distance between 2 targets +- Angle between 2 targets +- Switching between feet and meters +- Switching between degrees and mils +... -## What ACE3 has to offer +The Vector is controlled with 2 keys: the azimuth key and the range key; Tab and R by default. First you bring it up like every other binocular in the game and then, while looking through it you can access all the different functions. + +The Vector 21 rangefinder has the following usage modes: + +1. Slope distance +2. Azimuth +3. Slope distance & Azimuth +4. Horizontal distance and height difference +5. Azimuth & Inclination +6. Distance between two points +7. Horizontal & vertical distance between two points +8. Horizontal distance & azimuth between two points +9. Fall of shot + +#### 1. Slope distance +Measuring Slope distance + +Press and hold the "Distance" key until the red pointing circle appears. Sight the circle on the object and release the key. + +#### 2. Azimuth +Measuring Azimuth + +Press and hold the "Azimuth" key until the red pointing circle appears. Sight the circle on the object and release the key. + +#### 3. Slope distance and Azimuth +Measuring Slope distance and Azimuth + +Press and hold both the "Distance" and "Azimuth" key until the red pointing circle appears. Sight the circle on the object and release both keys. + +#### 4. Horizontal distance and height difference +Measuring Horizontal distance and height difference + +Tap the "Distance" key once then press and hold it until the red pointing circle appears. Sight the circle on the object and release the key. + +#### 5. Azimuth and Inclination +Measuring Azimuth and Inclination + +Tap the "Azimuth" key once then press and hold it until the red pointing circle appears. Sight the circle on the object and release the key. + +#### 6. Distance between two points +Measuring Distance between two points + +Press and hold the "Distance" key until the red pointing circle appears. Sight the circle on the first object and tap the "Azimuth" key while further holding the "Distance" key. The first measurement is confirmed ("1-P" = first point). Sight the second object and release the "Distance" key. + +#### 7. Horizontal and vertical distance between two points +Measuring Horizontal and vertical distance between two points + +Tap the "Distance" key once then press and hold it until the red pointing circle appears. Sight the circle on the object and tap the "Azimuth" key once. The first measurement is confirmed ("1-P" = first point). Sight the second object and release the "Distance" key. + +#### 8. Horizontal distance and azimuth between two points +Measuring Horizontal distance and azimuth between two points + +Press and hold the "Azimuth" key until the red pointing circle appears. Sight the circle on the first object and tap the "Distance" key while further holding the "Azimuth" key. The first measurement is confirmed ("1-P" = first point). Sight the second object and release the "Azimuth" key. + +#### 9. Fall of shot +Measuring Fall of shot + +Tap the "Azimuth" key once then press and hold it until the red pointing circle appears. Sight the circle on the object and tap the "Distance" key while further holding the "Azimuth" key. The first measurement is confirmed ("1-P" = first point). Sight the Fall of shot and release the "Azimuth" key. The left digits display the left (`L`)/right (`r`) correction value in meter and the right digits display the longer (`A` = add)/shorter (`d` = drop) correction value in meter. If the "Distance" key is tapped the height correction values will be displayed (`UP` and `dn`). diff --git a/documentation/user/how-to-make-a-feature-request.md b/documentation/user/how-to-make-a-feature-request.md index bfc5401f38..7b0c52478d 100644 --- a/documentation/user/how-to-make-a-feature-request.md +++ b/documentation/user/how-to-make-a-feature-request.md @@ -6,19 +6,17 @@ order: 11 parent: wiki --- -### Before requesting +### Background +ACE2, AGM and CSE had a lot of features implemented or planned. All of them are or have been evaluated for inclusion in ACE3 itself, and we'd like to port the majority of them eventually. However, due to time constraints, we have managed to finish only a fraction of the job so far. -ACE 2, AGM and CSE had a lot of features implemented or planned. All of them are or have been evaluated for inclusion in ACE3 itself, and we'd like to port the majority of them eventually. However, due to time constraints, we have only managed to do a fraction of the job so far. - -There's really no point on making feature requests for anything included or planned for inclusion in ACE2, AGM or CSE. The majority of those things are been considered for porting or rewritting already. +Please refrain from making requests for any planned or existing features from either ACE2, AGM or CSE. Most of them are already being or have been considered for porting or a rewrite.
-
Please note:
-

Due to the pace at which development is taking place, we are establishing a feature request embargo during the first week weeks prior and posterior to the first release. Feel free to add feature requests as described below, but don't expect them to be evaluated or discussed yet. Any dev activity on the feature request thread is highly unlikely during that period.

+
Note:
+

Due to our current work load, in the period of weeks prior and posterior to the first release, new feature requests are under embargo. Feel free to submit yours now, but don't expect them to be considered just yet. Any treatment or attention by developers towards the feature request thread is highly unlikely during this time.

### Requesting a feature +In order to avoid duplicates and keep the issue tracker organized, we have created a common issue for ACE 3 Feature requests. Any and all relevant requests should be submitted there, where they will also get discussed and evaluated. Before adding a new one, make sure to check the previous entries from the thread and do a quick search for similar suggestions; please don't reiterate requests for features that had already been accepted for inclusion, or those which were disregarded earlier. -In order not to spam the issue tracker with duplicated requests, we have have created a single Issue for feature request. Any and all requests should be done there, where they will get discussed and evaluated. Before posting a new one, please make sure to check the previous entries on the thread and make a quick search; please don't reiterate requests that had already been either accepted for inclusion or disregarded. - -Accepted feature requests may be moved to a separate issue by moderators for further discussion. +Following their approval, feature requests may be moved by moderators to a separate issue for further discussion. diff --git a/documentation/user/shortcuts.md b/documentation/user/shortcuts.md new file mode 100644 index 0000000000..66e12ae76f --- /dev/null +++ b/documentation/user/shortcuts.md @@ -0,0 +1,214 @@ +--- +layout: wiki +title: Shortcuts +group: user +order: 5 +parent: wiki +--- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ShortcutActionPBO
Ctrl+⇧ Shift+KShow ProtractorACE_Advanced_Ballistics
⊞ WinInteraction menuACE_Interaction
Ctrl+⊞ WinSelf-interaction menuACE_Interaction
Ctrl+SpaceOpen/close doorACE_Interaction
Ctrl+TTap on the shoulderACE_Interaction
CtrlModifier keyACE_Logistics
Ctrl+⇧ Shift+TWipe off gogglesACE_Goggles
8Switch grenade modeACE_Grenades
CtrlShow namesACE_NameTags
Alt+Page UpNVG: Increase brightnessACE_NightVision
Alt+Page DownNVG: Decrease brightnessACE_NightVision
⇧ Shift+RClear firearm malfunctionACE_Overheating
OAltimeterACE_Parachute
Ctrl+RCheck ammunitionACE_Reload
`Safety toggleACE_SafeMode
Page UpScope: Elevation upACE_Scopes
Page DownScope: Elevation downACE_Scopes
Ctrl+Page UpScope: Windage leftACE_Scopes
Ctrl+Page DownScope: Windage rightACE_Scopes
Tab ↹Vector: Azimuth keyACE_Vector
RVector: Distance keyACE_Vector
DelSpeed limiterACE_Vehicles
1PistolACE_WeaponSelect
2RifleACE_WeaponSelect
3Grenade launcherACE_WeaponSelect
5BinocularsACE_WeaponSelect
6Frag grenadeACE_WeaponSelect
7Non-frag grenadeACE_WeaponSelect
0Holster weaponACE_WeaponSelect
2Engine onACE_WeaponSelect
1Engine offACE_WeaponSelect
3Primary weaponACE_WeaponSelect
4Machine gunACE_WeaponSelect
5MissilesACE_WeaponSelect
9Fire smoke launcherACE_WeaponSelect
Tab ↹FCS: Lase target (measure distance)ACE_FireControlSsystem
Page UpFCS: Range upACE_FireControlSsystem
Page DownFCS: Range downACE_FireControlSsystem
⇧ Shift+KShow Wind InfoACE_Weather
diff --git a/documentation/user/shourtcuts.md b/documentation/user/shourtcuts.md deleted file mode 100644 index d44dc54886..0000000000 --- a/documentation/user/shourtcuts.md +++ /dev/null @@ -1,204 +0,0 @@ ---- -layout: wiki -title: Shortcuts -group: user -order: 5 -parent: wiki ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PBOCommandShortcut
ACE_InteractionInteraction MenuWin_Left
ACE_InteractionInteraction Menu (Self)Ctrl Win_Left
ACE_InteractionOpen / Close DoorCtrl Space
ACE_InteractionTap ShoulderCtrl T
ACE_LogisticsModifier KeyCtrl_Left
ACE_GogglesWipe GogglesCtrl Shift T
ACE_GrenadesSwitch Grenade Mode8
ACE_NameTagsShow NamesCtrl_Left
ACE_NightVisionIncrease NVG BrightnessAlt Page Up
ACE_NightVisionDecrease NVG BrightnessAlt Page Down
ACE_OverheatingClear jamShift R
ACE_ParachuteShow AltimeterO
ACE_ReloadCheck AmmoCtrl R
ACE_SafeModeSafe Mode`(en) | ^(de)
ACE_ScopesAdjust Elevation UpPage Up
ACE_ScopesAdjust Elevation DownPage Down
ACE_ScopesAdjust Windage LeftCtrl Page Up
ACE_ScopesAdjust Windage RightCtrl Page Down
ACE_VectorVector - Azimuth KeyTab
ACE_VectorVector - Distance KeyR
ACE_VehiclesSpeed LimiterDel
ACE_WeaponSelectSelect Pistol1
ACE_WeaponSelectSelect Rifle2
ACE_WeaponSelectSelect Grenade Launcher3
ACE_WeaponSelectSelect Binoculars5
ACE_WeaponSelectSelect Frag Grenade6
ACE_WeaponSelectSelect Non-Frag Grenade7
ACE_WeaponSelectHolster Weapon0
ACE_WeaponSelectEngine on2
ACE_WeaponSelectEngine off1
ACE_WeaponSelectSelect Main Gun3
ACE_WeaponSelectSelect Machine Gun4
ACE_WeaponSelectSelect Missiles5
ACE_WeaponSelectFire Smoke Launcher9
ACE_FireControlSsystemLase Target / Measure DistanceTab
ACE_FireControlSsystemAdjust FCS Range (Up)Page Up
ACE_FireControlSsystemAdjust FCS Range (Down)Page Down
\ No newline at end of file diff --git a/extensions/advanced_ballistics/AdvancedBallistics.cpp b/extensions/advanced_ballistics/AdvancedBallistics.cpp index 4bc9a28933..e62a564dca 100644 --- a/extensions/advanced_ballistics/AdvancedBallistics.cpp +++ b/extensions/advanced_ballistics/AdvancedBallistics.cpp @@ -461,7 +461,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) if (gridHeight > position[2]) { double angle = atan((gridHeight - position[2]) / 100); - windAttenuation *= pow(cos(angle), 2); + windAttenuation *= pow(abs(cos(angle)), 2); } } } @@ -476,7 +476,7 @@ void __stdcall RVExtension(char *output, int outputSize, const char *function) if (heightAGL > 0 && heightAGL < 20) { double roughnessLength = calculateRoughnessLength(windSourceObstacles[0], windSourceObstacles[1]); - windAttenuation *= (log(heightAGL / roughnessLength) / log(20 / roughnessLength)); + windAttenuation *= abs(log(heightAGL / roughnessLength) / log(20 / roughnessLength)); } } diff --git a/extras/CfgWeaponsReference.hpp b/extras/CfgWeaponsReference.hpp index 77ce494e39..4821d53813 100644 --- a/extras/CfgWeaponsReference.hpp +++ b/extras/CfgWeaponsReference.hpp @@ -294,7 +294,7 @@ class CfgWeapons class RH_gsh18 : Pistol_Base_F { ACE_barrelTwist=9.8; - ACE_barrelLength=4.1; + ACE_barrelLength=4.1; }; class RH_mateba : Pistol_Base_F { @@ -329,7 +329,7 @@ class CfgWeapons class RH_fn57 : Pistol_Base_F { ACE_barrelTwist=9.1; - ACE_barrelLength=4.8; + ACE_barrelLength=4.8; }; class RH_vp70 : Pistol_Base_F { diff --git a/extras/assets/icons/png/Icon_Module_mk6_ca.png b/extras/assets/icons/png/Icon_Module_mk6_ca.png new file mode 100644 index 0000000000..26c2966551 Binary files /dev/null and b/extras/assets/icons/png/Icon_Module_mk6_ca.png differ diff --git a/optionals/asdg_comp/config.cpp b/optionals/compat_asdg/config.cpp similarity index 96% rename from optionals/asdg_comp/config.cpp rename to optionals/compat_asdg/config.cpp index b485685c55..c7e7903ce2 100644 --- a/optionals/asdg_comp/config.cpp +++ b/optionals/compat_asdg/config.cpp @@ -28,6 +28,7 @@ class asdg_OpticRail1913: asdg_OpticRail { 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; diff --git a/optionals/asdg_comp/script_component.hpp b/optionals/compat_asdg/script_component.hpp similarity index 100% rename from optionals/asdg_comp/script_component.hpp rename to optionals/compat_asdg/script_component.hpp diff --git a/optionals/compat_cup/CfgAmmo.hpp b/optionals/compat_cup/CfgAmmo.hpp new file mode 100644 index 0000000000..1dcd91bc23 --- /dev/null +++ b/optionals/compat_cup/CfgAmmo.hpp @@ -0,0 +1,422 @@ +class CfgAmmo +{ + class BulletBase; + class B_762x51_Ball; + class B_127x99_Ball; + class CUP_B_545x39_Ball: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + 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[]={10, 16.3, 20}; + }; + class CUP_B_545x39_Ball_Tracer_Green: CUP_B_545x39_Ball + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + 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[]={10, 16.3, 20}; + }; + class CUP_B_545x39_Ball_Tracer_Red: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + 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[]={10, 16.3, 20}; + }; + class CUP_B_545x39_Ball_Tracer_White: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + 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[]={10, 16.3, 20}; + }; + class CUP_B_545x39_Ball_Tracer_Yellow: BulletBase + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + 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[]={10, 16.3, 20}; + }; + class CUP_B_762x39_Ball: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + 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[]={10, 16.3, 20}; + }; + class CUP_B_762x39_Ball_Tracer_Green: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=117; + 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[]={10, 16.3, 20}; + }; + class CUP_B_9x18_Ball: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + 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[]={3.8, 5, 9}; + }; + class CUP_B_9x18_Ball_Tracer_Green: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + 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[]={3.8, 5, 9}; + }; + class CUP_B_9x18_Ball_Tracer_Red: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + 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[]={3.8, 5, 9}; + }; + class CUP_B_9x18_Ball_Tracer_Yellow: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + 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[]={3.8, 5, 9}; + }; + class CUP_B_9x18_Ball_White_Tracer: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + 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[]={3.8, 5, 9}; + }; + class CUP_B_9x19_Ball: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + 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[]={4, 5, 9}; + }; + class CUP_B_762x51_noTracer: B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + 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[]={10, 16, 20, 24, 26}; + }; + class CUP_B_303_Ball: BulletBase + { + ACE_caliber=0.311; + ACE_bulletLength=1.227; + ACE_bulletMass=174; + 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[]={20, 24, 26}; + }; + class CUP_B_127x107_Ball_Green_Tracer: BulletBase + { + ACE_caliber=0.511; + ACE_bulletLength=2.520; + ACE_bulletMass=745; + 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[]={28.7}; + }; + class CUP_B_127x108_Ball_Green_Tracer: BulletBase + { + ACE_caliber=0.511; + ACE_bulletLength=2.520; + ACE_bulletMass=745; + 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[]={28.7}; + }; + class CUP_B_762x54_Ball_White_Tracer: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + 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[]={16, 20, 24, 26}; + }; + class CUP_B_762x54_Ball_Red_Tracer: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + 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[]={16, 20, 24, 26}; + }; + class CUP_B_762x54_Ball_Green_Tracer: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + 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[]={16, 20, 24, 26}; + }; + class CUP_B_762x54_Ball_Yellow_Tracer: BulletBase + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + 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[]={16, 20, 24, 26}; + }; + class CUP_B_9x39_SP5: BulletBase + { + ACE_caliber=0.364; + ACE_bulletLength=1.24; + ACE_bulletMass=250; + 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[]={10, 16.3, 20}; + }; + class CUP_B_762x51_Tracer_Green: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + 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[]={10, 16, 20, 24, 26}; + }; + class CUP_B_762x51_Tracer_Red: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + 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[]={10, 16, 20, 24, 26}; + }; + class CUP_B_762x51_Tracer_Yellow: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + 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[]={10, 16, 20, 24, 26}; + }; + class CUP_B_762x51_Tracer_White: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + 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[]={10, 16, 20, 24, 26}; + }; + class B_127x107_Ball: BulletBase + { + ACE_caliber=0.511; + ACE_bulletLength=2.520; + ACE_bulletMass=745; + 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[]={28.7}; + }; + class CUP_B_9x18_SD: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + 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[]={3.8, 5, 9}; + }; + class CUP_B_765x17_Ball: BulletBase + { + ACE_caliber=0.3125; + ACE_bulletLength=0.610; + ACE_bulletMass=65; + 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[]={4, 5, 9}; + }; + class CUP_B_145x115_AP_Green_Tracer: BulletBase + { + ACE_caliber=0.586; + ACE_bulletLength=2.00; + ACE_bulletMass=1010; + 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[]={53}; + }; + class CUP_B_127x99_Ball_White_Tracer: B_127x99_Ball + { + ACE_caliber=0.510; + ACE_bulletLength=2.310; + ACE_bulletMass=647; + 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[]={29}; + }; + class CUP_B_86x70_Ball_noTracer: BulletBase + { + ACE_caliber=0.338; + ACE_bulletLength=1.70; + ACE_bulletMass=300; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.381}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={820, 826, 830}; + ACE_barrelLengths[]={24, 26.5, 28}; + }; +}; \ No newline at end of file diff --git a/optionals/compat_cup/config.cpp b/optionals/compat_cup/config.cpp new file mode 100644 index 0000000000..e4f26f8051 --- /dev/null +++ b/optionals/compat_cup/config.cpp @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"CUP_Weapons_Ammunition"}; + author[]={"Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" diff --git a/optionals/compat_cup/script_component.hpp b/optionals/compat_cup/script_component.hpp new file mode 100644 index 0000000000..3d77fcb370 --- /dev/null +++ b/optionals/compat_cup/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT CUP_Weapons_Ammunition_comp + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/hlc_ar15_comp/CfgWeapons.hpp b/optionals/compat_hlc_ar15/CfgWeapons.hpp similarity index 100% rename from optionals/hlc_ar15_comp/CfgWeapons.hpp rename to optionals/compat_hlc_ar15/CfgWeapons.hpp diff --git a/optionals/hlc_ar15_comp/config.cpp b/optionals/compat_hlc_ar15/config.cpp similarity index 100% rename from optionals/hlc_ar15_comp/config.cpp rename to optionals/compat_hlc_ar15/config.cpp diff --git a/optionals/hlc_ar15_comp/script_component.hpp b/optionals/compat_hlc_ar15/script_component.hpp similarity index 100% rename from optionals/hlc_ar15_comp/script_component.hpp rename to optionals/compat_hlc_ar15/script_component.hpp diff --git a/optionals/hlc_wp_mp5_comp/CfgWeapons.hpp b/optionals/compat_hlc_wp_mp5/CfgWeapons.hpp similarity index 100% rename from optionals/hlc_wp_mp5_comp/CfgWeapons.hpp rename to optionals/compat_hlc_wp_mp5/CfgWeapons.hpp diff --git a/optionals/hlc_wp_mp5_comp/config.cpp b/optionals/compat_hlc_wp_mp5/config.cpp similarity index 100% rename from optionals/hlc_wp_mp5_comp/config.cpp rename to optionals/compat_hlc_wp_mp5/config.cpp diff --git a/optionals/hlc_wp_mp5_comp/script_component.hpp b/optionals/compat_hlc_wp_mp5/script_component.hpp similarity index 100% rename from optionals/hlc_wp_mp5_comp/script_component.hpp rename to optionals/compat_hlc_wp_mp5/script_component.hpp diff --git a/optionals/hlcmods_ak_comp/CfgWeapons.hpp b/optionals/compat_hlcmods_ak/CfgWeapons.hpp similarity index 60% rename from optionals/hlcmods_ak_comp/CfgWeapons.hpp rename to optionals/compat_hlcmods_ak/CfgWeapons.hpp index 51a86e42cf..390d3e6177 100644 --- a/optionals/hlcmods_ak_comp/CfgWeapons.hpp +++ b/optionals/compat_hlcmods_ak/CfgWeapons.hpp @@ -1,7 +1,9 @@ class CfgWeapons { + class optic_dms; class hlc_ak_base; class hlc_rifle_ak12; + class InventoryOpticsItem_Base_F; class hlc_rifle_ak74: hlc_ak_base { ACE_barrelTwist=7.8699999; @@ -52,4 +54,23 @@ class CfgWeapons ACE_twistDirection=0; ACE_barrelLength=16.9; }; + + class HLC_Optic_PSO1 : optic_dms { + ACE_ScopeAdjust_Vertical[] = { 0, 0 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_Increment = 0.5; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Snip { + discreteDistance[]={100, 200, 300, 400, 450, 500, 550, 600, 650, 700, 750, 800, 850, 900, 950, 1000}; + discreteDistanceInitIndex=3; + }; + }; + }; + }; + class HLC_Optic_1p29 : HLC_Optic_PSO1 { + ACE_ScopeAdjust_Vertical[] = {}; + ACE_ScopeAdjust_Horizontal[] = {}; + ACE_ScopeAdjust_Increment = 0; + }; }; \ No newline at end of file diff --git a/optionals/hlcmods_ak_comp/config.cpp b/optionals/compat_hlcmods_ak/config.cpp similarity index 100% rename from optionals/hlcmods_ak_comp/config.cpp rename to optionals/compat_hlcmods_ak/config.cpp diff --git a/optionals/hlcmods_ak_comp/script_component.hpp b/optionals/compat_hlcmods_ak/script_component.hpp similarity index 100% rename from optionals/hlcmods_ak_comp/script_component.hpp rename to optionals/compat_hlcmods_ak/script_component.hpp diff --git a/optionals/compat_hlcmods_aug/CfgWeapons.hpp b/optionals/compat_hlcmods_aug/CfgWeapons.hpp new file mode 100644 index 0000000000..b46cf485e1 --- /dev/null +++ b/optionals/compat_hlcmods_aug/CfgWeapons.hpp @@ -0,0 +1,51 @@ + +class CfgWeapons +{ + class Rifle_Base_F; + class hlc_aug_base; + class hlc_rifle_aug: hlc_aug_base + { + ACE_barrelTwist=9; + ACE_barrelLength=20; + }; + class hlc_rifle_auga1carb: hlc_rifle_aug + { + ACE_barrelTwist=9; + ACE_barrelLength=16; + }; + class hlc_rifle_aughbar: hlc_rifle_aug + { + ACE_barrelTwist=9; + ACE_barrelLength=24; + }; + class hlc_rifle_augpara: hlc_rifle_aug + { + ACE_barrelTwist=9; + ACE_barrelLength=16.5; + }; + class hlc_rifle_auga2: hlc_rifle_aug + { + ACE_barrelTwist=9; + ACE_barrelLength=20; + }; + class hlc_rifle_auga2para: hlc_rifle_auga2 + { + ACE_barrelTwist=9; + ACE_barrelLength=16.5; + }; + class hlc_rifle_auga2carb: hlc_rifle_auga2 + { + ACE_barrelTwist=9; + ACE_barrelLength=18; + }; + class hlc_rifle_auga2lsw: hlc_rifle_aughbar + { + ACE_barrelTwist=9; + ACE_barrelLength=24; + }; + class hlc_rifle_auga3: hlc_rifle_aug + { + ACE_barrelTwist=9; + ACE_barrelLength=18; + }; +}; \ No newline at end of file diff --git a/optionals/compat_hlcmods_aug/config.cpp b/optionals/compat_hlcmods_aug/config.cpp new file mode 100644 index 0000000000..06192a6ffd --- /dev/null +++ b/optionals/compat_hlcmods_aug/config.cpp @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"hlcweapons_AUG"}; + author[]={"Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/optionals/compat_hlcmods_aug/script_component.hpp b/optionals/compat_hlcmods_aug/script_component.hpp new file mode 100644 index 0000000000..d5a6712b6b --- /dev/null +++ b/optionals/compat_hlcmods_aug/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT hlcweapons_AUG_comp + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/hlcmods_core_comp/CfgAmmo.hpp b/optionals/compat_hlcmods_core/CfgAmmo.hpp similarity index 99% rename from optionals/hlcmods_core_comp/CfgAmmo.hpp rename to optionals/compat_hlcmods_core/CfgAmmo.hpp index dd060b5cbb..7259d2da3d 100644 --- a/optionals/hlcmods_core_comp/CfgAmmo.hpp +++ b/optionals/compat_hlcmods_core/CfgAmmo.hpp @@ -4,6 +4,7 @@ class CfgAmmo class B_556x45_Ball; class B_127x99_Ball; class B_127x99_Ball_Tracer_Red; + class HLC_762x51_tracer; class HLC_762x51_ball; class HLC_556NATO_EPR: B_556x45_Ball { diff --git a/optionals/hlcmods_core_comp/config.cpp b/optionals/compat_hlcmods_core/config.cpp similarity index 100% rename from optionals/hlcmods_core_comp/config.cpp rename to optionals/compat_hlcmods_core/config.cpp diff --git a/optionals/hlcmods_core_comp/script_component.hpp b/optionals/compat_hlcmods_core/script_component.hpp similarity index 100% rename from optionals/hlcmods_core_comp/script_component.hpp rename to optionals/compat_hlcmods_core/script_component.hpp diff --git a/optionals/hlcmods_fal_comp/CfgWeapons.hpp b/optionals/compat_hlcmods_fal/CfgWeapons.hpp similarity index 100% rename from optionals/hlcmods_fal_comp/CfgWeapons.hpp rename to optionals/compat_hlcmods_fal/CfgWeapons.hpp diff --git a/optionals/hlcmods_fal_comp/config.cpp b/optionals/compat_hlcmods_fal/config.cpp similarity index 100% rename from optionals/hlcmods_fal_comp/config.cpp rename to optionals/compat_hlcmods_fal/config.cpp diff --git a/optionals/hlcmods_fal_comp/script_component.hpp b/optionals/compat_hlcmods_fal/script_component.hpp similarity index 100% rename from optionals/hlcmods_fal_comp/script_component.hpp rename to optionals/compat_hlcmods_fal/script_component.hpp diff --git a/optionals/hlcmods_g3_comp/CfgWeapons.hpp b/optionals/compat_hlcmods_g3/CfgWeapons.hpp similarity index 100% rename from optionals/hlcmods_g3_comp/CfgWeapons.hpp rename to optionals/compat_hlcmods_g3/CfgWeapons.hpp diff --git a/optionals/hlcmods_g3_comp/config.cpp b/optionals/compat_hlcmods_g3/config.cpp similarity index 100% rename from optionals/hlcmods_g3_comp/config.cpp rename to optionals/compat_hlcmods_g3/config.cpp diff --git a/optionals/hlcmods_g3_comp/script_component.hpp b/optionals/compat_hlcmods_g3/script_component.hpp similarity index 100% rename from optionals/hlcmods_g3_comp/script_component.hpp rename to optionals/compat_hlcmods_g3/script_component.hpp diff --git a/optionals/hlcmods_m14_comp/CfgWeapons.hpp b/optionals/compat_hlcmods_m14/CfgWeapons.hpp similarity index 100% rename from optionals/hlcmods_m14_comp/CfgWeapons.hpp rename to optionals/compat_hlcmods_m14/CfgWeapons.hpp diff --git a/optionals/hlcmods_m14_comp/config.cpp b/optionals/compat_hlcmods_m14/config.cpp similarity index 100% rename from optionals/hlcmods_m14_comp/config.cpp rename to optionals/compat_hlcmods_m14/config.cpp diff --git a/optionals/hlcmods_m14_comp/script_component.hpp b/optionals/compat_hlcmods_m14/script_component.hpp similarity index 100% rename from optionals/hlcmods_m14_comp/script_component.hpp rename to optionals/compat_hlcmods_m14/script_component.hpp diff --git a/optionals/hlcmods_m60e4_comp/CfgWeapons.hpp b/optionals/compat_hlcmods_m60e4/CfgWeapons.hpp similarity index 100% rename from optionals/hlcmods_m60e4_comp/CfgWeapons.hpp rename to optionals/compat_hlcmods_m60e4/CfgWeapons.hpp diff --git a/optionals/hlcmods_m60e4_comp/config.cpp b/optionals/compat_hlcmods_m60e4/config.cpp similarity index 100% rename from optionals/hlcmods_m60e4_comp/config.cpp rename to optionals/compat_hlcmods_m60e4/config.cpp diff --git a/optionals/hlcmods_m60e4_comp/script_component.hpp b/optionals/compat_hlcmods_m60e4/script_component.hpp similarity index 100% rename from optionals/hlcmods_m60e4_comp/script_component.hpp rename to optionals/compat_hlcmods_m60e4/script_component.hpp diff --git a/optionals/compat_rh_acc/CfgWeapons.hpp b/optionals/compat_rh_acc/CfgWeapons.hpp new file mode 100644 index 0000000000..4dda8ffbe0 --- /dev/null +++ b/optionals/compat_rh_acc/CfgWeapons.hpp @@ -0,0 +1,131 @@ + +class CfgWeapons { + class ItemCore; + class InventoryOpticsItem_Base_F; + + class RH_accupoint : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Accupoint { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + class RH_m3lr : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class m3lr { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + class RH_leu_mk4 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class mk4 { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + class RH_c79 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class c79scope { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + class RH_c79_2d : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class c79scope { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + class RH_anpvs10 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class pvs10 { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + class RH_pas13cm : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class MTWS { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + class RH_pas13cmg : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class MTWSmg { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + class RH_pas13ch : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class HTWS { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/optionals/compat_rh_acc/config.cpp b/optionals/compat_rh_acc/config.cpp new file mode 100644 index 0000000000..9f563bd157 --- /dev/null +++ b/optionals/compat_rh_acc/config.cpp @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"RH_acc"}; + author[]={"Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/optionals/rh_m4_comp/script_component.hpp b/optionals/compat_rh_acc/script_component.hpp similarity index 76% rename from optionals/rh_m4_comp/script_component.hpp rename to optionals/compat_rh_acc/script_component.hpp index 4ab887e889..4b36a38ce0 100644 --- a/optionals/rh_m4_comp/script_component.hpp +++ b/optionals/compat_rh_acc/script_component.hpp @@ -1,4 +1,4 @@ -#define COMPONENT rh_m4_comp +#define COMPONENT RH_acc_comp #include "\z\ace\addons\main\script_mod.hpp" diff --git a/optionals/compat_rh_de/CfgAmmo.hpp b/optionals/compat_rh_de/CfgAmmo.hpp new file mode 100644 index 0000000000..b66b55f530 --- /dev/null +++ b/optionals/compat_rh_de/CfgAmmo.hpp @@ -0,0 +1,161 @@ + +class CfgAmmo +{ + class BulletBase; + class RH_50_AE_Ball: BulletBase + { + ACE_caliber=0.5; + ACE_bulletLength=1.110; + ACE_bulletMass=325; + 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.228}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 398, 420}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_454_Casull: BulletBase + { + ACE_caliber=0.452; + ACE_bulletLength=0.895; + ACE_bulletMass=325; + 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.171}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={450, 490, 500}; + ACE_barrelLengths[]={4, 7.5, 9}; + }; + class RH_32ACP: BulletBase + { + ACE_caliber=0.3125; + ACE_bulletLength=0.610; + ACE_bulletMass=65; + 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[]={4, 5, 9}; + }; + class RH_45ACP: BulletBase + { + ACE_caliber=0.452; + ACE_bulletLength=0.68; + ACE_bulletMass=230; + 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.195}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={230, 250, 285}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class RH_B_40SW: BulletBase + { + ACE_caliber=0.4; + ACE_bulletLength=0.447; + ACE_bulletMass=135; + 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.105, 0.115, 0.120, 0.105}; + ACE_velocityBoundaries[]={365, 305, 259}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 380, 400}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_44mag_ball: BulletBase + { + ACE_caliber=0.429; + ACE_bulletLength=0.804; + ACE_bulletMass=200; + 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.172}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 390, 420}; + ACE_barrelLengths[]={4, 7.5, 9}; + }; + class RH_357mag_ball: BulletBase + { + ACE_caliber=0.357; + ACE_bulletLength=0.541; + ACE_bulletMass=125; + 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.148}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={490, 510, 535}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_762x25: BulletBase + { + ACE_caliber=0.310; + ACE_bulletLength=0.5455; + ACE_bulletMass=86; + 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.17}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={360, 380, 400}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_9x18_Ball: BulletBase + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + 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[]={3.8, 5, 9}; + }; + class RH_B_9x19_Ball: BulletBase + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=124; + 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[]={4, 5, 9}; + }; + class RH_B_22LR_SD: BulletBase + { + ACE_caliber=0.223; + ACE_bulletLength=0.45; + ACE_bulletMass=38; + 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.111}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={330, 340, 360}; + ACE_barrelLengths[]={4, 6, 9}; + }; + class RH_57x28mm: BulletBase + { + ACE_caliber=0.224; + ACE_bulletLength=0.495; + ACE_bulletMass=28; + 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.144}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={550, 625, 720}; + ACE_barrelLengths[]={4, 6, 10.35}; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rh_de/CfgWeapons.hpp b/optionals/compat_rh_de/CfgWeapons.hpp new file mode 100644 index 0000000000..8fdff293c9 --- /dev/null +++ b/optionals/compat_rh_de/CfgWeapons.hpp @@ -0,0 +1,140 @@ +class CfgWeapons +{ + class Pistol_Base_F; + class RH_Pistol_Base_F; + class RH_deagle: RH_Pistol_Base_F + { + ACE_barrelTwist=19; + ACE_barrelLength=6; + }; + class RH_mateba: Pistol_Base_F + { + ACE_barrelTwist=14; + ACE_barrelLength=6; + }; + class RH_mp412: Pistol_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=6; + }; + class RH_python: Pistol_Base_F + { + ACE_barrelTwist=14; + ACE_barrelLength=6; + }; + class RH_bull: RH_python + { + ACE_barrelTwist=24; + ACE_barrelLength=6.5; + }; + class RH_ttracker: Pistol_Base_F + { + ACE_barrelTwist=12; + ACE_barrelLength=4; + }; + class RH_cz75: RH_Pistol_Base_F + { + ACE_barrelTwist=9.7; + ACE_barrelLength=4.7; + }; + class RH_p226: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.4; + }; + class RH_sw659: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=7.44; + }; + class RH_usp: RH_Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.41; + }; + class RH_uspm: RH_Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=6; + }; + class RH_kimber: RH_Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5; + }; + class RH_m1911: RH_Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5; + }; + class RH_tt33: RH_Pistol_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=4.6; + }; + class RH_mak: RH_Pistol_Base_F + { + ACE_barrelTwist=9.45; + ACE_barrelLength=3.68; + }; + class RH_mk2: RH_Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4; + }; + class RH_m9: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.9; + }; + class RH_g18: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.49; + }; + class RH_g17: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.49; + }; + class RH_g19: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4; + }; + class RH_gsh18: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.1; + }; + class RH_fnp45: RH_Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.5; + }; + class RH_fn57: RH_fnp45 + { + ACE_barrelTwist=9.1; + ACE_barrelLength=4.8; + }; + class RH_vp70: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=4.6; + }; + class RH_vz61: RH_Pistol_Base_F + { + ACE_barrelTwist=16; + ACE_barrelLength=4.5; + }; + class RH_tec9: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=5; + }; + class RH_muzi: RH_Pistol_Base_F + { + ACE_barrelTwist=9.8; + ACE_barrelLength=5; + }; +}; \ No newline at end of file diff --git a/optionals/rh_m4_comp/config.cpp b/optionals/compat_rh_de/config.cpp similarity index 82% rename from optionals/rh_m4_comp/config.cpp rename to optionals/compat_rh_de/config.cpp index 937097354f..3d82eab05a 100644 --- a/optionals/rh_m4_comp/config.cpp +++ b/optionals/compat_rh_de/config.cpp @@ -5,7 +5,7 @@ class CfgPatches { units[] = {}; weapons[] = {}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"asdg_jointrails","RH_m4_cfg"}; + requiredAddons[] = {"RH_de_cfg"}; author[]={"Ruthberg"}; VERSION_CONFIG; }; diff --git a/optionals/compat_rh_de/script_component.hpp b/optionals/compat_rh_de/script_component.hpp new file mode 100644 index 0000000000..07ed06ae3f --- /dev/null +++ b/optionals/compat_rh_de/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT RH_de_cfg_comp + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/rh_m4_comp/CfgAmmo.hpp b/optionals/compat_rh_m4/CfgAmmo.hpp similarity index 100% rename from optionals/rh_m4_comp/CfgAmmo.hpp rename to optionals/compat_rh_m4/CfgAmmo.hpp diff --git a/optionals/rh_m4_comp/CfgWeapons.hpp b/optionals/compat_rh_m4/CfgWeapons.hpp similarity index 77% rename from optionals/rh_m4_comp/CfgWeapons.hpp rename to optionals/compat_rh_m4/CfgWeapons.hpp index 132859f778..69536e9302 100644 --- a/optionals/rh_m4_comp/CfgWeapons.hpp +++ b/optionals/compat_rh_m4/CfgWeapons.hpp @@ -1,35 +1,7 @@ -class Mode_SemiAuto; -class Mode_Burst; -class Mode_FullAuto; -class SlotInfo; -class MuzzleSlot; -class CowsSlot; -class PointerSlot; -class UnderBarrelSlot; -class asdg_SlotInfo; -class asdg_FrontSideRail; -class asdg_OpticRail; -class asdg_OpticRail1913; -class asdg_OpticRail1913_short; -class asdg_MuzzleSlot_556; -class asdg_MuzzleSlot_762; -class asdg_MuzzleSlot_9MM; -class asdg_UnderSlot; class CfgWeapons { - class Rifle; - class UGL_F; - class Rifle_Base_F: Rifle - { - }; - class ItemCore; - class ItemInfo; - class InventoryItem_Base_F; - class InventoryMuzzleItem_Base_F; - class InventoryOpticsItem_Base_F; - class InventoryFlashLightItem_Base_F; - class Zasleh2; + class Rifle_Base_F; class RH_ar10: Rifle_Base_F { ACE_barrelTwist=11.25; @@ -105,7 +77,7 @@ class CfgWeapons ACE_barrelTwist=7; ACE_barrelLength=20; }; - class RH_M16A4 : Rifle_Base_F + class RH_M16A4 : RH_M4_ris { ACE_barrelTwist=7; ACE_barrelLength=20; diff --git a/optionals/compat_rh_m4/config.cpp b/optionals/compat_rh_m4/config.cpp new file mode 100644 index 0000000000..9c28be4f89 --- /dev/null +++ b/optionals/compat_rh_m4/config.cpp @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"RH_m4_cfg"}; + author[]={"Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rh_m4/script_component.hpp b/optionals/compat_rh_m4/script_component.hpp new file mode 100644 index 0000000000..167c926dd7 --- /dev/null +++ b/optionals/compat_rh_m4/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT RH_m4_cfg_comp + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_rh_pdw/CfgAmmo.hpp b/optionals/compat_rh_pdw/CfgAmmo.hpp new file mode 100644 index 0000000000..706344ff8c --- /dev/null +++ b/optionals/compat_rh_pdw/CfgAmmo.hpp @@ -0,0 +1,15 @@ + +class BulletBase; +class RH_B_6x35: BulletBase +{ + ACE_caliber=0.224; + ACE_bulletLength=0.445; + ACE_bulletMass=65; + 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.26}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={730, 750, 760}; + ACE_barrelLengths[]={8, 10, 12}; +}; \ No newline at end of file diff --git a/optionals/compat_rh_pdw/CfgWeapons.hpp b/optionals/compat_rh_pdw/CfgWeapons.hpp new file mode 100644 index 0000000000..b009a202ce --- /dev/null +++ b/optionals/compat_rh_pdw/CfgWeapons.hpp @@ -0,0 +1,10 @@ + +class CfgWeapons +{ + class Rifle_Base_F; + class RH_PDW: Rifle_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=10; + }; +}; diff --git a/optionals/compat_rh_pdw/config.cpp b/optionals/compat_rh_pdw/config.cpp new file mode 100644 index 0000000000..4aed0e6241 --- /dev/null +++ b/optionals/compat_rh_pdw/config.cpp @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"RH_PDW"}; + author[]={"Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rh_pdw/script_component.hpp b/optionals/compat_rh_pdw/script_component.hpp new file mode 100644 index 0000000000..67c4617e06 --- /dev/null +++ b/optionals/compat_rh_pdw/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT RH_PDW_comp + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_rhs_afrf3/CfgAmmo.hpp b/optionals/compat_rhs_afrf3/CfgAmmo.hpp new file mode 100644 index 0000000000..323634f02c --- /dev/null +++ b/optionals/compat_rhs_afrf3/CfgAmmo.hpp @@ -0,0 +1,125 @@ + +class CfgAmmo +{ + class BulletBase; + class B_556x45_Ball; + class rhs_B_545x39_Ball: B_556x45_Ball + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=52.9; + 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[]={10, 16.3, 20}; + }; + class rhs_B_545x39_Ball_Tracer_Green: rhs_B_545x39_Ball + { + ACE_caliber=0.220; + ACE_bulletLength=0.85; + ACE_bulletMass=49.8; + 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[]={10, 16.3, 20}; + }; + class B_762x51_Ball; + class rhs_B_762x54_Ball: B_762x51_Ball + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class rhs_B_762x54_Ball_Tracer_Green: B_762x51_Ball + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=149; + 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[]={16, 20, 24, 26}; + }; + class rhs_B_762x54_7N1_Ball: rhs_B_762x54_Ball + { + ACE_caliber=0.312; + ACE_bulletLength=1.14; + ACE_bulletMass=152; + ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19}; + ACE_ballisticCoefficients[]={0.4}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={700, 800, 820, 833}; + ACE_barrelLengths[]={16, 20, 24, 26}; + }; + class rhs_B_762x39_Ball: B_762x51_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=123; + 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[]={10, 16.3, 20}; + }; + class rhs_B_762x39_Tracer: rhs_B_762x39_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=117; + 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[]={10, 16.3, 20}; + }; + class B_9x21_Ball; + class rhs_B_9x19_7N21: B_9x21_Ball + { + ACE_caliber=0.355; + ACE_bulletLength=0.610; + ACE_bulletMass=80.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.14}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={445, 460, 480}; + ACE_barrelLengths[]={4, 5, 9}; + }; + class rhs_B_9x18_57N181S: B_9x21_Ball + { + ACE_caliber=0.365; + ACE_bulletLength=0.610; + ACE_bulletMass=92.6; + ACE_ammoTempMuzzleVelocityShifts[]={-2.655, -2.547, -2.285, -2.012, -1.698, -1.280, -0.764, -0.153, 0.596, 1.517, 2.619}; + ACE_ballisticCoefficients[]={0.125}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={298, 330, 350}; + ACE_barrelLengths[]={3.8, 5, 9}; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_afrf3/CfgWeapons.hpp b/optionals/compat_rhs_afrf3/CfgWeapons.hpp new file mode 100644 index 0000000000..49573b164a --- /dev/null +++ b/optionals/compat_rhs_afrf3/CfgWeapons.hpp @@ -0,0 +1,67 @@ + +class CfgWeapons +{ + class hgun_Rook40_F; + class rhs_weap_pya: hgun_Rook40_F + { + ACE_barrelTwist=10; + ACE_barrelLength=4.4; + }; + class Pistol_Base_F; + class rhs_weap_makarov_pmm: rhs_weap_pya + { + ACE_barrelTwist=9.45; + ACE_barrelLength=3.68; + }; + class rhs_weap_ak74m_Base_F; + class rhs_weap_ak74m: rhs_weap_ak74m_Base_F + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class rhs_weap_akm: rhs_weap_ak74m + { + ACE_barrelTwist=7.87; + ACE_barrelLength=16.3; + }; + class rhs_weap_aks74; + class rhs_weap_aks74u: rhs_weap_aks74 + { + ACE_barrelTwist=6.3; + ACE_barrelLength=8.3; + }; + class rhs_weap_svd: rhs_weap_ak74m + { + ACE_barrelTwist=9.4; + ACE_barrelLength=24.4; + }; + class rhs_weap_svdp; + class rhs_weap_svds: rhs_weap_svdp + { + ACE_barrelTwist=9.4; + ACE_barrelLength=22.2; + }; + class rhs_pkp_base; + class rhs_weap_pkp: rhs_pkp_base + { + ACE_barrelTwist=9.45; + ACE_barrelLength=25.9; + }; + class rhs_weap_pkm: rhs_weap_pkp + { + ACE_barrelTwist=9.45; + ACE_barrelLength=25.4; + }; + class rhs_weap_rpk74m: rhs_weap_pkp + { + ACE_barrelTwist=7.68; + ACE_barrelLength=23.2; + }; + + class rhs_acc_sniper_base; + class rhs_acc_pso1m2: rhs_acc_sniper_base { + ACE_ScopeAdjust_Vertical[] = { 0, 0 }; + ACE_ScopeAdjust_Horizontal[] = { -10, 10 }; + ACE_ScopeAdjust_Increment = 0.5; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_afrf3/config.cpp b/optionals/compat_rhs_afrf3/config.cpp new file mode 100644 index 0000000000..8b7f9d5ca4 --- /dev/null +++ b/optionals/compat_rhs_afrf3/config.cpp @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"rhs_c_weapons"}; + author[]={"Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rhs_afrf3/script_component.hpp b/optionals/compat_rhs_afrf3/script_component.hpp new file mode 100644 index 0000000000..edf3963b1f --- /dev/null +++ b/optionals/compat_rhs_afrf3/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT rhs_c_weapons_comp + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_rhs_usf3/CfgAmmo.hpp b/optionals/compat_rhs_usf3/CfgAmmo.hpp new file mode 100644 index 0000000000..68a8c8f7fd --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgAmmo.hpp @@ -0,0 +1,97 @@ + +class CfgAmmo +{ + class BulletBase; + class rhsusf_B_300winmag: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.489; + ACE_bulletMass=220; + 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="ICAO"; + ACE_dragModel=7; + ACE_muzzleVelocities[]={847, 867, 877}; + ACE_barrelLengths[]={20, 24, 26}; + }; + class B_556x45_Ball; + class rhs_ammo_556x45_Mk318_Ball: B_556x45_Ball + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=62; + 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.307}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={780, 886, 950}; + ACE_barrelLengths[]={10, 15.5, 20}; + }; + class rhs_ammo_556x45_Mk262_Ball: B_556x45_Ball + { + ACE_caliber=0.224; + ACE_bulletLength=0.906; + ACE_bulletMass=77; + 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.361}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={624, 816, 832, 838}; + ACE_barrelLengths[]={7.5, 14.5, 18, 20}; + }; + class rhs_ammo_762x51_M80_Ball: BulletBase + { + ACE_caliber=0.308; + ACE_bulletLength=1.14; + ACE_bulletMass=146; + 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[]={10, 16, 20, 24, 26}; + }; + class rhs_ammo_762x51_M118_Special_Ball: rhs_ammo_762x51_M80_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=175; + 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[]={16, 20, 24, 26}; + }; + class rhs_ammo_762x51_M993_Ball: rhs_ammo_762x51_M80_Ball + { + ACE_caliber=0.308; + ACE_bulletLength=1.24; + ACE_bulletMass=127; + 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.377}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ICAO"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={875, 910, 930}; + ACE_barrelLengths[]={13, 16, 20}; + }; + class rhs_ammo_45ACP_MHP: BulletBase + { + ACE_caliber=0.452; + ACE_bulletLength=0.68; + ACE_bulletMass=230; + 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.195}; + ACE_velocityBoundaries[]={}; + ACE_standardAtmosphere="ASM"; + ACE_dragModel=1; + ACE_muzzleVelocities[]={230, 250, 285}; + ACE_barrelLengths[]={4, 5, 9}; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_usf3/CfgWeapons.hpp b/optionals/compat_rhs_usf3/CfgWeapons.hpp new file mode 100644 index 0000000000..a9791cd6b8 --- /dev/null +++ b/optionals/compat_rhs_usf3/CfgWeapons.hpp @@ -0,0 +1,86 @@ + +class CfgWeapons +{ + class Pistol_Base_F; + class Rifle_Base_F; + class srifle_EBR_F; + class rhs_weap_XM2010_Base_F: Rifle_Base_F + { + ACE_barrelTwist=10; + ACE_barrelLength=24; + }; + class arifle_MX_Base_F; + class rhs_weap_m4_Base: arifle_MX_Base_F + { + ACE_barrelTwist=7; + ACE_barrelLength=14.5; + }; + class rhs_weap_m4a1; + class rhs_weap_mk18: rhs_weap_m4a1 + { + ACE_barrelTwist=7; + ACE_barrelLength=10.3; + }; + class rhs_weap_m16a4: rhs_weap_m4_Base + { + ACE_barrelTwist=7; + ACE_barrelLength=20; + }; + class rhs_M249_base; + class rhs_weap_m249_pip: rhs_M249_base + { + ACE_barrelTwist=7; + ACE_barrelLength=16.3; + }; + class weap_m240_base; + class rhs_weap_m240B: weap_m240_base + { + ACE_barrelTwist=12; + ACE_barrelLength=24.8; + }; + class rhs_weap_m14ebrri: srifle_EBR_F + { + ACE_barrelTwist=12; + ACE_barrelLength=22; + }; + class rhs_weap_sr25: rhs_weap_m14ebrri + { + ACE_barrelTwist=11.25; + ACE_barrelLength=24; + }; + class rhs_weap_sr25_ec: rhs_weap_sr25 + { + ACE_barrelTwist=11.25; + ACE_barrelLength=20; + }; + class rhs_weap_M590_5RD: Rifle_Base_F + { + ACE_barrelTwist=0; + ACE_twistDirection=0; + ACE_barrelLength=18.5; + }; + class rhs_weap_M590_8RD: rhs_weap_M590_5RD + { + ACE_barrelTwist=0; + ACE_twistDirection=0; + ACE_barrelLength=20; + }; + class hgun_ACPC2_F; + class rhsusf_weap_m1911a1: hgun_ACPC2_F + { + ACE_barrelTwist=16; + ACE_barrelLength=5; + }; + + class rhsusf_acc_sniper_base; + class rhsusf_acc_LEUPOLDMK4: rhsusf_acc_sniper_base { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + }; + class rhsusf_acc_LEUPOLDMK4_2: rhsusf_acc_sniper_base { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + }; +}; \ No newline at end of file diff --git a/optionals/compat_rhs_usf3/config.cpp b/optionals/compat_rhs_usf3/config.cpp new file mode 100644 index 0000000000..bc4d264697 --- /dev/null +++ b/optionals/compat_rhs_usf3/config.cpp @@ -0,0 +1,15 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"rhsusf_c_weapons"}; + author[]={"Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgAmmo.hpp" +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rhs_usf3/script_component.hpp b/optionals/compat_rhs_usf3/script_component.hpp new file mode 100644 index 0000000000..c0a5bbf1f4 --- /dev/null +++ b/optionals/compat_rhs_usf3/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT rhsusf_c_weapons_comp + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/optionals/compat_rksl_pm_ii/CfgWeapons.hpp b/optionals/compat_rksl_pm_ii/CfgWeapons.hpp new file mode 100644 index 0000000000..621dd98b71 --- /dev/null +++ b/optionals/compat_rksl_pm_ii/CfgWeapons.hpp @@ -0,0 +1,33 @@ + +class CfgWeapons { + class ItemCore; + class InventoryOpticsItem_Base_F; + + class RKSL_optic_PMII_312 : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Snip { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; + + class RKSL_optic_PMII_312_sunshade : ItemCore { + ACE_ScopeAdjust_Vertical[] = { -4, 30 }; + ACE_ScopeAdjust_Horizontal[] = { -6, 6 }; + ACE_ScopeAdjust_Increment = 0.1; + class ItemInfo : InventoryOpticsItem_Base_F { + class OpticsModes { + class Snip { + discreteDistance[] = { 100 }; + discreteDistanceInitIndex = 0; + }; + }; + }; + }; +}; diff --git a/optionals/compat_rksl_pm_ii/config.cpp b/optionals/compat_rksl_pm_ii/config.cpp new file mode 100644 index 0000000000..c3ed720f8b --- /dev/null +++ b/optionals/compat_rksl_pm_ii/config.cpp @@ -0,0 +1,14 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"RKSL_PMII"}; + author[]={"Ruthberg"}; + VERSION_CONFIG; + }; +}; + +#include "CfgWeapons.hpp" diff --git a/optionals/compat_rksl_pm_ii/script_component.hpp b/optionals/compat_rksl_pm_ii/script_component.hpp new file mode 100644 index 0000000000..a98639b0e8 --- /dev/null +++ b/optionals/compat_rksl_pm_ii/script_component.hpp @@ -0,0 +1,5 @@ +#define COMPONENT RKSL_PMII_comp + +#include "\z\ace\addons\main\script_mod.hpp" + +#include "\z\ace\addons\main\script_macros.hpp" diff --git a/tools/make.cfg b/tools/make.cfg index e89568d60e..5e2d9d78da 100644 --- a/tools/make.cfg +++ b/tools/make.cfg @@ -17,6 +17,11 @@ project = @ace # Default: None # key = D:\Program Files (x86)\Bohemia Interactive\Tools\DSSignFile Tools\keys\ace_preAlpha.biprivatekey +# Path to where private keys are automatically created if the command-line parameter "key" is used +# Make sure this isn't in your public repository! +# Default: \private_keys +# private_key_path = P:\private_keys + # If set to True, the make system will attempt to autodetect addons in the # current folder by looking for directories with 'config.cpp' in them. # Default: True diff --git a/tools/make.py b/tools/make.py index 3b7bf9d94e..382f8dd776 100644 --- a/tools/make.py +++ b/tools/make.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # vim: set fileencoding=utf-8 : # make.py @@ -60,6 +60,9 @@ module_root = "" release_dir = "" module_root_parent = "" optionals_root = "" +key_name = "ace_preAlpha" +key = "" +dssignfile = "" ############################################################################### # http://akiscode.com/articles/sha-1directoryhash.shtml @@ -196,6 +199,7 @@ def find_bi_tools(work_drive): else: raise Exception("BadTools","Arma 3 Tools are not installed correctly or the P: drive needs to be created.") + def find_depbo_tools(regKey): """Use registry entries to find DePBO-based tools.""" stop = False @@ -248,6 +252,7 @@ def find_depbo_tools(regKey): #Strip any quotations from the path due to a MikeRo tool bug which leaves a trailing space in some of its registry paths. return [pboproject_path.strip('"'),rapify_path.strip('"'),makepbo_path.strip('"')] + def color(color): """Set the color. Works on Win32 and normal terminals.""" if sys.platform == "win32": @@ -304,12 +309,12 @@ def copy_important_files(source_dir,destination_dir): "logo_ace3_ca.paa" ] - print_yellow ("source_dir: " + source_dir) - print_yellow("destination_dir: " + destination_dir) - #copy importantFiles try: print_blue("\nSearching for important files in " + source_dir) + print("Source_dir: " + source_dir) + print("Destination_dir: " + destination_dir) + for file in importantFiles: print_green("Copying file => " + os.path.join(source_dir,file)) shutil.copyfile(os.path.join(source_dir,file),os.path.join(destination_dir,file)) @@ -336,6 +341,7 @@ def copy_important_files(source_dir,destination_dir): finally: os.chdir(originalDir) + def copy_optionals_for_building(mod,pbos): src_directories = os.listdir(optionals_root) current_dir = os.getcwd() @@ -350,10 +356,15 @@ def copy_optionals_for_building(mod,pbos): #print ("Adding the following file: " + file_name) pbos.append(file_name) pbo_path = os.path.join(release_dir, "@ace","optionals",file_name) + sigFile_name = file_name +"."+ key_name + ".bisign" + sig_path = os.path.join(release_dir, "@ace","optionals",sigFile_name) if (os.path.isfile(pbo_path)): print("Moving " + pbo_path + " for processing.") shutil.move(pbo_path, os.path.join(release_dir,"@ace","addons",file_name)) + if (os.path.isfile(sig_path)): + #print("Moving " + sig_path + " for processing.") + shutil.move(sig_path, os.path.join(release_dir,"@ace","addons",sigFile_name)) except: print_error("Error in moving") raise @@ -384,7 +395,8 @@ def copy_optionals_for_building(mod,pbos): finally: os.chdir(current_dir) -def cleanup_optionals(mod,pbos): + +def cleanup_optionals(mod): print("") try: for dir_name in mod: @@ -400,9 +412,17 @@ def cleanup_optionals(mod,pbos): file_name = "ace_{}.pbo".format(dir_name) src_file_path = os.path.join(release_dir, "@ace","addons",file_name) dst_file_path = os.path.join(release_dir, "@ace","optionals",file_name) + + sigFile_name = file_name +"."+ key_name + ".bisign" + src_sig_path = os.path.join(release_dir, "@ace","addons",sigFile_name) + dst_sig_path = os.path.join(release_dir, "@ace","optionals",sigFile_name) + if (os.path.isfile(src_file_path)): #print("Preserving " + file_name) os.renames(src_file_path,dst_file_path) + if (os.path.isfile(src_sig_path)): + #print("Preserving " + sigFile_name) + os.renames(src_sig_path,dst_sig_path) except FileExistsError: print_error(file_name + " already exists") continue @@ -411,12 +431,47 @@ def cleanup_optionals(mod,pbos): except: print_error("Cleaning Optionals Failed") raise + + +def purge(dir, pattern, friendlyPattern="files"): + print_green("Deleting " + friendlyPattern + " files from directory: " + dir) + for f in os.listdir(dir): + if re.search(pattern, f): + os.remove(os.path.join(dir, f)) + + +def build_signature_file(file_name): + global key + global dssignfile + print("Signing with " + key + ".") + ret = subprocess.call([dssignfile, key, file_name]) + if ret == 0: + return True + else: + return False + + +def check_for_obsolete_pbos(addonspath, file): + module = file[4:-4] + if not os.path.exists(os.path.join(addonspath, module)): + return True + return False ############################################################################### + 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" + __version__)) + global work_drive + global module_root + global release_dir + global module_root_parent + global optionals_root + global key_name + global key + global dssignfile + if sys.platform != "win32": print_error("Non-Windows platform (Cygwin?). Please re-run from cmd.") sys.exit(1) @@ -436,7 +491,7 @@ def main(argv): release_version = 0 # Version of release use_pboproject = True # Default to pboProject build tool make_target = "DEFAULT" # Which section in make.cfg to use for the build - new_key = False # Make a new key and use it to sign? + new_key = True # Make a new key and use it to sign? quiet = False # Suppress output from build tool? # Parse arguments @@ -512,6 +567,8 @@ See the make.cfg file for additional build options. else: check_external = False + print_yellow("\nCheck external references is set to " + str(check_external)) + # Get the directory the make script is in. make_root = os.path.dirname(os.path.realpath(__file__)) make_root_parent = os.path.abspath(os.path.join(os.getcwd(), os.pardir)) @@ -524,26 +581,27 @@ See the make.cfg file for additional build options. commit_id = subprocess.check_output(["git", "rev-parse", "HEAD"]) commit_id = str(commit_id, "utf-8")[:8] + key_name = str(key_name+"-"+commit_id) except: print_error("FAILED TO DETERMINE COMMIT ID.") commit_id = "NOGIT" cfg = configparser.ConfigParser(); try: - global work_drive - global module_root - global release_dir - global module_root_parent - global optionals_root - cfg.read(os.path.join(make_root, "make.cfg")) # Project name (with @ symbol) project = cfg.get(make_target, "project", fallback="@"+os.path.basename(os.getcwd())) + # BI Tools work drive on Windows + work_drive = cfg.get(make_target, "work_drive", fallback="P:\\") + # Private key path key = cfg.get(make_target, "key", fallback=None) + # Private key creation directory + private_key_path = cfg.get(make_target, "private_key_path", fallback=os.path.join(work_drive, "private_keys")) + # Project prefix (folder path) prefix = cfg.get(make_target, "prefix", fallback="") @@ -561,9 +619,6 @@ See the make.cfg file for additional build options. # List of directories to ignore when detecting ignore = [x.strip() for x in cfg.get(make_target, "ignore", fallback="release").split(',')] - # BI Tools work drive on Windows - work_drive = cfg.get(make_target, "work_drive", fallback="P:\\") - # Which build tool should we use? build_tool = cfg.get(make_target, "build_tool", fallback="addonbuilder").lower() @@ -640,6 +695,20 @@ See the make.cfg file for additional build options. print ("No cache found.") cache = {} + if not os.path.isdir(os.path.join(release_dir, project, "addons")): + try: + os.makedirs(os.path.join(release_dir, project, "addons")) + except: + print_error("Cannot create release directory") + raise + + if not os.path.isdir(os.path.join(release_dir, project, "keys")): + try: + os.makedirs(os.path.join(release_dir, project, "keys")) + except: + print_error("Cannot create release directory") + raise + #Temporarily copy optionals_root for building. They will be removed later. optionals_modules = [] optional_files = [] @@ -659,39 +728,60 @@ See the make.cfg file for additional build options. # Make the key specified from command line if necessary. if new_key: - if not os.path.isfile(os.path.join(module_root, key_name + ".biprivatekey")): - print_green("\nRequested key does not exist.") + if not os.path.isfile(os.path.join(private_key_path, key_name + ".biprivatekey")): + print_yellow("\nRequested key does not exist.") + try: + os.makedirs(private_key_path) + except: + pass + curDir = os.getcwd() + os.chdir(private_key_path) ret = subprocess.call([dscreatekey, key_name]) # Created in make_root + os.chdir(curDir) if ret == 0: - print_blue("Created: " + os.path.join(module_root, key_name + ".biprivatekey")) + print_green("Created: " + os.path.join(private_key_path, key_name + ".biprivatekey")) + print("Removing any old signature keys...") + purge(os.path.join(module_root, release_dir, project, "addons"), "^.*\.bisign$","*.bisign") + purge(os.path.join(module_root, release_dir, project, "optionals"), "^.*\.bisign$","*.bisign") + purge(os.path.join(module_root, release_dir, project, "keys"), "^.*\.bikey$","*.bikey") else: print_error("Failed to create key!") try: - print_blue("Copying public key to release directory.") + print("Copying public key to release directory.") try: - os.makedirs(os.path.join(module_root, release_dir, "Keys")) + os.makedirs(os.path.join(module_root, release_dir, project, "keys")) except: pass - shutil.copyfile(os.path.join(module_root, key_name + ".bikey"), os.path.join(module_root, release_dir, "Keys", key_name + ".bikey")) + shutil.copyfile(os.path.join(private_key_path, key_name + ".bikey"), os.path.join(module_root, release_dir, project, "keys", key_name + ".bikey")) except: - raise print_error("Could not copy key to release directory.") + raise else: - print_green("\nNOTE: Using key " + os.path.join(module_root, key_name + ".biprivatekey")) + print_green("\nNOTE: Using key " + os.path.join(private_key_path, key_name + ".biprivatekey")) - key = os.path.join(module_root, key_name + ".biprivatekey") + key = os.path.join(private_key_path, key_name + ".biprivatekey") + # Remove any obsolete files. + print_blue("\nChecking for obsolete files...") + obsolete_check_path = os.path.join(module_root, release_dir, project,"addons") + for file in os.listdir(obsolete_check_path): + if (file.endswith(".pbo") and os.path.isfile(os.path.join(obsolete_check_path,file))): + if check_for_obsolete_pbos(module_root, file): + fileName = os.path.splitext(file)[0] + print_yellow("Removing obsolete file => " + file) + purge(obsolete_check_path,fileName+"\..",fileName+".*") # For each module, prep files and then build. print_blue("\nBuilding...") for module in modules: print_green("\nMaking " + module + "-"*max(1, (60-len(module)))) missing = False + sigMissing = False # Cache check if module in cache: @@ -706,16 +796,23 @@ See the make.cfg file for additional build options. # Hash the module new_sha = get_directory_hash(os.path.join(module_root, module)) - # Is the pbo file missing? + # Is the pbo or sig file missing? missing = not os.path.isfile(os.path.join(release_dir, project, "addons", "ace_{}.pbo".format(module))) + sigFile = pbo_name_prefix+module + ".pbo." + key_name + ".bisign" + sigMissing = not os.path.isfile(os.path.join(release_dir, project, "addons", sigFile )) + if missing: - print("ace_{}.pbo".format(module) + " is missing. Building...") + print_yellow("Missing PBO file ace_{}.pbo".format(module) + ". Building...") # Check if it needs rebuilt # print ("Hash:", new_sha) if old_sha == new_sha and not missing: if not force_build: print("Module has not changed.") + if sigMissing: + if key: + print("Missing Signature key " + sigFile) + build_signature_file(os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix + module + ".pbo")) # Skip everything else continue @@ -740,13 +837,13 @@ See the make.cfg file for additional build options. try: # Remove the old pbo, key, and log - old = os.path.join(module_root, release_dir, project, "Addons", module) + "*" + old = os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix+module) + "*" files = glob.glob(old) for f in files: os.remove(f) if pbo_name_prefix: - old = os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix+module) + "*" + old = os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix+module) + "*" files = glob.glob(old) for f in files: os.remove(f) @@ -759,11 +856,11 @@ See the make.cfg file for additional build options. # Build the module into a pbo print_blue("Building: " + os.path.join(work_drive, prefix, module)) - print_blue("Destination: " + os.path.join(module_root, release_dir, project, "Addons")) + print_blue("Destination: " + os.path.join(module_root, release_dir, project, "addons")) # Make destination folder (if needed) try: - os.makedirs(os.path.join(module_root, release_dir, project, "Addons")) + os.makedirs(os.path.join(module_root, release_dir, project, "addons")) except: pass @@ -815,7 +912,7 @@ See the make.cfg file for additional build options. if os.path.isfile(os.path.join(work_drive, prefix, module, "$NOBIN$")): print_green("$NOBIN$ Found. Proceeding with non-binarizing!") - cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"Addons")] + cmd = [makepboTool, "-P","-A","-L","-N","-G", os.path.join(work_drive, prefix, module),os.path.join(module_root, release_dir, project,"addons")] else: if check_external: @@ -837,7 +934,7 @@ See the make.cfg file for additional build options. # Prettyprefix rename the PBO if requested. if pbo_name_prefix: try: - os.rename(os.path.join(module_root, release_dir, project, "Addons", module+".pbo"), os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix+module+".pbo")) + os.rename(os.path.join(module_root, release_dir, project, "addons", module+".pbo"), os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix+module+".pbo")) except: raise print_error("Could not rename built PBO with prefix.") @@ -845,9 +942,9 @@ See the make.cfg file for additional build options. if key: print("Signing with " + key + ".") if pbo_name_prefix: - ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "Addons", pbo_name_prefix + module + ".pbo")]) + ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "addons", pbo_name_prefix + module + ".pbo")]) else: - ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "Addons", module + ".pbo")]) + ret = subprocess.call([dssignfile, key, os.path.join(module_root, release_dir, project, "addons", module + ".pbo")]) if ret == 0: build_successful = True @@ -887,7 +984,7 @@ See the make.cfg file for additional build options. # Call AddonBuilder os.chdir("P:\\") - cmd = [addonbuilder, os.path.join(work_drive, prefix, module), os.path.join(make_root, release_dir, project, "Addons"), "-clear", "-project="+work_drive] + cmd = [addonbuilder, os.path.join(work_drive, prefix, module), os.path.join(make_root, release_dir, project, "addons"), "-clear", "-project="+work_drive] if not do_binarize: cmd.append("-packonly") @@ -910,7 +1007,7 @@ See the make.cfg file for additional build options. # Prettyprefix rename the PBO if requested. if pbo_name_prefix: try: - os.rename(os.path.join(make_root, release_dir, project, "Addons", module+".pbo"), os.path.join(make_root, release_dir, project, "Addons", pbo_name_prefix+module+".pbo")) + os.rename(os.path.join(make_root, release_dir, project, "addons", module+".pbo"), os.path.join(make_root, release_dir, project, "addons", pbo_name_prefix+module+".pbo")) except: raise print_error("Could not rename built PBO with prefix.") @@ -920,9 +1017,9 @@ See the make.cfg file for additional build options. if key: print("Signing with " + key + ".") if pbo_name_prefix: - ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "Addons", pbo_name_prefix + module + ".pbo")]) + ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "addons", pbo_name_prefix + module + ".pbo")]) else: - ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "Addons", module + ".pbo")]) + ret = subprocess.call([dssignfile, key, os.path.join(make_root, release_dir, project, "addons", module + ".pbo")]) if ret == 0: build_successful = True @@ -963,7 +1060,8 @@ See the make.cfg file for additional build options. except: print_error("ERROR: Could not delete pboProject temp files.") - print_green("\nDone.") + copy_important_files(module_root_parent,os.path.join(release_dir, "@ace")) + cleanup_optionals(optionals_modules) # Make release if make_release: @@ -971,7 +1069,7 @@ See the make.cfg file for additional build options. try: # Delete all log files - for root, dirs, files in os.walk(os.path.join(module_root, release_dir, project, "Addons")): + for root, dirs, files in os.walk(os.path.join(module_root, release_dir, project, "addons")): for currentFile in files: if currentFile.lower().endswith("log"): os.remove(os.path.join(root, currentFile)) @@ -1003,9 +1101,10 @@ See the make.cfg file for additional build options. shutil.copytree(os.path.join(module_root, release_dir, project), os.path.join(a3_path, project)) except: print_error("Could not copy files. Is Arma 3 running?") + + print_green("\nDone.") + - copy_important_files(module_root_parent,os.path.join(release_dir, "@ace")) - cleanup_optionals(optionals_modules,optional_files) if __name__ == "__main__": main(sys.argv) input("Press Enter to continue...") diff --git a/tools/stringtableduplicates.py b/tools/stringtableduplicates.py index b9b4920059..49f5bcb743 100755 --- a/tools/stringtableduplicates.py +++ b/tools/stringtableduplicates.py @@ -34,7 +34,7 @@ def check_module(projectpath, module): diff = len(entries) - len(list(set(entries))) duplicates += diff if diff > 0: - print key.getAttribute("ID") + print(key.getAttribute("ID")) return duplicates