Merge pull request #7 from acemod/master

Update master
This commit is contained in:
Grzegorz 2015-04-26 15:11:12 +02:00
commit 7ebf5e5a10
175 changed files with 5794 additions and 1177 deletions

View File

@ -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

View File

@ -1,48 +1,83 @@
<p align="center">
<img src="https://github.com/acemod/ACE3/blob/master/extras/assets/logo/black/ACE3-Logo.jpg" height="80" />
<img src="https://github.com/acemod/ACE3/blob/master/extras/assets/logo/black/ACE3-Logo.jpg"
height="112">
</p>
<p align="center">
<a href="https://github.com/acemod/ACE3/releases">
<img src="http://img.shields.io/badge/release-3.0-green.svg?style=flat" alt="ACE version">
<img src="http://img.shields.io/badge/Version-3.0.0-blue.svg?style=flat"
alt="ACE version">
</a>
<a href="#">
<img src="http://img.shields.io/badge/download-22_MB-blue.svg?style=flat" alt="ACE download">
<a href="https://github.com/acemod/ACE3/archive/master.zip">
<img src="http://img.shields.io/badge/Download-48.3_MB-green.svg?style=flat"
alt="ACE download">
</a>
<a href="https://github.com/acemod/ACE3/issues">
<img src="http://img.shields.io/github/issues/acemod/ACE3.svg?style=flat" alt="ACE issues">
<img src="http://img.shields.io/github/issues-raw/acemod/ACE3.svg?style=flat&label=Issues"
alt="ACE issues">
</a>
<a href="http://forums.bistudio.com/showthread.php?190433-ACE3-A-collaborative-merger-between-AGM-CSE-and-ACE&p=2910796&viewfull=1#post2910796">
<img src="https://img.shields.io/badge/BIF-Thread-lightgrey.svg?style=flat"
alt="BIF thread">
</a>
<a href="https://github.com/acemod/ACE3/blob/master/LICENSE">
<img src="http://img.shields.io/badge/license-GPLv2-red.svg?style=flat" alt="ACE license">
<img src="http://img.shields.io/badge/License-GPLv2-red.svg?style=flat"
alt="ACE license">
</a>
</p>
<p align="center"><sup><strong>Requires the latest version of <a href="http://www.armaholic.com/page.php?id=18767">CBA A3</a> | <a href="#">BIF thread</a></strong></sup></p>
<p align="center"><sup><strong>Requires the latest version of <a href="http://www.armaholic.com/page.php?id=18767">CBA A3</a>. Visit us on <a href="https://www.facebook.com/ACE3Mod">Facebook</a> | <a href="https://www.youtube.com/c/ACE3Mod">YouTube</a> | <a href="https://twitter.com/ACE3Mod">Twitter</a> | <a href="http://www.reddit.com/r/arma/search?q=ACE&restrict_sr=on&sort=new&t=all">Reddit</a></strong></sup></p>
**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<br>
***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.

View File

@ -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);

View File

@ -1,36 +0,0 @@
/*
* Author: Ruthberg
*
* Calculates the air density
*
* Arguments:
* 0: temperature - degrees celcius <NUMBER>
* 1: pressure - hPa <NUMBER>
* 2: relativeHumidity - value between 0.0 and 1.0 <NUMBER>
*
* Return Value:
* 0: density of air - kg * m^(-3) <NUMBER>
*
* Return value:
* None
*/
#include "script_component.hpp"
private ["_temperature", "_pressure", "_relativeHumidity"];
_temperature = _this select 0; // in C
_pressure = _this select 1; // in hPa
_relativeHumidity = _this select 2; // as ratio 0-1
_pressure = _pressure * 100;
if (_relativeHumidity > 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 = _relativeHumidity * _pSat;
_partialPressure = _pressure - _vaporPressure;
(_partialPressure * DRY_AIR_MOLAR_MASS + _vaporPressure * WATER_VAPOR_MOLAR_MASS) / (UNIVERSAL_GAS_CONSTANT * KELVIN(_temperature))
} else {
_pressure / (SPECIFIC_GAS_CONSTANT_DRY_AIR * KELVIN(_temperature))
};

View File

@ -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", "_bulletWeight", "_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;

View File

@ -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

View File

@ -9,7 +9,7 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) ==
GVAR(gunList) = [["12.7x108mm" , 820, 100, 0.0657, -0.0006400, 3.81, 0, 2, 10, 120, 0, 0, 48.28, 12.7, 38.10, 0.630, 1, "ASM" ],
["12.7x99mm AMAX" , 860, 100, 0.0612, -0.0003740, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 38.10, 1.050, 1, "ASM" ],
["12.7x99mm" , 853, 100, 0.0623, -0.0006000, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ],
["12.7x99mm" , 900, 100, 0.0623, -0.0006000, 3.81, 0, 2, 10, 120, 0, 0, 41.92, 12.7, 38.10, 0.670, 1, "ASM" ],
["12.7x54mm" , 300, 100, 0.3395, -0.0001400, 3.81, 0, 2, 10, 120, 0, 0, 48.60, 12.7, 24.13, 1.050, 1, "ASM" ],
@ -34,6 +34,7 @@ if ((profileNamespace getVariable ["ACE_ATragMX_profileNamespaceVersion", 0]) ==
["6.5x39mm" , 800, 100, 0.0683, -0.0007850, 3.81, 0, 2, 10, 120, 0, 0, 7.970, 6.71, 22.86, 0.263, 7, "ICAO"],
["6.5x47mm Lapua" , 800, 100, 0.0682, -0.0007710, 3.81, 0, 2, 10, 120, 0, 0, 9.007, 6.71, 22.86, 0.290, 7, "ICAO"],
["6.5mm Creedmor" , 840, 100, 0.0637, -0.0006510, 3.81, 0, 2, 10, 120, 0, 0, 9.072, 6.71, 22.86, 0.317, 7, "ICAO"],
["5.56x45mm M855" , 870, 100, 0.0626, -0.0012650, 3.81, 0, 2, 10, 120, 0, 0, 4.018, 5.70, 17.78, 0.151, 7, "ASM" ],
["5.56x45mm Mk262" , 820, 100, 0.0671, -0.0011250, 3.81, 0, 2, 10, 120, 0, 0, 4.990, 5.70, 17.78, 0.361, 1, "ASM" ],

View File

@ -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);
};

View File

@ -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]

View File

@ -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);
};

View File

@ -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];

View File

@ -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)];

View File

@ -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)];

View File

@ -11,4 +11,4 @@
#include "\z\ace\addons\main\script_macros.hpp"
#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.2
#define ATRAGMX_PROFILE_NAMESPACE_VERSION 1.3

View File

@ -23,6 +23,8 @@ class CfgAmmo {
airFriction=-0.001265;
hit=8;
typicalSpeed=750;
tracerStartTime = 0.073; //M856 tracer burns out to 800m
tracerEndTime = 1.579; //Time in seconds calculated with ballistics calculator
ACE_caliber=0.224;
ACE_bulletLength=0.906;
ACE_bulletMass=62;
@ -36,7 +38,7 @@ class CfgAmmo {
};
class ACE_556x45_Ball_Mk262 : B_556x45_Ball {
airFriction=-0.001125;
caliber=0.6;
caliber=0.8;
deflecting=18;
hit=11;
typicalSpeed=836;
@ -53,7 +55,7 @@ class CfgAmmo {
};
class ACE_556x45_Ball_Mk318 : B_556x45_Ball {
airFriction=-0.001120;
caliber=0.6;
caliber=0.8;
deflecting=18;
hit=9;
typicalSpeed=886;
@ -68,13 +70,30 @@ class CfgAmmo {
ACE_muzzleVelocities[]={780, 886, 950};
ACE_barrelLengths[]={10, 15.5, 20};
};
class ACE_556x45_Ball_M995_AP : B_556x45_Ball {
airFriction=-0.001120;
caliber=1.6;
deflecting=18;
hit=6;
typicalSpeed=886;
ACE_caliber=0.224;
ACE_bulletLength=0.906;
ACE_bulletMass=46;
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.151};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=7;
ACE_muzzleVelocities[]={950, 1030, 1040};
ACE_barrelLengths[]={10, 15.5, 20};
};
class B_556x45_Ball_Tracer_Red;
class ACE_B_556x45_Ball_Tracer_Dim: B_556x45_Ball_Tracer_Red {
nvgOnly = 1;
};
class ACE_545x39_Ball_7N6M : B_556x45_Ball {
airFriction=-0.001162;
caliber=0.5;
caliber=0.6;
deflecting=18;
hit=7;
typicalSpeed=880;
@ -89,13 +108,15 @@ class CfgAmmo {
ACE_muzzleVelocities[]={780, 880, 920};
ACE_barrelLengths[]={10, 16.3, 20};
};
class B_556x45_Ball_Tracer_Yellow;
class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Yellow {
class B_556x45_Ball_Tracer_Green;
class ACE_545x39_Ball_7T3M : B_556x45_Ball_Tracer_Green {
airFriction=-0.001162;
caliber=0.5;
caliber=0.6;
deflecting=18;
hit=7;
typicalSpeed=883;
tracerStartTime = 0.073; //7T3M tracer burns out to 850m
tracerEndTime = 1.736; //Time in seconds calculated with ballistics calculator
ACE_caliber=0.220;
ACE_bulletLength=0.85;
ACE_bulletMass=49.8;
@ -132,7 +153,7 @@ class CfgAmmo {
class ACE_65x47_Ball_Scenar: B_65x39_Caseless {
airFriction=-0.00078;
typicalSpeed=820 ;
caliber=0.6;
caliber=0.9;
ACE_caliber=0.264;
ACE_bulletLength=1.364;
ACE_bulletMass=139;
@ -145,9 +166,9 @@ class CfgAmmo {
ACE_barrelLengths[]={10, 16, 20, 24, 26};
};
class ACE_65_Creedmor_Ball: B_65x39_Caseless {
airFriction=-0.00078;
airFriction=-0.000651;
typicalSpeed=860 ;
caliber=0.7;
caliber=1.1;
ACE_caliber=0.264;
ACE_bulletLength=1.426;
ACE_bulletMass=140;
@ -156,13 +177,15 @@ class CfgAmmo {
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={750, 830, 850, 860, 865};
ACE_muzzleVelocities[]={750, 820, 840, 852, 860};
ACE_barrelLengths[]={10, 16, 20, 24, 26};
};
class B_762x51_Ball : BulletBase {
airFriction=-0.001035;
typicalSpeed=833;
hit=9;
tracerStartTime = 0.073; //Based on the British L5A1 which burns out to 1000m
tracerEndTime = 2.058; //Time in seconds calculated with ballistics calculator
ACE_caliber=0.308;
ACE_bulletLength=1.14;
ACE_bulletMass=146;
@ -180,7 +203,7 @@ class CfgAmmo {
};
class ACE_762x51_Ball_M118LR : B_762x51_Ball {
airFriction=-0.0008525;
caliber=1.05;
caliber=1.8;
hit=16;
typicalSpeed=790;
ACE_caliber=0.308;
@ -194,11 +217,27 @@ class CfgAmmo {
ACE_muzzleVelocities[]={750, 780, 790, 794};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x51_Ball_Mk316_Mod_0 : B_762x51_Ball {
airFriction=-0.0008525;
caliber=1.8;
hit=16;
typicalSpeed=790;
ACE_caliber=0.308;
ACE_bulletLength=1.24;
ACE_bulletMass=175;
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.243};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ICAO";
ACE_dragModel=7;
ACE_muzzleVelocities[]={775, 790, 805, 810};
ACE_barrelLengths[]={16, 20, 24, 26};
};
class ACE_762x51_Ball_Mk319_Mod_0 : B_762x51_Ball {
airFriction=-0.00103;
caliber=0.85;
caliber=1.5;
hit=14;
typicalSpeed=890;
typicalSpeed=900;
ACE_caliber=0.308;
ACE_bulletLength=1.24;
ACE_bulletMass=130;
@ -210,11 +249,27 @@ class CfgAmmo {
ACE_muzzleVelocities[]={838, 892, 910};
ACE_barrelLengths[]={13, 16, 20};
};
class ACE_762x51_Ball_M993_AP : B_762x51_Ball {
airFriction=-0.00103;
caliber=2.2;
hit=11;
typicalSpeed=930;
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 ACE_762x51_Ball_Subsonic : B_762x51_Ball {
airFriction=-0.000535;
caliber=0.5;
caliber=1;
hit=6;
typicalSpeed=790;
typicalSpeed=320;
ACE_caliber=0.308;
ACE_bulletLength=1.340;
ACE_bulletMass=200;
@ -229,7 +284,7 @@ class CfgAmmo {
class ACE_30_06_M1_Ball : B_762x51_Ball {
airFriction=-0.0009;
typicalSpeed=800;
caliber=1.3;
caliber=2.0;
hit=10;
ACE_caliber=0.308;
ACE_bulletLength=1.21;
@ -245,7 +300,7 @@ class CfgAmmo {
class ACE_7_Remington_Magnum_Ball : B_762x51_Ball {
airFriction=-0.0008;
typicalSpeed=820;
caliber=1.4;
caliber=2.1;
hit=8;
ACE_caliber=0.284;
ACE_bulletLength=1.529;
@ -261,7 +316,7 @@ class CfgAmmo {
class ACE_243_Winchester_Ball : B_762x51_Ball {
airFriction=-0.00095;
typicalSpeed=915;
caliber=0.8;
caliber=2.3;
hit=6;
ACE_caliber=0.243;
ACE_bulletLength=1.282;
@ -276,13 +331,13 @@ class CfgAmmo {
};
class ACE_762x67_Ball_Mk248_Mod_0 : B_762x51_Ball {
airFriction=-0.000830;
caliber=1.08;
caliber=1.8;
hit=17;
typicalSpeed=900;
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";
@ -292,13 +347,13 @@ class CfgAmmo {
};
class ACE_762x67_Ball_Mk248_Mod_1 : B_762x51_Ball {
airFriction=-0.000815;
caliber=1.12;
caliber=1.9;
hit=18;
typicalSpeed=867;
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";
@ -308,7 +363,7 @@ class CfgAmmo {
};
class ACE_762x67_Ball_Berger_Hybrid_OTM : B_762x51_Ball {
airFriction=-0.00076;
caliber=1.15;
caliber=2.0;
hit=19;
typicalSpeed=853;
ACE_caliber=0.308;
@ -338,7 +393,7 @@ class CfgAmmo {
};
class ACE_762x54_Ball_7N14 : B_762x51_Ball {
airFriction=-0.001023;
caliber=0.95;
caliber=1.5;
hit=15;
typicalSpeed=820;
ACE_caliber=0.312;
@ -355,9 +410,11 @@ class CfgAmmo {
class B_762x54_Tracer_Green;
class ACE_762x54_Ball_7T2 : B_762x54_Tracer_Green {
airFriction=-0.001023;
caliber=0.9;
caliber=1.5;
hit=15;
typicalSpeed=800;
tracerStartTime = 0.073; //Based on the 7T2 which burns three seconds
tracerEndTime = 3;
ACE_caliber=0.312;
ACE_bulletLength=1.14;
ACE_bulletMass=149;
@ -371,7 +428,7 @@ class CfgAmmo {
};
class ACE_762x35_Ball : B_762x51_Ball {
airFriction=-0.000821;
caliber=0.9;
caliber=1.5;
hit=11;
typicalSpeed=790;
ACE_caliber=0.308;
@ -388,6 +445,7 @@ class CfgAmmo {
class ACE_762x39_Ball : B_762x51_Ball {
airFriction=-0.0015168;
hit=12;
caliber=1.5;
typicalSpeed=716;
ACE_caliber=0.308;
ACE_bulletLength=1.14;
@ -400,10 +458,13 @@ class CfgAmmo {
ACE_muzzleVelocities[]={650, 716, 750};
ACE_barrelLengths[]={10, 16.3, 20};
};
class ACE_762x39_Ball_57N231P : B_762x51_Tracer_Yellow {
class ACE_762x39_Ball_57N231P : B_762x54_Tracer_Green {
airFriction=-0.0015168;
hit=12;
caliber=1.5;
typicalSpeed=716;
tracerStartTime = 0.073; //57N231P tracer burns out to 800m
tracerEndTime = 2.082; //Time in seconds calculated with ballistics calculator
ACE_caliber=0.308;
ACE_bulletLength=1.14;
ACE_bulletMass=117;
@ -493,6 +554,7 @@ class CfgAmmo {
class ACE_303_Ball : ACE_762x51_Ball_M118LR {
airFriction=-0.00083;
typicalSpeed=761;
caliber=2.0;
ACE_caliber=0.311;
ACE_bulletLength=1.227;
ACE_bulletMass=174;
@ -510,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[]={};
@ -580,7 +641,6 @@ class CfgAmmo {
class ACE_338_Ball : B_338_Ball {
timeToLive=10;
airFriction=-0.000535;
caliber=1.55;
typicalSpeed=826;
ACE_caliber=0.338;
ACE_bulletLength=1.70;
@ -596,7 +656,7 @@ class CfgAmmo {
class ACE_338_Ball_API526 : B_338_Ball {
timeToLive=10;
airFriction=-0.000673;
caliber=2.4;
caliber=2.8;
typicalSpeed=826;
ACE_caliber=0.338;
ACE_bulletLength=1.535;
@ -626,7 +686,7 @@ class CfgAmmo {
class B_127x99_Ball : BulletBase {
timeToLive=10;
airFriction=-0.0006;
typicalSpeed=853;
typicalSpeed=900;
ACE_caliber=0.510;
ACE_bulletLength=2.310;
ACE_bulletMass=647;
@ -635,13 +695,31 @@ class CfgAmmo {
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={853};
ACE_muzzleVelocities[]={900};
ACE_barrelLengths[]={29};
};
class ACE_127x99_API : BulletBase {
timeToLive=10;
airFriction=-0.0006;
typicalSpeed=900;
hit=25;
caliber=4.0;
ACE_caliber=0.510;
ACE_bulletLength=2.310;
ACE_bulletMass=648;
ACE_ammoTempMuzzleVelocityShifts[]={-26.55, -25.47, -22.85, -20.12, -16.98, -12.80, -7.64, -1.53, 5.96, 15.17, 26.19};
ACE_ballisticCoefficients[]={0.670};
ACE_velocityBoundaries[]={};
ACE_standardAtmosphere="ASM";
ACE_dragModel=1;
ACE_muzzleVelocities[]={900};
ACE_barrelLengths[]={29};
};
class ACE_127x99_Ball_AMAX : B_127x99_Ball {
timeToLive=10;
airFriction=-0.000374;
typicalSpeed=860;
caliber=3.0;
ACE_caliber=0.510;
ACE_bulletLength=2.540;
ACE_bulletMass=750;

View File

@ -49,6 +49,14 @@ class CfgMagazines {
class 30Rnd_556x45_Stanag: CA_Magazine {
};
class ACE_30Rnd_556x45_Stanag_M995_AP_mag: 30Rnd_556x45_Stanag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_556x45_Ball_M995_AP";
displayName = "$STR_ACE_30Rnd_556x45_Stanag_M995_AP_mag_Name";
displayNameShort = "$STR_ACE_30Rnd_556x45_Stanag_M995_AP_mag_NameShort";
descriptionShort = "$STR_ACE_30Rnd_556x45_Stanag_M995_AP_mag_Description";
initSpeed = 1046;
};
class ACE_30Rnd_556x45_Stanag_Mk262_mag: 30Rnd_556x45_Stanag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_556x45_Ball_Mk262";
@ -123,6 +131,15 @@ class CfgMagazines {
descriptionShort = "$STR_ACE_10Rnd_762x51_M118LR_Mag_Description";
initSpeed = 780;
};
class ACE_10Rnd_762x51_Mk316_Mod_0_Mag: 10Rnd_762x51_Mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_762x51_Ball_Mk316_Mod_0";
count = 10;
displayName = "$STR_ACE_10Rnd_762x51_Mk316_Mod_0_Mag_Name";
displayNameShort = "$STR_ACE_10Rnd_762x51_Mk316_Mod_0_Mag_NameShort";
descriptionShort = "$STR_ACE_10Rnd_762x51_Mk316_Mod_0_Mag_Description";
initSpeed = 790;
};
class ACE_10Rnd_762x51_Mk319_Mod_0_Mag: 10Rnd_762x51_Mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_762x51_Ball_Mk319_Mod_0";
@ -132,6 +149,15 @@ class CfgMagazines {
descriptionShort = "$STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_Description";
initSpeed = 900;
};
class ACE_10Rnd_762x51_M993_AP_Mag: 10Rnd_762x51_Mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_762x51_Ball_M993_AP";
count = 10;
displayName = "$STR_ACE_10Rnd_762x51_M993_AP_Mag_Name";
displayNameShort = "$STR_ACE_10Rnd_762x51_M993_AP_Mag_NameShort";
descriptionShort = "$STR_ACE_10Rnd_762x51_M993_AP_Mag_Description";
initSpeed = 920;
};
class ACE_20Rnd_762x51_M118LR_Mag: 20Rnd_762x51_Mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_762x51_Ball_M118LR";
@ -140,6 +166,15 @@ class CfgMagazines {
descriptionShort = "$STR_ACE_20Rnd_762x51_M118LR_Mag_Description";
initSpeed = 780;
};
class ACE_20Rnd_762x51_Mk316_Mod_0_Mag: 20Rnd_762x51_Mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_762x51_Ball_Mk316_Mod_0";
count = 20;
displayName = "$STR_ACE_20Rnd_762x51_Mk316_Mod_0_Mag_Name";
displayNameShort = "$STR_ACE_20Rnd_762x51_Mk316_Mod_0_Mag_NameShort";
descriptionShort = "$STR_ACE_20Rnd_762x51_Mk316_Mod_0_Mag_Description";
initSpeed = 790;
};
class ACE_20Rnd_762x51_Mk319_Mod_0_Mag: 20Rnd_762x51_Mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_762x51_Ball_Mk319_Mod_0";
@ -148,6 +183,15 @@ class CfgMagazines {
descriptionShort = "$STR_ACE_20Rnd_762x51_Mk319_Mod_0_Mag_Description";
initSpeed = 900;
};
class ACE_20Rnd_762x51_M993_AP_Mag: 20Rnd_762x51_Mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_762x51_Ball_M993_AP";
count = 20;
displayName = "$STR_ACE_20Rnd_762x51_M993_AP_Mag_Name";
displayNameShort = "$STR_ACE_20Rnd_762x51_M993_AP_Mag_NameShort";
descriptionShort = "$STR_ACE_20Rnd_762x51_M993_AP_Mag_Description";
initSpeed = 920;
};
class ACE_20Rnd_762x67_Mk248_Mod_0_Mag: 20Rnd_762x51_Mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_762x67_Ball_Mk248_Mod_0";
@ -211,7 +255,15 @@ class CfgMagazines {
displayName = "$STR_ACE_5Rnd_127x99_Mag_Name";
displayNameShort = "$STR_ACE_5Rnd_127x99_Mag_NameShort";
descriptionShort = "$STR_ACE_5Rnd_127x99_Mag_Description";
initSpeed = 853;
initSpeed = 900;
};
class ACE_5Rnd_127x99_API_Mag: 5Rnd_127x108_Mag {
author = "$STR_ACE_Common_ACETeam";
ammo = "ACE_127x99_API";
displayName = "$STR_ACE_5Rnd_127x99_API_Mag_Name";
displayNameShort = "$STR_ACE_5Rnd_127x99_API_Mag_NameShort";
descriptionShort = "$STR_ACE_5Rnd_127x99_API_Mag_Description";
initSpeed = 900;
};
class ACE_5Rnd_127x99_AMAX_Mag: 5Rnd_127x108_Mag {
author = "$STR_ACE_Common_ACETeam";

View File

@ -27,6 +27,7 @@ class CfgVehicles {
MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_API_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4);
};
};
@ -37,12 +38,15 @@ class CfgVehicles {
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk316_Mod_0_Mag,4);
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_Dim,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_API_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4);
};
};
@ -51,13 +55,18 @@ class CfgVehicles {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk316_Mod_0_Mag,4);
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_Dim,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,3);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M993_AP_Mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M993_AP_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_API_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4);
};
};
@ -69,6 +78,8 @@ class CfgVehicles {
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk316_Mod_0_Mag,4);
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_Dim,4);
@ -106,7 +117,6 @@ class CfgVehicles {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_65x47_Scenar_mag,6);
MACRO_ADDMAGAZINE(ACE_30Rnd_65_Creedmor_mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,3);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4);
};
};
@ -114,6 +124,7 @@ class CfgVehicles {
class IND_Box_Base;
class Box_IND_Wps_F: IND_Box_Base {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_M995_AP_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk262_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk318_mag,4);
};
@ -127,6 +138,7 @@ class CfgVehicles {
class Box_IND_Ammo_F: IND_Box_Base {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_M995_AP_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk262_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk318_mag,4);
};
@ -135,6 +147,7 @@ class CfgVehicles {
class FIA_Box_Base_F;
class Box_FIA_Wps_F: FIA_Box_Base_F {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_M995_AP_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk262_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk318_mag,4);
};
@ -142,6 +155,7 @@ class CfgVehicles {
class Box_FIA_Ammo_F: FIA_Box_Base_F {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_M995_AP_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk262_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk318_mag,4);
};
@ -149,6 +163,7 @@ class CfgVehicles {
class I_supplyCrate_F: B_supplyCrate_F {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_M995_AP_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk262_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk318_mag,4);
};
@ -156,6 +171,7 @@ class CfgVehicles {
class IG_supplyCrate_F: ReammoBox_F {
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_M995_AP_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk262_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk318_mag,4);
};
@ -176,8 +192,12 @@ class CfgVehicles {
author = "$STR_ACE_Common_ACETeam";
class TransportMagazines {
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_Mag_SD,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M993_AP_Mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M993_AP_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x51_M118LR_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x51_Mk316_Mod_0_Mag,4);
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_Dim,4);
@ -185,6 +205,7 @@ class CfgVehicles {
MACRO_ADDMAGAZINE(ACE_20Rnd_762x67_Mk248_Mod_1_Mag,4);
MACRO_ADDMAGAZINE(ACE_20Rnd_762x67_Berger_Hybrid_OTM_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_762x54_Tracer_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_M995_AP_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk262_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Mk318_mag,4);
MACRO_ADDMAGAZINE(ACE_30Rnd_556x45_Stanag_Tracer_Dim,4);
@ -197,6 +218,7 @@ class CfgVehicles {
MACRO_ADDMAGAZINE(ACE_10Rnd_338_300gr_HPBT_Mag,4);
MACRO_ADDMAGAZINE(ACE_10Rnd_338_API526_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_API_Mag,4);
MACRO_ADDMAGAZINE(ACE_5Rnd_127x99_AMAX_Mag,4);
};
};

View File

@ -382,6 +382,7 @@ class CfgWeapons {
"30Rnd_556x45_Stanag_Tracer_Red",
"30Rnd_556x45_Stanag_Tracer_Green",
"30Rnd_556x45_Stanag_Tracer_Yellow",
"ACE_30Rnd_556x45_Stanag_M995_AP_mag",
"ACE_30Rnd_556x45_Stanag_Mk262_mag",
"ACE_30Rnd_556x45_Stanag_Mk318_mag",
"ACE_30Rnd_556x45_Stanag_Tracer_Dim"
@ -401,6 +402,7 @@ class CfgWeapons {
"30Rnd_556x45_Stanag_Tracer_Red",
"30Rnd_556x45_Stanag_Tracer_Green",
"30Rnd_556x45_Stanag_Tracer_Yellow",
"ACE_30Rnd_556x45_Stanag_M995_AP_mag",
"ACE_30Rnd_556x45_Stanag_Mk262_mag",
"ACE_30Rnd_556x45_Stanag_Mk318_mag",
"ACE_30Rnd_556x45_Stanag_Tracer_Dim"
@ -415,6 +417,7 @@ class CfgWeapons {
"30Rnd_556x45_Stanag_Tracer_Red",
"30Rnd_556x45_Stanag_Tracer_Green",
"30Rnd_556x45_Stanag_Tracer_Yellow",
"ACE_30Rnd_556x45_Stanag_M995_AP_mag",
"ACE_30Rnd_556x45_Stanag_Mk262_mag",
"ACE_30Rnd_556x45_Stanag_Mk318_mag",
"ACE_30Rnd_556x45_Stanag_Tracer_Dim"
@ -429,6 +432,7 @@ class CfgWeapons {
"30Rnd_556x45_Stanag_Tracer_Red",
"30Rnd_556x45_Stanag_Tracer_Green",
"30Rnd_556x45_Stanag_Tracer_Yellow",
"ACE_30Rnd_556x45_Stanag_M995_AP_mag",
"ACE_30Rnd_556x45_Stanag_Mk262_mag",
"ACE_30Rnd_556x45_Stanag_Mk318_mag",
"ACE_30Rnd_556x45_Stanag_Tracer_Dim"
@ -449,6 +453,7 @@ class CfgWeapons {
"30Rnd_556x45_Stanag_Tracer_Red",
"30Rnd_556x45_Stanag_Tracer_Green",
"30Rnd_556x45_Stanag_Tracer_Yellow",
"ACE_30Rnd_556x45_Stanag_M995_AP_mag",
"ACE_30Rnd_556x45_Stanag_Mk262_mag",
"ACE_30Rnd_556x45_Stanag_Mk318_mag",
"ACE_30Rnd_556x45_Stanag_Tracer_Dim"
@ -463,6 +468,7 @@ class CfgWeapons {
"30Rnd_556x45_Stanag_Tracer_Red",
"30Rnd_556x45_Stanag_Tracer_Green",
"30Rnd_556x45_Stanag_Tracer_Yellow",
"ACE_30Rnd_556x45_Stanag_M995_AP_mag",
"ACE_30Rnd_556x45_Stanag_Mk262_mag",
"ACE_30Rnd_556x45_Stanag_Mk318_mag",
"ACE_30Rnd_556x45_Stanag_Tracer_Dim"
@ -477,6 +483,7 @@ class CfgWeapons {
"30Rnd_556x45_Stanag_Tracer_Red",
"30Rnd_556x45_Stanag_Tracer_Green",
"30Rnd_556x45_Stanag_Tracer_Yellow",
"ACE_30Rnd_556x45_Stanag_M995_AP_mag",
"ACE_30Rnd_556x45_Stanag_Mk262_mag",
"ACE_30Rnd_556x45_Stanag_Mk318_mag",
"ACE_30Rnd_556x45_Stanag_Tracer_Dim"
@ -503,8 +510,10 @@ class CfgWeapons {
magazines[] = {
"20Rnd_762x51_Mag",
"ACE_20Rnd_762x51_Mag_Tracer_Dim",
"ACE_20Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_20Rnd_762x51_M118LR_Mag",
"ACE_20Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_20Rnd_762x51_M993_AP_Mag",
"ACE_20Rnd_762x51_Mag_SD"
};
initSpeed = -0.9724;
@ -528,6 +537,7 @@ class CfgWeapons {
"5Rnd_127x108_Mag",
"5Rnd_127x108_APDS_Mag",
"ACE_5Rnd_127x99_Mag",
"ACE_5Rnd_127x99_API_Mag",
"ACE_5Rnd_127x99_AMAX_Mag"
};
initSpeed = -1.0;
@ -551,8 +561,10 @@ class CfgWeapons {
magazines[] = {
"20Rnd_762x51_Mag",
"ACE_20Rnd_762x51_Mag_Tracer_Dim",
"ACE_20Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_20Rnd_762x51_M118LR_Mag",
"ACE_20Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_20Rnd_762x51_M993_AP_Mag",
"ACE_20Rnd_762x51_Mag_SD"
};
initSpeed = -0.9843;
@ -573,8 +585,10 @@ class CfgWeapons {
magazines[] = {
"20Rnd_762x51_Mag",
"ACE_20Rnd_762x51_Mag_Tracer_Dim",
"ACE_20Rnd_762x51_Mk316_Mod_0_Mag",
"ACE_20Rnd_762x51_M118LR_Mag",
"ACE_20Rnd_762x51_Mk319_Mod_0_Mag",
"ACE_20Rnd_762x51_M993_AP_Mag",
"ACE_20Rnd_762x51_Mag_SD"
};
initSpeed = -0.9916;

View File

@ -256,42 +256,6 @@
<Italian>Calibro: 5.56x45 mm Traccianti IR-DIM&lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Italian>
<Russian>Калибр: 5,56x45 мм ИК-трассирующие&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_mag_APName">
<English>5.56mm 30Rnd AP Mag</English>
<Hungarian>5,56 mm Páncéltörő 30-as Tár</Hungarian>
<German>5,56 mm 30-Schuss-Magazin AP</German>
<Spanish>Cargador de 30 balas AP de 5,56mm</Spanish>
<French>Ch. 5,56mm 30Cps AP</French>
<Polish>Magazynek 5,56mm 30rd AP</Polish>
<Czech>5.56mm 30ks AP Zásobník</Czech>
<Portuguese>Carregador de 30 projéteis AP de 5,56mm</Portuguese>
<Italian>Caricatore 5.56mm 30Rnd AP</Italian>
<Russian>Магазин из 30-ти 5,56 мм бронебойных</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_mag_APNameShort">
<English>5.56mm AP</English>
<Hungarian>5,56 mm Páncéltörő</Hungarian>
<German>5,56mm AP</German>
<Spanish>5,56mm AP</Spanish>
<French>5,56mm AP</French>
<Polish>5,56mm AP</Polish>
<Czech>5.56mm AP</Czech>
<Portuguese>5,56mm AP</Portuguese>
<Italian>5.56mm AP</Italian>
<Russian>5,56 мм бронебойные</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_mag_APDescription">
<English>Caliber: 5.56x45 mm AP&lt;br /&gt;Rounds: 30&lt;br /&gt;Used in: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</English>
<Hungarian>Kaliber: 5,56x45 mm Páncéltörő&lt;br /&gt;Lövedékek: 30&lt;br /&gt;Használható: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Hungarian>
<German>Kaliber: 5,56x45 mm AP&lt;br /&gt;Patronen: 30&lt;br /&gt;Eingesetzt von: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</German>
<Spanish>Calibre: 5,56x45 mm AP&lt;br /&gt;Balas: 30&lt;br /&gt;Se usa en: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Spanish>
<French>Calibre: 5,56x45 mm AP&lt;br /&gt;Cartouches: 30&lt;br /&gt;Utilisé dans: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</French>
<Polish>Kaliber: 5,56x45 mm AP&lt;br /&gt;Pociski: 30&lt;br /&gt;Używane w: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Polish>
<Czech>Ráže: 5.56x45 mm AP&lt;br /&gt;Munice: 30&lt;br /&gt;Použití: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Czech>
<Portuguese>Calibre: 5,56x45 mm AP&lt;br /&gt;Projéteis: 30&lt;br /&gt;Usado em: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Portuguese>
<Italian>Calibro: 5.56x45 mm AP&lt;br /&gt;Munizioni: 30&lt;br /&gt;In uso su: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Italian>
<Russian>Калибр: 5,56x45 мм бронебойные&lt;br /&gt;Патронов: 30&lt;br /&gt;Используются с: TRG-20, TRG-21/EGLM, Mk20/C/EGLM, SDAR</Russian>
</Key>
<!-- 7.62x51mm -->
<Key ID="STR_ACE_20Rnd_762x51_mag_TracerName">
<English>7.62mm 20rnd Tracer Mag</English>
@ -401,42 +365,6 @@
<Italian>Calibro: 7.62x51 mm Sil.&lt;br /&gt;Munizioni: 20&lt;br /&gt;In uso su: Mk18 ABR</Italian>
<Russian>Калибр: 7,62x51 мм дозвуковые&lt;br /&gt;Патронов: 20&lt;br /&gt;Используются с: Mk18 ABR</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_APName">
<English>7.62mm 20Rnd AP Mag</English>
<Hungarian>7,62 mm Páncéltörő 20-as Tár</Hungarian>
<German>7,62 mm 20-Schuss-Magazin AP</German>
<Spanish>Cargador de 20 balas AP de 7,62mm</Spanish>
<French>Ch. 7,62mm 20Cps AP</French>
<Polish>Magazynek 7,62mm 20rd AP</Polish>
<Czech>7.62mm 20ks AP Zásobník</Czech>
<Portuguese>Carregador de 20 projéteis AP de 7,62mm</Portuguese>
<Italian>Caricatore 7.62mm 20Rnd AP</Italian>
<Russian>Магазин из 20-ти 7,62 мм бронебойных</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_APNameShort">
<English>7.62mm AP</English>
<Hungarian>7,62 mm Páncéltörő</Hungarian>
<German>7,62mm AP</German>
<Spanish>7,62mm AP</Spanish>
<French>7,62mm AP</French>
<Polish>7,62mm AP</Polish>
<Czech>7.62mm AP</Czech>
<Portuguese>7,62mm AP</Portuguese>
<Italian>7.62mm AP</Italian>
<Russian>7,62 мм бронебойные</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_mag_APDescription">
<English>Caliber: 7.62x51 mm AP&lt;br /&gt;Rounds: 20&lt;br /&gt;Used in: Mk18 ABR</English>
<Hungarian>Kaliber: 7,62x51 mm Páncéltörő&lt;br /&gt;Lövedékek: 20&lt;br /&gt;Használható: Mk18 ABR</Hungarian>
<German>Kaliber: 7,62x51 mm AP&lt;br /&gt;Patronen: 20&lt;br /&gt;Eingesetzt von: EBR</German>
<Spanish>Calibre: 7,62x51 mm AP&lt;br /&gt;Balas: 20&lt;br /&gt;Se usa en: Mk18 ABR</Spanish>
<French>Calibre: 7,62x51 mm AP&lt;br /&gt;Cartouches: 20&lt;br /&gt;Utilisé dans: EBR</French>
<Polish>Kaliber: 7,62x51 mm AP&lt;br /&gt;Pociski: 20&lt;br /&gt;Używane w: Mk18 ABR</Polish>
<Czech>Ráže: 7.62x51 mm AP&lt;br /&gt;Munice: 20&lt;br /&gt;Použití: Mk18 ABR</Czech>
<Portuguese>Calibre: 7,62x51 mm AP&lt;br /&gt;Projéteis: 20&lt;br /&gt;Usado em: Mk18 ABR</Portuguese>
<Italian>Calibro: 7.62x51 mm AP&lt;br /&gt;Munizioni: 20&lt;br /&gt;In uso su: Mk18 ABR</Italian>
<Russian>Калибр: 7,62x51 мм дозвуковые&lt;br /&gt;Патронов: 20&lt;br /&gt;Используются с: Mk18 ABR</Russian>
</Key>
<!-- .338 Norma Magnum -->
<Key ID="STR_ACE_130Rnd_338_Mag_TracerName">
<English>.338 NM 130Rnd Tracer Belt</English>
@ -564,31 +492,6 @@
<Spanish>Calibre: 9.3x64mm trazadora IR-DIM&lt;br /&gt;Balas: 10&lt;br /&gt;Se usa en: Cyrus</Spanish>
<Russian>Калибр: 9,3x64 мм ИК-трассирующие&lt;br /&gt;Патронов: 10&lt;br /&gt;Используются с: Cyrus</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_APName">
<English>9.3mm 10Rnd AP Mag</English>
<German>9,3mm 10-Schuss-Magazin Hartkern</German>
<Polish>Magazynek 9,3mm 10rd AP</Polish>
<French>Chargeur 9.3mm 10Cps AP</French>
<Spanish>Cargador de 10 balas AP de 9.3mm</Spanish>
<Russian>Магазин из 10-ти 9,3 мм бронебойных</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_APNameShort">
<English>9.3mm AP</English>
<German>9,3mm AP</German>
<Polish>9,3mm AP</Polish>
<Czech>9.3mm AP</Czech>
<French>9.3mm AP</French>
<Spanish>9.3mm AP</Spanish>
<Russian>9,3 мм бронебойные</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_93x64_DMR_05_Mag_APDescription">
<English>Caliber: 9.3x64mm AP&lt;br /&gt;Rounds: 10&lt;br /&gt;Used in: Cyrus</English>
<German>Kaliber: 9,3x64mm Hartkern&lt;br /&gt;Schuss: 10&lt;br /&gt;Verwendet für: Cyrus</German>
<Polish>Kaliber: 9,3x64 mm AP&lt;br /&gt;Pociski: 10&lt;br /&gt;Używany w: Cyrus</Polish>
<French>Calibre: 9.3x64mm AP&lt;br /&gt;Cartouches: 10&lt;br /&gt;Utilisé dans: Cyrus</French>
<Spanish>Calibre: 9.3x64mm AP&lt;br /&gt;Balas: 10&lt;br /&gt;Se usa en: Cyrus</Spanish>
<Russian>Калибр: 9,3x64 мм бронебойные&lt;br /&gt;Патронов: 10&lt;br /&gt;Используются с: Cyrus</Russian>
</Key>
<!-- 9.3x64mm 150Rnd Belt-->
<Key ID="STR_ACE_150Rnd_93x64_Mag_TracerName">
<English>9.3mm 150Rnd Tracer Belt</English>
@ -781,7 +684,7 @@
<English>5.56mm Mk262</English>
<Polish>5,56mm Mk262</Polish>
<French>5.56mm Mk262</French>
<Spanish>5.56mm (Mk262)</Spanish>
<Spanish>5.56mm Mk262</Spanish>
<Russian>5,56 мм Mk262</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk262_mag_Description">
@ -793,16 +696,16 @@
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk318_mag_Name">
<English>5.56mm 30Rnd Mag (Mk318)</English>
<Polish>Magazynek 5,56mm 30rd Mk318</Polish>
<Polish>Magazynek 5,56mm 30rd (Mk318)</Polish>
<French>5.56mm 30Cps (Mk318)</French>
<Spanish>Cargador de 30 balas de 5.56mm (Mk318)</Spanish>
<Russian>Магазин из 30-ти 5.56 мм Mk318</Russian>
<Russian>Магазин из 30-ти 5.56 мм (Mk318)</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk318_mag_NameShort">
<English>5.56mm Mk318</English>
<Polish>5,56mm Mk318</Polish>
<French>5.56mm Mk318</French>
<Spanish>5.56mm (Mk318)</Spanish>
<Spanish>5.56mm Mk318</Spanish>
<Russian>5.56 мм Mk318</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_Mk318_mag_Description">
@ -812,6 +715,27 @@
<Spanish>Calibre: 5.56x45 mm NATO (Mk318)&lt;br /&gt;Balas: 30</Spanish>
<Russian>Калибр: 5,56x45 мм NATO (Mk318)&lt;br /&gt;Патронов: 30</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_M995_AP_mag_Name">
<English>5.56mm 30Rnd Mag (M995 AP)</English>
<Polish>Magazynek 5,56mm 30rd (M995 AP)</Polish>
<French>5.56mm 30Cps (M995 AP)</French>
<Spanish>Cargador de 30 balas de 5.56mm (M995 AP)</Spanish>
<Russian>Магазин из 30-ти 5.56 мм (M995 AP)</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_M995_AP_mag_NameShort">
<English>5.56mm AP</English>
<Polish>5,56mm AP</Polish>
<French>5.56mm AP</French>
<Spanish>5.56mm AP</Spanish>
<Russian>5.56 мм AP</Russian>
</Key>
<Key ID="STR_ACE_30Rnd_556x45_Stanag_M995_AP_mag_Description">
<English>Caliber: 5.56x45 mm NATO (M995 AP)&lt;br /&gt;Rounds: 30</English>
<Polish>Kaliber: 5,56x45 mm NATO (M995 AP)&lt;br /&gt;Pociski: 30</Polish>
<French>Calibre: 5.56x45 mm NATO (M995 AP)&lt;br /&gt;Cartouches: 30</French>
<Spanish>Calibre: 5.56x45 mm NATO (M995 AP)&lt;br /&gt;Balas: 30</Spanish>
<Russian>Калибр: 5,56x45 мм NATO (M995 AP)&lt;br /&gt;Патронов: 30</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_M118LR_Mag_Name">
<English>7.62mm 10Rnd Mag (M118LR)</English>
<Polish>Magazynek 7,62mm 10rd (M118LR)</Polish>
@ -854,6 +778,48 @@
<Spanish>Calibre: 7.62x51 mm NATO (M118LR)&lt;br /&gt;Balas: 20</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (M118LR)&lt;br /&gt;Патронов: 20</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_Mk316_Mod_0_Mag_Name">
<English>7.62mm 10Rnd Mag (Mk316 Mod 0)</English>
<Polish>Magazynek 7,62mm 10rd (Mk316 Mod 0)</Polish>
<French>7.62mm 10Cps (Mk316 Mod 0)</French>
<Spanish>Cargador de 10 balas de 7.62mm (Mk316 Mod 0)</Spanish>
<Russian>Магазин из 10-ти 7,62 мм (Mk316 Mod 0)</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_Mk316_Mod_0_Mag_NameShort">
<English>7.62mm Mk316</English>
<Polish>7,62mm Mk316</Polish>
<French>7.62mm Mk316</French>
<Spanish>7.62mm Mk316</Spanish>
<Russian>7,62 мм Mk316</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_Mk316_Mod_0_Mag_Description">
<English>Caliber: 7.62x51 mm NATO (Mk316 Mod 0)&lt;br /&gt;Rounds: 10</English>
<Polish>Kaliber: 7,62x51 mm NATO (Mk316 Mod 0)&lt;br /&gt;Pociski: 10</Polish>
<French>Calibre: 7.62x51 mm NATO (Mk316 Mod 0)&lt;br /&gt;Cartouches: 10</French>
<Spanish>Calibre: 7.62x51 mm NATO (Mk316 Mod 0)&lt;br /&gt;Balas: 10</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (Mk316 Mod 0)&lt;br /&gt;Патронов: 10</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_Mk316_Mod_0_Mag_Name">
<English>7.62mm 20Rnd Mag (Mk316 Mod 0)</English>
<Polish>Magazynek 7,62mm 20rd (Mk316 Mod 0)</Polish>
<French>7.62mm 20Cps (Mk316 Mod 0)</French>
<Spanish>Cargador de 20 balas de 7.62mm (Mk316 Mod 0)</Spanish>
<Russian>Магазин из 20-ти 7,62 мм (Mk316 Mod 0)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_Mk316_Mod_0_Mag_NameShort">
<English>7.62mm Mk316</English>
<Polish>7,62mm Mk316</Polish>
<French>7.62mm Mk316</French>
<Spanish>7.62mm Mk316</Spanish>
<Russian>7,62 мм Mk316</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_Mk316_Mod_0_Mag_Description">
<English>Caliber: 7.62x51 mm NATO (Mk316 Mod 0)&lt;br /&gt;Rounds: 20</English>
<Polish>Kaliber: 7,62x51 mm NATO (Mk316 Mod 0)&lt;br /&gt;Pociski: 20</Polish>
<French>Calibre: 7.62x51 mm NATO (Mk316 Mod 0)&lt;br /&gt;Cartouches: 20</French>
<Spanish>Calibre: 7.62x51 mm NATO (Mk316 Mod 0)&lt;br /&gt;Balas: 20</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (Mk316 Mod 0)&lt;br /&gt;Патронов: 20</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_Mk319_Mod_0_Mag_Name">
<English>7.62mm 10Rnd Mag (Mk319 Mod 0)</English>
<Polish>Magazynek 7,62mm 10rd (Mk319 Mod 0)</Polish>
@ -896,6 +862,48 @@
<Spanish>Calibre: 7.62x51 mm NATO (Mk319 Mod 0)&lt;br /&gt;Balas: 20</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (Mk319 Mod 0)&lt;br /&gt;Патронов: 20</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_M993_AP_Mag_Name">
<English>7.62mm 10Rnd Mag (M993 AP)</English>
<Polish>Magazynek 7,62mm 10rd (M993 AP)</Polish>
<French>7.62mm 10Cps (M993 AP)</French>
<Spanish>Cargador de 10 balas de 7.62mm (M993 AP)</Spanish>
<Russian>Магазин из 10-ти 7,62 мм (M993 AP)</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_M993_AP_Mag_NameShort">
<English>7.62mm AP</English>
<Polish>7,62mm AP</Polish>
<French>7.62mm AP</French>
<Spanish>7.62mm AP</Spanish>
<Russian>7,62mm AP</Russian>
</Key>
<Key ID="STR_ACE_10Rnd_762x51_M993_AP_Mag_Description">
<English>Caliber: 7.62x51 mm NATO (M993 AP)&lt;br /&gt;Rounds: 10</English>
<Polish>Kaliber: 7,62x51 mm NATO (M993 AP)&lt;br /&gt;Pociski: 10</Polish>
<French>Calibre: 7.62x51 mm NATO (M993 AP)&lt;br /&gt;Cartouches: 10</French>
<Spanish>Calibre: 7.62x51 mm NATO (M993 AP)&lt;br /&gt;Balas: 10</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (M993 AP)&lt;br /&gt;Патронов: 10</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_M993_AP_Mag_Name">
<English>7.62mm 20Rnd Mag (M993 AP)</English>
<Polish>Magazynek 7,62mm 20rd (M993 AP)</Polish>
<French>7.62mm 20Cps (M993 AP)</French>
<Spanish>Cargador de 20 balas de 7.62mm (M993 AP)</Spanish>
<Russian>Магазин из 20-ти 7,62 мм (M993 AP)</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_M993_AP_Mag_NameShort">
<English>7.62mm AP</English>
<Polish>7,62mm AP</Polish>
<French>7.62mm AP</French>
<Spanish>7.62mm AP</Spanish>
<Russian>7,62 мм AP</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x51_M993_AP_Mag_Description">
<English>Caliber: 7.62x51 mm NATO (M993 AP)&lt;br /&gt;Rounds: 20</English>
<Polish>Kaliber: 7,62x51 mm NATO (M993 AP)&lt;br /&gt;Pociski: 20</Polish>
<French>Calibre: 7.62x51 mm NATO (M993 AP)&lt;br /&gt;Cartouches: 20</French>
<Spanish>Calibre: 7.62x51 mm NATO (M993 AP)&lt;br /&gt;Balas: 20</Spanish>
<Russian>Калибр: 7,62x51 мм NATO (M993 AP)&lt;br /&gt;Патронов: 20</Russian>
</Key>
<Key ID="STR_ACE_20Rnd_762x67_Mk248_Mod_0_Mag_Name">
<English>7.62mm 20Rnd Mag (Mk248 Mod 0)</English>
<Polish>Magazynek 7,62mm 20rd (Mk248 Mod 0)</Polish>
@ -1058,6 +1066,24 @@
<Polish>Kaliber: 12,7x99 mm&lt;br /&gt;Pociski: 5</Polish>
<Russian>Калибр: 12,7x99 мм&lt;br /&gt;Патронов: 5</Russian>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_API_Mag_Name">
<English>12.7x99mm API 5Rnd Mag</English>
<French>12.7x99mm API 5Cps</French>
<Spanish>Cargador de 5 balas de 12.7x99mm API</Spanish>
<Polish>Magazynek 12,7x99mm API 5rd</Polish>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_API_Mag_NameShort">
<English>12.7mm API</English>
<French>12.7mm API</French>
<Spanish>12.7mm API</Spanish>
<Polish>12,7mm API</Polish>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_API_Mag_Description">
<English>Caliber: 12.7x99mm API&lt;br /&gt;Rounds: 5</English>
<French>Calibre: 12.7x99mm API&lt;br /&gt;Cartouches: 5</French>
<Spanish>Calibre: 12.7x99mm API&lt;br /&gt;Balas: 5</Spanish>
<Polish>Kaliber: 12,7x99 mm API&lt;br /&gt;Pociski: 5</Polish>
</Key>
<Key ID="STR_ACE_5Rnd_127x99_AMAX_Mag_Name">
<English>12.7x99mm 5Rnd Mag (AMAX)</English>
<French>12.7x99mm 5Rnd Mag (AMAX)</French>

View File

@ -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"; \
}; \
}; \
};

View File

@ -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];

View File

@ -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

View File

@ -35,7 +35,7 @@
// Conditions: canInteract
if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false};
// Conditions: specific
if !(call FUNC(canUseRangefinder) || FUNC(canUseFCS)) exitWith {false};
if !(call FUNC(canUseFCS)) exitWith {false};
// Statement
[vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex), 50] call FUNC(adjustRange);
@ -49,7 +49,7 @@
// Conditions: canInteract
if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) exitWith {false};
// Conditions: specific
if !(call FUNC(canUseRangefinder) || FUNC(canUseFCS)) exitWith {false};
if !(call FUNC(canUseFCS)) exitWith {false};
// Statement
[vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex), -50] call FUNC(adjustRange);

View File

@ -6,99 +6,137 @@ 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;
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;
// GVAR(skip) = 1;
//};
//class R_57mm_HE: RocketBase {
// ACE_FRAG_SKIP = 1;
// GVAR(skip) = 1;
//};
class R_80mm_HE: RocketBase {
ACE_FRAG_SKIP = 1;
GVAR(skip) = 1;
};
//class R_S8T_AT: RocketBase {
// ACE_FRAG_SKIP = 1;
// 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_HE: GrenadeBase {
ACE_FRAG_SKIP = 0;
ACE_FRAG_FORCE = 1;
GVAR(skip) = 0;
GVAR(force) = 1;
};
class ACE_G_40mm_HEDP: G_40mm_HE {
GVAR(classes)[] = {"ACE_frag_tiny_HD"};
GVAR(metal) = 200;
GVAR(charge) = 45;
GVAR(gurney_c) = 2830;
GVAR(gurney_k) = 3/5;
};
class ACE_G_40mm_HE: ACE_G_40mm_HEDP {
GVAR(classes)[] = {"ACE_frag_tiny_HD"};
GVAR(metal) = 200;
GVAR(charge) = 32;
GVAR(gurney_c) = 2700;
GVAR(gurney_k) = 3/5;
};
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 Sh_82mm_AMOS;
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_155mm_AMOS;
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;
// GVAR(force) = 1;
// GVAR(multiplier) = 1.75;
//};
/*
class B_762x51_Ball;
class ACE_frag_base: B_762x51_Ball { ////TODO: B_762x45_Ball no longer exists, is this a valid replacement?
@ -253,51 +291,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;
@ -305,19 +343,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;
@ -325,7 +363,7 @@ class CfgAmmo {
airFriction = BASE_DRAG*0.5;
caliber = 2.8;
};
class ACE_frag_huge_HD: ACE_frag_large {
hit = 40;
indirectHit = 4;
@ -333,19 +371,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;
};

View File

@ -26,6 +26,9 @@ GVAR(tracesStarted) = false;
GVAR(traceID) = -1;
GVAR(autoTrace) = true;
// TODO setting
GVAR(enabled) = true;
// * Other Shit */
PREP(frag_trace);

View File

@ -3,11 +3,11 @@
#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",
// 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"];
@ -40,21 +40,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;
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);
@ -78,20 +78,20 @@ if(_alive || {_caliber >= 2.5} || {(_explosive > 0 && {_idh >= 1})}) then {
];
// _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 +109,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 +117,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 +130,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 +151,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);
};
};
};

View File

@ -1,6 +1,6 @@
#include "script_component.hpp"
private ["_gun", "_type", "_round", "_doFragTrack", "_doSpall"];
if !(isNil QGVAR(enabled) && {GVAR(enabled)}) exitWith {};
if !(!isNil QGVAR(enabled) && {GVAR(enabled)}) exitWith {};
_gun = _this select 0;
_type = _this select 4;
@ -11,10 +11,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 +28,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 +48,5 @@ if(_doFragTrack && alive _round) then {
if(_doSpall) then {
[_round, 2, _spallTrack, _spallTrackID] call FUNC(spallTrack);
};
// player sideChat "WTF2";
// ACE_player sideChat "WTF2";
};

View File

@ -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",
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"];
_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,18 @@ 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
];
_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 +176,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;
@ -198,15 +198,15 @@ if(_isArmed && (count _objects) > 0) then {
_sectorOffset = 360 * (_i - 1) / (_randomCount max 1);
_randomDir = random(_sectorSize);
_vec = [cos(_sectorOffset + _randomDir), sin(_sectorOffset + _randomDir), sin(30 - (random 45))];
_fp = (_fragPower-(random (_fragPowerRandom)));
_vel = [
(_vec select 0)*_fp,
(_vec select 1)*_fp,
(_vec select 2)*_fp
];
_fragType = round (random ((count _fragTypes)-1));
_fragObj = (_fragTypes select _fragType) createVehicleLocal [0,0,10000];
_fragObj setPosASL _lastPos;
@ -217,14 +217,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;

View File

@ -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;

View File

@ -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););
};
};
};

View File

@ -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);

View File

@ -10,6 +10,7 @@ PREP(hasEarPlugsIn);
PREP(moduleHearing);
PREP(putInEarPlugs);
PREP(removeEarPlugs);
PREP(updatePlayerVehAttenuation);
PREP(updateVolume);
ADDON = true;

View File

@ -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", "_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);

View File

@ -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 <NUMBER>
*
* 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;

View File

@ -3,6 +3,8 @@
if (!hasInterface) exitWith {};
GVAR(ParsedTextCached) = [];
//Setup text/shadow color matrix
[] call FUNC(setupTextColors);
["SettingChanged", {

View File

@ -8,6 +8,7 @@ PREP(compileMenu);
PREP(compileMenuSelfAction);
PREP(collectActiveActionTree);
PREP(createAction);
PREP(ctrlSetParsedTextCached);
PREP(findActionNode);
PREP(handlePlayerChanged);
PREP(isSubPath);

View File

@ -50,13 +50,13 @@ class ACE_Settings {
displayName = "$STR_ACE_Interact_Menu_ColorTextMin";
};
class GVAR(colorShadowMax) {
value[] = {1, 1, 1, 1};
value[] = {0, 0, 0, 1};
typeName = "COLOR";
isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_ColorShadowMax";
};
class GVAR(colorShadowMin) {
value[] = {1, 1, 1, 0.25};
value[] = {0, 0, 0, 0.25};
typeName = "COLOR";
isClientSettable = 1;
displayName = "$STR_ACE_Interact_Menu_ColorShadowMin";

View File

@ -53,7 +53,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"));

View File

@ -0,0 +1,13 @@
// by commy2
#include "script_component.hpp"
private ["_ctrl", "_index", "_text"];
_ctrl = _this select 0;
_index = _this select 1;
_text = _this select 2;
if (_text != ARR_SELECT(GVAR(ParsedTextCached),_index,"-1")) then {
GVAR(ParsedTextCached) set [_index, _text];
_ctrl ctrlSetStructuredText parseText _text;
};

View File

@ -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 ||

View File

@ -77,6 +77,7 @@ if (GVAR(openedMenuType) >= 0) then {
GVAR(startHoverTime) = diag_tickTime;
GVAR(lastPath) = _hoverPath;
GVAR(expanded) = false;
GVAR(ParsedTextCached) = [];
} else {
if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then {
GVAR(expanded) = true;

View File

@ -41,9 +41,21 @@ if((count _this) > 2) then {
};
};
// For non-self actions, exit if the action is too far away
// For non-self actions, exit if the action is too far away or ocluded
if (GVAR(openedMenuType) == 0 && vehicle ACE_player == ACE_player &&
{(ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot")) distance _pos >= _distance}) exitWith {false};
{
private ["_headPos","_actualDistance"];
_headPos = ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot");
_actualDistance = _headPos distance _pos;
if (_actualDistance > _distance) exitWith {true};
if (_distance > 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
};
}) exitWith {false};
// Exit if the action is behind you
_sPos = if (count _pos != 2) then {

View File

@ -27,7 +27,6 @@ if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then {
GVAR(iconCtrls) pushBack ((findDisplay _displayNum) ctrlCreate ["RscStructuredText", 54021+GVAR(iconCount)]);
};
_ctrl = GVAR(iconCtrls) select GVAR(iconCount);
GVAR(iconCount) = GVAR(iconCount) + 1;
if(_icon == "") then {
_icon = DEFAULT_ICON;
};
@ -38,8 +37,11 @@ _text = if (GVAR(UseListMenu)) then {
format ["<img image='%1' color='%2' align='center'/><br/><t color='%3' size='0.80' align='center' shadow='1' shadowColor='%4' shadowOffset='0.06'>%5</t>", _icon, _iconColor, _textColor, _shadowColor, "ace_breakLine" callExtension _text];
};
_ctrl ctrlSetStructuredText (parseText _text);
_text = if (GVAR(UseListMenu)) then {
//_ctrl ctrlSetStructuredText parseText _text;
[_ctrl, GVAR(iconCount), _text] call FUNC(ctrlSetParsedTextCached);
GVAR(iconCount) = GVAR(iconCount) + 1;
if (GVAR(UseListMenu)) then {
_ctrl ctrlSetPosition [(_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];

View File

@ -22,14 +22,14 @@ if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then {
private "_ctrl";
_ctrl = GVAR(iconCtrls) select GVAR(iconCount);
GVAR(iconCount) = GVAR(iconCount) + 1;
if (GVAR(UseListMenu)) then {
_ctrl ctrlSetStructuredText (parseText format ["<img image='%1' color='#FF0000' size='1.6'/>", _icon]);
[_ctrl, GVAR(iconCount), format ["<img image='%1' color='#FF0000' size='1.6'/>", _icon]] call FUNC(ctrlSetParsedTextCached);
_ctrl ctrlSetPosition [(_sPos select 0)-(0.014*SafeZoneW), (_sPos select 1)-(0.014*SafeZoneW), 0.05*SafeZoneW, 0.035*SafeZoneW];
} else {
_ctrl ctrlSetStructuredText (parseText format ["<img image='%1' color='#FF0000' size='1.6' align='center'/>", _icon]);
[_ctrl, GVAR(iconCount), format ["<img image='%1' color='#FF0000' size='1.6' align='center'/>", _icon]] call FUNC(ctrlSetParsedTextCached);
_ctrl ctrlSetPosition [(_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];
GVAR(iconCount) = GVAR(iconCount) + 1;
_ctrl ctrlCommit 0;

View File

@ -27,7 +27,7 @@ class CfgVehicles {
class ACE_Actions {
class ACE_MainActions {
displayName = "$STR_ACE_Interaction_MainAction";
distance = 5;
distance = 4;
condition = QUOTE(true);
statement = "";
icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa";
@ -35,7 +35,6 @@ class CfgVehicles {
class ACE_TeamManagement {
displayName = "$STR_ACE_Interaction_TeamManagement";
distance = 5;
condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {GVAR(EnableTeamManagement)});
statement = "";
showDisabled = 0;
@ -45,7 +44,6 @@ class CfgVehicles {
class ACE_JoinTeamRed {
displayName = "$STR_ACE_Interaction_JoinTeamRed";
distance = 5;
condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player});
statement = QUOTE([ARR_2(_target,'RED')] call DFUNC(joinTeam));
showDisabled = 1;
@ -55,7 +53,6 @@ class CfgVehicles {
};
class ACE_JoinTeamGreen {
displayName = "$STR_ACE_Interaction_JoinTeamGreen";
distance = 5;
condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player});
statement = QUOTE([ARR_2(_target,'GREEN')] call DFUNC(joinTeam));
showDisabled = 1;
@ -65,7 +62,6 @@ class CfgVehicles {
};
class ACE_JoinTeamBlue {
displayName = "$STR_ACE_Interaction_JoinTeamBlue";
distance = 5;
condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player});
statement = QUOTE([ARR_2(_target,'BLUE')] call DFUNC(joinTeam));
showDisabled = 1;
@ -75,7 +71,6 @@ class CfgVehicles {
};
class ACE_JoinTeamYellow {
displayName = "$STR_ACE_Interaction_JoinTeamYellow";
distance = 5;
condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player});
statement = QUOTE([ARR_2(_target,'YELLOW')] call DFUNC(joinTeam));
showDisabled = 1;
@ -86,7 +81,6 @@ class CfgVehicles {
class ACE_LeaveTeam {
displayName = "$STR_ACE_Interaction_LeaveTeam";
distance = 5;
condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {assignedTeam _player != 'MAIN'});
statement = QUOTE([ARR_2(_target,'MAIN')] call DFUNC(joinTeam));
showDisabled = 1;
@ -98,7 +92,6 @@ class CfgVehicles {
class ACE_JoinGroup {
displayName = "$STR_ACE_Interaction_JoinGroup";
distance = 5;
condition = QUOTE(side group _player == side group _target && {group _player != group _target});
statement = QUOTE([_player] joinSilent group _target;);
showDisabled = 0;
@ -109,7 +102,6 @@ class CfgVehicles {
class ACE_GetDown {
displayName = "$STR_ACE_Interaction_GetDown";
distance = 5;
condition = QUOTE([_target] call DFUNC(canInteractWithCivilian));
statement = QUOTE([_target] call DFUNC(getDown));
showDisabled = 0;
@ -117,7 +109,6 @@ class CfgVehicles {
};
class ACE_SendAway {
displayName = "$STR_ACE_Interaction_SendAway";
distance = 5;
condition = QUOTE([_target] call DFUNC(canInteractWithCivilian));
statement = QUOTE([_target] call DFUNC(sendAway));
showDisabled = 0;
@ -125,7 +116,6 @@ class CfgVehicles {
};
class ACE_Pardon {
displayName = "$STR_ACE_Interaction_Pardon";
distance = 5;
condition = QUOTE(rating _target < -2000 && {alive _target} && {side group _player == side group _target});
statement = QUOTE([ARR_3(_target,'{_this addRating -rating _this}',_target)] call DEFUNC(common,execRemoteFnc));
showDisabled = 0;

View File

@ -9,7 +9,9 @@ private["_apos", "_aposX", "_aposY", "_args", "_boundsInput", "_bpos", "_canFire
private["_constraintLeft", "_constraintRight", "_constraintTop", "_currentTarget", "_fireDisabledEH"];
private["_firedEH", "_fov", "_lastTick", "_lockTime", "_maxX", "_maxY", "_minX", "_minY", "_newTarget"];
private["_offsetX", "_offsetY", "_pos", "_randomLockInterval", "_randomPosWithinBounds", "_range"];
private["_runTime", "_soundTime", "_targetArray", "_zamerny"];
private["_runTime", "_soundTime", "_targetArray", "_zamerny", "_currentShooter"];
_currentShooter = (vehicle ACE_player);
#define __OffsetX ((ctrlPosition __JavelinIGUITargetingLineV) select 0) - 0.5
#define __OffsetY ((ctrlPosition __JavelinIGUITargetingLineH) select 1) - 0.5
@ -128,7 +130,7 @@ FUNC(disableFire) = {
if(_firedEH < 0 && difficulty > 0) then {
_firedEH = [ACE_player, "DefaultAction", {true}, {
_canFire = ACE_player getVariable["ace_missileguidance_target", nil];
_canFire = _this getVariable["ace_missileguidance_target", nil];
if(!isNil "_canFire") exitWith { false };
true
}] call EFUNC(common,addActionEventHandler);
@ -155,7 +157,7 @@ if (isNull _newTarget) then {
__JavelinIGUITargetingLines ctrlShow false;
__JavelinIGUITargetingConstraints ctrlShow false;
ACE_player setVariable ["ace_missileguidance_target",nil, false];
_currentShooter setVariable ["ace_missileguidance_target",nil, false];
// Disallow fire
_fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire);
@ -212,7 +214,7 @@ if (isNull _newTarget) then {
{_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingGateTL,__JavelinIGUITargetingGateTR,__JavelinIGUITargetingGateBL,__JavelinIGUITargetingGateBR];
ACE_player setVariable["ace_missileguidance_target", _currentTarget, false];
_currentShooter setVariable["ace_missileguidance_target", _currentTarget, false];
// Allow fire
_fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire);
@ -227,7 +229,7 @@ if (isNull _newTarget) then {
__JavelinIGUITargetingConstrains ctrlShow true;
__JavelinIGUITargetingLines ctrlShow false;
ACE_player setVariable["ace_missileguidance_target", nil, false];
_currentShooter setVariable["ace_missileguidance_target", nil, false];
_boundsInput = if (_currentTarget isKindOf "CAManBase") then {
[_newTarget,[-1,-1,-2],_currentTarget selectionPosition "body"];
@ -270,7 +272,7 @@ if (isNull _newTarget) then {
__JavelinIGUITargetingLines ctrlShow false;
__JavelinIGUITargetingConstraints ctrlShow false;
ACE_player setVariable ["ace_missileguidance_target",nil, false];
_currentShooter setVariable ["ace_missileguidance_target",nil, false];
// Disallow fire
_fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire);
@ -287,4 +289,4 @@ _args set[3, _lockTime];
_args set[4, _soundTime];
_args set[6, _fireDisabledEH];
uiNamespace setVariable[QGVAR(arguments), _args ];
uiNamespace setVariable[QGVAR(arguments), _args ];

View File

@ -33,7 +33,8 @@ uiNameSpace setVariable [QGVAR(arguments),
_pfh_handle = uiNamespace getVariable ["ACE_RscOptics_javelin_PFH", nil];
if(isNil "_pfh_handle") then {
_pfh_handle = [FUNC(onOpticDraw), 0, []] call CBA_fnc_addPerFrameHandler;
uiNamespace setVariable["ACE_RscOptics_javelin_PFH", _pfh_handle];
};
if(!isNil "_pfh_handle") then {
[] call FUNC(onOpticUnload); // Unload optic if it was already loaded
};
_pfh_handle = [FUNC(onOpticDraw), 0, []] call CBA_fnc_addPerFrameHandler;
uiNamespace setVariable["ACE_RscOptics_javelin_PFH", _pfh_handle];

View File

@ -14,7 +14,7 @@
*/
#include "script_component.hpp"
private ["_playerDir", "_windSpeed", "_windDir", "_crosswind", "_headwind", "_humidity", "_temperature", "_humidity", "_barometricPressure", "_altitude"];
private ["_playerDir", "_windSpeed", "_crosswind", "_headwind", "_humidity", "_temperature", "_humidity", "_barometricPressure", "_altitude"];
if (isNil QGVAR(MIN) || isNil QGVAR(MAX)) then {
_temperature = GET_TEMPERATURE_AT_HEIGHT((getPosASL ACE_player) select 2);

View File

@ -42,9 +42,7 @@ if (GVAR(Kestrel4500) && dialog) then {
GVAR(Overlay) = true;
[{
private ["_outputData", "_updateTimer"];
[{
// abort condition
if (!GVAR(Overlay) || {!(("ACE_Kestrel4500" in (uniformItems ACE_player)) || ("ACE_Kestrel4500" in (vestItems ACE_player)))}) exitWith {
GVAR(Overlay) = false;
@ -55,6 +53,7 @@ GVAR(Overlay) = true;
if (diag_tickTime > GVAR(updateTimer)) then {
GVAR(updateTimer) = diag_tickTime + 1;
private ["_outputData"];
_outputData = [] call FUNC(generateOutputData);
3 cutRsc ["RscKestrel4500", "PLAIN", 1, false];

View File

@ -14,7 +14,7 @@
*/
#include "script_component.hpp"
private ["_playerDir", "_textTop", "_textCenterBig", "_textCenterLine1Left", "_textCenterLine2Left", "_textCenterLine3Left", "_textCenterLine1Right", "_textCenterLine2Right", "_textCenterLine3Right", "_textInfoLine1", "_textInfoLine2", "_temperature", "_humidity", "_windSpeed", "_windDir", "_newWindSpeed", "_windSource", "_height"];
private ["_playerDir", "_textTop", "_textCenterBig", "_textCenterLine1Left", "_textCenterLine2Left", "_textCenterLine3Left", "_textCenterLine1Right", "_textCenterLine2Right", "_textCenterLine3Right", "_textInfoLine1", "_textInfoLine2", "_temperature", "_humidity", "_windSpeed", "_windDir"];
[] call FUNC(collectData);

View File

@ -53,4 +53,4 @@ _structuredOutputText = _structuredOutputText + format ["<img align='center' siz
// } forEach (magazinesAmmoFull ACE_player);
// _structuredOutputText = _structuredOutputText + format [("<t align='center'>" + (localize "STR_ACE_MagazineRepack_RepackedMagazinesCount") + "</t>"), _fullMags, _partialMags];
[parseText _structuredOutputText] call EFUNC(common,displayTextStructured);
[parseText _structuredOutputText, 2] call EFUNC(common,displayTextStructured);

View File

@ -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

View File

@ -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);
@ -70,11 +71,18 @@ class ACE_Head {
statement = QUOTE([ARR_4(_player, _target, 'head', 'CheckResponse')] call DFUNC(treatment));
EXCEPTIONS
};
class Diagnose: CheckPulse {
displayName = "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);
@ -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);

View File

@ -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);

View File

@ -71,14 +71,14 @@ class ACE_Medical_Actions {
itemConsumed = 1;
litter[] = {};
};
class CheckPulse: Bandage {
displayName = "";
displayNameProgress = "";
class Diagnose: Bandage {
displayName = "Diagnose";
displayNameProgress = "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 {

View File

@ -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);

View File

@ -0,0 +1,41 @@
/*
* Author: Glowbal
* Action for diagnosing in basic medical
*
* Arguments:
* 0: The medic <OBJECT>
* 1: The patient <OBJECT>
*
* Return Value:
* NONE
*
* Public: No
*/
#include "script_component.hpp"
private ["_caller","_target","_title","_content"];
_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), false]) then {
_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);

View File

@ -14,6 +14,8 @@
#include "script_component.hpp"
// Exit for basic medical
if (GVAR(level) < 2) exitWith {};
private ["_target", "_show", "_selectionN"];
_target = _this select 0;
_show = if (count _this > 1) then {_this select 1} else {true};

View File

@ -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 <OBJECT>
* 1: The Diagnosing Unit <OBJECT>
* 2: Selection Number <NUMBER>
* 3: The action to modify <OBJECT>
*
* 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;

View File

@ -5,11 +5,13 @@
<English>Litter Simulation Detail</English>
<Polish>Detale zużytych medykamentów</Polish>
<Spanish>Detalle de simulación de basura</Spanish>
<Russian>Количество мусора от медицины</Russian>
</Key>
<Key ID="STR_ACE_Medical_litterSimulationDetail_Desc">
<English>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.</English>
<Polish>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.</Polish>
<Spanish>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.</Spanish>
<Russian>Устанавливает количество мусора, который появляется после использования мед. препаратов. Большое количество мусора может уменьшить производительность, поэтому данная настройка локальна для клиента.</Russian>
</Key>
<Key ID="STR_ACE_Medical_Inject_Atropine">
<English>Inject Atropine</English>
@ -1322,6 +1324,28 @@
<Hungarian>Megnézted %1-t</Hungarian>
<Italian>Hai controllato %1</Italian>
</Key>
<Key ID="STR_ACE_MEDICAL_diagnoseMessage">
<English>Patient %1&lt;br/&gt;is %2.&lt;br/&gt;%3.&lt;br/&gt;%4</English>
</Key>
<Key ID="STR_ACE_MEDICAL_diagnoseAlive">
<English>alive</English>
</Key>
<Key ID="STR_ACE_MEDICAL_diagnoseDead">
<English>dead</English>
</Key>
<Key ID="STR_ACE_MEDICAL_lostBlood">
<English>He's lost some blood</English>
</Key>
<Key ID="STR_ACE_MEDICAL_noBloodloss">
<English>He hasn't lost blood</English>
</Key>
<Key ID="STR_ACE_MEDICAL_inPain">
<English>He is in pain</English>
</Key>
<Key ID="STR_ACE_MEDICAL_noPain">
<English>He is not in pain</English>
</Key>
<Key ID="STR_ACE_MEDICAL_BANDAGED">
<English>Bandaged</English>
<French>Bandé</French>
@ -1636,4 +1660,4 @@
<French>Aberration chromatique</French>
</Key>
</Package>
</Project>
</Project>

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
z\ace\Addons\mk6mortar

View File

@ -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));
};
};
};

View File

@ -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 = "";
};
};
};

View File

@ -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;
};
};
};

View File

@ -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)

View File

@ -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)";
};
};
};
};
};

View File

@ -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";
};
};
};

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,5 @@
#include "script_component.hpp"
if (!hasInterface) exitWith {};
["playerVehicleChanged", {_this call FUNC(handlePlayerVehicleChanged);}] call EFUNC(common,addEventHandler);

View File

@ -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;

View File

@ -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;
};
};

View File

@ -0,0 +1,87 @@
/*
* Author: PabstMirror
* DEV function to build mortar tables, very cpu intensive (never used durring normal gameplay)
*
* Arguments:
* 0: Muzzle Velocity <NUMBER>
* 1: Air Friction <NUMBER>
*
* Return Value:
* <Data in clipboard>
*
* 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";

View File

@ -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)

View File

@ -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]

View File

@ -0,0 +1,55 @@
/*
* Author: PabstMirror
* DEV to find a firing solution for a given range
*
* Arguments:
* 0: Range to Hit (Meters)<NUMBER>
* 1: Height To Hit (Meters)<NUMBER>
* 2: Muzzle Velocity (M/S)<NUMBER>
* 3: Air Friction <NUMBER>
* 4: Time Step (seconds) (eg 1/50 will simulate 50 cycles per second) <NUMBER>
*
* 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)]

View File

@ -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) <NUMBER>
* 1: Muzzle Velocity (m/s) <NUMBER>
* 2: Air Friction <NUMBER>
* 3: Tempeture (degres celcius) <NUMBER>
* 4: Relative Air Denisty <NUMBER>
* 5: Tail Wind (m/s) <NUMBER>
* 6: Cross Wind (m/s) <NUMBER>
* 7: Height Of Target (M) <NUMBER>
* 8: Time Step (fraction of a second) <NUMBER>
*
* Return Value:
* <ARRAY> [Distance Traveled<NUMBER>, Shot Time<NUMBER>, Offset (degrees)<NUMBER>]
*
* 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]

View File

@ -0,0 +1,89 @@
/*
* Author: PabstMirror
* Called when the mortar is fired.
*
* Arguments:
* 0: mortar - Object the event handler is assigned to <OBJECT>
* 1: weapon - Fired weapon <STRING>
* 2: muzzle - Muzzle that was used <STRING>
* 3: mode - Current mode of the fired weapon <STRING>
* 4: ammo - Ammo used <STRING>
* 5: magazine - magazine name which was used <STRING>
* 6: projectile - Object of the projectile that was shot <OBJECT>
*
* 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;

View File

@ -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 <OBJECT>
* 1: New Vehicle <OBJECT>
*
* 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 ["<t size='0.8'>%1: %2 <img image='%3'/></t>", (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;

View File

@ -0,0 +1,27 @@
/*
* Author: PabstMirror
* Loads settings from the module.
*
* Arguments:
* 0: The Module Logic Object <OBJECT>
* 1: synced objects <ARRAY>
* 2: Activated <BOOL>
*
* 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);

View File

@ -0,0 +1,21 @@
/*
* Author: PabstMirror
* Can player open 82mm rangetable.
*
* Arguments:
* 0: Vehicle <OBJECT>
* 1: Player <OBJECT>
*
* Return Value:
* Can Open <BOOL>
*
* Example:
* [bob, bob] call ace_mk6mortar_fnc_rangeTableCanUse
*
* Public: No
*/
#include "script_component.hpp"
PARAMS_2(_vehicle,_player);
"ACE_RangeTable_82mm" in (items _player);

View File

@ -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;

View File

@ -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 ["", "", "", "", "", "", "", "", "", "", ""];

View File

@ -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 <NUMBER>
* 1: Air Friction <NUMBER>
*
* Return Value:
* <ARRAY>
*
* 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");
[]
};
};

View File

@ -0,0 +1,24 @@
/*
* Author: PabstMirror
* Toggles the mortart to show mils or degrees
*
* Arguments:
* 0: Vehicle <OBJECT>
* 1: Player <OBJECT>
*
* 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)];

View File

@ -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;

View File

@ -0,0 +1 @@
#include "\z\ace\addons\mk6mortar\script_component.hpp"

View File

@ -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

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Edited with tabler - 2015-04-06 -->
<Project name="ACE">
<Package name="mk6mortar">
<Key ID="STR_ACE_MK6MORTAR_rangetable_name">
<English>82mm Rangetable</English>
</Key>
<Key ID="STR_ACE_MK6MORTAR_rangetable_description">
<English>Range Table for the MK6 82mm Mortar</English>
</Key>
<Key ID="STR_ACE_MK6MORTAR_rangetable_action">
<English>Open 82mm Rangetable</English>
</Key>
<Key ID="STR_ACE_MK6MORTAR_rangetable_charge">
<English>Charge</English>
</Key>
</Package>
</Project>

View File

@ -3,6 +3,8 @@
ADDON = false;
PREP(moduleInit);
PREP(bi_moduleProjectile);
GVAR(moduleInitCollection) = [];
ADDON = true;

View File

@ -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"

View File

@ -0,0 +1,191 @@
/*
* Author: Bohemia Interactive
* Module function for spawning projectiles
* Used by Curator artillery modules etc
*
* Arguments:
* 0: The logic object <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;
};
};

View File

@ -519,7 +519,7 @@
<English>Punisher (GMG)</English>
<German>Punisher (GMW)</German>
<Spanish>Punisher (GMG)</Spanish>
<Polish>Punisher (CKM)</Polish>
<Polish>Punisher (GMG)</Polish>
<Czech>Punisher (granátomet)</Czech>
<French>Punisher (GMG)</French>
<Russian>Kаратель (Гранатомет)</Russian>
@ -1135,7 +1135,7 @@
<English>Mini-Spike (AT)</English>
<German>Mini-Spike (PALR)</German>
<Czech>Mini-Spike (PT)</Czech>
<Polish>Mini-Spike (AA)</Polish>
<Polish>Mini-Spike (AT)</Polish>
<French>Mini-Spike (AT)</French>
<Hungarian>Mini-Spike (Tankelhárító)</Hungarian>
<Spanish>Mini-Spike (AT)</Spanish>

View File

@ -1,6 +1,5 @@
class Extended_PreInit_EventHandlers {
class ADDON {
clientInit = QUOTE(call COMPILE_FILE(XEH_preClientInit));
init = QUOTE(call COMPILE_FILE(XEH_preInit));
};
};

View File

@ -7,6 +7,22 @@ class CfgWorlds {
ACE_TempNight[] = {4, 4, 6, 8, 13, 17, 20, 20, 16, 12, 8, 6};
// Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Limnos,Greece
ACE_Humidity[] = {78, 77, 78, 74, 71, 60, 59, 61, 65, 72, 79, 80};
// Source: https://weatherspark.com/averages/32194/Lemnos-Limnos-North-Aegean-Islands-Greece
ACE_WindSpeedMax[] = {{8.8, 5.5}, {8.8, 5}, {8.6, 4.8}, {7.6, 3.4}, {7.0, 3.0}, {7.1, 3.0}, {7.5, 3.1}, {8.0, 3.2}, {7.6, 3.5}, {7.8, 4.6}, {7.9, 5.0}, {8.2, 5.5}};
ACE_WindSpeedMean[] = {4.8, 4.9, 4.6, 4.1, 3.5, 3.5, 4.3, 4.4, 4.1, 4.5, 4.5, 5.0};
ACE_WindSpeedMin[] = {{0.2, 5.0}, {0.1, 5.0}, {0.2, 4.3}, {0.0, 3.0}, {0.0, 2.1}, {0.0, 2.0}, {0.1, 3.1}, {0.3, 3.1}, {0.0, 3.6}, {0.0, 4.2}, {0.1, 5.0}, {0.2, 5.5}};
ACE_WindDirectionProbabilities[] = {{0.06, 0.32, 0.05, 0.04, 0.15, 0.06, 0.02, 0.02}, // January
{0.08, 0.32, 0.04, 0.04, 0.18, 0.06, 0.02, 0.02}, // February
{0.09, 0.30, 0.04, 0.04, 0.20, 0.06, 0.02, 0.03}, // March
{0.10, 0.25, 0.03, 0.04, 0.22, 0.06, 0.02, 0.04}, // April
{0.18, 0.25, 0.03, 0.04, 0.18, 0.04, 0.01, 0.05}, // May
{0.25, 0.25, 0.03, 0.03, 0.15, 0.03, 0.00, 0.08}, // June
{0.32, 0.30, 0.02, 0.02, 0.10, 0.01, 0.00, 0.09}, // July
{0.28, 0.35, 0.02, 0.01, 0.08, 0.01, 0.00, 0.08}, // August
{0.20, 0.37, 0.03, 0.01, 0.11, 0.01, 0.01, 0.05}, // September
{0.10, 0.39, 0.04, 0.02, 0.15, 0.02, 0.01, 0.03}, // October
{0.08, 0.38, 0.06, 0.04, 0.19, 0.03, 0.02, 0.02}, // November
{0.06, 0.37, 0.05, 0.03, 0.18, 0.04, 0.02, 0.02}};// December
};
class Altis: CAWorld {
@ -15,5 +31,21 @@ class CfgWorlds {
ACE_TempNight[] = {4, 4, 6, 8, 13, 17, 20, 20, 16, 12, 8, 6};
// Source: http://www.weather-and-climate.com/average-monthly-Humidity-perc,Limnos,Greece
ACE_Humidity[] = {78, 77, 78, 74, 71, 60, 59, 61, 65, 72, 79, 80};
// Source: https://weatherspark.com/averages/32194/Lemnos-Limnos-North-Aegean-Islands-Greece
ACE_WindSpeedMax[] = {{8.8, 5.5}, {8.8, 5}, {8.6, 4.8}, {7.6, 3.4}, {7.0, 3.0}, {7.1, 3.0}, {7.5, 3.1}, {8.0, 3.2}, {7.6, 3.5}, {7.8, 4.6}, {7.9, 5.0}, {8.2, 5.5}};
ACE_WindSpeedMean[] = {4.8, 4.9, 4.6, 4.1, 3.5, 3.5, 4.3, 4.4, 4.1, 4.5, 4.5, 5.0};
ACE_WindSpeedMin[] = {{0.2, 5.0}, {0.1, 5.0}, {0.2, 4.3}, {0.0, 3.0}, {0.0, 2.1}, {0.0, 2.0}, {0.1, 3.1}, {0.3, 3.1}, {0.0, 3.6}, {0.0, 4.2}, {0.1, 5.0}, {0.2, 5.5}};
ACE_WindDirectionProbabilities[] = {{0.06, 0.32, 0.05, 0.04, 0.15, 0.06, 0.02, 0.02}, // January
{0.08, 0.32, 0.04, 0.04, 0.18, 0.06, 0.02, 0.02}, // February
{0.09, 0.30, 0.04, 0.04, 0.20, 0.06, 0.02, 0.03}, // March
{0.10, 0.25, 0.03, 0.04, 0.22, 0.06, 0.02, 0.04}, // April
{0.18, 0.25, 0.03, 0.04, 0.18, 0.04, 0.01, 0.05}, // May
{0.25, 0.25, 0.03, 0.03, 0.15, 0.03, 0.00, 0.08}, // June
{0.32, 0.30, 0.02, 0.02, 0.10, 0.01, 0.00, 0.09}, // July
{0.28, 0.35, 0.02, 0.01, 0.08, 0.01, 0.00, 0.08}, // August
{0.20, 0.37, 0.03, 0.01, 0.11, 0.01, 0.01, 0.05}, // September
{0.10, 0.39, 0.04, 0.02, 0.15, 0.02, 0.01, 0.03}, // October
{0.08, 0.38, 0.06, 0.04, 0.19, 0.03, 0.02, 0.02}, // November
{0.06, 0.37, 0.05, 0.03, 0.18, 0.04, 0.02, 0.02}};// December
};
};
};

View File

@ -1,43 +1,27 @@
#include "script_component.hpp"
// Rain variables
GVAR(enableRain) = true;
GVAR(rain_next_period) = -1;
GVAR(rain_period_count) = 0;
GVAR(rain_initial_rain) = 0;
if(overcast >= 0.7) then {
GVAR(rain_initial_rain) = (random ((overcast-0.7)/0.3));
};
GVAR(current_rain) = GVAR(rain_initial_rain);
GVAR(rain_current_range) = -1+(random 2);
GVAR(overcast_multiplier) = 1;
// Randomization
GVAR(temperatureShift) = 3 - random 6;
GVAR(badWeatherShift) = (random 1) ^ 2 * 10;
GVAR(humidityShift) = (5 - random 10) / 100;
// Wind Variables
ACE_wind = [0, 0, 0];
GVAR(wind_initial_dir) = (random 360);
GVAR(wind_initial_speed) = (overcast*5)+(random (overcast*5)) max 1;
GVAR(wind_mean_speed) = GVAR(wind_initial_speed);
GVAR(wind_mean_dir) = GVAR(wind_initial_dir);
GVAR(wind_current_speed) = GVAR(wind_initial_speed);
GVAR(wind_current_dir) = GVAR(wind_initial_dir);
GVAR(wind_current_range_speed) = -1+(random 2);
GVAR(wind_current_range_dir) = -1+(random 2);
GVAR(wind_next_period) = -1; //ceil((2+random(5))/(GVAR(overcast_multiplier)/10));
GVAR(wind_next_major_period) = -1;
GVAR(wind_period_count) = 0;
GVAR(wind_major_period_count) = 0;
GVAR(wind_total_time) = 0;
GVAR(wind_period_start_time) = time;
call FUNC(getMapData);
GVAR(rain_period_start_time) = time;
"ACE_WIND_PARAMS" addPublicVariableEventHandler { GVAR(wind_period_start_time) = time; };
"ACE_RAIN_PARAMS" addPublicVariableEventHandler { GVAR(rain_period_start_time) = time; };
"ACE_MISC_PARAMS" addPublicVariableEventHandler {
if !(isServer) then {
30 setLightnings (ACE_MISC_PARAMS select 0);
30 setRainbow (ACE_MISC_PARAMS select 1);
30 setFog (ACE_MISC_PARAMS select 2);
if (!isServer) then {
if (GVAR(syncMisc)) then {
30 setLightnings (ACE_MISC_PARAMS select 0);
30 setRainbow (ACE_MISC_PARAMS select 1);
30 setFog (ACE_MISC_PARAMS select 2);
};
GVAR(temperatureShift) = (ACE_MISC_PARAMS select 3);
GVAR(badWeatherShift) = (ACE_MISC_PARAMS select 4);
GVAR(humidityShift) = (ACE_MISC_PARAMS select 5);
call FUNC(updateTemperature);
call FUNC(updateHumidity);
};
};

Some files were not shown because too many files have changed in this diff Show More