Merge branch 'release' into french

This commit is contained in:
KoffeinFlummi 2015-09-10 19:36:56 +02:00
commit 83aa2cc68c
1060 changed files with 20764 additions and 9478 deletions

View File

@ -1,4 +1,4 @@
# ACE 3 CONTRIBUTOR LIST # ACE3 CONTRIBUTOR LIST
# If you contributed, but are not listed here, contact me: # If you contributed, but are not listed here, contact me:
# koffeinflummi@gmail.com # koffeinflummi@gmail.com
# #
@ -14,6 +14,7 @@ Garth "L-H" de Wet <garthofhearts@gmail.com>
Giallustio Giallustio
Glowbal Glowbal
Janus Janus
jokoho482 <jokoho482@gmail.com>`
Kieran Kieran
NouberNou NouberNou
PabstMirror <pabstmirror@gmail.com> PabstMirror <pabstmirror@gmail.com>
@ -50,6 +51,7 @@ Coren <coren4@gmail.com>
Crusty Crusty
Dharma Bellamkonda <dharma.bellamkonda@gmail.com> Dharma Bellamkonda <dharma.bellamkonda@gmail.com>
Dimaslg <dimaslg@telecable.es> Dimaslg <dimaslg@telecable.es>
Drill <drill87@gmail.com>
eRazeri eRazeri
evromalarkey <evromalarkey@gmail.com> evromalarkey <evromalarkey@gmail.com>
F3 Project <alanr@ferstaberinde.com> F3 Project <alanr@ferstaberinde.com>
@ -68,8 +70,7 @@ Hamburger SV
Harakhti <shadowdragonphd@gmail.com> Harakhti <shadowdragonphd@gmail.com>
havena <silveredenis@gmail.com> havena <silveredenis@gmail.com>
Hawkins Hawkins
Head Head <brobergsebastian@gmail.com>
jokoho482 <jokoho482@gmail.com>`
Jonpas <jonpas33@gmail.com> Jonpas <jonpas33@gmail.com>
Karneck <dschultz26@hotmail.com> Karneck <dschultz26@hotmail.com>
Kavinsky <nmunozfernandez@gmail.com> Kavinsky <nmunozfernandez@gmail.com>
@ -81,6 +82,7 @@ Macusercom <macusercom@gmail.com>
MarcBook MarcBook
meat <p.humberdroz@gmail.com> meat <p.humberdroz@gmail.com>
Michail Nikolaev Michail Nikolaev
MikeMatrix <m.braun92@gmail.com>
nic547 <nic547@outlook.com> nic547 <nic547@outlook.com>
nikolauska <nikolauska1@gmail.com> nikolauska <nikolauska1@gmail.com>
nomisum <nomisum@gmail.com> nomisum <nomisum@gmail.com>
@ -106,4 +108,3 @@ Valentin Torikian <valentin.torikian@gmail.com>
VyMajoris(W-Cephei)<vycanismajoriscsa@gmail.com> VyMajoris(W-Cephei)<vycanismajoriscsa@gmail.com>
Winter <simon@agius-muscat.net> Winter <simon@agius-muscat.net>
zGuba zGuba
Drill <drill87@gmail.com>

View File

@ -1,83 +1,80 @@
<p align="center"> <p align="center">
<img src="https://github.com/acemod/ACE3/blob/master/extras/assets/logo/black/ACE3-Logo.jpg" <img src="https://github.com/acemod/ACE3/blob/master/extras/assets/logo/black/ACE3-Logo.jpg" width="480">
height="112">
</p> </p>
<p align="center"> <p align="center">
<a href="https://github.com/acemod/ACE3/releases"> <a href="https://github.com/acemod/ACE3/releases">
<img src="https://img.shields.io/badge/Version-3.2.0-blue.svg" <img src="https://img.shields.io/badge/Version-3.3.0-blue.svg" alt="ACE3 Version">
alt="ACE version">
</a> </a>
<a href="https://github.com/acemod/ACE3/releases/download/v3.2.0/ace3_3.2.0.zip"> <a href="https://github.com/acemod/ACE3/releases/download/v3.3.0/ace3_3.3.0.zip">
<img src="http://img.shields.io/badge/Download-56.5_MB-green.svg" <img src="http://img.shields.io/badge/Download-56.5_MB-green.svg" alt="ACE3 Download">
alt="ACE download">
</a> </a>
<a href="https://github.com/acemod/ACE3/issues"> <a href="https://github.com/acemod/ACE3/issues">
<img src="http://img.shields.io/github/issues-raw/acemod/ACE3.svg?label=Issues" <img src="http://img.shields.io/github/issues-raw/acemod/ACE3.svg?label=Issues" alt="ACE3 Issues">
alt="ACE issues">
</a> </a>
<a href="http://forums.bistudio.com/showthread.php?191716-ACE3-A-collaborative-merger-between-AGM-CSE-and-ACE&p=2935435&viewfull=1#post2935435"> <a href="https://forums.bistudio.com/topic/181341-ace3-a-collaborative-merger-between-agm-cse-and-ace/?p=2859670">
<img src="https://img.shields.io/badge/BIF-Thread-lightgrey.svg" <img src="https://img.shields.io/badge/BIF-Thread-lightgrey.svg" alt="BIF Thread">
alt="BIF thread">
</a> </a>
<a href="https://github.com/acemod/ACE3/blob/master/LICENSE"> <a href="https://github.com/acemod/ACE3/blob/master/LICENSE">
<img src="http://img.shields.io/badge/License-GPLv2-red.svg" <img src="http://img.shields.io/badge/License-GPLv2-red.svg" alt="ACE3 License">
alt="ACE license"> </a>
<a href="http://slackin.koffeinflummi.de">
<img src="http://slackin.koffeinflummi.de/badge.svg" alt="ACE3 Slack">
</a> </a>
</p> </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> <p align="center"><sup><strong>Requires the latest version of <a href="https://github.com/CBATeam/CBA_A3/releases">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. **ACE3** is a joint effort by the teams behind **ACE2**, **AGM** and **CSE** to improve the realism and authenticity of Arma 3.
The project is entirely **open-source** and all contributions are welcome. Feel free to maintain your own custom version, so long as the changes you make are open to the public in accordance with the GNU General Public License ([GPLv2](https://github.com/acemod/ACE3/blob/master/LICENSE)). The project is entirely **open-source** and all contributions are welcome. Feel free to maintain your own custom version, so long as the changes you make are open to the public in accordance with the GNU General Public License ([GPLv2](https://github.com/acemod/ACE3/blob/master/LICENSE)).
The mod is **built modularly**, so almost any included PBO can be easily removed from the configuration. This way, a team can maintain its own tailored version of ACE by simply excluding any components they don't need, or those possibly in conflict with other add-ons. Modules themselves, e.g. the medical system, also include various customization options, allowing mission designers to tweak the overall experience. The mod is **built modularly**, so almost any included PBO can be easily removed from the configuration. This way, a team can maintain its own tailored version of ACE3 by simply excluding any components they don't need, or those possibly in conflict with other mods. Modules themselves, e.g. the medical system, also include various customization options, allowing mission designers to tweak the overall experience.
### Core features ### Core features
* Brand new 3D interaction/action system - Brand new 3D interaction/action system
* Performance and reliability framework - Performance and reliability framework
* Focus on modularity and customization - Focus on modularity and customization
* New flexible client and server settings & configuration - New flexible client and server settings & configuration
* Improved medical system with various levels (basic/advanced) focus on gameplay/realism - Improved medical system with various levels (basic/advanced) focus on gameplay/realism
* Proper & consistent network-synced weather - Proper & consistent network-synced weather
* Wind and weather-based ballistics - Wind and weather-based ballistics
* Captivity system - Captivity system
* Explosives system, including different trigger types - Explosives system, including different trigger types
* Map screen improvements marker placement and map tools - Map screen improvements marker placement and map tools
* Advanced missile guidance and laser designation - Advanced missile guidance and laser designation
#### Additional features #### Additional features
* Carrying and dragging - Carrying and dragging
* Realistic names for vehicles and weapons - Realistic names for vehicles and weapons
* A fire control system (FCS) for armored vehicles and helicopters - A fire control system (FCS) for armored vehicles and helicopters
* Realistic ballistics/FCS calculated in C/C++ extensions - Realistic ballistics/FCS calculated in C/C++ extensions
* Backblast area and overpressure simulation - Backblast area and overpressure simulation
* Disposable launchers - Disposable launchers
* Realistic G-forces - Realistic G-forces
* Vehicle locking - Vehicle locking
* Realistic night and thermal vision modes - Realistic night and thermal vision modes
* Magazine repacking - Magazine repacking
* Realistic weapon overheating mechanic - Realistic weapon overheating mechanic
* Combat deafness (temporary loss of hearing) simulation - Combat deafness (temporary loss of hearing) simulation
* Improved ragdoll physics - Improved ragdoll physics
* Improved interactions for AARs and ammo bearers - Improved interactions for AARs and ammo bearers
* Adjustable sniper scopes - Adjustable sniper scopes
* No idle animation with lowered weapon - No idle animation with lowered weapon
* No talking player avatar - No talking player avatar
* Jumping over obstacles, climbing over walls and cutting down fences - Jumping over obstacles, climbing over walls and cutting down fences
* Vector, MicroDAGR and Kestrel devices<br> - Vector, MicroDAGR and Kestrel devices<br>
***and much more...*** ***and much more...***
### Guides & how-tos ### Guides & how-tos
If you installed ACE3 but have trouble understanding how it all works, or where to start, read this first: If you installed ACE3 but have trouble understanding how it all works, or where to start, read this first:
* [Getting started](http://ace3mod.com/wiki/user/getting-started.html) - [Getting started](http://ace3mod.com/wiki/user/getting-started.html)
#### Contributing #### Contributing
You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. To contribute something to ACE, simply fork this repository and submit your pull requests for review by other collaborators. Remember to add yourself to the author array of any PBO you will be editing and the [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) file; including a valid email address. You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. To contribute something to ACE3, simply fork this repository and submit your pull requests for review by other collaborators. Remember to add yourself to the author array of any PBO you will be editing and the [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) file; including a valid email address.
Please, use our [Issue Tracker](https://github.com/acemod/ACE3/issues) to report a bug, propose a feature, or suggest changes to the existing ones. See also: 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 report an issue](http://ace3mod.com/wiki/user/how-to-report-an-issue.html)
* [How to make a feature request](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html) - [How to make a feature request](http://ace3mod.com/wiki/user/how-to-make-a-feature-request.html)
#### Testing & building #### 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: To help us test the latest development changes, download our master branch ([directly](https://github.com/acemod/ACE3/archive/master.zip), or [with git](https://help.github.com/articles/fetching-a-remote/)), then assemble a test build:
* [Setting up the development environment](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) step-by-step instructions on how to properly setup and build a version of ACE for testing purposes. - [Setting up the development environment](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html) step-by-step instructions on how to properly setup and build a version of ACE3 for testing purposes.

View File

@ -1,31 +1,31 @@
class ACE_Settings { class ACE_Settings {
class GVAR(enabled) { class GVAR(enabled) {
displayName = "Advanced Ballistics"; displayName = CSTRING(enabled_DisplayName);
description = "Enables advanced ballistics"; description = CSTRING(enabled_Description);
typeName = "BOOL"; typeName = "BOOL";
value = 0; value = 0;
}; };
class GVAR(simulateForSnipers) { class GVAR(simulateForSnipers) {
displayName = "Enabled For Snipers"; displayName = CSTRING(simulateForSnipers_DisplayName);
description = "Enables advanced ballistics for non local snipers (when using high power optics)"; description = CSTRING(simulateForSnipers_Description);
typeName = "BOOL"; typeName = "BOOL";
value = 1; value = 1;
}; };
class GVAR(simulateForGroupMembers) { class GVAR(simulateForGroupMembers) {
displayName = "Enabled For Group Members"; displayName = CSTRING(simulateForGroupMembers_DisplayName);
description = "Enables advanced ballistics for non local group members"; description = CSTRING(simulateForGroupMembers_Description);
typeName = "BOOL"; typeName = "BOOL";
value = 0; value = 0;
}; };
class GVAR(simulateForEveryone) { class GVAR(simulateForEveryone) {
displayName = "Enabled For Everyone"; displayName = CSTRING(simulateForEveryone_DisplayName);
description = "Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer)"; description = CSTRING(simulateForEveryone_Description);
typeName = "BOOL"; typeName = "BOOL";
value = 0; value = 0;
}; };
class GVAR(disabledInFullAutoMode) { class GVAR(disabledInFullAutoMode) {
displayName = "Disabled In FullAuto Mode"; displayName = CSTRING(disabledInFullAutoMod_DisplayName);
description = "Disables advanced ballistics during full auto fire"; description = CSTRING(disabledInFullAutoMod_Description);
typeName = "BOOL"; typeName = "BOOL";
value = 0; value = 0;
}; };
@ -38,32 +38,32 @@ class ACE_Settings {
}; };
*/ */
class GVAR(ammoTemperatureEnabled) { class GVAR(ammoTemperatureEnabled) {
displayName = "Enable Ammo Temperature Simulation"; displayName = CSTRING(ammoTemperatureEnabled_DisplayName);
description = "Muzzle velocity varies with ammo temperature"; description = CSTRING(ammoTemperatureEnabled_Description);
typeName = "BOOL"; typeName = "BOOL";
value = 1; value = 1;
}; };
class GVAR(barrelLengthInfluenceEnabled) { class GVAR(barrelLengthInfluenceEnabled) {
displayName = "Enable Barrel Length Simulation"; displayName = CSTRING(barrelLengthInfluenceEnabled_DisplayName);
description = "Muzzle velocity varies with barrel length"; description = CSTRING(barrelLengthInfluenceEnabled_Description);
typeName = "BOOL"; typeName = "BOOL";
value = 1; value = 1;
}; };
class GVAR(bulletTraceEnabled) { class GVAR(bulletTraceEnabled) {
displayName = "Enable Bullet Trace Effect"; displayName = CSTRING(bulletTraceEnabled_DisplayName);
description = "Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics)"; description = CSTRING(bulletTraceEnabled_Description);
typeName = "BOOL"; typeName = "BOOL";
value = 1; value = 1;
}; };
class GVAR(simulationInterval) { class GVAR(simulationInterval) {
displayName = "Simulation Interval"; displayName = CSTRING(simulationInterval_DisplayName);
description = "Defines the interval between every calculation step"; description = CSTRING(simulationInterval_Description);
typeName = "SCALAR"; typeName = "SCALAR";
value = 0.0; value = 0.0;
}; };
class GVAR(simulationRadius) { class GVAR(simulationRadius) {
displayName = "Simulation Radius"; displayName = CSTRING(simulationRadius_DisplayName);
description = "Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles"; description = CSTRING(simulationRadius_Description);
typeName = "SCALAR"; typeName = "SCALAR";
value = 3000; value = 3000;
}; };

View File

@ -3,8 +3,9 @@ ace_advanced_ballistics
The Advanced Ballistics module introduces advanced external- and internal ballistics to the game. The Advanced Ballistics module introduces advanced external- and internal ballistics to the game.
## Maintainers ## Maintainers
The people responsible for merging changes to this component or answering potential questions. The people responsible for merging changes to this component or answering potential questions.
- [Ruthberg] (http://github.com/Ulteq) - [Ruthberg](http://github.com/Ulteq)

View File

@ -6,9 +6,8 @@ GVAR(currentbulletID) = -1;
GVAR(Protractor) = false; GVAR(Protractor) = false;
GVAR(ProtractorStart) = ACE_time; GVAR(ProtractorStart) = ACE_time;
GVAR(allBullets) = [];
GVAR(currentGrid) = 0; GVAR(currentGrid) = 0;
GVAR(initMessageEnabled) = false;
GVAR(extensionAvailable) = true; GVAR(extensionAvailable) = true;
/* @TODO: Remove this until versioning is in sync with cmake/build versioning /* @TODO: Remove this until versioning is in sync with cmake/build versioning

View File

@ -13,5 +13,5 @@ PREP(initializeTerrainExtension);
PREP(initModuleSettings); PREP(initModuleSettings);
PREP(readAmmoDataFromConfig); PREP(readAmmoDataFromConfig);
PREP(readWeaponDataFromConfig); PREP(readWeaponDataFromConfig);
PREP(handleFirePFH);
ADDON = true; ADDON = true;

View File

@ -8,29 +8,29 @@
* 1: temperature - degrees celcius <NUMBER> * 1: temperature - degrees celcius <NUMBER>
* *
* Return Value: * Return Value:
* 0: muzzle velocity shift - m/s <NUMBER> * muzzle velocity shift - m/s <NUMBER>
* *
* Return value: * Public: No
* None
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_muzzleVelocityShiftTable", "_temperature", "_muzzleVelocityShift", "_temperatureIndexA", "_temperatureIndexB", "_temperatureRatio"]; private ["_muzzleVelocityShiftTableUpperLimit", "_temperatureIndexFunction",
_muzzleVelocityShiftTable = _this select 0; "_temperatureIndexA", "_temperatureIndexB", "_interpolationRatio"];
_temperature = _this select 1; params["_muzzleVelocityShiftTable", "_temperature"];
if (count _muzzleVelocityShiftTable != 11) exitWith { 0 }; // Check if muzzleVelocityShiftTable is Larger Than 11 Entrys
_muzzleVelocityShiftTableUpperLimit = _muzzleVelocityShiftTable select 10;
if (isNil "_muzzleVelocityShiftTableUpperLimit") exitWith { 0 };
_temperatureIndexA = floor((_temperature + 15) / 5); // Find exact data index required for given temperature
_temperatureIndexA = 0 max _temperatureIndexA; _temperatureIndexFunction = (_temperature + 15) / 5;
_temperatureIndexA = _temperatureIndexA min 10;
_temperatureIndexB = ceil((_temperature + 15) / 5); // lower and upper data index used for interpolation
_temperatureIndexB = 0 max _temperatureIndexB; _temperatureIndexA = (0 max (floor(_temperatureIndexFunction))) min 10;
_temperatureIndexB = _temperatureIndexB min 10; _temperatureIndexB = (0 max (ceil(_temperatureIndexFunction))) min 10;
_temperatureRatio = ((_temperature + 15) / 5) - floor((_temperature + 15) / 5); // Interpolation ratio
_interpolationRatio = _temperatureIndexFunction - floor(_temperatureIndexFunction);
_muzzleVelocityShift = (_muzzleVelocityShiftTable select _temperatureIndexA) * (1 - _temperatureRatio) + (_muzzleVelocityShiftTable select _temperatureIndexB) * _temperatureRatio; // Interpolation
(_muzzleVelocityShiftTable select _temperatureIndexA) * (1 - _interpolationRatio) + (_muzzleVelocityShiftTable select _temperatureIndexB) * _interpolationRatio // Return
_muzzleVelocityShift

View File

@ -17,12 +17,9 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_ballisticCoefficient", "_temperature", "_pressure", "_relativeHumidity", "_atmosphereModel", "_airDensity"]; private "_airDensity";
_ballisticCoefficient = _this select 0;
_temperature = _this select 1; // in C params ["_ballisticCoefficient", "_temperature"/*in C*/, "_pressure"/*in hPa*/, "_relativeHumidity"/*as ratio 0-1*/, "_atmosphereModel"/*"ICAO" or "ASM"*/];
_pressure = _this select 2; // in hPa
_relativeHumidity = _this select 3; // as ratio 0-1
_atmosphereModel = _this select 4; // "ICAO" or "ASM"
_airDensity = [_temperature, _pressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity); _airDensity = [_temperature, _pressure, _relativeHumidity] call EFUNC(weather,calculateAirDensity);

View File

@ -1,5 +1,5 @@
/* /*
* Author: Ruthberg * Author: Ruthberg, MikeMatrix, joko // Jonas
* *
* Calculates the muzzle velocity shift caused by different barrel lengths * Calculates the muzzle velocity shift caused by different barrel lengths
* *
@ -10,46 +10,61 @@
* 3: muzzle velocity - m/s <NUMBER> * 3: muzzle velocity - m/s <NUMBER>
* *
* Return Value: * Return Value:
* 0: muzzle velocity shift - m/s <NUMBER> * muzzle velocity shift - m/s <NUMBER>
* *
* Return value: * Public: No
* None
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_barrelLength", "_muzzleVelocityTable", "_barrelLengthTable", "_muzzleVelocity", "_lowerIndex", "_upperIndex", "_barrelLengthRatio", "_muzzleVelocityNew"]; scopeName "main";
_barrelLength = _this select 0;
_muzzleVelocityTable = _this select 1;
_barrelLengthTable = _this select 2;
_muzzleVelocity = _this select 3;
private ["_muzzleVelocityTableCount", "_barrelLengthTableCount", "_lowerDataIndex",
"_upperDataIndex", "_lowerBarrelLength", "_upperBarrelLength", "_lowerMuzzleVelocity",
"_upperMuzzleVelocity", "_interpolationRatio"];
params ["_barrelLength", "_muzzleVelocityTable", "_barrelLengthTable", "_muzzleVelocity"];
// If barrel length is not defined, then there is no point in calculating muzzle velocity
if (_barrelLength == 0) exitWith { 0 }; if (_barrelLength == 0) exitWith { 0 };
if (count _muzzleVelocityTable != count _barrelLengthTable) exitWith { 0 };
if (count _muzzleVelocityTable == 0 || count _barrelLengthTable == 0) exitWith { 0 };
if (count _muzzleVelocityTable == 1) exitWith { (_muzzleVelocityTable select 0) - _muzzleVelocity };
_lowerIndex = 0; _muzzleVelocityTableCount = count _muzzleVelocityTable;
_upperIndex = (count _barrelLengthTable) - 1; _barrelLengthTableCount = count _barrelLengthTable;
if (_barrelLength <= (_barrelLengthTable select _lowerIndex)) exitWith { (_muzzleVelocityTable select _lowerIndex) - _muzzleVelocity }; // Exit if tables are different sizes, have no elements or have only one element
if (_barrelLength >= (_barrelLengthTable select _upperIndex)) exitWith { (_muzzleVelocityTable select _upperIndex) - _muzzleVelocity }; if (_muzzleVelocityTableCount != _barrelLengthTableCount || _muzzleVelocityTableCount == 0 || _barrelLengthTableCount == 0) exitWith { 0 };
if (_muzzleVelocityTableCount == 1) exitWith { (_muzzleVelocityTable select 0) - _muzzleVelocity };
for "_i" from 0 to (count _barrelLengthTable) - 1 do { // If we have the precise barrel length value, return result immediately
if (_barrelLength >= _barrelLengthTable select _i) then { if (_barrelLength in _barrelLengthTable) exitWith {
_lowerIndex = _i; (_muzzleVelocityTable select (_barrelLengthTable find _barrelLength)) - _muzzleVelocity
}; };
};
for "_i" from (count _barrelLengthTable) - 1 to 0 step -1 do { // Limit values to lower and upper bound of data we have available
if (_barrelLength <= _barrelLengthTable select _i) then { if (_barrelLength <= (_barrelLengthTable select 0)) exitWith { (_muzzleVelocityTable select 0) - _muzzleVelocity };
_upperIndex = _i; if (_barrelLength >= (_barrelLengthTable select _barrelLengthTableCount - 1)) exitWith { (_muzzleVelocityTable select _barrelLengthTableCount - 1) - _muzzleVelocity };
// Find closest bordering values for barrel length
{
if (_barrelLength <= _x) then {
_upperDataIndex = _forEachIndex;
_lowerDataIndex = _upperDataIndex - 1;
breakTo "main";
}; };
} forEach _barrelLengthTable;
// Worst case scenario
if (isNil "_lowerDataIndex" || isNil "_upperDataIndex") exitWith {0};
_lowerBarrelLength = _barrelLengthTable select _lowerDataIndex;
_upperBarrelLength = _barrelLengthTable select _upperDataIndex;
_lowerMuzzleVelocity = _muzzleVelocityTable select _lowerDataIndex;
_upperMuzzleVelocity = _muzzleVelocityTable select _upperDataIndex;
// Calculate interpolation ratio
_interpolationRatio = if (abs (_lowerBarrelLength - _upperBarrelLength) > 0) then {
(_upperBarrelLength - _barrelLength) / (_upperBarrelLength - _lowerBarrelLength)
} else {
0
}; };
_barrelLengthRatio = 0; // Calculate interpolated muzzle velocity shift
if ((_barrelLengthTable select _upperIndex) - (_barrelLengthTable select _lowerIndex) > 0) then { (_lowerMuzzleVelocity + ((_upperMuzzleVelocity - _lowerMuzzleVelocity) * (1 - _interpolationRatio))) - _muzzleVelocity // Return
_barrelLengthRatio = ((_barrelLengthTable select _upperIndex) - _barrelLength) / ((_barrelLengthTable select _upperIndex) - (_barrelLengthTable select _lowerIndex));
};
_muzzleVelocityNew = (_muzzleVelocityTable select _lowerIndex) + ((_muzzleVelocityTable select _upperIndex) - (_muzzleVelocityTable select _lowerIndex)) * (1 - _barrelLengthRatio);
_muzzleVelocityNew - _muzzleVelocity

View File

@ -4,142 +4,129 @@
* Calculates the retardation of the bullet * Calculates the retardation of the bullet
* *
* Arguments: * Arguments:
* 0: drag model - 1-7 <integer> * 0: drag model - integer 1-7 <NUMBER>
* 1: drag coefficient - bc <NUMBER> * 1: drag coefficient - bc <NUMBER>
* 2: velocity - m/s <NUMBER> * 2: velocity - m/s <NUMBER>
* *
* Return Value: * Return Value:
* 0: retardation - m/(s^2) <NUMBER> * retardation - m/(s^2) <NUMBER>
* *
* Return value: * Public: No
* None
*/ */
#include "script_component.hpp" #include "script_component.hpp"
// Source: GNU Exterior Ballistics // Source: GNU Exterior Ballistics
private ["_dragModel", "_dragCoefficient", "_velocity", "_A", "_M", "_result"]; private ["_A", "_M"];
_dragModel = _this select 0; params ["_dragModel", "_dragCoefficient", "_velocity"];
_dragCoefficient = _this select 1; _velocity = _velocity * 3.2808399;
_velocity = (_this select 2) * 3.2808399;
_A = -1;
_M = -1;
_result = 0;
switch _dragModel do { switch _dragModel do {
case 1: case 1: {
{ call {
switch true do { if (_velocity > 4230) exitWith { _A = 0.0001477404177730177; _M = 1.9565; };
case (_velocity > 4230) : { _A = 0.0001477404177730177; _M = 1.9565; }; if (_velocity > 3680) exitWith { _A = 0.0001920339268755614; _M = 1.925; };
case (_velocity > 3680) : { _A = 0.0001920339268755614; _M = 1.925 ; }; if (_velocity > 3450) exitWith { _A = 0.0002894751026819746; _M = 1.875; };
case (_velocity > 3450) : { _A = 0.0002894751026819746; _M = 1.875 ; }; if (_velocity > 3295) exitWith { _A = 0.0004349905111115636; _M = 1.825; };
case (_velocity > 3295) : { _A = 0.0004349905111115636; _M = 1.825 ; }; if (_velocity > 3130) exitWith { _A = 0.0006520421871892662; _M = 1.775; };
case (_velocity > 3130) : { _A = 0.0006520421871892662; _M = 1.775 ; }; if (_velocity > 2960) exitWith { _A = 0.0009748073694078696; _M = 1.725; };
case (_velocity > 2960) : { _A = 0.0009748073694078696; _M = 1.725 ; }; if (_velocity > 2830) exitWith { _A = 0.001453721560187286; _M = 1.675; };
case (_velocity > 2830) : { _A = 0.001453721560187286; _M = 1.675 ; }; if (_velocity > 2680) exitWith { _A = 0.002162887202930376; _M = 1.625; };
case (_velocity > 2680) : { _A = 0.002162887202930376; _M = 1.625 ; }; if (_velocity > 2460) exitWith { _A = 0.003209559783129881; _M = 1.575; };
case (_velocity > 2460) : { _A = 0.003209559783129881; _M = 1.575 ; }; if (_velocity > 2225) exitWith { _A = 0.003904368218691249; _M = 1.55; };
case (_velocity > 2225) : { _A = 0.003904368218691249; _M = 1.55 ; }; if (_velocity > 2015) exitWith { _A = 0.003222942271262336; _M = 1.575; };
case (_velocity > 2015) : { _A = 0.003222942271262336; _M = 1.575 ; }; if (_velocity > 1890) exitWith { _A = 0.002203329542297809; _M = 1.625; };
case (_velocity > 1890) : { _A = 0.002203329542297809; _M = 1.625 ; }; if (_velocity > 1810) exitWith { _A = 0.001511001028891904; _M = 1.675; };
case (_velocity > 1810) : { _A = 0.001511001028891904; _M = 1.675 ; }; if (_velocity > 1730) exitWith { _A = 0.0008609957592468259; _M = 1.75; };
case (_velocity > 1730) : { _A = 0.0008609957592468259; _M = 1.75 ; }; if (_velocity > 1595) exitWith { _A = 0.0004086146797305117; _M = 1.85; };
case (_velocity > 1595) : { _A = 0.0004086146797305117; _M = 1.85 ; }; if (_velocity > 1520) exitWith { _A = 0.0001954473210037398; _M = 1.95; };
case (_velocity > 1520) : { _A = 0.0001954473210037398; _M = 1.95 ; }; if (_velocity > 1420) exitWith { _A = 0.00005431896266462351; _M = 2.125; };
case (_velocity > 1420) : { _A = 0.00005431896266462351; _M = 2.125 ; }; if (_velocity > 1360) exitWith { _A = 0.000008847742581674416; _M = 2.375; };
case (_velocity > 1360) : { _A = 0.000008847742581674416; _M = 2.375 ; }; if (_velocity > 1315) exitWith { _A = 0.000001456922328720298; _M = 2.625; };
case (_velocity > 1315) : { _A = 0.000001456922328720298; _M = 2.625 ; }; if (_velocity > 1280) exitWith { _A = 0.0000002419485191895565; _M = 2.875; };
case (_velocity > 1280) : { _A = 0.0000002419485191895565; _M = 2.875 ; }; if (_velocity > 1220) exitWith { _A = 0.00000001657956321067612; _M = 3.25; };
case (_velocity > 1220) : { _A = 0.00000001657956321067612; _M = 3.25 ; }; if (_velocity > 1185) exitWith { _A = 0.0000000004745469537157371; _M = 3.75; };
case (_velocity > 1185) : { _A = 0.0000000004745469537157371; _M = 3.75 ; }; if (_velocity > 1150) exitWith { _A = 0.00000000001379746590025088; _M = 4.25; };
case (_velocity > 1150) : { _A = 0.00000000001379746590025088; _M = 4.25 ; }; if (_velocity > 1100) exitWith { _A = 0.0000000000004070157961147882; _M = 4.75; };
case (_velocity > 1100) : { _A = 0.0000000000004070157961147882; _M = 4.75 ; }; if (_velocity > 1060) exitWith { _A = 0.00000000000002938236954847331; _M = 5.125; };
case (_velocity > 1060) : { _A = 0.00000000000002938236954847331; _M = 5.125 ; }; if (_velocity > 1025) exitWith { _A = 0.00000000000001228597370774746; _M = 5.25; };
case (_velocity > 1025) : { _A = 0.00000000000001228597370774746; _M = 5.25 ; }; if (_velocity > 980) exitWith { _A = 0.00000000000002916938264100495; _M = 5.125; };
case (_velocity > 980) : { _A = 0.00000000000002916938264100495; _M = 5.125 ; }; if (_velocity > 945) exitWith { _A = 0.0000000000003855099424807451; _M = 4.75; };
case (_velocity > 945) : { _A = 0.0000000000003855099424807451; _M = 4.75 ; }; if (_velocity > 905) exitWith { _A = 0.00000000001185097045689854; _M = 4.25; };
case (_velocity > 905) : { _A = 0.00000000001185097045689854; _M = 4.25 ; }; if (_velocity > 860) exitWith { _A = 0.0000000003566129470974951; _M = 3.75; };
case (_velocity > 860) : { _A = 0.0000000003566129470974951; _M = 3.75 ; }; if (_velocity > 810) exitWith { _A = 0.00000001045513263966272; _M = 3.25; };
case (_velocity > 810) : { _A = 0.00000001045513263966272; _M = 3.25 ; }; if (_velocity > 780) exitWith { _A = 0.0000001291159200846216; _M = 2.875; };
case (_velocity > 780) : { _A = 0.0000001291159200846216; _M = 2.875 ; }; if (_velocity > 750) exitWith { _A = 0.0000006824429329105383; _M = 2.625; };
case (_velocity > 750) : { _A = 0.0000006824429329105383; _M = 2.625 ; }; if (_velocity > 700) exitWith { _A = 0.000003569169672385163; _M = 2.375; };
case (_velocity > 700) : { _A = 0.000003569169672385163; _M = 2.375 ; }; if (_velocity > 640) exitWith { _A = 0.00001839015095899579; _M = 2.125; };
case (_velocity > 640) : { _A = 0.00001839015095899579; _M = 2.125 ; }; if (_velocity > 600) exitWith { _A = 0.00005711174688734240; _M = 1.950; };
case (_velocity > 600) : { _A = 0.00005711174688734240; _M = 1.950 ; }; if (_velocity > 550) exitWith { _A = 0.00009226557091973427; _M = 1.875; };
case (_velocity > 550) : { _A = 0.00009226557091973427; _M = 1.875 ; }; if (_velocity > 250) exitWith { _A = 0.00009337991957131389; _M = 1.875; };
case (_velocity > 250) : { _A = 0.00009337991957131389; _M = 1.875 ; }; if (_velocity > 100) exitWith { _A = 0.00007225247327590413; _M = 1.925; };
case (_velocity > 100) : { _A = 0.00007225247327590413; _M = 1.925 ; }; if (_velocity > 65) exitWith { _A = 0.00005792684957074546; _M = 1.975; };
case (_velocity > 65) : { _A = 0.00005792684957074546; _M = 1.975 ; }; if (_velocity > 0) exitWith { _A = 0.00005206214107320588; _M = 2.000; };
case (_velocity > 0) : { _A = 0.00005206214107320588; _M = 2.000 ; };
}; };
}; };
case 2: case 2: {
{ call {
switch true do { if (_velocity > 1674) exitWith { _A = 0.0079470052136733; _M = 1.36999902851493; };
case (_velocity > 1674) : { _A = 0.0079470052136733; _M = 1.36999902851493; }; if (_velocity > 1172) exitWith { _A = 0.00100419763721974; _M = 1.65392237010294; };
case (_velocity > 1172) : { _A = 0.00100419763721974; _M = 1.65392237010294; }; if (_velocity > 1060) exitWith { _A = 0.0000000000000000000000715571228255369; _M = 7.91913562392361; };
case (_velocity > 1060) : { _A = 0.0000000000000000000000715571228255369; _M = 7.91913562392361; }; if (_velocity > 949) exitWith { _A = 0.000000000139589807205091; _M = 3.81439537623717; };
case (_velocity > 949) : { _A = 0.000000000139589807205091; _M = 3.81439537623717; }; if (_velocity > 670) exitWith { _A = 0.000234364342818625; _M = 1.71869536324748; };
case (_velocity > 670) : { _A = 0.000234364342818625; _M = 1.71869536324748; }; if (_velocity > 335) exitWith { _A = 0.000177962438921838; _M = 1.76877550388679; };
case (_velocity > 335) : { _A = 0.000177962438921838; _M = 1.76877550388679; }; if (_velocity > 0) exitWith { _A = 0.0000518033561289704; _M = 1.98160270524632; };
case (_velocity > 0) : { _A = 0.0000518033561289704; _M = 1.98160270524632; };
}; };
}; };
case 5: case 5: {
{ call {
switch true do { if (_velocity > 1730) exitWith { _A = 0.00724854775171929; _M = 1.41538574492812; };
case (_velocity > 1730) : { _A = 0.00724854775171929; _M = 1.41538574492812; }; if (_velocity > 1228) exitWith { _A = 0.0000350563361516117; _M = 2.13077307854948; };
case (_velocity > 1228) : { _A = 0.0000350563361516117; _M = 2.13077307854948; }; if (_velocity > 1116) exitWith { _A = 0.000000000000184029481181151; _M = 4.81927320350395; };
case (_velocity > 1116) : { _A = 0.000000000000184029481181151; _M = 4.81927320350395; }; if (_velocity > 1004) exitWith { _A = 0.000000000000000000000134713064017409; _M = 7.8100555281422; };
case (_velocity > 1004) : { _A = 0.000000000000000000000134713064017409; _M = 7.8100555281422 ; }; if (_velocity > 837) exitWith { _A = 0.000000103965974081168; _M = 2.84204791809926; };
case (_velocity > 837) : { _A = 0.000000103965974081168; _M = 2.84204791809926; }; if (_velocity > 335) exitWith { _A = 0.0001093015938698234; _M = 1.81096361579504; };
case (_velocity > 335) : { _A = 0.0001093015938698234; _M = 1.81096361579504; }; if (_velocity > 0) exitWith { _A = 0.0000351963178524273; _M = 2.00477856801111; };
case (_velocity > 0) : { _A = 0.0000351963178524273; _M = 2.00477856801111; };
}; };
}; };
case 6: case 6: {
{ call {
switch true do { if (_velocity > 3236) exitWith { _A = 0.0455384883480781; _M = 1.15997674041274; };
case (_velocity > 3236) : { _A = 0.0455384883480781; _M = 1.15997674041274; }; if (_velocity > 2065) exitWith { _A = 0.07167261849653769; _M = 1.10704436538885; };
case (_velocity > 2065) : { _A = 0.07167261849653769; _M = 1.10704436538885; }; if (_velocity > 1311) exitWith { _A = 0.00166676386084348; _M = 1.60085100195952; };
case (_velocity > 1311) : { _A = 0.00166676386084348; _M = 1.60085100195952; }; if (_velocity > 1144) exitWith { _A = 0.000000101482730119215; _M = 2.9569674731838; };
case (_velocity > 1144) : { _A = 0.000000101482730119215; _M = 2.9569674731838 ; }; if (_velocity > 1004) exitWith { _A = 0.00000000000000000431542773103552; _M = 6.34106317069757; };
case (_velocity > 1004) : { _A = 0.00000000000000000431542773103552; _M = 6.34106317069757; }; if (_velocity > 670) exitWith { _A = 0.0000204835650496866; _M = 2.11688446325998; };
case (_velocity > 670) : { _A = 0.0000204835650496866; _M = 2.11688446325998; }; if (_velocity > 0) exitWith { _A = 0.0000750912466084823; _M = 1.92031057847052; };
case (_velocity > 0) : { _A = 0.0000750912466084823; _M = 1.92031057847052; };
}; };
}; };
case 7: case 7: {
{ call {
switch true do { if (_velocity > 4200) exitWith { _A = 0.00000000129081656775919; _M = 3.24121295355962; };
case (_velocity > 4200) : { _A = 0.00000000129081656775919; _M = 3.24121295355962; }; if (_velocity > 3000) exitWith { _A = 0.0171422231434847; _M = 1.27907168025204; };
case (_velocity > 3000) : { _A = 0.0171422231434847; _M = 1.27907168025204; }; if (_velocity > 1470) exitWith { _A = 0.00233355948302505; _M = 1.52693913274526; };
case (_velocity > 1470) : { _A = 0.00233355948302505; _M = 1.52693913274526; }; if (_velocity > 1260) exitWith { _A = 0.000797592111627665; _M = 1.67688974440324; };
case (_velocity > 1260) : { _A = 0.000797592111627665; _M = 1.67688974440324; }; if (_velocity > 1110) exitWith { _A = 0.00000000000571086414289273; _M = 4.3212826264889; };
case (_velocity > 1110) : { _A = 0.00000000000571086414289273; _M = 4.3212826264889 ; }; if (_velocity > 960) exitWith { _A = 0.0000000000000000302865108244904; _M = 5.99074203776707; };
case (_velocity > 960) : { _A = 0.0000000000000000302865108244904; _M = 5.99074203776707; }; if (_velocity > 670) exitWith { _A = 0.00000752285155782535; _M = 2.1738019851075; };
case (_velocity > 670) : { _A = 0.00000752285155782535; _M = 2.1738019851075 ; }; if (_velocity > 540) exitWith { _A = 0.0000131766281225189; _M = 2.08774690257991; };
case (_velocity > 540) : { _A = 0.0000131766281225189; _M = 2.08774690257991; }; if (_velocity > 0) exitWith { _A = 0.0000134504843776525; _M = 2.08702306738884; };
case (_velocity > 0) : { _A = 0.0000134504843776525; _M = 2.08702306738884; };
}; };
}; };
case 8: case 8: {
{ call {
switch true do { if (_velocity > 3571) exitWith { _A = 0.0112263766252305; _M = 1.33207346655961; };
case (_velocity > 3571) : { _A = 0.0112263766252305; _M = 1.33207346655961; }; if (_velocity > 1841) exitWith { _A = 0.0167252613732636; _M = 1.28662041261785; };
case (_velocity > 1841) : { _A = 0.0167252613732636; _M = 1.28662041261785; }; if (_velocity > 1120) exitWith { _A = 0.00220172456619625; _M = 1.55636358091189; };
case (_velocity > 1120) : { _A = 0.00220172456619625; _M = 1.55636358091189; }; if (_velocity > 1088) exitWith { _A = 0.00000000000000020538037167098; _M = 5.80410776994789; };
case (_velocity > 1088) : { _A = 0.00000000000000020538037167098; _M = 5.80410776994789; }; if (_velocity > 976) exitWith { _A = 0.00000000000592182174254121; _M = 4.29275576134191; };
case (_velocity > 976) : { _A = 0.00000000000592182174254121; _M = 4.29275576134191; }; if (_velocity > 0) exitWith { _A = 0.000043917343795117; _M = 1.99978116283334; };
case (_velocity > 0) : { _A = 0.000043917343795117; _M = 1.99978116283334; };
}; };
}; };
}; };
if (_A != -1 && _M != -1 && _velocity > 0 && _velocity < 10000) then { if (!isNil "_A" && !isNil "_M" && _velocity > 0 && _velocity < 10000) then {
_result = _A * (_velocity ^ _M) / _dragCoefficient; (_A * (_velocity ^ _M) / _dragCoefficient) / 3.2808399
_result = _result / 3.2808399; } else {
0
}; };
_result

View File

@ -13,33 +13,23 @@
* 6: barometric Pressure - hPA <NUMBER> * 6: barometric Pressure - hPA <NUMBER>
* *
* Return Value: * Return Value:
* 0: stability factor <NUMBER> * stability factor <NUMBER>
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_caliber", "_bulletLength", "_bulletMass", "_barrelTwist", "_muzzleVelocity", "_temperature", "_barometricPressure", "_l", "_t", "_stabilityFactor"]; private ["_twist", "_length", "_stabilityFactor"];
_caliber = _this select 0; params ["_caliber", "_bulletLength", "_bulletMass", "_barrelTwist", "_muzzleVelocity", "_temperature", "_barometricPressure"];
_bulletLength = _this select 1;
_bulletMass = _this select 2;
_barrelTwist = _this select 3;
_muzzleVelocity = _this select 4;
_temperature = _this select 5;
_barometricPressure = _this select 6;
// Source: http://www.jbmballistics.com/ballistics/bibliography/articles/miller_stability_1.pdf // Source: http://www.jbmballistics.com/ballistics/bibliography/articles/miller_stability_1.pdf
_t = _barrelTwist / _caliber; _twist = _barrelTwist / _caliber;
_l = _bulletLength / _caliber; _length = _bulletLength / _caliber;
_stabilityFactor = 7587000 * _bulletMass / (_t^2 * _caliber^3 * _l * (1 + _l^2)); _stabilityFactor = 7587000 * _bulletMass / (_twist^2 * _caliber^3 * _length * (1 + _length^2));
if (_muzzleVelocity > 341.376) then { if (_muzzleVelocity > 341.376) then {
_stabilityFactor = _stabilityFactor * (_muzzleVelocity / 853.44) ^ (1/3); (_stabilityFactor * (_muzzleVelocity / 853.44) ^ (1/3)) * KELVIN(_temperature) / KELVIN(15) * 1013.25 / _barometricPressure
} else { } else {
_stabilityFactor = _stabilityFactor * (_muzzleVelocity / 341.376) ^ (1/3); (_stabilityFactor * (_muzzleVelocity / 341.376) ^ (1/3)) * KELVIN(_temperature) / KELVIN(15) * 1013.25 / _barometricPressure
}; };
_stabilityFactor = _stabilityFactor * KELVIN(_temperature) / KELVIN(15) * 1013.25 / _barometricPressure;
_stabilityFactor

View File

@ -8,6 +8,8 @@
* *
* Return value: * Return value:
* None * None
*
* Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
@ -15,8 +17,6 @@
#define __ctrl1 (__dsp displayCtrl 132950) #define __ctrl1 (__dsp displayCtrl 132950)
#define __ctrl2 (__dsp displayCtrl 132951) #define __ctrl2 (__dsp displayCtrl 132951)
private ["_inclinationAngle", "_refPosition"];
if (GVAR(Protractor)) exitWith { if (GVAR(Protractor)) exitWith {
GVAR(Protractor) = false; GVAR(Protractor) = false;
1 cutText ["", "PLAIN"]; 1 cutText ["", "PLAIN"];
@ -32,30 +32,26 @@ EGVAR(weather,WindInfo) = false;
GVAR(Protractor) = true; GVAR(Protractor) = true;
[{ [{
params ["","_idPFH"];
if !(GVAR(Protractor) && !(weaponLowered ACE_player) && currentWeapon ACE_player == primaryWeapon ACE_player) exitWith { if !(GVAR(Protractor) && !(weaponLowered ACE_player) && currentWeapon ACE_player == primaryWeapon ACE_player) exitWith {
GVAR(Protractor) = false; GVAR(Protractor) = false;
1 cutText ["", "PLAIN"]; 1 cutText ["", "PLAIN"];
[_this select 1] call cba_fnc_removePerFrameHandler; [_idPFH] call cba_fnc_removePerFrameHandler;
}; };
_refPosition = [SafeZoneX + 0.001, SafeZoneY + 0.001, 0.2, 0.2 * 4/3];
_inclinationAngle = asin((ACE_player weaponDirection currentWeapon ACE_player) select 2);
_inclinationAngle = -58 max _inclinationAngle min 58;
1 cutRsc ["RscProtractor", "PLAIN", 1, false]; 1 cutRsc ["RscProtractor", "PLAIN", 1, false];
__ctrl1 ctrlSetScale 1; __ctrl1 ctrlSetScale 1;
__ctrl1 ctrlCommit 0; __ctrl1 ctrlCommit 0;
__ctrl1 ctrlSetText QUOTE(PATHTOF(UI\protractor.paa)); __ctrl1 ctrlSetText QUOTE(PATHTOF(UI\protractor.paa));
__ctrl1 ctrlSetTextColor [1, 1, 1, 1]; __ctrl1 ctrlSetTextColor [1, 1, 1, 1];
__ctrl2 ctrlSetScale 1; __ctrl2 ctrlSetScale 1;
__ctrl2 ctrlSetPosition [(_refPosition select 0), (_refPosition select 1) - 0.0012 * _inclinationAngle, (_refPosition select 2), (_refPosition select 3)]; __ctrl2 ctrlSetPosition [SafeZoneX + 0.001, SafeZoneY + 0.001 - 0.0012 * (-58 max (asin((ACE_player weaponDirection currentWeapon ACE_player) select 2)) min 58), 0.2, 0.2 * 4/3];
__ctrl2 ctrlCommit 0; __ctrl2 ctrlCommit 0;
__ctrl2 ctrlSetText QUOTE(PATHTOF(UI\protractor_marker.paa)); __ctrl2 ctrlSetText QUOTE(PATHTOF(UI\protractor_marker.paa));
__ctrl2 ctrlSetTextColor [1, 1, 1, 1]; __ctrl2 ctrlSetTextColor [1, 1, 1, 1];
}, 0.1, []] call CBA_fnc_addPerFrameHandler; }, 0.1, []] call CBA_fnc_addPerFrameHandler;
true true

View File

@ -0,0 +1,47 @@
/*
* Author: Glowbal, Ruthberg, joko // Jonas
* Handle the PFH for Bullets
*
* Arguments:
* None
*
* Return Value:
* None
*
* Public: No
*/
#include "script_component.hpp"
private "_deleted";
_deleted = 0;
{
private ["_bulletVelocity", "_bulletPosition", "_bulletSpeed"];
_x params["_bullet","_caliber","_bulletTraceVisible","_index"];
_bulletVelocity = velocity _bullet;
_bulletSpeed = vectorMagnitude _bulletVelocity;
if (!alive _bullet || _bulletSpeed < 100) exitWith {
GVAR(allBullets) deleteAt (_forEachIndex - _deleted);
_deleted = _deleted + 1;
};
_bulletPosition = getPosASL _bullet;
if (_bulletTraceVisible && _bulletSpeed > 500) then {
drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.02*_caliber,0.01*_caliber],[[0,0,0,0.65],[0,0,0,0.2]],[1,0],0,0,"","",""];
};
_aceTimeSecond = floor ACE_time;
call compile ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, _aceTimeSecond, ACE_time - _aceTimeSecond]);
} forEach GVAR(allBullets);
if (GVAR(allBullets) isEqualTo []) then {
[_this select 1] call CBA_fnc_removePerFrameHandler;
GVAR(BulletPFH) = nil;
};

View File

@ -13,28 +13,28 @@
* 6: projectile - Object of the projectile that was shot <OBJECT> * 6: projectile - Object of the projectile that was shot <OBJECT>
* *
* Return Value: * Return Value:
* Nothing * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_weapon", "_mode", "_ammo", "_magazine", "_caliber", "_bullet", "_abort", "_AmmoCacheEntry", "_WeaponCacheEntry", "_opticsName", "_opticType", "_bulletTraceVisible", "_temperature", "_barometricPressure", "_bulletMass", "_bulletLength", "_muzzleVelocity", "_muzzleVelocityShift", "_bulletVelocity", "_bulletSpeed", "_bulletLength", "_barrelTwist", "_stabilityFactor"]; // Early Quiting
_unit = _this select 0; if (!hasInterface) exitWith {};
_weapon = _this select 1; if (!GVAR(enabled)) exitWith {};
_mode = _this select 3;
_ammo = _this select 4; // Parameterization
_magazine = _this select 5; private ["_abort", "_AmmoCacheEntry", "_WeaponCacheEntry", "_opticsName", "_opticType", "_bulletTraceVisible", "_temperature", "_barometricPressure", "_bulletMass", "_bulletLength", "_muzzleVelocity", "_muzzleVelocityShift", "_bulletVelocity", "_bulletSpeed", "_bulletLength", "_barrelTwist", "_stabilityFactor"];
_bullet = _this select 6; params ["_unit", "_weapon", "", "_mode", "_ammo", "_magazine", "_bullet"];
_abort = false; _abort = false;
if (!hasInterface) exitWith {};
if (!alive _bullet) exitWith {};
if (!GVAR(enabled)) exitWith {};
if (!([_unit] call EFUNC(common,isPlayer))) exitWith {};
if (underwater _unit) exitWith {};
if (!(_ammo isKindOf "BulletBase")) exitWith {}; if (!(_ammo isKindOf "BulletBase")) exitWith {};
if (!alive _bullet) exitWith {};
if (!([_unit] call EFUNC(common,isPlayer))) exitWith {};
if (_unit distance ACE_player > GVAR(simulationRadius)) exitWith {}; if (_unit distance ACE_player > GVAR(simulationRadius)) exitWith {};
if (underwater _unit) exitWith {};
if (!GVAR(simulateForEveryone) && !(local _unit)) then { if (!GVAR(simulateForEveryone) && !(local _unit)) then {
// The shooter is non local // The shooter is non local
_abort = true; _abort = true;
@ -56,34 +56,41 @@ if (_abort || !(GVAR(extensionAvailable))) exitWith {
[_bullet, getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction")] call EFUNC(winddeflection,updateTrajectoryPFH); [_bullet, getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction")] call EFUNC(winddeflection,updateTrajectoryPFH);
}; };
// Get Weapon and Ammo Configurations
_AmmoCacheEntry = uiNamespace getVariable format[QGVAR(%1), _ammo]; _AmmoCacheEntry = uiNamespace getVariable format[QGVAR(%1), _ammo];
if (isNil {_AmmoCacheEntry}) then { if (isNil "_AmmoCacheEntry") then {
_AmmoCacheEntry = _ammo call FUNC(readAmmoDataFromConfig); _AmmoCacheEntry = _ammo call FUNC(readAmmoDataFromConfig);
}; };
_WeaponCacheEntry = uiNamespace getVariable format[QGVAR(%1), _weapon]; _WeaponCacheEntry = uiNamespace getVariable format[QGVAR(%1), _weapon];
if (isNil {_WeaponCacheEntry}) then { if (isNil "_WeaponCacheEntry") then {
_WeaponCacheEntry = _weapon call FUNC(readWeaponDataFromConfig); _WeaponCacheEntry = _weapon call FUNC(readWeaponDataFromConfig);
}; };
_AmmoCacheEntry params ["_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable"];
_WeaponCacheEntry params ["_barrelTwist", "_twistDirection", "_barrelLength"];
_bulletVelocity = velocity _bullet; _bulletVelocity = velocity _bullet;
_muzzleVelocity = vectorMagnitude _bulletVelocity; _muzzleVelocity = vectorMagnitude _bulletVelocity;
if (GVAR(barrelLengthInfluenceEnabled)) then { if (GVAR(barrelLengthInfluenceEnabled)) then {
_muzzleVelocityShift = [_WeaponCacheEntry select 2, _AmmoCacheEntry select 10, _AmmoCacheEntry select 11, _muzzleVelocity] call FUNC(calculateBarrelLengthVelocityShift); _barrelVelocityShift = uiNamespace getVariable [format [QGVAR(%1_muzzleVelocityShift),_weapon],nil];
if (_muzzleVelocityShift != 0) then { if (isNil "_barrelVelocityShift") then {
_bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift)); _barrelVelocityShift = [_barrelLength, _muzzleVelocityTable, _barrelLengthTable, _muzzleVelocity] call FUNC(calculateBarrelLengthVelocityShift);
_bullet setVelocity _bulletVelocity; uiNamespace setVariable [format [QGVAR(%1_muzzleVelocityShift),_weapon],_muzzleVelocityShift];
_muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift;
}; };
}; };
if (GVAR(ammoTemperatureEnabled)) then { if (GVAR(ammoTemperatureEnabled)) then {
_temperature = ((getPosASL _unit) select 2) call EFUNC(weather,calculateTemperatureAtHeight); _temperature = ((getPosASL _unit) select 2) call EFUNC(weather,calculateTemperatureAtHeight);
_muzzleVelocityShift = [_AmmoCacheEntry select 9, _temperature] call FUNC(calculateAmmoTemperatureVelocityShift); _temperatureVelocityShift = ([_ammoTempMuzzleVelocityShifts, _temperature] call FUNC(calculateAmmoTemperatureVelocityShift));
};
if (GVAR(ammoTemperatureEnabled) || GVAR(barrelLengthInfluenceEnabled)) then {
if (_muzzleVelocityShift != 0) then { if (_muzzleVelocityShift != 0) then {
_muzzleVelocity = _muzzleVelocity + (_barrelVelocityShift + _ammoTemperatureVelocityShift);
_bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift)); _bulletVelocity = _bulletVelocity vectorAdd ((vectorNormalized _bulletVelocity) vectorMultiply (_muzzleVelocityShift));
_bullet setVelocity _bulletVelocity; _bullet setVelocity _bulletVelocity;
_muzzleVelocity = _muzzleVelocity + _muzzleVelocityShift;
}; };
}; };
@ -100,43 +107,22 @@ if (GVAR(bulletTraceEnabled) && cameraView == "GUNNER") then {
}; };
}; };
_caliber = _AmmoCacheEntry select 1;
_bulletLength = _AmmoCacheEntry select 2;
_bulletMass = _AmmoCacheEntry select 3;
_barrelTwist = _WeaponCacheEntry select 0;
_stabilityFactor = 1.5; _stabilityFactor = 1.5;
if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then { if (_caliber > 0 && _bulletLength > 0 && _bulletMass > 0 && _barrelTwist > 0) then {
_temperature = ((getPosASL _unit) select 2) call EFUNC(weather,calculateTemperatureAtHeight); if (isNil "_temperature") then {
_temperature = ((getPosASL _unit) select 2) call EFUNC(weather,calculateTemperatureAtHeight);
};
_barometricPressure = ((getPosASL _bullet) select 2) call EFUNC(weather,calculateBarometricPressure); _barometricPressure = ((getPosASL _bullet) select 2) call EFUNC(weather,calculateBarometricPressure);
_stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor); _stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor);
}; };
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), _AmmoCacheEntry select 0, _AmmoCacheEntry select 6, _AmmoCacheEntry select 7, _AmmoCacheEntry select 8, _AmmoCacheEntry select 5, _stabilityFactor, _WeaponCacheEntry select 1, _muzzleVelocity, _AmmoCacheEntry select 4, getPosASL _bullet, EGVAR(common,mapLatitude), EGVAR(weather,currentTemperature), EGVAR(common,mapAltitude), EGVAR(weather,currentHumidity), overcast, floor(ACE_time), ACE_time - floor(ACE_time)]; _aceTimeSecond = floor ACE_time;
"ace_advanced_ballistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", GVAR(currentbulletID), _airFriction, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _stabilityFactor, _twistDirection, _muzzleVelocity, _transonicStabilityCoef, getPosASL _bullet, EGVAR(common,mapLatitude), EGVAR(weather,currentTemperature), EGVAR(common,mapAltitude), EGVAR(weather,currentHumidity), overcast, _aceTimeSecond, ACE_time - _aceTimeSecond];
[{ GVAR(allBullets) pushBack [_bullet, _caliber, _bulletTraceVisible, GVAR(currentbulletID)];
private ["_args", "_index", "_bullet", "_caliber", "_bulletTraceVisible", "_bulletVelocity", "_bulletPosition"];
_args = _this select 0;
_bullet = _args select 0;
_caliber = _args select 1;
_bulletTraceVisible = _args select 2;
_index = _args select 3;
_bulletVelocity = velocity _bullet;
_bulletPosition = getPosASL _bullet;
_bulletSpeed = vectorMagnitude _bulletVelocity;
if (!alive _bullet || _bulletSpeed < 100) exitWith {
[_this select 1] call cba_fnc_removePerFrameHandler;
};
if (_bulletTraceVisible && _bulletSpeed > 500) then {
drop ["\A3\data_f\ParticleEffects\Universal\Refract","","Billboard",1,0.1,getPos _bullet,[0,0,0],0,1.275,1,0,[0.02*_caliber,0.01*_caliber],[[0,0,0,0.65],[0,0,0,0.2]],[1,0],0,0,"","",""];
};
call compile ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6:%7", _index, _bulletVelocity, _bulletPosition, ACE_wind, ASLToATL(_bulletPosition) select 2, floor(ACE_time), ACE_time - floor(ACE_time)]); if (isNil QGVAR(BulletPFH)) then {
GVAR(BulletPFH) = [FUNC(handleFirePFH), GVAR(simulationInterval), []] call CBA_fnc_addPerFrameHandler;
}, GVAR(simulationInterval), [_bullet, _caliber, _bulletTraceVisible, GVAR(currentbulletID)]] call CBA_fnc_addPerFrameHandler; };

View File

@ -8,17 +8,13 @@
* 2: activated <BOOL> * 2: activated <BOOL>
* *
* Return Value: * Return Value:
* None <NIL> * None
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_logic", "_units", "_activated"]; params ["_logic","_units", "_activated"];
_logic = _this select 0;
_units = _this select 1;
_activated = _this select 2;
if !(_activated) exitWith {}; if !(_activated) exitWith {};

View File

@ -3,10 +3,10 @@
* Initializes the advanced ballistics dll extension with terrain data * Initializes the advanced ballistics dll extension with terrain data
* *
* Arguments: * Arguments:
* Nothing * None
* *
* Return Value: * Return Value:
* Nothing * None
* *
* Public: No * Public: No
*/ */
@ -22,9 +22,9 @@ _initStartTime = ACE_time;
_mapSize = getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize"); _mapSize = getNumber (configFile >> "CfgWorlds" >> worldName >> "MapSize");
if (("ace_advanced_ballistics" callExtension format["init:%1:%2", worldName, _mapSize]) == "Terrain already initialized") exitWith { if (("ace_advanced_ballistics" callExtension format["init:%1:%2", worldName, _mapSize]) == "Terrain already initialized") exitWith {
if (GVAR(initMessageEnabled)) then { #ifdef DEBUG_MODE_FULL
systemChat "AdvancedBallistics: Terrain already initialized"; systemChat "AdvancedBallistics: Terrain already initialized";
}; #endIf
}; };
_mapGrids = ceil(_mapSize / 50) + 1; _mapGrids = ceil(_mapSize / 50) + 1;
@ -33,19 +33,16 @@ _gridCells = _mapGrids * _mapGrids;
GVAR(currentGrid) = 0; GVAR(currentGrid) = 0;
[{ [{
private ["_args", "_mapGrids", "_gridCells", "_initStartTime"]; params ["_args","_idPFH"];
_args = _this select 0; _args params ["_mapGrids", "_gridCells", "_initStartTime"];
_mapGrids = _args select 0;
_gridCells = _args select 1;
_initStartTime = _args select 2;
if (GVAR(currentGrid) >= _gridCells) exitWith { if (GVAR(currentGrid) >= _gridCells) exitWith {
if (GVAR(initMessageEnabled)) then { #ifdef DEBUG_MODE_FULL
systemChat format["AdvancedBallistics: Finished terrain initialization in %1 seconds", ceil(ACE_time - _initStartTime)]; systemChat format["AdvancedBallistics: Finished terrain initialization in %1 seconds", ceil(ACE_time - _initStartTime)];
}; #endif
[_this select 1] call cba_fnc_removePerFrameHandler; [_idPFH] call cba_fnc_removePerFrameHandler;
}; };
for "_i" from 1 to 50 do { for "_i" from 1 to 50 do {
_x = floor(GVAR(currentGrid) / _mapGrids) * 50; _x = floor(GVAR(currentGrid) / _mapGrids) * 50;
_y = (GVAR(currentGrid) - floor(GVAR(currentGrid) / _mapGrids) * _mapGrids) * 50; _y = (GVAR(currentGrid) - floor(GVAR(currentGrid) / _mapGrids) * _mapGrids) * 50;
@ -57,5 +54,5 @@ GVAR(currentGrid) = 0;
GVAR(currentGrid) = GVAR(currentGrid) + 1; GVAR(currentGrid) = GVAR(currentGrid) + 1;
if (GVAR(currentGrid) >= _gridCells) exitWith {}; if (GVAR(currentGrid) >= _gridCells) exitWith {};
}; };
}, 0, [_mapGrids, _gridCells, _initStartTime]] call CBA_fnc_addPerFrameHandler }, 0, [_mapGrids, _gridCells, _initStartTime]] call CBA_fnc_addPerFrameHandler

View File

@ -4,61 +4,53 @@
* Reads the ammo class config and updates the config cache * Reads the ammo class config and updates the config cache
* *
* Arguments: * Arguments:
* 0: ammo - classname <string> * ammo - classname <STRING>
* *
* Return Value: * Return Value:
* 0: [_airFriction, _caliber, _bulletLength, _bulletMass, _transonicStabilityCoef, _dragModel, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _ammoTempMuzzleVelocityShifts, _muzzleVelocityTable, _barrelLengthTable] <ARRAY> * 0: _airFriction
* 1: _caliber
* 2: _bulletLength
* 3: _bulletMass
* 4: _transonicStabilityCoef
* 5: _dragModel
* 6: _ballisticCoefficients
* 7: _velocityBoundaries
* 8: _atmosphereModel
* 9: _ammoTempMuzzleVelocityShifts
* 10: _muzzleVelocityTable
* 11: _barrelLengthTable
* *
* Return value: * Public: No
* None
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_ammo", "_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable", "_result"]; private ["_ammo", "_airFriction", "_caliber", "_bulletLength", "_bulletMass", "_transonicStabilityCoef", "_dragModel", "_ballisticCoefficients", "_velocityBoundaries", "_atmosphereModel", "_ammoTempMuzzleVelocityShifts", "_muzzleVelocityTable", "_barrelLengthTable", "_result"];
_ammo = _this; _ammoConfig = configFile >> "CfgAmmo" >> _this;
_airFriction = getNumber(configFile >> "CfgAmmo" >> _ammo >> "airFriction"); _airFriction = getNumber(_ammoConfig >> "airFriction");
_caliber = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_caliber"); _caliber = getNumber(_ammoConfig >> "ACE_caliber");
_bulletLength = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_bulletLength"); _bulletLength = getNumber(_ammoConfig >> "ACE_bulletLength");
_bulletMass = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_bulletMass"); _bulletMass = getNumber(_ammoConfig >> "ACE_bulletMass");
_transonicStabilityCoef = 0.5; _transonicStabilityCoef = getNumber(_ammoConfig >> "ACE_transonicStabilityCoef");
if (isNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_transonicStabilityCoef")) then { if (_transonicStabilityCoef == 0) then {
_transonicStabilityCoef = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_transonicStabilityCoef"); _transonicStabilityCoef = 0.5;
}; };
_dragModel = 1; _dragModel = getNumber(_ammoConfig >> "ACE_dragModel");
_ballisticCoefficients = []; if (_dragModel == 0 || !(_dragModel in [1, 2, 5, 6, 7, 8])) then {
_velocityBoundaries = []; _dragModel = 1;
_atmosphereModel = "ICAO";
if (isNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_dragModel")) then {
_dragModel = getNumber(configFile >> "CfgAmmo" >> _ammo >> "ACE_dragModel");
if (!(_dragModel in [1, 2, 5, 6, 7, 8])) then {
_dragModel = 1;
};
}; };
if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_ballisticCoefficients")) then { _ballisticCoefficients = getArray(_ammoConfig >> "ACE_ballisticCoefficients");
_ballisticCoefficients = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_ballisticCoefficients"); _velocityBoundaries = getArray(_ammoConfig >> "ACE_velocityBoundaries");
}; _atmosphereModel = getText(_ammoConfig >> "ACE_standardAtmosphere");
if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_velocityBoundaries")) then { if (_atmosphereModel isEqualTo "") then {
_velocityBoundaries = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_velocityBoundaries"); _atmosphereModel = "ICAO";
};
if (isText(configFile >> "CfgAmmo" >> _ammo >> "ACE_standardAtmosphere")) then {
_atmosphereModel = getText(configFile >> "CfgAmmo" >> _ammo >> "ACE_standardAtmosphere");
};
_ammoTempMuzzleVelocityShifts = [];
if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_ammoTempMuzzleVelocityShifts")) then {
_ammoTempMuzzleVelocityShifts = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_ammoTempMuzzleVelocityShifts");
};
_muzzleVelocityTable = [];
_barrelLengthTable = [];
if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_muzzleVelocities")) then {
_muzzleVelocityTable = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_muzzleVelocities");
};
if (isArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_barrelLengths")) then {
_barrelLengthTable = getArray(configFile >> "CfgAmmo" >> _ammo >> "ACE_barrelLengths");
}; };
_ammoTempMuzzleVelocityShifts = getArray(_ammoConfig >> "ACE_ammoTempMuzzleVelocityShifts");
_muzzleVelocityTable = getArray(_ammoConfig >> "ACE_muzzleVelocities");
_barrelLengthTable = getArray(_ammoConfig >> "ACE_barrelLengths");
_result = [_airFriction, _caliber, _bulletLength, _bulletMass, _transonicStabilityCoef, _dragModel, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _ammoTempMuzzleVelocityShifts, _muzzleVelocityTable, _barrelLengthTable]; _result = [_airFriction, _caliber, _bulletLength, _bulletMass, _transonicStabilityCoef, _dragModel, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _ammoTempMuzzleVelocityShifts, _muzzleVelocityTable, _barrelLengthTable];
uiNamespace setVariable [format[QGVAR(%1), _ammo], _result]; uiNamespace setVariable [format[QGVAR(%1), _this], _result];
_result _result

View File

@ -4,28 +4,28 @@
* Reads the weapon class config and updates the config cache * Reads the weapon class config and updates the config cache
* *
* Arguments: * Arguments:
* 0: weapon - classname <string> * weapon - classname <STRING>
* *
* Return Value: * Return Value:
* 0: [_barrelTwist, _twistDirection, _barrelLength] <ARRAY> * 0: _barrelTwist
* 1: _twistDirection
* 2: _barrelLength
* *
* Return value: * Public: No
* None
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_weapon", "_barrelTwist", "_twistDirection", "_barrelLength", "_result"]; private ["_weaponConfig", "_barrelTwist", "_twistDirection", "_barrelLength", "_result"];
_weapon = _this; _weaponConfig = (configFile >> "CfgWeapons" >> _this);
_barrelTwist = getNumber(configFile >> "CfgWeapons" >> _weapon >> "ACE_barrelTwist"); _barrelTwist = getNumber(_weaponConfig >> "ACE_barrelTwist");
_twistDirection = 1; _twistDirection = 1;
if (isNumber(configFile >> "CfgWeapons" >> _weapon >> "ACE_twistDirection")) then { _twistDirection = getNumber(_weaponConfig >> "ACE_twistDirection");
_twistDirection = getNumber(configFile >> "CfgWeapons" >> _weapon >> "ACE_twistDirection"); if !(_twistDirection in [-1, 0, 1]) then {
if (_twistDirection != -1 && _twistDirection != 0 && _twistDirection != 1) then { _twistDirection = 1;
_twistDirection = 1;
};
}; };
_barrelLength = getNumber(configFile >> "CfgWeapons" >> _weapon >> "ACE_barrelLength");
_barrelLength = getNumber(_weaponConfig >> "ACE_barrelLength");
_result = [_barrelTwist, _twistDirection, _barrelLength]; _result = [_barrelTwist, _twistDirection, _barrelLength];

View File

@ -33,6 +33,7 @@
<Czech>Pokročilá balistika</Czech> <Czech>Pokročilá balistika</Czech>
<Portuguese>Balística avançada</Portuguese> <Portuguese>Balística avançada</Portuguese>
<French>Balistique avancée</French> <French>Balistique avancée</French>
<Hungarian>Fejlett ballisztika</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_enabled_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_enabled_DisplayName">
<English>Advanced Ballistics</English> <English>Advanced Ballistics</English>
@ -42,6 +43,7 @@
<Czech>Pokročilá balistika</Czech> <Czech>Pokročilá balistika</Czech>
<Portuguese>Balística avançada</Portuguese> <Portuguese>Balística avançada</Portuguese>
<French>Balistique avancée</French> <French>Balistique avancée</French>
<Hungarian>Fejlett ballisztika</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_enabled_Description"> <Key ID="STR_ACE_Advanced_Ballistics_enabled_Description">
<English>Enables advanced ballistics</English> <English>Enables advanced ballistics</English>
@ -51,6 +53,7 @@
<Czech>Aktivuje pokročilou balistiku</Czech> <Czech>Aktivuje pokročilou balistiku</Czech>
<Portuguese>Ativa balística avançada</Portuguese> <Portuguese>Ativa balística avançada</Portuguese>
<French>Activer la balistique avancée</French> <French>Activer la balistique avancée</French>
<Hungarian>Engedélyezi a fejlett ballisztikát</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_DisplayName">
<English>Enabled For Snipers</English> <English>Enabled For Snipers</English>
@ -60,6 +63,7 @@
<Czech>Povoleno pro odstřelovače</Czech> <Czech>Povoleno pro odstřelovače</Czech>
<Portuguese>Ativar para caçadores</Portuguese> <Portuguese>Ativar para caçadores</Portuguese>
<French>Activer pour les snipers</French> <French>Activer pour les snipers</French>
<Hungarian>Mesterlövészeknek engedélyezve</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_Description"> <Key ID="STR_ACE_Advanced_Ballistics_simulateForSnipers_Description">
<English>Enables advanced ballistics for non local snipers (when using high power optics)</English> <English>Enables advanced ballistics for non local snipers (when using high power optics)</English>
@ -69,6 +73,7 @@
<Czech>Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku)</Czech> <Czech>Aktivuje pokročilou balistiku pro nelokální odstřelovače (když používá výkonnou optiku)</Czech>
<Portuguese>Ativa balística avançada para caçadores não locais (quando usando miras telescópicas)</Portuguese> <Portuguese>Ativa balística avançada para caçadores não locais (quando usando miras telescópicas)</Portuguese>
<French>Active la balistique avancée pour les snipers non locaux (en utilisant les optiques avancées)</French> <French>Active la balistique avancée pour les snipers non locaux (en utilisant les optiques avancées)</French>
<Hungarian>Engedélyezi a fejlett ballisztikát nem-helyi mesterlövészeknek (nagy-teljesítményű optika használatakor)</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_DisplayName">
<English>Enabled For Group Members</English> <English>Enabled For Group Members</English>
@ -78,6 +83,7 @@
<Czech>Povoleno pro členy skupiny</Czech> <Czech>Povoleno pro členy skupiny</Czech>
<Portuguese>Ativada para membros do grupo</Portuguese> <Portuguese>Ativada para membros do grupo</Portuguese>
<French>Activer pour les membres groupés</French> <French>Activer pour les membres groupés</French>
<Hungarian>Csoporttagoknak engedélyezve</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_Description"> <Key ID="STR_ACE_Advanced_Ballistics_simulateForGroupMembers_Description">
<English>Enables advanced ballistics for non local group members</English> <English>Enables advanced ballistics for non local group members</English>
@ -87,6 +93,7 @@
<Czech>Aktivuje pokročilou balistiku pro nelokální členy skupiny</Czech> <Czech>Aktivuje pokročilou balistiku pro nelokální členy skupiny</Czech>
<Portuguese>Ativa balística avançada para membros de grupo não locais</Portuguese> <Portuguese>Ativa balística avançada para membros de grupo não locais</Portuguese>
<French>Active la balistique avancée pour les membres groupés non locaux</French> <French>Active la balistique avancée pour les membres groupés non locaux</French>
<Hungarian>Engedélyezi a fejlett ballisztikát nem-helyi csoporttagoknak</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_DisplayName">
<English>Enabled For Everyone</English> <English>Enabled For Everyone</English>
@ -96,6 +103,7 @@
<Czech>Povoleno pro všechny</Czech> <Czech>Povoleno pro všechny</Czech>
<Portuguese>Ativada para todos</Portuguese> <Portuguese>Ativada para todos</Portuguese>
<French>Activer pour tout le monde</French> <French>Activer pour tout le monde</French>
<Hungarian>Mindenkinek engedélyezve</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_Description"> <Key ID="STR_ACE_Advanced_Ballistics_simulateForEveryone_Description">
<English>Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer)</English> <English>Enables advanced ballistics for all non local players (enabling this may degrade performance during heavy firefights in multiplayer)</English>
@ -105,6 +113,7 @@
<Czech>Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru)</Czech> <Czech>Aktivovat pokročilou balistiku pro všechny nelokální hráče (aktivace této možnosti způsobuje pokles snímu za sekundu během těžké přestřelky v multiplayeru)</Czech>
<Portuguese>Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer)</Portuguese> <Portuguese>Ativa balística avançada para todos os jogadores não locais (ativando isso pode degradar a performance durante troca de tiros intensas no multiplayer)</Portuguese>
<French>Active la balistique avancé pour tous les joueurs non locaux (activer cette option peut avoir un impact sur les performance en multi durant les grands échanges de tirs)</French> <French>Active la balistique avancé pour tous les joueurs non locaux (activer cette option peut avoir un impact sur les performance en multi durant les grands échanges de tirs)</French>
<Hungarian>Engedélyezi a fejlett ballisztikát az összes nem-helyi játékosnak (ez a funkció leronthatja a teljesítményt intenzív többjátékos tűzharcok alatt)</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_DisplayName">
<English>Always Enabled For Group Members</English> <English>Always Enabled For Group Members</English>
@ -114,6 +123,7 @@
<Czech>Vždy povoleno pro členy skupiny</Czech> <Czech>Vždy povoleno pro členy skupiny</Czech>
<Portuguese>Sempre ativada para membros do grupo</Portuguese> <Portuguese>Sempre ativada para membros do grupo</Portuguese>
<French>Toujours activer pour les membres groupés</French> <French>Toujours activer pour les membres groupés</French>
<Hungarian>Mindig engedélyezve csoporttagoknak</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_Description"> <Key ID="STR_ACE_Advanced_Ballistics_alwaysSimulateForGroupMembers_Description">
<English>Always enables advanced ballistics when a group member fires</English> <English>Always enables advanced ballistics when a group member fires</English>
@ -123,6 +133,7 @@
<Czech>Aktivuje pokročilou balistiku pro členy skupiny</Czech> <Czech>Aktivuje pokročilou balistiku pro členy skupiny</Czech>
<Portuguese>Sempre ative balística avançada quando um membro do grupo disparar</Portuguese> <Portuguese>Sempre ative balística avançada quando um membro do grupo disparar</Portuguese>
<French>Active tout le temps la balistique avancée quand un membre du groupe ouvre le feu</French> <French>Active tout le temps la balistique avancée quand un membre du groupe ouvre le feu</French>
<Hungarian>Mindig engedélyezi a fejlett ballisztikát, ha egy csoporttag tüzel</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_DisplayName">
<English>Disabled In FullAuto Mode</English> <English>Disabled In FullAuto Mode</English>
@ -132,6 +143,7 @@
<Czech>Zakázáno v automatickém režimu střelby</Czech> <Czech>Zakázáno v automatickém režimu střelby</Czech>
<Portuguese>Desabilitar no modo automático</Portuguese> <Portuguese>Desabilitar no modo automático</Portuguese>
<French>Désactiver en mode rafale libre</French> <French>Désactiver en mode rafale libre</French>
<Hungarian>Automata módban letiltva</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_Description"> <Key ID="STR_ACE_Advanced_Ballistics_disabledInFullAutoMod_Description">
<English>Disables the advanced ballistics during full auto fire</English> <English>Disables the advanced ballistics during full auto fire</English>
@ -141,6 +153,7 @@
<Czech>Zákáže pokročilou balistiku během střelby v režimu automat</Czech> <Czech>Zákáže pokročilou balistiku během střelby v režimu automat</Czech>
<Portuguese>Desabilitar a balística avançada durante fogo automático</Portuguese> <Portuguese>Desabilitar a balística avançada durante fogo automático</Portuguese>
<French>Désactive la balistique avancée pour les tirs en rafale libre</French> <French>Désactive la balistique avancée pour les tirs en rafale libre</French>
<Hungarian>Letiltja a fejlett ballisztikát automata tüzelés folyamán</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_DisplayName">
<English>Enable Ammo Temperature Simulation</English> <English>Enable Ammo Temperature Simulation</English>
@ -150,6 +163,7 @@
<Czech>Povolit simulaci teploty munice</Czech> <Czech>Povolit simulaci teploty munice</Czech>
<Portuguese>Ativar simulação de temperatura de munição</Portuguese> <Portuguese>Ativar simulação de temperatura de munição</Portuguese>
<French>Activer la simulation de la température</French> <French>Activer la simulation de la température</French>
<Hungarian>Lőszer-hő szimuláció engedélyezése</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_Description"> <Key ID="STR_ACE_Advanced_Ballistics_ammoTemperatureEnabled_Description">
<English>Muzzle velocity varies with ammo temperature</English> <English>Muzzle velocity varies with ammo temperature</English>
@ -159,6 +173,7 @@
<Czech>Úsťová rychlost je závislá na teplotě munice</Czech> <Czech>Úsťová rychlost je závislá na teplotě munice</Czech>
<Portuguese>A velocidade de saída varia com a temperatura da munição</Portuguese> <Portuguese>A velocidade de saída varia com a temperatura da munição</Portuguese>
<French>La température de la munition influe sur la vélocité intiale</French> <French>La température de la munition influe sur la vélocité intiale</French>
<Hungarian>A kezdősebesség a lőszer hőmérsékletétől függően változó</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_DisplayName">
<English>Enable Barrel Length Simulation</English> <English>Enable Barrel Length Simulation</English>
@ -168,6 +183,7 @@
<Czech>Povolit simulaci délky hlavně</Czech> <Czech>Povolit simulaci délky hlavně</Czech>
<Portuguese>Ativar a simulação de comprimento do cano</Portuguese> <Portuguese>Ativar a simulação de comprimento do cano</Portuguese>
<French>Activer la simulation de la longueur de canon</French> <French>Activer la simulation de la longueur de canon</French>
<Hungarian>Csőhossz-szimuláció engedélyezése</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_Description"> <Key ID="STR_ACE_Advanced_Ballistics_barrelLengthInfluenceEnabled_Description">
<English>Muzzle velocity varies with barrel length</English> <English>Muzzle velocity varies with barrel length</English>
@ -177,6 +193,7 @@
<Czech>Úsťová rychlost je závislá na délce hlavně</Czech> <Czech>Úsťová rychlost je závislá na délce hlavně</Czech>
<Portuguese>A velocidade de saída caria com o comprimento do cano</Portuguese> <Portuguese>A velocidade de saída caria com o comprimento do cano</Portuguese>
<French>La longueur du canon influe sur la vélocité initale</French> <French>La longueur du canon influe sur la vélocité initale</French>
<Hungarian>A kezdősebesség a cső hosszától függően változó</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_DisplayName">
<English>Enable Bullet Trace Effect</English> <English>Enable Bullet Trace Effect</English>
@ -186,6 +203,7 @@
<Czech>Povolit efekt trasírek</Czech> <Czech>Povolit efekt trasírek</Czech>
<Portuguese>Ativa efeito traçante de projétil</Portuguese> <Portuguese>Ativa efeito traçante de projétil</Portuguese>
<French>Activer l'effet traçante</French> <French>Activer l'effet traçante</French>
<Hungarian>Nyomkövető-effekt engedélyezése</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_Description"> <Key ID="STR_ACE_Advanced_Ballistics_bulletTraceEnabled_Description">
<English>Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics)</English> <English>Enables a bullet trace effect to high caliber bullets (only visible when looking through high power optics)</English>
@ -195,6 +213,7 @@
<Czech>Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku)</Czech> <Czech>Aktivuje efekt trasírek z vysokokaliberních zbraní (viditelné pouze skrze výkonnou optiku)</Czech>
<Portuguese>Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas)</Portuguese> <Portuguese>Ativa o efeito traçante de projétil para projéteis de alto calibre (somente visível quando observado por miras telescópicas)</Portuguese>
<French>Active une tracante pour les munitions de gros calibre (seulement visible en utilisant des optiques avancées)</French> <French>Active une tracante pour les munitions de gros calibre (seulement visible en utilisant des optiques avancées)</French>
<Hungarian>Engedélyezi a nagy kaliberű lövedékek nyomának vizuális követését (csak nagy teljesítményű optikán keresztül látható)</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_DisplayName">
<English>Simulation Interval</English> <English>Simulation Interval</English>
@ -204,6 +223,7 @@
<Czech>Interval simulace</Czech> <Czech>Interval simulace</Czech>
<Portuguese>Intervalo da simulação</Portuguese> <Portuguese>Intervalo da simulação</Portuguese>
<French>Intervalle de simulation</French> <French>Intervalle de simulation</French>
<Hungarian>Szimuláció intervalluma</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_Description"> <Key ID="STR_ACE_Advanced_Ballistics_simulationInterval_Description">
<English>Defines the interval between every calculation step</English> <English>Defines the interval between every calculation step</English>
@ -213,6 +233,7 @@
<Czech>Určuje interval mezi každým výpočtem</Czech> <Czech>Určuje interval mezi každým výpočtem</Czech>
<Portuguese>Define o intervalo entre cada cálculo</Portuguese> <Portuguese>Define o intervalo entre cada cálculo</Portuguese>
<French>Défini un intervalle de calcul entre deux simulations</French> <French>Défini un intervalle de calcul entre deux simulations</French>
<Hungarian>Meghatározza a számítási lépések közötti időintervallumot</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_DisplayName"> <Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_DisplayName">
<English>Simulation Radius</English> <English>Simulation Radius</English>
@ -222,6 +243,7 @@
<Czech>Rozsah simulace</Czech> <Czech>Rozsah simulace</Czech>
<Portuguese>Raio de simulação</Portuguese> <Portuguese>Raio de simulação</Portuguese>
<French>Rayon de simulation</French> <French>Rayon de simulation</French>
<Hungarian>Szimuláció hatóköre</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_Description"> <Key ID="STR_ACE_Advanced_Ballistics_simulationRadius_Description">
<English>Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles</English> <English>Defines the radius around the player (in meters) at which advanced ballistics are applied to projectiles</English>
@ -231,6 +253,7 @@
<Czech>Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil</Czech> <Czech>Určuje oblast kolem hráče (v metrech), kde je pokročilá balistika použita na projektil</Czech>
<Portuguese>Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis</Portuguese> <Portuguese>Define o raio ao redor do jogador (em metros) onde a balística avançada será aplicada aos projéteis</Portuguese>
<French>Défini le rayon autour du joueur (en mètres) d'application de la balistique avancée</French> <French>Défini le rayon autour du joueur (en mètres) d'application de la balistique avancée</French>
<Hungarian>Meghatározza a játékos körüli hatókört (méterben), ahol a lövedékek fejlett ballisztikát használnak</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Advanced_Ballistics_Description"> <Key ID="STR_ACE_Advanced_Ballistics_Description">
<English>This module enables advanced ballistics simulation - meaning the trajectory of projectiles is influenced by variables like air temperature, atmospheric pressure, humidity, gravity, the type of ammunition and the weapon from which it was fired.</English> <English>This module enables advanced ballistics simulation - meaning the trajectory of projectiles is influenced by variables like air temperature, atmospheric pressure, humidity, gravity, the type of ammunition and the weapon from which it was fired.</English>
@ -238,6 +261,7 @@
<Czech>Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice.</Czech> <Czech>Tento modul umožňuje aktivovat pokročilou balistiku, která vypočítává trajektorii kulky a bere do úvahy věci jako je teplota vzduchu, atmosférický tlak, vlhkost vzduchu, gravitaci, typ munice a zbraň, ze které je náboj vystřelen. To vše přispívá k velmi přesné balistice.</Czech>
<Portuguese>Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa.</Portuguese> <Portuguese>Este módulo permite que você ative cálculos de balística avançada, fazendo a trajetória do projétil levar em consideração coisas como temperatura do ar, pressão atmosférica, umidade, força de Coriolis, a gravidade, o modelo da arma no qual o disparo é realizado e o tipo de munição. Tudo isso acrescenta-se a um balística muito precisa.</Portuguese>
<French>Ce module active la simulation de balistique avancée - ie les projectiles sont influencé par des varibles comme le vent, la température, la pression atmosphérique, l'humidité, la gravité, le type de munition et l'arme avec laquelles ils sont tirés</French> <French>Ce module active la simulation de balistique avancée - ie les projectiles sont influencé par des varibles comme le vent, la température, la pression atmosphérique, l'humidité, la gravité, le type de munition et l'arme avec laquelles ils sont tirés</French>
<Hungarian>Ez a modul engedélyezi a fejlett ballisztikai szimulációt - a lövedékek röppályáját befolyásolni fogja a levegő hőmérséklete, légnyomás, páratartalom, gravitáció, a lövedék fajtája, valamint a fegyver, amiből kilőtték a lövedéket.</Hungarian>
</Key> </Key>
</Package> </Package>
</Project> </Project>

View File

@ -1,9 +1,10 @@
ace_aircraft ace_aircraft
============ ============
Changes to air weaponry, flightmodels and HUDs. Changes to air weaponry, flight models and HUDs.
- Contributions by Kimi (geraldbolso1899) for HUD updates
* Contributations by Kimi (geraldbolso1899) for HUD updates
## Maintainers ## Maintainers
@ -11,4 +12,4 @@ The people responsible for merging changes to this component or answering potent
- [KoffeinFlummi](https://github.com/KoffeinFlummi) - [KoffeinFlummi](https://github.com/KoffeinFlummi)
- [commy2](https://github.com/commy2) - [commy2](https://github.com/commy2)
- [jaynus](https://github.com/walterpearce) - [jaynus](https://github.com/walterpearce)

11
addons/apl/README.md Normal file
View File

@ -0,0 +1,11 @@
ace_apl
============
Assets licensed under Arma Public License (APL).
## Maintainers
The people responsible for merging changes to this component or answering potential questions.
- None

View File

@ -21,7 +21,7 @@ class CfgVehicles {
author = "Ruthberg"; author = "Ruthberg";
scope = 2; scope = 2;
scopeCurator = 2; scopeCurator = 2;
displayName = "ATragMX"; displayName = CSTRING(Name);
vehicleClass = "Items"; vehicleClass = "Items";
class TransportItems { class TransportItems {
MACRO_ADDITEM(ACE_ATragMX,1); MACRO_ADDITEM(ACE_ATragMX,1);

View File

@ -3,8 +3,9 @@ ace_atragmx
ATragMX - Handheld ballistics calculator ATragMX - Handheld ballistics calculator
## Maintainers ## Maintainers
The people responsible for merging changes to this component or answering potential questions. The people responsible for merging changes to this component or answering potential questions.
- [Ruthberg] (http://github.com/Ulteq) - [Ruthberg](http://github.com/Ulteq)

View File

@ -57,6 +57,6 @@ GVAR(DialogPFH) = [{
[_this select 1] call cba_fnc_removePerFrameHandler; [_this select 1] call cba_fnc_removePerFrameHandler;
}; };
__ctrlBackground ctrlSetText format [QUOTE(PATHTOF(UI\ATRAG_%1.paa)), ["N", "D"] select (call EFUNC(common,ambientBrightness))]; __ctrlBackground ctrlSetText format [QUOTE(PATHTOF(UI\ATRAG_%1.paa)), ["N", "D"] select (call EFUNC(common,ambientBrightness))];
}, 60, []] call cba_fnc_addPerFrameHandler; }, 60, []] call CBA_fnc_addPerFrameHandler;
true true

View File

@ -8,3 +8,24 @@ class Extended_PostInit_EventHandlers {
clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) ); clientInit = QUOTE( call COMPILE_FILE(XEH_clientInit) );
}; };
}; };
class Extended_GetIn_EventHandlers {
class All {
class ADDON {
getIn = QUOTE(_this call FUNC(handleGetIn));
};
};
};
class Extended_GetOut_EventHandlers {
class All {
class ADDON {
getOut = QUOTE(_this call FUNC(handleGetOut));
};
};
};
class Extended_Killed_EventHandlers {
class All {
class ADDON {
killed = QUOTE(_this call FUNC(handleKilled));
};
};
};

View File

@ -2,7 +2,9 @@ ace_attach
========== ==========
Introducing the ability to attach various throwables to yourself or vehicles, to mark your position and assist in IFF. Introducing the ability to attach various throwables to yourself or vehicles, to mark your position and assist in IFF.
Adds item `ACE_IR_Strobe_Item`.
#### Items Added:
`ACE_IR_Strobe_Item`
## Maintainers ## Maintainers

View File

@ -7,6 +7,9 @@ PREP(canAttach);
PREP(canDetach); PREP(canDetach);
PREP(detach); PREP(detach);
PREP(getChildrenAttachActions); PREP(getChildrenAttachActions);
PREP(handleGetIn);
PREP(handleGetOut);
PREP(handleKilled);
PREP(placeApprove); PREP(placeApprove);
ADDON = true; ADDON = true;

View File

@ -17,15 +17,14 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_itemClassname", "_itemVehClass", "_onAtachText", "_selfAttachPosition", "_attachedItem", "_tempObject", "_actionID", "_model"]; params ["_attachToVehicle","_unit","_args", ["_silentScripted", false]];
_args params [["_itemClassname","", [""]]];
TRACE_4("params",_attachToVehicle,_unit,_itemClassname,_silentScripted);
PARAMS_3(_attachToVehicle,_unit,_args); private ["_itemVehClass", "_onAtachText", "_selfAttachPosition", "_attachedItem", "_tempObject", "_actionID", "_model"];
_itemClassname = [_args, 0, ""] call CBA_fnc_defaultParam;
//Sanity Check (_unit has item in inventory, not over attach limit) //Sanity Check (_unit has item in inventory, not over attach limit)
if ((_itemClassname == "") || {!(_this call FUNC(canAttach))}) exitWith {ERROR("Tried to attach, but check failed");}; if ((_itemClassname == "") || {(!_silentScripted) && {!(_this call FUNC(canAttach))}}) exitWith {ERROR("Tried to attach, but check failed");};
_selfAttachPosition = [_unit, [-0.05, 0, 0.12], "rightshoulder"];
_itemVehClass = getText (configFile >> "CfgWeapons" >> _itemClassname >> "ACE_Attachable"); _itemVehClass = getText (configFile >> "CfgWeapons" >> _itemClassname >> "ACE_Attachable");
_onAtachText = getText (configFile >> "CfgWeapons" >> _itemClassname >> "displayName"); _onAtachText = getText (configFile >> "CfgWeapons" >> _itemClassname >> "displayName");
@ -40,12 +39,13 @@ if (_itemVehClass == "") exitWith {ERROR("no ACE_Attachable for Item");};
_onAtachText = format [localize LSTRING(Item_Attached), _onAtachText]; _onAtachText = format [localize LSTRING(Item_Attached), _onAtachText];
if (_unit == _attachToVehicle) then { //Self Attachment if (_unit == _attachToVehicle) then { //Self Attachment
_unit removeItem _itemClassname; // Remove item
_attachedItem = _itemVehClass createVehicle [0,0,0]; _attachedItem = _itemVehClass createVehicle [0,0,0];
_attachedItem attachTo _selfAttachPosition; _attachedItem attachTo [_unit, [-0.05, 0, 0.12], "rightshoulder"];
[_onAtachText] call EFUNC(common,displayTextStructured); if (!_silentScripted) then {
_attachToVehicle setVariable [QGVAR(Objects), [_attachedItem], true]; _unit removeItem _itemClassname; // Remove item
_attachToVehicle setVariable [QGVAR(ItemNames), [_itemClassname], true]; [_onAtachText] call EFUNC(common,displayTextStructured);
};
_unit setVariable [QGVAR(attached), [[_attachedItem, _itemClassname]], true];
} else { } else {
GVAR(placeAction) = PLACE_WAITING; GVAR(placeAction) = PLACE_WAITING;
@ -69,9 +69,8 @@ if (_unit == _attachToVehicle) then { //Self Attachment
[{ [{
private["_angle", "_dir", "_screenPos", "_realDistance", "_up", "_virtualPos", "_virtualPosASL", "_lineInterection"]; private["_angle", "_dir", "_screenPos", "_realDistance", "_up", "_virtualPos", "_virtualPosASL", "_lineInterection"];
params ["_args","_idPFH"];
PARAMS_2(_args,_pfID); _args params ["_unit","_attachToVehicle","_itemClassname","_itemVehClass","_onAtachText","_actionID"];
EXPLODE_6_PVT(_args,_unit,_attachToVehicle,_itemClassname,_itemVehClass,_onAtachText,_actionID);
_virtualPosASL = (eyePos _unit) vectorAdd (positionCameraToWorld [0,0,0.6]) vectorDiff (positionCameraToWorld [0,0,0]); _virtualPosASL = (eyePos _unit) vectorAdd (positionCameraToWorld [0,0,0.6]) vectorDiff (positionCameraToWorld [0,0,0]);
if (cameraView == "EXTERNAL") then { if (cameraView == "EXTERNAL") then {
@ -88,7 +87,7 @@ if (_unit == _attachToVehicle) then { //Self Attachment
{!([_unit, _attachToVehicle, []] call EFUNC(common,canInteractWith))} || {!([_unit, _attachToVehicle, []] call EFUNC(common,canInteractWith))} ||
{!([_attachToVehicle, _unit, _itemClassname] call FUNC(canAttach))}) then { {!([_attachToVehicle, _unit, _itemClassname] call FUNC(canAttach))}) then {
[_pfID] call CBA_fnc_removePerFrameHandler; [_idPFH] call CBA_fnc_removePerFrameHandler;
[_unit, QGVAR(vehAttach), false] call EFUNC(common,setForceWalkStatus); [_unit, QGVAR(vehAttach), false] call EFUNC(common,setForceWalkStatus);
[] call EFUNC(interaction,hideMouseHint); [] call EFUNC(interaction,hideMouseHint);
[_unit, "DefaultAction", (_unit getVariable [QGVAR(placeActionEH), -1])] call EFUNC(common,removeActionEventHandler); [_unit, "DefaultAction", (_unit getVariable [QGVAR(placeActionEH), -1])] call EFUNC(common,removeActionEventHandler);

View File

@ -17,14 +17,17 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_3(_attachToVehicle,_player,_args); params ["_attachToVehicle","_player","_args"];
_args params [["_itemClassname","", [""]]];
TRACE_3("params",_attachToVehicle,_player,_itemClassname);
private ["_itemName", "_attachLimit", "_attachedObjects","_playerPos"]; private ["_attachLimit", "_attachedObjects"];
_itemName = [_args, 0, ""] call CBA_fnc_defaultParam;
_attachLimit = [6, 1] select (_player == _attachToVehicle); _attachLimit = [6, 1] select (_player == _attachToVehicle);
_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; _attachedObjects = _attachToVehicle getVariable [QGVAR(attached), []];
_playerPos = (ACE_player modelToWorldVisual (ACE_player selectionPosition "pilot")); ((_player == _attachToVehicle) || {canStand _player}) &&
{(_attachToVehicle distance _player) < 7} &&
(canStand _player) && {(_attachToVehicle distance _player) < 7} && {alive _attachToVehicle} && {(count _attachedObjects) < _attachLimit} && {_itemName in ((itemsWithMagazines _player) + [""])}; {alive _attachToVehicle} &&
{(count _attachedObjects) < _attachLimit} &&
{_itemClassname in ((itemsWithMagazines _player) + [""])};

View File

@ -16,25 +16,25 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_attachToVehicle,_unit); params ["_attachToVehicle", "_unit"];
TRACE_2("params",_attachToVehicle,_unit);
private ["_attachedObjects", "_inRange"]; _attachedList = _attachToVehicle getVariable [QGVAR(attached), []];
if ((count _attachedList) == 0) exitWith {false};
_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; private ["_inRange"];
_inRange = false; _inRange = false;
if (_unit == _attachToVehicle) then { {
_inRange = count _attachedObjects > 0; _x params ["_xObject"];
} else { if (isNull _xObject) exitWith {
//Scan if unit is within range (using 2d distance) TRACE_1("Null attached",_x);
private ["_unitPos", "_objectPos"]; _attachedList deleteAt _forEachIndex;
_unitPos = getPos _unit; _attachToVehicle setVariable [QGVAR(attached), _attachedList, true];
_unitPos set [2,0]; };
{ if (((getPos _unit) distance2d (getPos _xObject)) < 4) exitWith {_inRange = true};
_objectPos = getPos _x; } forEach _attachedList;
_objectPos set [2, 0];
if (_objectPos distance _unitPos < 4) exitWith {_inRange = true};
} forEach _attachedObjects;
};
canStand _unit && {_inRange} && {alive _attachToVehicle} _inRange &&
{(_unit == _attachToVehicle) || {canStand _unit}} &&
{alive _attachToVehicle}

View File

@ -16,14 +16,12 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_attachToVehicle,_unit); params ["_attachToVehicle","_unit"],
TRACE_2("params",_attachToVehicle,_unit);
private ["_attachedObjects", "_attachedItems", "_itemDisplayName"]; private ["_attachedList", "_itemDisplayName", "_attachedObject", "_attachedIndex", "_itemName", "_minDistance"];
_attachedObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; _attachedList = _attachToVehicle getVariable [QGVAR(attached), []];
_attachedItems = _attachToVehicle getVariable [QGVAR(ItemNames), []];
private ["_attachedObject", "_attachedIndex", "_itemName", "_minDistance", "_unitPos", "_objectPos"];
_attachedObject = objNull; _attachedObject = objNull;
_attachedIndex = -1; _attachedIndex = -1;
@ -31,18 +29,17 @@ _itemName = "";
//Find closest attached object //Find closest attached object
_minDistance = 1000; _minDistance = 1000;
_unitPos = getPos _unit;
_unitPos set [2,0];
{ {
_objectPos = getPos _x; _x params ["_xObject", "_xItemName"];
_objectPos set [2, 0];
if (_objectPos distance _unitPos < _minDistance) then { if (((getPos _unit) distance2d (getPos _xObject)) < _minDistance) then {
_minDistance = _objectPos distance _unitPos; _minDistance = ((getPos _unit) distance2d (getPos _xObject));
_attachedObject = _x; _attachedObject = _xObject;
_itemName = _attachedItems select _forEachIndex; _itemName = _xItemName;
_attachedIndex = _forEachIndex; _attachedIndex = _forEachIndex;
}; };
} forEach _attachedObjects; } forEach _attachedList;
// Check if unit has an attached item // Check if unit has an attached item
if (isNull _attachedObject || {_itemName == ""}) exitWith {ERROR("Could not find attached object")}; if (isNull _attachedObject || {_itemName == ""}) exitWith {ERROR("Could not find attached object")};
@ -67,10 +64,8 @@ if (toLower _itemName in ["b_ir_grenade", "o_ir_grenade", "i_ir_grenade"]) then
}; };
// Reset unit variables // Reset unit variables
_attachedObjects deleteAt _attachedIndex; _attachedList deleteAt _attachedIndex;
_attachedItems deleteAt _attachedIndex; _attachToVehicle setVariable [QGVAR(attached), _attachedList, true];
_attachToVehicle setVariable [QGVAR(Objects), _attachedObjects, true];
_attachToVehicle setVariable [QGVAR(ItemNames), _attachedItems, true];
// Display message // Display message
_itemDisplayName = getText (configFile >> "CfgWeapons" >> _itemName >> "displayName"); _itemDisplayName = getText (configFile >> "CfgWeapons" >> _itemName >> "displayName");

View File

@ -18,7 +18,8 @@
#include "script_component.hpp" #include "script_component.hpp"
private ["_listed", "_actions", "_item", "_displayName", "_picture", "_action"]; private ["_listed", "_actions", "_item", "_displayName", "_picture", "_action"];
PARAMS_2(_target,_player); params ["_target","_player"];
TRACE_2("params",_target,_player);
_listed = []; _listed = [];
_actions = []; _actions = [];
@ -30,7 +31,7 @@ _actions = [];
if (getText (_item >> "ACE_Attachable") != "") then { if (getText (_item >> "ACE_Attachable") != "") then {
_displayName = getText(_item >> "displayName"); _displayName = getText(_item >> "displayName");
_picture = getText(_item >> "picture"); _picture = getText(_item >> "picture");
_action = [_x, _displayName, _picture, {_this call FUNC(attach)}, {_this call FUNC(canAttach)}, {}, [_x]] call EFUNC(interact_menu,createAction); _action = [_x, _displayName, _picture, {[{_this call FUNC(attach)}, _this] call EFUNC(common,execNextFrame)}, {_this call FUNC(canAttach)}, {}, [_x]] call EFUNC(interact_menu,createAction);
_actions pushBack [_action, [], _target]; _actions pushBack [_action, [], _target];
}; };
}; };
@ -43,7 +44,7 @@ _actions = [];
if (getText (_item >> "ACE_Attachable") != "") then { if (getText (_item >> "ACE_Attachable") != "") then {
_displayName = getText(_item >> "displayName"); _displayName = getText(_item >> "displayName");
_picture = getText(_item >> "picture"); _picture = getText(_item >> "picture");
_action = [_x, _displayName, _picture, {_this call FUNC(attach)}, {_this call FUNC(canAttach)}, {}, [_x]] call EFUNC(interact_menu,createAction); _action = [_x, _displayName, _picture, {[{_this call FUNC(attach)}, _this] call EFUNC(common,execNextFrame)}, {_this call FUNC(canAttach)}, {}, [_x]] call EFUNC(interact_menu,createAction);
_actions pushBack [_action, [], _target]; _actions pushBack [_action, [], _target];
}; };
}; };

View File

@ -0,0 +1,38 @@
/*
* Author: PabstMirror
* Handles when a unit gets in to a vehicle.
*
* Arguments:
* 0: vehicle <OBJECT>
* 1: dunno <OBJECT>
* 2: unit <OBJECT>
*
* Return Value:
* None
*
* Example:
* [car2, x, player] call ACE_attach_fnc_handleGetIn
*
* Public: No
*/
#include "script_component.hpp"
if (!isServer) exitWith {};
params ["", "", "_unit"];
TRACE_1("params",_unit);
private ["_attachedList"];
_attachedList = _unit getVariable [QGVAR(attached), []];
if ((count _attachedList) == 0) exitWith {};
(_attachedList select 0) params ["_xObject"];
if (!isNull _xObject) then {
detach _xObject;
_xObject setPos ((getPos _unit) vectorAdd [0, 0, -1000]);
[{deleteVehicle (_this select 0)}, [_xObject], 2] call EFUNC(common,waitAndExecute);
(_attachedList select 0) set [0, objNull];
};
_unit setVariable [QGVAR(attached), _attachedList, true];

View File

@ -0,0 +1,35 @@
/*
* Author: PabstMirror
* Handles when a unit gets in to a vehicle.
*
* Arguments:
* 0: vehicle <OBJECT>
* 1: dunno <OBJECT>
* 2: unit <OBJECT>
*
* Return Value:
* None
*
* Example:
* [car2, x, player] call ACE_attach_fnc_handleGetOut
*
* Public: No
*/
#include "script_component.hpp"
if (!isServer) exitWith {};
params ["", "", "_unit"];
TRACE_1("params",_unit);
private ["_attachedList"];
_attachedList = _unit getVariable [QGVAR(attached), []];
if ((count _attachedList) == 0) exitWith {};
(_attachedList select 0) params ["_xObject", "_xItemName"];
if (isNull _xObject) then {
TRACE_1("null attached when exiting vehicle, scripted reattach",_xItemName);
_unit setVariable [QGVAR(attached), [], true];
[_unit, _unit, _xItemName, true] call FUNC(attach);
};

View File

@ -0,0 +1,39 @@
/*
* Author: PabstMirror
* Handles when vehicle or man is killed.
* Note: Runs where unit is local.
*
* Arguments:
* 0: DeadVehicle <OBJECT>
*
* Return Value:
* None
*
* Example:
* [bob1] call ACE_attach_fnc_handleKilled
*
* Public: No
*/
#include "script_component.hpp"
params ["_deadUnit"];
TRACE_1("params",_deadUnit);
private ["_attachedList"];
_attachedList = _deadUnit getVariable [QGVAR(attached), []];
if ((count _attachedList) == 0) exitWith {};
{
_x params ["_xObject"];
TRACE_2("detaching",_xObject,_deadUnit);
detach _xObject;
//If it's a vehicle, also delete the attached
if (!(_deadUnit isKindOf "CAManBase")) then {
_xObject setPos ((getPos _deadUnit) vectorAdd [0, 0, -1000]);
[{deleteVehicle (_this select 0)}, [_xObject], 2] call EFUNC(common,waitAndExecute);
};
} forEach _attachedList;
_deadUnit setVariable [QGVAR(attached), nil, true];

View File

@ -25,9 +25,10 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_startingOffset", "_startDistanceFromCenter", "_closeInUnitVector", "_closeInMax", "_closeInMin", "_closeInDistance", "_endPosTestOffset", "_endPosTest", "_doesIntersect", "_startingPosShifted", "_startASL", "_endPosShifted", "_endASL", "_attachedObject", "_currentObjects", "_currentItemNames"]; private ["_startingOffset", "_startDistanceFromCenter", "_closeInUnitVector", "_closeInMax", "_closeInMin", "_closeInDistance", "_endPosTestOffset", "_endPosTest", "_doesIntersect", "_startingPosShifted", "_startASL", "_endPosShifted", "_endASL", "_attachedObject", "_attachList"];
PARAMS_6(_unit,_attachToVehicle,_itemClassname,_itemVehClass,_onAtachText,_startingPosition); params ["_unit", "_attachToVehicle", "_itemClassname", "_itemVehClass", "_onAtachText", "_startingPosition"];
TRACE_6("params",_unit,_attachToVehicle,_itemClassname,_itemVehClass,_onAtachText,_startingPosition);
_startingOffset = _attachToVehicle worldToModel _startingPosition; _startingOffset = _attachToVehicle worldToModel _startingPosition;
@ -86,12 +87,9 @@ _attachedObject attachTo [_attachToVehicle, _endPosTestOffset];
//Remove Item from inventory //Remove Item from inventory
_unit removeItem _itemClassname; _unit removeItem _itemClassname;
//Add Object to ACE_AttachedObjects and ACE_AttachedItemNames //Add Object to attached array
_currentObjects = _attachToVehicle getVariable [QGVAR(Objects), []]; _attachList = _attachToVehicle getVariable [QGVAR(attached), []];
_currentObjects pushBack _attachedObject; _attachList pushBack [_attachedObject, _itemClassname];
_attachToVehicle setVariable [QGVAR(Objects), _currentObjects, true]; _attachToVehicle setVariable [QGVAR(attached), _attachList, true];
_currentItemNames = _attachToVehicle getVariable [QGVAR(ItemNames), []];
_currentItemNames pushBack _itemClassname;
_attachToVehicle setVariable [QGVAR(ItemNames), _currentItemNames, true];
[_onAtachText] call EFUNC(common,displayTextStructured); [_onAtachText] call EFUNC(common,displayTextStructured);

View File

@ -5,7 +5,7 @@
<English>Attach item &gt;&gt;</English> <English>Attach item &gt;&gt;</English>
<German>Gegenstand befestigen &gt;&gt;</German> <German>Gegenstand befestigen &gt;&gt;</German>
<Spanish>Acoplar objeto &gt;&gt;</Spanish> <Spanish>Acoplar objeto &gt;&gt;</Spanish>
<Polish>Przyczep przedmiot &gt;&gt;</Polish> <Polish>Przyczep &gt;&gt;</Polish>
<French>Attacher l'objet &gt;&gt;</French> <French>Attacher l'objet &gt;&gt;</French>
<Czech>Připnout předmět &gt;&gt;</Czech> <Czech>Připnout předmět &gt;&gt;</Czech>
<Portuguese>Fixar item &gt;&gt;</Portuguese> <Portuguese>Fixar item &gt;&gt;</Portuguese>
@ -185,7 +185,7 @@
<English>%1&lt;br/&gt;Attached</English> <English>%1&lt;br/&gt;Attached</English>
<German>%1&lt;br/&gt;befestigt</German> <German>%1&lt;br/&gt;befestigt</German>
<Spanish>%1&lt;br/&gt;acoplada</Spanish> <Spanish>%1&lt;br/&gt;acoplada</Spanish>
<Polish>%1&lt;br/&gt;przyczepiono</Polish> <Polish>Przyczepiono&lt;br/&gt;%1</Polish>
<French>%1&lt;br/&gt;attachée</French> <French>%1&lt;br/&gt;attachée</French>
<Czech>%1&lt;br/&gt;Připnutý</Czech> <Czech>%1&lt;br/&gt;Připnutý</Czech>
<Portuguese>%1&lt;br/&gt;Fixada</Portuguese> <Portuguese>%1&lt;br/&gt;Fixada</Portuguese>
@ -197,7 +197,7 @@
<English>%1&lt;br/&gt;Detached</English> <English>%1&lt;br/&gt;Detached</English>
<German>%1&lt;br/&gt;entfernt</German> <German>%1&lt;br/&gt;entfernt</German>
<Spanish>%1&lt;br/&gt;quitada</Spanish> <Spanish>%1&lt;br/&gt;quitada</Spanish>
<Polish>%1&lt;br/&gt;odczepiono</Polish> <Polish>Odczepiono&lt;br/&gt;%1</Polish>
<French>%1&lt;br/&gt;détachée</French> <French>%1&lt;br/&gt;détachée</French>
<Czech>%1&lt;br/&gt;Odepnutý</Czech> <Czech>%1&lt;br/&gt;Odepnutý</Czech>
<Portuguese>%1&lt;br/&gt;Separada</Portuguese> <Portuguese>%1&lt;br/&gt;Separada</Portuguese>
@ -206,4 +206,4 @@
<Russian>%1&lt;br/&gt;отсоединен(-а)</Russian> <Russian>%1&lt;br/&gt;отсоединен(-а)</Russian>
</Key> </Key>
</Package> </Package>
</Project> </Project>

View File

@ -1,7 +1,8 @@
ace_backpacks ace_backpacks
================= =================
Adds indication when someone else opens your backpack (soundeffect / camShake). Adds indication when someone else opens your backpack (sound effect and camera shake).
## Maintainers ## Maintainers

View File

@ -1,3 +1,3 @@
#include "script_component.hpp" #include "script_component.hpp"
["backpackOpened", {_this call FUNC(backpackOpened)}] call EFUNC(common,addEventHandler); ["backpackOpened", DFUNC(backpackOpened)] call EFUNC(common,addEventHandler);

View File

@ -3,7 +3,6 @@
ADDON = false; ADDON = false;
PREP(backpackOpened); PREP(backpackOpened);
PREP(getBackpackAssignedUnit);
PREP(isBackpack); PREP(isBackpack);
PREP(onOpenInventory); PREP(onOpenInventory);

View File

@ -2,18 +2,18 @@
* Author: commy2 * Author: commy2
* *
* Someone opened your backpack. Execute locally. * Someone opened your backpack. Execute locally.
* *
* Argument: * Argument:
* 0: Who accessed your inventory? (Object) * 0: Who accessed your inventory? (Object)
* 1: Unit that wields the backpack (Object) * 1: Unit that wields the backpack (Object)
* 2: The backpack object (Object) * 2: The backpack object (Object)
* *
* Return value: * Return value:
* None. * None.
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_sounds", "_position"];
PARAMS_3(_unit,_target,_backpack); params ["_target", "_backpack"];
// do cam shake if the target is the player // do cam shake if the target is the player
if ([_target] call EFUNC(common,isPlayer)) then { if ([_target] call EFUNC(common,isPlayer)) then {
@ -21,7 +21,6 @@ if ([_target] call EFUNC(common,isPlayer)) then {
}; };
// play a rustling sound // play a rustling sound
private ["_sounds", "_position"];
_sounds = [ _sounds = [
/*"a3\sounds_f\characters\ingame\AinvPknlMstpSlayWpstDnon_medic.wss", /*"a3\sounds_f\characters\ingame\AinvPknlMstpSlayWpstDnon_medic.wss",

View File

@ -1,22 +0,0 @@
/*
* Author: commy2
*
* Returns the unit that has the given backpack object equipped.
*
* Argument:
* 0: A backpack object (Object)
*
* Return value:
* Unit that has the backpack equipped. (Object)
*/
#include "script_component.hpp"
private ["_backpack", "_unit"];
_backpack = _this select 0;
_unit = objNull;
{
if (backpackContainer _x == _backpack) exitWith {_unit = _x};
} forEach (allUnits + allDeadMen);
_unit

View File

@ -11,9 +11,8 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_backpack", "_config"]; private ["_config"];
params ["_backpack"];
_backpack = _this select 0;
if (typeName _backpack == "OBJECT") then { if (typeName _backpack == "OBJECT") then {
_backpack = typeOf _backpack; _backpack = typeOf _backpack;

View File

@ -1,30 +1,29 @@
/* /*
* Author: commy2 * Author: commy2
* *
* Handle the open inventory event. Display message on traget client. * Handle the open inventory event. Display message on target client.
* *
* Argument: * Argument:
* Input from "InventoryOpened" eventhandler * Input from "InventoryOpened" eventhandler
* *
* Return value: * Return value:
* false. Always open the inventory dialog. (Bool) * false. Always open the inventory dialog. (Bool)
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_unit", "_backpack"]; params ["_unit","_backpack"];
_unit = _this select 0; // exit if the target is not a real backpack, i.e. parachute, static weapon bag etc.
_backpack = _this select 1; if !([_backpack] call FUNC(isBackpack)) exitWith {false};
// exit if the target is not a backpack
if !([_backpack] call FUNC(isBackpack)) exitWith {};
// get the unit that wears the backpack object // get the unit that wears the backpack object
private "_target"; private "_target";
_target = [_backpack] call FUNC(getBackpackAssignedUnit); _target = objectParent _backpack;
if (isNull _target) exitWith {false};
// raise event on target unit // raise event on target unit
["backpackOpened", _target, [_unit, _target, _backpack]] call EFUNC(common,targetEvent); ["backpackOpened", _target, [_target, _backpack]] call EFUNC(common,targetEvent);
// return false to open inventory as usual // return false to open inventory as usual
false false

View File

@ -6,23 +6,11 @@ class CfgAmmo {
timeToLive=6; timeToLive=6;
}; };
class B_20mm : BulletBase {
timeToLive=30;
};
class B_25mm : BulletBase {
timeToLive=30;
};
class B_35mm_AA : BulletBase {
timeToLive=30;
};
class B_30mm_AP : BulletBase {
timeToLive=30;
};
class B_556x45_Ball : BulletBase { class B_556x45_Ball : BulletBase {
airFriction=-0.00126466; airFriction=-0.00126466;
hit=8; hit=8;
typicalSpeed=750; typicalSpeed=750;
tracerScale = 1;
tracerStartTime=0.073; // M856 tracer burns out to 800m tracerStartTime=0.073; // M856 tracer burns out to 800m
tracerEndTime=1.57123; // Time in seconds calculated with ballistics calculator tracerEndTime=1.57123; // Time in seconds calculated with ballistics calculator
ACE_caliber=5.69; ACE_caliber=5.69;
@ -128,9 +116,13 @@ class CfgAmmo {
ACE_muzzleVelocities[]={785, 883, 925}; ACE_muzzleVelocities[]={785, 883, 925};
ACE_barrelLengths[]={254.0, 414.02, 508.0}; ACE_barrelLengths[]={254.0, 414.02, 508.0};
}; };
class B_56x15_dual: BulletBase {
tracerScale = 0.5;
};
class B_65x39_Caseless : BulletBase { class B_65x39_Caseless : BulletBase {
airFriction=-0.00075308; airFriction=-0.00075308;
typicalSpeed=800; typicalSpeed=800;
tracerScale = 1.1; //1.0;
ACE_caliber=6.706; ACE_caliber=6.706;
ACE_bulletLength=32.893; ACE_bulletLength=32.893;
ACE_bulletMass=7.9704; ACE_bulletMass=7.9704;
@ -180,10 +172,15 @@ class CfgAmmo {
ACE_muzzleVelocities[]={750, 820, 840, 852, 860}; ACE_muzzleVelocities[]={750, 820, 840, 852, 860};
ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4}; ACE_barrelLengths[]={254.0, 406.4, 508.0, 609.6, 660.4};
}; };
class SubmunitionBullet;
class B_65x39_Minigun_Caseless: SubmunitionBullet {
tracerScale = 1.1; //1.0;
};
class B_762x51_Ball : BulletBase { class B_762x51_Ball : BulletBase {
airFriction=-0.00100957; airFriction=-0.00100957;
typicalSpeed=833; typicalSpeed=833;
hit=9; hit=9;
tracerScale = 1.2; //0.6;
tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m tracerStartTime=0.073; // Based on the British L5A1 which burns out to 1000m
tracerEndTime=2.15957; // Time in seconds calculated with ballistics calculator tracerEndTime=2.15957; // Time in seconds calculated with ballistics calculator
ACE_caliber=7.823; ACE_caliber=7.823;
@ -479,6 +476,7 @@ class CfgAmmo {
class B_9x21_Ball : BulletBase { class B_9x21_Ball : BulletBase {
airFriction=-0.00226847; airFriction=-0.00226847;
typicalSpeed=390; typicalSpeed=390;
tracerScale = 0.5;
hit=6; hit=6;
ACE_caliber=9.042; ACE_caliber=9.042;
ACE_bulletLength=15.494; ACE_bulletLength=15.494;
@ -491,6 +489,9 @@ class CfgAmmo {
ACE_muzzleVelocities[]={440, 460, 480}; ACE_muzzleVelocities[]={440, 460, 480};
ACE_barrelLengths[]={101.6, 127.0, 228.6}; ACE_barrelLengths[]={101.6, 127.0, 228.6};
}; };
class B_9x21_Ball_Tracer_Green: B_9x21_Ball {
tracerScale = 0.5;
};
class ACE_9x18_Ball_57N181S : B_9x21_Ball { class ACE_9x18_Ball_57N181S : B_9x21_Ball {
hit=5; hit=5;
airFriction=-0.00190333; airFriction=-0.00190333;
@ -584,6 +585,7 @@ class CfgAmmo {
timeToLive=10; timeToLive=10;
airFriction=-0.00038944; airFriction=-0.00038944;
typicalSpeed=910; typicalSpeed=910;
tracerScale = 1.3; //1.2;
ACE_caliber=10.363; ACE_caliber=10.363;
ACE_bulletLength=54.0; ACE_bulletLength=54.0;
ACE_bulletMass=26.568; ACE_bulletMass=26.568;
@ -670,9 +672,13 @@ class CfgAmmo {
ACE_muzzleVelocities[]={880, 915, 925}; ACE_muzzleVelocities[]={880, 915, 925};
ACE_barrelLengths[]={508.0, 660.4, 711.2}; ACE_barrelLengths[]={508.0, 660.4, 711.2};
}; };
class B_127x33_Ball: BulletBase {
tracerScale = 1.3; //1.2;
};
class B_127x54_Ball : BulletBase { class B_127x54_Ball : BulletBase {
airFriction=-0.00019268; airFriction=-0.00019268;
typicalSpeed=300; typicalSpeed=300;
tracerScale = 1.3;//
ACE_caliber=12.954; ACE_caliber=12.954;
ACE_bulletLength=64.516; ACE_bulletLength=64.516;
ACE_bulletMass=48.6; ACE_bulletMass=48.6;
@ -688,6 +694,7 @@ class CfgAmmo {
timeToLive=10; timeToLive=10;
airFriction=-0.00057503; airFriction=-0.00057503;
typicalSpeed=900; typicalSpeed=900;
tracerScale = 1.3; //1.2;
ACE_caliber=12.954; ACE_caliber=12.954;
ACE_bulletLength=58.674; ACE_bulletLength=58.674;
ACE_bulletMass=41.9256; ACE_bulletMass=41.9256;
@ -703,6 +710,7 @@ class CfgAmmo {
timeToLive=10; timeToLive=10;
airFriction=-0.00057503; airFriction=-0.00057503;
typicalSpeed=900; typicalSpeed=900;
tracerScale = 1.3;//
hit=25; hit=25;
caliber=4.0; caliber=4.0;
ACE_caliber=12.954; ACE_caliber=12.954;
@ -736,6 +744,7 @@ class CfgAmmo {
timeToLive=10; timeToLive=10;
airFriction=-0.00063800; airFriction=-0.00063800;
typicalSpeed=820; typicalSpeed=820;
tracerScale = 1.3; //1.5;
ACE_caliber=12.979; ACE_caliber=12.979;
ACE_bulletLength=64.008; ACE_bulletLength=64.008;
ACE_bulletMass=48.276; ACE_bulletMass=48.276;
@ -750,6 +759,7 @@ class CfgAmmo {
class B_45ACP_Ball : BulletBase { class B_45ACP_Ball : BulletBase {
airFriction=-0.00081221; airFriction=-0.00081221;
typicalSpeed=250; typicalSpeed=250;
tracerScale = 0.6;
ACE_caliber=11.481; ACE_caliber=11.481;
ACE_bulletLength=17.272; ACE_bulletLength=17.272;
ACE_bulletMass=14.904; ACE_bulletMass=14.904;
@ -761,4 +771,36 @@ class CfgAmmo {
ACE_muzzleVelocities[]={230, 250, 285}; ACE_muzzleVelocities[]={230, 250, 285};
ACE_barrelLengths[]={101.6, 127.0, 228.6}; ACE_barrelLengths[]={101.6, 127.0, 228.6};
}; };
class B_19mm_HE: BulletBase {
tracerScale = 1;
};
class B_30mm_HE: B_19mm_HE {
tracerScale = 2.5;
};
class B_20mm: BulletBase {
timeToLive=30;
tracerScale = 1.5; //1;
};
class B_25mm: BulletBase {
timeToLive=30;
tracerScale = 2.0; //1;
};
class B_30mm_AP: BulletBase {
timeToLive=30;
tracerScale = 2.5;
};
class B_35mm_AA: BulletBase {
timeToLive=30;
tracerScale = 2.75; //1.85;
};
class ShellBase;
class Sh_120mm_HE: ShellBase {
tracerScale = 3;
};
class Sh_120mm_APFSDS: ShellBase {
tracerScale = 3;
};
class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase {
tracerScale = 2.5;
};
}; };

View File

@ -3,10 +3,11 @@ ace_ballistics
Changes to weapon, magazine and ammunition values. Changes to weapon, magazine and ammunition values.
## Maintainers ## Maintainers
The people responsible for merging changes to this component or answering potential questions. The people responsible for merging changes to this component or answering potential questions.
- [Ruthberg] (http://github.com/Ulteq) - [Ruthberg](http://github.com/Ulteq)
- [KoffeinFlummi](https://github.com/KoffeinFlummi) - [KoffeinFlummi](https://github.com/KoffeinFlummi)
- [commy2](https://github.com/commy2) - [commy2](https://github.com/commy2)

View File

@ -1,9 +1,9 @@
// by commy2 // by commy2
#include "script_component.hpp" #include "script_component.hpp"
private ["_wall", "_paper"]; private "_paper";
_wall = _this select 0; params ["_wall"];
if (local _wall) then { if (local _wall) then {
_paper = "UserTexture_1x2_F" createVehicle position _wall; _paper = "UserTexture_1x2_F" createVehicle position _wall;

View File

@ -1600,6 +1600,7 @@
<Czech>[ACE] Bedna s municí</Czech> <Czech>[ACE] Bedna s municí</Czech>
<Portuguese>[ACE] Caixa com suprimentos de munição</Portuguese> <Portuguese>[ACE] Caixa com suprimentos de munição</Portuguese>
<French>[ACE] Caisse de munitions</French> <French>[ACE] Caisse de munitions</French>
<Hungarian>[ACE] Lőszeres láda</Hungarian>
</Key> </Key>
</Package> </Package>
</Project> </Project>

View File

@ -5,6 +5,13 @@ class ACE_Settings {
typeName = "BOOL"; typeName = "BOOL";
value = 1; value = 1;
}; };
class GVAR(requireSurrender) {
displayName = CSTRING(ModuleSettings_requireSurrender_name);
description = CSTRING(ModuleSettings_requireSurrender_description);
typeName = "SCALAR";
values[] = {ECSTRING(common,Disabled), CSTRING(SurrenderOnly), CSTRING(SurrenderOrNoWeapon)};
value = 1;
};
class GVAR(allowSurrender) { class GVAR(allowSurrender) {
displayName = CSTRING(ModuleSettings_allowSurrender_name); displayName = CSTRING(ModuleSettings_allowSurrender_name);
description = CSTRING(ModuleSettings_allowSurrender_description); description = CSTRING(ModuleSettings_allowSurrender_description);

View File

@ -18,6 +18,11 @@ class CfgMovesBasic {
default = "ACE_AmovPercMstpSsurWnonDnon"; default = "ACE_AmovPercMstpSsurWnonDnon";
PutDown = ""; PutDown = "";
}; };
class ACE_CivilHandCuffedFFVActions: ACE_CivilStandHandcuffedActions {
stop = "ACE_HandcuffedFFV";
StopRelaxed = "ACE_HandcuffedFFV";
default = "ACE_HandcuffedFFV";
};
}; };
}; };
@ -30,6 +35,12 @@ class CfgMovesMaleSdr: CfgMovesBasic {
class CutSceneAnimationBase; class CutSceneAnimationBase;
#define MACRO_ANIMATION \
head = "headDefault"; \
aimingBody = "aimingNo"; \
forceAim = 1; \
static = 1;
//Handcuffed Anims: //Handcuffed Anims:
class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase { class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon: CutSceneAnimationBase {
actions = "ACE_CivilStandHandcuffedActions"; actions = "ACE_CivilStandHandcuffedActions";
@ -40,6 +51,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1}; ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1};
canReload = 0; canReload = 0;
MACRO_ANIMATION
}; };
class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { class ACE_AmovPercMstpScapWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon {
file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_Ease"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\AmovPercMstpSnonWnonDnon_Ease";
@ -47,14 +59,25 @@ class CfgMovesMaleSdr: CfgMovesBasic {
ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; ConnectTo[] = {"ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01}; InterpolateTo[] = {"Unconscious",0.01};
looped = 1; looped = 1;
MACRO_ANIMATION
}; };
class ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon { class ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon {
actions = "CivilStandActions"; actions = "CivilStandActions";
file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\amovpercmstpsnonwnondnon_easeout"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\non\non\amovpercmstpsnonwnondnon_easeout";
ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpScapWnonDnon",0.1};
MACRO_ANIMATION
}; };
//Handcuffed-FFV:
class ACE_HandcuffedFFV: ACE_AmovPercMstpScapWnonDnon {
file = "\A3\cargoposes_F_heli\anim\passenger_flatground_3idleunarmed.rtm";
actions = "ACE_CivilHandCuffedFFVActions";
ConnectTo[] = {};
MACRO_ANIMATION
};
//Surrender Anims: //Surrender Anims:
class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon: CutSceneAnimationBase { class ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon: CutSceneAnimationBase {
actions = "ACE_CivilStandSurrenderActions"; actions = "ACE_CivilStandSurrenderActions";
@ -65,6 +88,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon",0.1}; ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1};
canReload = 0; canReload = 0;
MACRO_ANIMATION
}; };
class ACE_AmovPercMstpSsurWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { class ACE_AmovPercMstpSsurWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon {
file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon";
@ -72,6 +96,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
looped = 1; looped = 1;
ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1}; ConnectTo[] = {"ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01}; InterpolateTo[] = {"Unconscious",0.01};
MACRO_ANIMATION
}; };
class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon {
speed = 0.5; //for gameplay reasons, slow this down speed = 0.5; //for gameplay reasons, slow this down
@ -79,6 +104,7 @@ class CfgMovesMaleSdr: CfgMovesBasic {
file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon";
ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1};
InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1}; InterpolateTo[] = {"Unconscious",0.01,"ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon",0.1};
MACRO_ANIMATION
}; };
}; };
}; };

View File

@ -12,17 +12,17 @@ class CfgVehicles {
exceptions[] = {}; exceptions[] = {};
icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); icon = QUOTE(PATHTOF(UI\handcuff_ca.paa));
}; };
class ACE_RemoveHandcuffs {
displayName = CSTRING(ReleaseCaptive);
selection = "righthand";
distance = 2;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs));
statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs));
exceptions[] = {};
icon = QUOTE(PATHTOF(UI\handcuff_ca.paa));
};
class ACE_MainActions { class ACE_MainActions {
class ACE_RemoveHandcuffs {
displayName = CSTRING(ReleaseCaptive);
selection = "righthand";
distance = 2;
condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs));
statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs));
exceptions[] = {};
icon = QUOTE(PATHTOF(UI\handcuff_ca.paa));
};
class ACE_EscortCaptive { class ACE_EscortCaptive {
displayName = CSTRING(EscortCaptive); displayName = CSTRING(EscortCaptive);
distance = 4; distance = 4;
@ -97,7 +97,7 @@ class CfgVehicles {
}; };
}; };
#define MACRO_LOADUNLOADCAPTIVE \ #define MACRO_LOADCAPTIVE \
class ACE_Actions { \ class ACE_Actions { \
class ACE_MainActions { \ class ACE_MainActions { \
class GVAR(LoadCaptive) { \ class GVAR(LoadCaptive) { \
@ -113,27 +113,27 @@ class CfgVehicles {
class LandVehicle; class LandVehicle;
class Car: LandVehicle { class Car: LandVehicle {
MACRO_LOADUNLOADCAPTIVE MACRO_LOADCAPTIVE
}; };
class Tank: LandVehicle { class Tank: LandVehicle {
MACRO_LOADUNLOADCAPTIVE MACRO_LOADCAPTIVE
}; };
class Air; class Air;
class Helicopter: Air { class Helicopter: Air {
MACRO_LOADUNLOADCAPTIVE MACRO_LOADCAPTIVE
}; };
class Plane: Air { class Plane: Air {
MACRO_LOADUNLOADCAPTIVE MACRO_LOADCAPTIVE
}; };
class Ship; class Ship;
class Ship_F: Ship { class Ship_F: Ship {
MACRO_LOADUNLOADCAPTIVE MACRO_LOADCAPTIVE
}; };
class StaticWeapon: LandVehicle { class StaticWeapon: LandVehicle {
MACRO_LOADUNLOADCAPTIVE MACRO_LOADCAPTIVE
}; };
class Box_NATO_Support_F; class Box_NATO_Support_F;
@ -189,6 +189,26 @@ class CfgVehicles {
typeName = "BOOL"; typeName = "BOOL";
defaultValue = 1; defaultValue = 1;
}; };
class requireSurrender {
displayName = CSTRING(ModuleSettings_requireSurrender_name);
description = CSTRING(ModuleSettings_requireSurrender_description);
typeName = "NUMBER";
class values {
class disable {
name = ECSTRING(common,No);
value = 0;
};
class Surrender {
name = CSTRING(SurrenderOnly);
value = 1;
default = 1;
};
class SurrenderOrNoWeapon {
name = CSTRING(SurrenderOrNoWeapon);
value = 2;
};
};
};
}; };
class ModuleDescription: ModuleDescription { class ModuleDescription: ModuleDescription {
description = CSTRING(ModuleSettings_Description); description = CSTRING(ModuleSettings_Description);

View File

@ -1,10 +1,10 @@
ace_captives ace_captives
============ ============
Allows taking people captive/handcuffed Adds ability to handcuff and surrender.
####Items: #### Items Added:
`ACE_CableTie` - adds ability to take someone captive `ACE_CableTie`
## Maintainers ## Maintainers

View File

@ -6,12 +6,11 @@
if (isServer) then { if (isServer) then {
addMissionEventHandler ["HandleDisconnect", { addMissionEventHandler ["HandleDisconnect", {
PARAMS_1(_disconnectedPlayer); params ["_disconnectedPlayer"];
private "_escortedUnit"; private "_escortedUnit";
_escortedUnit = _disconnectedPlayer getVariable [QGVAR(escortedUnit), objNull]; _escortedUnit = _disconnectedPlayer getVariable [QGVAR(escortedUnit), objNull];
if ((!isNull _escortedUnit) && {(attachedTo _escortedUnit) == _disconnectedPlayer}) then { if ((!isNull _escortedUnit) && {(attachedTo _escortedUnit) == _disconnectedPlayer}) then {
detach _escortedUnit; detach _escortedUnit;
//systemChat "debug: DC detach";
}; };
if (_disconnectedPlayer getVariable [QGVAR(isEscorting), false]) then { if (_disconnectedPlayer getVariable [QGVAR(isEscorting), false]) then {
_disconnectedPlayer setVariable [QGVAR(isEscorting), false, true]; _disconnectedPlayer setVariable [QGVAR(isEscorting), false, true];

View File

@ -16,6 +16,7 @@ PREP(doFriskPerson);
PREP(doLoadCaptive); PREP(doLoadCaptive);
PREP(doRemoveHandcuffs); PREP(doRemoveHandcuffs);
PREP(doUnloadCaptive); PREP(doUnloadCaptive);
PREP(findEmptyNonFFVCargoSeat);
PREP(handleGetIn); PREP(handleGetIn);
PREP(handleGetOut); PREP(handleGetOut);
PREP(handleKilled); PREP(handleKilled);

View File

@ -16,11 +16,11 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_target); params ["_unit", "_target"];
//Check sides, Player has cableTie, target is alive and not already handcuffed //Check sides, Player has cableTie, target is alive and not already handcuffed
(GVAR(allowHandcuffOwnSide) || {(side _unit) != (side _target)}) && (GVAR(allowHandcuffOwnSide) || {(side _unit) != (side _target)}) &&
("ACE_CableTie" in (items _unit)) && ("ACE_CableTie" in (items _unit)) &&
{alive _target} && {alive _target} &&
{!(_target getVariable [QGVAR(isHandcuffed), false])} {!(_target getVariable [QGVAR(isHandcuffed), false])} &&
(GVAR(requireSurrender) == 0 || ((_target getVariable [QGVAR(isSurrendering), false]) || (currentWeapon _target == "" && GVAR(requireSurrender) == 2)))

View File

@ -16,8 +16,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_target); params ["_unit", "_target"];
//Alive, handcuffed, not being escored, and not unconscious //Alive, handcuffed, not being escored, and not unconscious
(_target getVariable [QGVAR(isHandcuffed), false]) && (_target getVariable [QGVAR(isHandcuffed), false]) &&

View File

@ -16,7 +16,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_target); params ["_unit", "_target"];
_target getVariable [QGVAR(isHandcuffed), false] _target getVariable [QGVAR(isHandcuffed), false]
|| {_target getVariable [QGVAR(isSurrendering), false]} || {_target getVariable [QGVAR(isSurrendering), false]}

View File

@ -11,29 +11,36 @@
* The return value <BOOL> * The return value <BOOL>
* *
* Example: * Example:
* [player, bob] call ACE_captives_fnc_canLoadCaptive * [player, bob, car] call ACE_captives_fnc_canLoadCaptive
* *
* Public: No * Public: No
*/ */
#include "script_component.hpp" #include "script_component.hpp"
private ["_objects"]; params ["_unit", "_target","_vehicle"];
PARAMS_3(_unit,_target,_vehicle); if ((isNull _target) && {_unit getVariable [QGVAR(isEscorting), false]}) then {
//Looking at a vehicle while escorting, get target from attached objects:
if (isNull _target) then { {
_objects = attachedObjects _unit; if (_x getVariable [QGVAR(isHandcuffed), false]) exitWith {
_objects = [_objects, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); _target = _x;
if ((count _objects) > 0) then {_target = _objects select 0;}; };
} forEach (attachedObjects _unit);
}; };
if ((isNull _target) || {(vehicle _target) != _target} || {!(_target getVariable [QGVAR(isHandcuffed), false])}) exitWith {false};
if (isNull _vehicle) then { if (isNull _vehicle) then {
_objects = nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship_F"], 10]; //Looking at a captive unit, search for nearby vehicles with valid seats:
if ((count _objects) > 0) then {_vehicle = _objects select 0;}; {
if ((_x emptyPositions "cargo") > 0) exitWith {
_vehicle = _x;
};
} forEach (nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]);
} else {
//We have a vehicle picked, make sure it has empty seats:
if ((_vehicle emptyPositions "cargo") == 0) then {
_vehicle = objNull;
};
}; };
(!isNull _target) (!isNull _vehicle)
&& {!isNull _vehicle}
&& {_unit getVariable [QGVAR(isEscorting), false]}
&& {_target getVariable [QGVAR(isHandcuffed), false]}
&& {_vehicle emptyPositions "cargo" > 0}

View File

@ -16,8 +16,9 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_target); params ["_unit", "_target"];
//Unit is handcuffed and not currently being escorted //Unit is handcuffed and not currently being escorted
_target getVariable [QGVAR(isHandcuffed), false] && _target getVariable [QGVAR(isHandcuffed), false] &&
{isNull (attachedTo _target)} {isNull (attachedTo _target)} &&
{(vehicle _target) == _target}

View File

@ -16,8 +16,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_unit); params ["_unit", ["_target", objNull]];
DEFAULT_PARAM(1,_target,objNull);
if (isNull _target) then { if (isNull _target) then {
_target = _unit getVariable [QGVAR(escortedUnit), objNull]; _target = _unit getVariable [QGVAR(escortedUnit), objNull];

View File

@ -16,12 +16,12 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_newSurrenderState);
private "_returnValue"; private "_returnValue";
params ["_unit", "_newSurrenderState"];
_returnValue = if (_newSurrenderState) then { _returnValue = if (_newSurrenderState) then {
//no weapon equiped AND not currently surrendering and //no weapon equiped AND not currently surrendering and
GVAR(allowSurrender) && {(currentWeapon _unit) == ""} && {!(_unit getVariable [QGVAR(isSurrendering), false])} GVAR(allowSurrender) && {(currentWeapon _unit) == ""} && {!(_unit getVariable [QGVAR(isSurrendering), false])}
} else { } else {
//is Surrendering //is Surrendering

View File

@ -18,6 +18,6 @@
private ["_cargo"]; private ["_cargo"];
PARAMS_2(_player,_unit); params ["_player", "_unit"];
((vehicle _unit) != _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]} ((vehicle _unit) != _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]}

View File

@ -16,10 +16,11 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_target);
_unit removeItem "ACE_CableTie"; params ["_unit", "_target"];
playSound3D [QUOTE(PATHTO_R(sounds\cable_tie_zipping.ogg)), objNull, false, (getPosASL _target), 1, 1, 10]; playSound3D [QUOTE(PATHTO_R(sounds\cable_tie_zipping.ogg)), objNull, false, (getPosASL _target), 1, 1, 10];
["SetHandcuffed", [_target], [_target, true]] call EFUNC(common,targetEvent); ["SetHandcuffed", [_target], [_target, true]] call EFUNC(common,targetEvent);
_unit removeItem "ACE_CableTie";

View File

@ -17,7 +17,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_3(_unit,_target,_state); params ["_unit", "_target","_state"];
if (_state) then { if (_state) then {
if (_unit getVariable [QGVAR(isEscorting), false]) exitWith {}; if (_unit getVariable [QGVAR(isEscorting), false]) exitWith {};
@ -35,7 +35,9 @@ if (_state) then {
nil, 20, false, true, "", QUOTE(!isNull (GETVAR(_target,QGVAR(escortedUnit),objNull)))]; nil, 20, false, true, "", QUOTE(!isNull (GETVAR(_target,QGVAR(escortedUnit),objNull)))];
[{ [{
EXPLODE_3_PVT((_this select 0),_unit,_target,_actionID); params ["_args", "_pfID"];
_args params ["_unit", "_target", "_actionID"];
if (_unit getVariable [QGVAR(isEscorting), false]) then { if (_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 { if (!alive _target || {!alive _unit} || {!canStand _target} || {!canStand _unit} || {_target getVariable ["ACE_isUnconscious", false]} || {_unit getVariable ["ACE_isUnconscious", false]} || {!isNull (attachedTo _unit)}) then {
_unit setVariable [QGVAR(isEscorting), false, true]; _unit setVariable [QGVAR(isEscorting), false, true];

View File

@ -18,7 +18,7 @@
private ["_weapon", "_listedItemClasses", "_actions", "_allGear"]; private ["_weapon", "_listedItemClasses", "_actions", "_allGear"];
PARAMS_2(_player,_unit); params ["_player", "_unit"];
_weapon = currentWeapon _player; _weapon = currentWeapon _player;
if (_weapon == primaryWeapon _player && {_weapon != ""}) then { if (_weapon == primaryWeapon _player && {_weapon != ""}) then {

View File

@ -1,6 +1,6 @@
/* /*
* Author: commy2 * Author: commy2
* Unit loads the target object into a vehicle. * Unit loads the target object into a vehicle. (logic same as canLoadCaptive)
* *
* Arguments: * Arguments:
* 0: Unit that wants to load a captive <OBJECT> * 0: Unit that wants to load a captive <OBJECT>
@ -17,23 +17,34 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_3(_unit,_target,_vehicle); params ["_unit", "_target","_vehicle"];
private "_objects";
if (isNull _target) then { if ((isNull _target) && {_unit getVariable [QGVAR(isEscorting), false]}) then {
_objects = attachedObjects _unit; //Looking at a vehicle while escorting, get target from attached objects:
_objects = [_objects, {_this getVariable [QGVAR(isHandcuffed), false]}] call EFUNC(common,filter); {
if ((count _objects) > 0) then {_target = _objects select 0;}; if (_x getVariable [QGVAR(isHandcuffed), false]) exitWith {
_target = _x;
};
} forEach (attachedObjects _unit);
}; };
if (isNull _target) exitWith {}; if ((isNull _target) || {(vehicle _target) != _target} || {!(_target getVariable [QGVAR(isHandcuffed), false])}) exitWith {ERROR("");};
if (isNull _vehicle) then { if (isNull _vehicle) then {
_objects = nearestObjects [_unit, ["Car_F", "Tank_F", "Helicopter_F", "Boat_F", "Plane_F"], 10]; //Looking at a captive unit, search for nearby vehicles with valid seats:
if ((count _objects) > 0) then {_vehicle = _objects select 0;}; {
// if (([_x] call FUNC(findEmptyNonFFVCargoSeat)) != -1) exitWith {
if ((_x emptyPositions "cargo") > 0) exitWith {
_vehicle = _x;
};
} forEach (nearestObjects [_unit, ["Car", "Tank", "Helicopter", "Plane", "Ship"], 10]);
} else {
// if (([_vehicle] call FUNC(findEmptyNonFFVCargoSeat)) == -1) then {
if ((_vehicle emptyPositions "cargo") == 0) then {
_vehicle = objNull;
};
}; };
if (isNull _vehicle) exitWith {};
if ((!isNil "_target") && {!isNil "_vehicle"}) then { if (isNull _vehicle) exitWith {ERROR("");};
_unit setVariable [QGVAR(isEscorting), false, true];
["MoveInCaptive", [_target], [_target, _vehicle]] call EFUNC(common,targetEvent); _unit setVariable [QGVAR(isEscorting), false, true];
}; ["MoveInCaptive", [_target], [_target, _vehicle]] call EFUNC(common,targetEvent);

View File

@ -15,6 +15,6 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_target); params ["_unit", "_target"];
["SetHandcuffed", [_target], [_target, false]] call EFUNC(common,targetEvent); ["SetHandcuffed", [_target], [_target, false]] call EFUNC(common,targetEvent);

View File

@ -16,6 +16,6 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_target); params ["_unit", "_target"];
["MoveOutCaptive", [_target], [_target]] call EFUNC(common,targetEvent); ["MoveOutCaptive", [_target], [_target]] call EFUNC(common,targetEvent);

View File

@ -0,0 +1,67 @@
/*
* Author: PabstMirror
* Finds a free cargo seat, searching non FFV first
*
* Arguments:
* 0: The Vehicle <OBJECT>
*
* Return Value:
* ARRAY [seat index <NUMBER>, is FFV <BOOL>]
*
* Example:
* [car1] call ACE_captives_fnc_findEmptyNonFFVCargoSeat
*
* Public: No
*/
#include "script_component.hpp"
params ["_vehicle"];
TRACE_1("params", _vehicle);
_vehicleConfig = configFile >> "CfgVehicles" >> (typeOf _vehicle);
_proxyOrder = getArray (_vehicleConfig >> "getInProxyOrder");
_transportSoldier = getNumber (_vehicleConfig >> "transportSoldier");
_realCargoCount = if (isArray (_vehicleConfig >> "getInProxyOrder")) then {count _proxyOrder} else {_transportSoldier};
//Find FFV turrets:
_ffvCargoIndexes = [];
{
_turretConfig = [_vehicleConfig, _x] call EFUNC(common,getTurretConfigPath);
_isCargoProxy = ((getText (_turretConfig >> "proxyType")) == "CPCargo") && {isNumber (_turretConfig >> "proxyIndex")};
if (_isCargoProxy) then {
_proxyCargoIndex = getNumber (_turretConfig >> "proxyIndex");
_cargoIndex = _proxyOrder find _proxyCargoIndex;
_ffvCargoIndexes pushBack _cargoIndex;
};
} forEach (allTurrets [_vehicle, true]);
//Find Empty Seats:
_occupiedSeats = [];
{
_x params ["", "", "_xIndex"];
if (_xIndex > -1) then {_occupiedSeats pushBack _xIndex;};
} forEach (fullCrew _vehicle);
TRACE_3("Searching for empty seat",_realCargoCount,_ffvCargoIndexes,_occupiedSeats);
_emptyCargoSeatReturn = [-1, false];
//First seach for non-ffv seats:
for "_index" from 0 to (_realCargoCount - 1) do {
if ((!(_index in _ffvCargoIndexes)) && {!(_index in _occupiedSeats)}) exitWith {
_emptyCargoSeatReturn = [_index, false];
};
};
//Only use FFV if none found:
if (_emptyCargoSeatReturn isEqualTo [-1, false]) then {
for "_index" from 0 to (_realCargoCount - 1) do {
if (!(_index in _occupiedSeats)) exitWith {
_emptyCargoSeatReturn = [_index, true];
};
};
};
_emptyCargoSeatReturn

View File

@ -4,8 +4,8 @@
* *
* Arguments: * Arguments:
* 0: _vehicle <OBJECT> * 0: _vehicle <OBJECT>
* 2: dunno <OBJECT> * 1: dunno <OBJECT>
* 1: _unit <OBJECT> * 2: _unit <OBJECT>
* *
* Return Value: * Return Value:
* The return value <BOOL> * The return value <BOOL>
@ -17,7 +17,8 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_3(_vehicle,_dontcare,_unit); params ["_vehicle", "","_unit"];
TRACE_2("params",_vehicle,_unit);
if (local _unit) then { if (local _unit) then {
if (_unit getVariable [QGVAR(isEscorting), false]) then { if (_unit getVariable [QGVAR(isEscorting), false]) then {
@ -27,4 +28,18 @@ if (local _unit) then {
if (_unit getVariable [QGVAR(isSurrendering), false]) then { if (_unit getVariable [QGVAR(isSurrendering), false]) then {
[_unit, false] call FUNC(setSurrender); [_unit, false] call FUNC(setSurrender);
}; };
if (_unit getVariable [QGVAR(isHandcuffed), false]) then {
//Need to force animation for FFV turrets
_turretPath = [];
{
_x params ["_xUnit", "", "", "_xTurretPath"];
if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath};
} forEach (fullCrew (vehicle _unit));
if (!(_turretPath isEqualTo [])) then {
TRACE_1("Setting FFV Handcuffed Animation",_turretPath);
[_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation);
[_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation);
};
};
}; };

View File

@ -4,8 +4,8 @@
* *
* Arguments: * Arguments:
* 0: _vehicle <OBJECT> * 0: _vehicle <OBJECT>
* 2: dunno <OBJECT> * 1: dunno <OBJECT>
* 1: _unit <OBJECT> * 2: _unit <OBJECT>
* *
* Return Value: * Return Value:
* The return value <BOOL> * The return value <BOOL>
@ -17,17 +17,21 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_3(_vehicle,_dontcare,_unit); params ["_vehicle", "", "_unit"];
TRACE_2("params",_vehicle,_unit);
if ((local _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]}) then { if ((local _unit) && {_unit getVariable [QGVAR(isHandcuffed), false]}) then {
private ["_cargoIndex"]; private ["_cargoIndex"];
_cargoIndex = _unit getVariable [QGVAR(CargoIndex), -1]; _cargoIndex = _unit getVariable [QGVAR(CargoIndex), -1];
//If captive was not "unloaded", then move them back into the vehicle. if (_cargoIndex != -1) then {
if (_cargoIndex != -1) exitWith { //If captive was not "unloaded", then move them back into the vehicle.
TRACE_1("forcing back into vehicle",_cargoIndex);
_unit moveInCargo [_vehicle, _cargoIndex]; _unit moveInCargo [_vehicle, _cargoIndex];
} else {
//Getting out of vehicle:
[_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation);
[_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
}; };
[_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation);
}; };

View File

@ -15,7 +15,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_oldUnit); params ["_oldUnit"];
if (!local _oldUnit) exitWith {}; if (!local _oldUnit) exitWith {};

View File

@ -16,7 +16,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
EXPLODE_2_PVT(_this,_unit,_isUnconc); params ["_unit","_isUnconc"];
if (!local _unit) exitWith {}; if (!local _unit) exitWith {};

View File

@ -16,7 +16,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_newUnit,_oldUnit); params ["_newUnit","_oldUnit"];
//set showHUD based on new unit status: //set showHUD based on new unit status:
if ((_newUnit getVariable [QGVAR(isHandcuffed), false]) || {_newUnit getVariable [QGVAR(isSurrendering), false]}) then { if ((_newUnit getVariable [QGVAR(isHandcuffed), false]) || {_newUnit getVariable [QGVAR(isSurrendering), false]}) then {

View File

@ -16,7 +16,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_dead); params ["_unit","_dead"];
if (!local _unit) exitWith {}; if (!local _unit) exitWith {};

View File

@ -15,10 +15,10 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_unit); params ["_unit"];
// prevent players from throwing grenades (added to all units) // prevent players from throwing grenades (added to all units)
[_unit, "Throw", {((_this select 1) getVariable [QGVAR(isHandcuffed), false]) || {(_this select 1) getVariable [QGVAR(isSurrendering), false]}}, {}] call EFUNC(common,addActionEventhandler); // [_unit, "Throw", {systemChat "a"; ((_this select 1) getVariable [QGVAR(isHandcuffed), false]) || {(_this select 1) getVariable [QGVAR(isSurrendering), false]}; true}, {systemChat "b";}] call EFUNC(common,addActionEventhandler);
if (local _unit) then { if (local _unit) then {
// reset status on mission start // reset status on mission start

View File

@ -17,7 +17,7 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_zeusIsOpen); params ["_unit","_zeusIsOpen"];
//set showHUD based on unit status: //set showHUD based on unit status:
if (!_zeusIsOpen) then { if (!_zeusIsOpen) then {

View File

@ -13,7 +13,8 @@
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_logic); params ["_logic"];
[_logic, QGVAR(allowHandcuffOwnSide), "allowHandcuffOwnSide"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(allowHandcuffOwnSide), "allowHandcuffOwnSide"] call EFUNC(common,readSettingFromModule);
[_logic, QGVAR(allowSurrender), "allowSurrender"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(allowSurrender), "allowSurrender"] call EFUNC(common,readSettingFromModule);
[_logic, QGVAR(requireSurrender), "requireSurrender"] call EFUNC(common,readSettingFromModule);

View File

@ -17,19 +17,20 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_3(_logic,_units,_activated);
private ["_bisMouseOver", "_mouseOverObject"]; private ["_bisMouseOver", "_mouseOverObject"];
params ["_logic", "_units", "_activated"];
if (!_activated) exitWith {}; if (!_activated) exitWith {};
if (local _logic) then { if (local _logic) then {
//Modules run before postInit can instal the event handler, so we need to wait a little bit //Modules run before postInit can instal the event handler, so we need to wait a little bit
[{ [{
PARAMS_1(_units); params ["_units"];
{ {
["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent);
} forEach _units; } forEach _units;
}, [_units], 0.05, 0.05]call EFUNC(common,waitAndExecute); }, [_units], 0.05]call EFUNC(common,waitAndExecute);
deleteVehicle _logic; deleteVehicle _logic;
}; };

View File

@ -16,8 +16,8 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_state); params ["_unit","_state"];
TRACE_2("params",_unit,_state);
if (!local _unit) exitwith { if (!local _unit) exitwith {
ERROR("running setHandcuffed on remote unit"); ERROR("running setHandcuffed on remote unit");
@ -43,25 +43,48 @@ if (_state) then {
// fix anim on mission start (should work on dedicated servers) // fix anim on mission start (should work on dedicated servers)
[{ [{
PARAMS_1(_unit); params ["_unit"];
if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { if (!(_unit getVariable [QGVAR(isHandcuffed), false])) exitWith {};
if ((vehicle _unit) == _unit) then {
[_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit] call EFUNC(common,fixLoweredRifleAnimation);
[_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
} else {
[_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation);
[_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation);
};
//Adds an animation changed eh //Adds an animation changed eh
//If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain)
private "_animChangedEHID"; private "_animChangedEHID";
_animChangedEHID = _unit addEventHandler ["AnimChanged", {
PARAMS_2(_unit,_newAnimation); _animChangedEHID = _unit addEventHandler ["AnimChanged", {
params ["_unit", "_newAnimation"];
TRACE_2("AnimChanged",_unit,_newAnimation);
if (_unit == (vehicle _unit)) then {
if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then {
TRACE_1("Handcuff animation interrupted",_newAnimation); TRACE_1("Handcuff animation interrupted",_newAnimation);
[_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
}; };
}]; } else {
_unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID];
}; _turretPath = [];
}, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); {
_x params ["_xUnit", "", "", "_xTurretPath"];
if (_unit == _xUnit) exitWith {_turretPath = _xTurretPath};
} forEach (fullCrew (vehicle _unit));
TRACE_1("turret Path",_turretPath);
if (_turretPath isEqualTo []) exitWith {};
TRACE_1("Handcuff (FFV) animation interrupted",_newAnimation);
[_unit, "ACE_HandcuffedFFV", 2] call EFUNC(common,doAnimation);
[_unit, "ACE_HandcuffedFFV", 1] call EFUNC(common,doAnimation);
};
}];
TRACE_2("Adding animChangedEH",_unit,_animChangedEHID);
_unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID];
}, [_unit], 0.01] call EFUNC(common,waitAndExecute);
} else { } else {
_unit setVariable [QGVAR(isHandcuffed), false, true]; _unit setVariable [QGVAR(isHandcuffed), false, true];
[_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus); [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus);
@ -69,6 +92,7 @@ if (_state) then {
//remove AnimChanged EH //remove AnimChanged EH
private "_animChangedEHID"; private "_animChangedEHID";
_animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1]; _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1];
TRACE_1("removing animChanged EH",_animChangedEHID);
_unit removeEventHandler ["AnimChanged", _animChangedEHID]; _unit removeEventHandler ["AnimChanged", _animChangedEHID];
_unit setVariable [QGVAR(handcuffAnimEHID), -1]; _unit setVariable [QGVAR(handcuffAnimEHID), -1];

View File

@ -16,8 +16,8 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_unit,_state); params ["_unit","_state"];
TRACE_2("params",_unit,_state);
if (!local _unit) exitwith { if (!local _unit) exitwith {
ERROR("running surrender on remote unit"); ERROR("running surrender on remote unit");
@ -44,13 +44,13 @@ if (_state) then {
// fix anim on mission start (should work on dedicated servers) // fix anim on mission start (should work on dedicated servers)
[{ [{
PARAMS_1(_unit); params ["_unit"];
if (_unit getVariable [QGVAR(isSurrendering), false] && {(vehicle _unit) == _unit}) then { if (_unit getVariable [QGVAR(isSurrendering), false] && {(vehicle _unit) == _unit}) then {
//Adds an animation changed eh //Adds an animation changed eh
//If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain)
private "_animChangedEHID"; private "_animChangedEHID";
_animChangedEHID = _unit addEventHandler ["AnimChanged", { _animChangedEHID = _unit addEventHandler ["AnimChanged", {
PARAMS_2(_unit,_newAnimation); params ["_unit", "_newAnimation"];
if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then { if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && {!(_unit getVariable ["ACE_isUnconscious", false])}) then {
TRACE_1("Surrender animation interrupted",_newAnimation); TRACE_1("Surrender animation interrupted",_newAnimation);
[_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation);
@ -58,7 +58,7 @@ if (_state) then {
}]; }];
_unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID];
}; };
}, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); }, [_unit], 0.01] call EFUNC(common,waitAndExecute);
} else { } else {
_unit setVariable [QGVAR(isSurrendering), false, true]; _unit setVariable [QGVAR(isSurrendering), false, true];
[_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus);
@ -86,8 +86,8 @@ if (_state) then {
//spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter "hands up" //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter "hands up"
//Handles long animation chains //Handles long animation chains
[{ [{
PARAMS_2(_args,_pfID); params ["_args", "_pfID"];
EXPLODE_2_PVT(_args,_unit,_maxTime); _args params ["_unit", "_maxTime"];
//If waited long enough or they re-surrendered or they are unconscious, exit loop //If waited long enough or they re-surrendered or they are unconscious, exit loop
if ((ACE_time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]} || {_unit getVariable ["ACE_isUnconscious", false]}) exitWith { if ((ACE_time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]} || {_unit getVariable ["ACE_isUnconscious", false]}) exitWith {
[_pfID] call CBA_fnc_removePerFrameHandler; [_pfID] call CBA_fnc_removePerFrameHandler;

View File

@ -16,11 +16,17 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_2(_target,_vehicle); params ["_target","_vehicle"];
TRACE_2("params",_target,_vehicle);
private ["_cargoIndex"]; private ["_cargoIndex"];
_target moveInCargo _vehicle; _getSeat = [_vehicle] call FUNC(findEmptyNonFFVCargoSeat);
_target assignAsCargo _vehicle; TRACE_1("free cargo seat",_getSeat);
_cargoIndex = _vehicle getCargoIndex _target; _cargoIndex = _getSeat select 0;
if (_cargoIndex == -1) exitWith {ERROR("cargo index -1");};
_target moveInCargo [_vehicle, _cargoIndex];
_target assignAsCargoIndex [_vehicle, _cargoIndex];
_target setVariable [QGVAR(CargoIndex), _cargoIndex, true]; _target setVariable [QGVAR(CargoIndex), _cargoIndex, true];

View File

@ -15,10 +15,12 @@
*/ */
#include "script_component.hpp" #include "script_component.hpp"
PARAMS_1(_unit); params ["_unit"];
TRACE_1("params",_unit);
_unit setVariable [QGVAR(CargoIndex), -1, true]; _unit setVariable [QGVAR(CargoIndex), -1, true];
moveOut _unit; moveOut _unit;
[_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 2] call EFUNC(common,doAnimation);
[_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation);
unassignVehicle _unit; unassignVehicle _unit;

View File

@ -1,6 +1,8 @@
#define COMPONENT captives #define COMPONENT captives
#include "\z\ace\addons\main\script_mod.hpp" #include "\z\ace\addons\main\script_mod.hpp"
// #define DEBUG_MODE_FULL
#ifdef DEBUG_ENABLED_CAPTIVES #ifdef DEBUG_ENABLED_CAPTIVES
#define DEBUG_MODE_FULL #define DEBUG_MODE_FULL
#endif #endif

View File

@ -165,6 +165,7 @@
<Czech>Vzdávající se jednotka</Czech> <Czech>Vzdávající se jednotka</Czech>
<Portuguese>Fazer unidade se render</Portuguese> <Portuguese>Fazer unidade se render</Portuguese>
<French>Faire capituler l'unité</French> <French>Faire capituler l'unité</French>
<Hungarian>Egység kapitulálása</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Captives_ModuleSurrender_Description"> <Key ID="STR_ACE_Captives_ModuleSurrender_Description">
<English>Sync a unit to make them surrender.&lt;br /&gt;Source: ace_captives</English> <English>Sync a unit to make them surrender.&lt;br /&gt;Source: ace_captives</English>
@ -174,6 +175,7 @@
<Czech>Synchronizuj s jednotkou, která se má vzdát.&lt;br /&gt;Zdroj: ace_captives</Czech> <Czech>Synchronizuj s jednotkou, která se má vzdát.&lt;br /&gt;Zdroj: ace_captives</Czech>
<Portuguese>Sincroniza uma unidade para fazer com que ela se renda. &lt;br/&gt;Fonte: ace_captives</Portuguese> <Portuguese>Sincroniza uma unidade para fazer com que ela se renda. &lt;br/&gt;Fonte: ace_captives</Portuguese>
<French>Synchronise une unité pour la rendre captive. &lt;br/&gt;Source: ace_captives</French> <French>Synchronise une unité pour la rendre captive. &lt;br/&gt;Source: ace_captives</French>
<Hungarian>Egység szinkronizálása, hogy kapituláljon.&lt;br /&gt;Forrás: ace_captives</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Captives_ModuleSettings_DisplayName"> <Key ID="STR_ACE_Captives_ModuleSettings_DisplayName">
<English>Captives Settings</English> <English>Captives Settings</English>
@ -183,6 +185,7 @@
<German>Gefangenen-Einstellungen</German> <German>Gefangenen-Einstellungen</German>
<Portuguese>Ajustes de prisioneiros</Portuguese> <Portuguese>Ajustes de prisioneiros</Portuguese>
<French>Options de capitulation</French> <French>Options de capitulation</French>
<Hungarian>Fogoly-beállítások</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Captives_ModuleSettings_Description"> <Key ID="STR_ACE_Captives_ModuleSettings_Description">
<English>Controls settings for surrender and cable ties</English> <English>Controls settings for surrender and cable ties</English>
@ -192,6 +195,7 @@
<German>Einstellungen zur Kapitulation und Kabelbindern</German> <German>Einstellungen zur Kapitulation und Kabelbindern</German>
<Portuguese>Controla as configurações de rendição e abraçadeiras</Portuguese> <Portuguese>Controla as configurações de rendição e abraçadeiras</Portuguese>
<French>Contrôle les paramètres de la rédition et des Serflex</French> <French>Contrôle les paramètres de la rédition et des Serflex</French>
<Hungarian>Szabályozza a kapituláció és bilincselés beállításait</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Captives_ModuleSettings_handcuffSide_name"> <Key ID="STR_ACE_Captives_ModuleSettings_handcuffSide_name">
<English>Can handcuff own side</English> <English>Can handcuff own side</English>
@ -201,6 +205,7 @@
<German>Kann Teamkollegen fesseln</German> <German>Kann Teamkollegen fesseln</German>
<Portuguese>Pode algemar o próprio lado</Portuguese> <Portuguese>Pode algemar o próprio lado</Portuguese>
<French>Peut libérer sa propre faction</French> <French>Peut libérer sa propre faction</French>
<Hungarian>Saját oldal megbilincselhető</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Captives_ModuleSettings_handcuffSide_description"> <Key ID="STR_ACE_Captives_ModuleSettings_handcuffSide_description">
<English>Can players cabletie units on their own side</English> <English>Can players cabletie units on their own side</English>
@ -210,6 +215,7 @@
<German>Können Spieler eigene Einheiten fesseln</German> <German>Können Spieler eigene Einheiten fesseln</German>
<Portuguese>Os jogadores podem algemar unidades do seu lado</Portuguese> <Portuguese>Os jogadores podem algemar unidades do seu lado</Portuguese>
<French>Les joueurs peuvent utiliser les Serflex sur leur propre camp</French> <French>Les joueurs peuvent utiliser les Serflex sur leur propre camp</French>
<Hungarian>A játékosok megkötözhetik-e a saját oldalukon lévő egységeket</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Captives_ModuleSettings_allowSurrender_name"> <Key ID="STR_ACE_Captives_ModuleSettings_allowSurrender_name">
<English>Allow surrendering</English> <English>Allow surrendering</English>
@ -219,6 +225,7 @@
<German>Kapitulation erlauben</German> <German>Kapitulation erlauben</German>
<Portuguese>Permite rendição</Portuguese> <Portuguese>Permite rendição</Portuguese>
<French>Permettre la capitulation</French> <French>Permettre la capitulation</French>
<Hungarian>Kapituláció engedélyezése</Hungarian>
</Key> </Key>
<Key ID="STR_ACE_Captives_ModuleSettings_allowSurrender_description"> <Key ID="STR_ACE_Captives_ModuleSettings_allowSurrender_description">
<English>Players can surrender after holstering their weapon</English> <English>Players can surrender after holstering their weapon</English>
@ -228,6 +235,23 @@
<German>Spieler können kapitulieren, nachdem sie ihre Waffe geholstert haben</German> <German>Spieler können kapitulieren, nachdem sie ihre Waffe geholstert haben</German>
<Portuguese>Jogadores podem se render depois de guardar sua arma</Portuguese> <Portuguese>Jogadores podem se render depois de guardar sua arma</Portuguese>
<French>Les joueurs peuvent se rendre après avoir rangé leur arme</French> <French>Les joueurs peuvent se rendre après avoir rangé leur arme</French>
<Hungarian>A játékosok megadhatják magukat a fegyverük elrakása után</Hungarian>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_requireSurrender_name">
<English>Require surrendering</English>
<Polish>Wymagaj kapitulacji</Polish>
</Key>
<Key ID="STR_ACE_Captives_ModuleSettings_requireSurrender_description">
<English>Require Players to surrender before they can be arrested</English>
<Polish>Wymagaj od graczy kapitulacji zanim będzie można ich zaaresztować</Polish>
</Key>
<Key ID="STR_ACE_Captives_SurrenderOnly">
<English>Surrendering only</English>
<Polish>Tylko kapitulacja</Polish>
</Key>
<Key ID="STR_ACE_Captives_SurrenderOrNoWeapon">
<English>Surrendering or No weapon</English>
<Polish>Kapitulacja lub brak broni</Polish>
</Key> </Key>
</Package> </Package>
</Project> </Project>

1
addons/cargo/$PBOPREFIX$ Normal file
View File

@ -0,0 +1 @@
z\ace\addons\cargo

View File

@ -0,0 +1,9 @@
class ACE_Settings {
class GVAR(enable) {
displayName = CSTRING(ModuleSettings_enable);
description = CSTRING(ModuleSettings_enable_Description);
typeName = "BOOL";
value = 1;
category = ECSTRING(OptionsMenu,CategoryLogistics);
};
};

View File

@ -0,0 +1,103 @@
class Extended_PreInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_FILE(XEH_preInit));
};
};
class Extended_PostInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_FILE(XEH_postInit));
};
};
class Extended_Killed_EventHandlers {
class All {
init = QUOTE(call FUNC(handleDestroyed));
};
};
class Extended_Init_EventHandlers {
class StaticWeapon {
class ADDON {
init = QUOTE(_this call DFUNC(initObject));
};
};
class ReammoBox_F {
class ADDON {
init = QUOTE(_this call DFUNC(initObject));
};
};
class Cargo_base_F {
class ADDON {
init = QUOTE(_this call DFUNC(initObject); _this call DFUNC(initVehicle));
};
};
class CargoNet_01_box_F {
class ADDON {
init = QUOTE(_this call DFUNC(initObject); _this call DFUNC(initVehicle));
};
};
class Land_CargoBox_V1_F {
class ADDON {
init = QUOTE(_this call DFUNC(initObject); _this call DFUNC(initVehicle));
};
};
class Land_PaperBox_closed_F {
class ADDON {
init = QUOTE(_this call DFUNC(initObject); _this call DFUNC(initVehicle));
};
};
class Car {
class ADDON {
init = QUOTE(_this call DFUNC(initVehicle));
};
};
class Tank {
class ADDON {
init = QUOTE(_this call DFUNC(initVehicle));
};
};
class Helicopter {
class ADDON {
init = QUOTE(_this call DFUNC(initVehicle));
};
};
class Plane {
class ADDON {
init = QUOTE(_this call DFUNC(initVehicle));
};
};
class Ship_F {
class ADDON {
init = QUOTE(_this call DFUNC(initVehicle));
};
};
class ACE_RepairItem_Base {
class ADDON {
init = QUOTE(_this call DFUNC(initObject));
};
};
class ACE_bodyBagObject {
class ADDON {
init = QUOTE(_this call DFUNC(initObject));
};
};
class ACE_ConcertinaWireCoil {
class ADDON {
init = QUOTE(_this call DFUNC(initObject));
};
};
};

View File

@ -0,0 +1,294 @@
class CfgVehicles {
class ACE_Module;
class ACE_moduleCargoSettings: ACE_Module {
scope = 2;
displayName = CSTRING(SettingsModule_DisplayName);
icon = QUOTE(PATHTOF(UI\Icon_Module_Cargo_ca.paa));
category = "ACE_Logistics";
function = QFUNC(moduleSettings);
functionPriority = 1;
isGlobal = 1;
isTriggerActivated = 0;
author = ECSTRING(common,ACETeam);
class Arguments {
class enable {
displayName = CSTRING(ModuleSettings_enable);
description = CSTRING(ModuleSettings_enable_Description);
typeName = "BOOL";
defaultValue = 1;
};
};
class ModuleDescription {
description = CSTRING(SettingsModule_Description);
sync[] = {};
};
};
class LandVehicle;
class Car: LandVehicle {
GVAR(space) = 4;
GVAR(hasCargo) = 1;
class ACE_Cargo {
/*
class Cargo {
class ACE_medicalSupplyCrate {
type = "ACE_medicalSupplyCrate";
amount = 1;
};
};*/
};
};
class Tank: LandVehicle {
GVAR(space) = 4;
GVAR(hasCargo) = 1;
};
class Car_F;
class Truck_F: Car_F {
GVAR(space) = 8;
GVAR(hasCargo) = 1;
};
class Air;
class Helicopter: Air {
GVAR(space) = 8;
GVAR(hasCargo) = 1;
};
class Heli_Transport_02_base_F;
class I_Heli_Transport_02_F : Heli_Transport_02_base_F {
GVAR(space) = 20;
GVAR(hasCargo) = 1;
};
class Plane: Air {
GVAR(space) = 4;
GVAR(hasCargo) = 1;
};
class Ship;
class Ship_F: Ship {
GVAR(space) = 4;
GVAR(hasCargo) = 1;
};
// Static weapons
class StaticWeapon: LandVehicle {
GVAR(size) = 2; // 1 = small, 2 = large
GVAR(canLoad) = 1;
};
class StaticMortar;
class Mortar_01_base_F: StaticMortar {
GVAR(size) = 2; // 1 = small, 2 = large
GVAR(canLoad) = 1;
};
// Ammo boxes
class ThingX;
class ReammoBox_F: ThingX {
GVAR(size) = 2; // 1 = small, 2 = large
GVAR(canLoad) = 1;
};
class Scrapyard_base_F;
class Land_PaperBox_closed_F: Scrapyard_base_F {
GVAR(space) = 10;
GVAR(hasCargo) = 1;
GVAR(size) = 11;
GVAR(canLoad) = 1;
XEH_ENABLED;
class ACE_Actions {
class ACE_MainActions {
displayName = ECSTRING(interaction,MainAction);
distance = 5;
condition = QUOTE(true);
statement = "";
icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa";
selection = "";
};
};
};
class Cargo_base_F: ThingX {
GVAR(space) = 4;
GVAR(hasCargo) = 1;
GVAR(size) = 4;
GVAR(canLoad) = 1;
class ACE_Actions {
class ACE_MainActions {
displayName = ECSTRING(interaction,MainAction);
distance = 5;
condition = QUOTE(true);
statement = "";
icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa";
selection = "";
};
};
};
class Cargo10_base_F: Cargo_base_F {
GVAR(space) = 14;
GVAR(size) = 15;
XEH_ENABLED;
};
class Land_Cargo20_blue_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_brick_red_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_cyan_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_grey_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_light_blue_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_light_green_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_military_green_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Ruins_F;
class Land_Cargo20_military_ruins_F: Ruins_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_orange_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_red_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_sand_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_vr_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_white_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo20_yellow_F: Cargo_base_F {
GVAR(space) = 49;
GVAR(size) = 50;
XEH_ENABLED;
};
class Land_Cargo40_blue_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_brick_red_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_cyan_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_grey_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_light_blue_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_light_green_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_military_green_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_military_ruins_F: Ruins_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_orange_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_red_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_sand_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_vr_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_white_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
class Land_Cargo40_yellow_F: Cargo_base_F {
GVAR(space) = 99;
GVAR(size) = 100;
XEH_ENABLED;
};
// small
class Land_CargoBox_V1_F: ThingX {
GVAR(space) = 7;
GVAR(hasCargo) = 1;
GVAR(size) = 7;
XEH_ENABLED;
class ACE_Actions {
class ACE_MainActions {
displayName = ECSTRING(interaction,MainAction);
distance = 5;
condition = QUOTE(true);
statement = "";
icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa";
selection = "";
};
};
};
};

12
addons/cargo/README.md Normal file
View File

@ -0,0 +1,12 @@
ace_cargo
============
Adds cargo menu to vehicles and allows loading and unloading of cargo items.
## Maintainers
The people responsible for merging changes to this component or answering potential questions.
- [commy2](https://github.com/commy2)
- [Glowbal](https://github.com/Glowbal)

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,5 @@
#include "script_component.hpp"
["LoadCargo", {_this call FUNC(loadItem)}] call EFUNC(common,addEventHandler);
["UnloadCargo", {_this call FUNC(unloadItem)}] call EFUNC(common,addEventHandler);
["AddCargoByClass", {_this call FUNC(addCargoItem)}] call EFUNC(common,addEventHandler);

View File

@ -0,0 +1,25 @@
#include "script_component.hpp"
ADDON = false;
PREP(addCargoItem);
PREP(canLoad);
PREP(canLoadItemIn);
PREP(canUnloadItem);
PREP(findNearestVehicle);
PREP(getCargoSpaceLeft);
PREP(getSizeItem);
PREP(handleDestroyed);
PREP(initObject);
PREP(initVehicle);
PREP(loadItem);
PREP(moduleSettings);
PREP(onMenuOpen);
PREP(startLoadIn);
PREP(startUnload);
PREP(unloadItem);
PREP(validateCargoSpace);
GVAR(initializedItemClasses) = [];
ADDON = true;

View File

@ -5,12 +5,14 @@ class CfgPatches {
units[] = {}; units[] = {};
weapons[] = {}; weapons[] = {};
requiredVersion = REQUIRED_VERSION; requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"}; requiredAddons[] = {"ace_interaction"};
author[] = {"commy2"}; author[] = {"commy2", "Glowbal"};
authorUrl = "https://github.com/commy2"; authorUrl = "https://ace3mod.com/";
VERSION_CONFIG; VERSION_CONFIG;
}; };
}; };
#include "ACE_Settings.hpp"
#include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp" #include "CfgVehicles.hpp"
#include "CfgWeapons.hpp" #include "menu.hpp"

View File

@ -0,0 +1,38 @@
/*
* Author: Glowbal, Jonpas
* Adds a cargo item to the vehicle.
*
* Arguments:
* 0: Item Classname <STRING>
* 1: Vehicle <OBJECT>
* 2: Amount <NUMBER> (default: 1)
*
* Return Value:
* None
*
* Example:
* ["item", vehicle] call ace_cargo_fnc_addCargoItem
*
* Public: No
*/
#include "script_component.hpp"
private ["_position", "_item", "_i"];
params ["_itemClass", "_vehicle", ["_amount", 1]];
TRACE_3("params",_itemClass,_vehicle,_amount);
_position = getPos _vehicle;
_position set [1, (_position select 1) + 1];
_position set [2, (_position select 2) + 7.5];
for "_i" from 1 to _amount do {
_item = createVehicle [_itemClass, _position, [], 0, "CAN_COLLIDE"];
// Load item or delete it if no space left
if !([_item, _vehicle] call FUNC(loadItem)) exitWith {
deleteVehicle _item;
};
// Invoke listenable event
["cargoAddedByClass", [_itemClass, _vehicle, _amount]] call EFUNC(common,globalEvent);
};

View File

@ -0,0 +1,34 @@
/*
* Author: Glowbal
* Check if player can load an item into the nearest vehicle.
*
* Arguments:
* 0: Player <OBJECT>
* 1: Object to load <OBJECT>
*
* Return value:
* Can load <BOOL>
*
* Example:
* [player, object] call ace_cargo_fnc_canLoad
*
* Public: No
*/
#include "script_component.hpp"
params ["_player", "_object"];
if (!([_player, _object, []] call EFUNC(common,canInteractWith))) exitWith {false};
private ["_nearestVehicle"];
_nearestVehicle = [_player] call FUNC(findNearestVehicle);
if (_nearestVehicle isKindOf "Cargo_Base_F" || isNull _nearestVehicle) then {
{
if ([_object, _x] call FUNC(canLoadItemIn)) exitWith {_nearestVehicle = _x};
} forEach (nearestObjects [_player, ["Cargo_base_F", "Land_PaperBox_closed_F"], MAX_LOAD_DISTANCE]);
};
if (isNull _nearestVehicle) exitWith {false};
[_object, _nearestVehicle] call FUNC(canLoadItemIn)

View File

@ -0,0 +1,29 @@
/*
* Author: Glowbal
* Check if item can be loaded into other Object.
*
* Arguments:
* 0: Item Object <OBJECT>
* 1: Holder Object (Vehicle) <OBJECT>
*
* Return value:
* Can load in <BOOL>
*
* Example:
* [item, holder] call ace_cargo_fnc_canLoadItemIn
*
* Public: No
*/
#include "script_component.hpp"
params ["_item", "_vehicle"];
if (speed _vehicle > 1 || (((getPos _vehicle) select 2) > 3)) exitWith {false};
private "_itemSize";
_itemSize = ([_item] call FUNC(getSizeItem));
(_itemSize > 0) &&
{alive _item && alive _vehicle} &&
{(_item distance _vehicle <= MAX_LOAD_DISTANCE)} &&
{_itemSize <= ([_vehicle] call FUNC(getCargoSpaceLeft))}

View File

@ -0,0 +1,44 @@
/*
* Author: Glowbal, ViperMaul
* Check if item can be unloaded.
*
* Arguments:
* 0: loaded Object <OBJECT>
* 1: Object <OBJECT>
*
* Return value:
* Can be unloaded <BOOL>
*
* Example:
* [item, holder] call ace_cargo_fnc_canUnloadItem
*
* Public: No
*/
#include "script_component.hpp"
private ["_loaded", "_validVehiclestate", "_emptyPos"];
params ["_item", "_vehicle"];
_loaded = _vehicle getVariable [QGVAR(loaded), []];
if !(_item in _loaded) exitWith {false};
_validVehiclestate = true;
_emptyPos = [];
if (_vehicle isKindOf "Ship" ) then {
if !(speed _vehicle <1 && {(((getPosATL _vehicle) select 2) < 2)}) then {_validVehiclestate = false};
_emptyPos = ((getPosASL _vehicle) call EFUNC(common,ASLtoPosition) findEmptyPosition [0, 15, typeOf _item]); // TODO: if spot is underwater pick another spot.
} else {
if (_vehicle isKindOf "Air" ) then {
if !(speed _vehicle <1 && {isTouchingGround _vehicle}) then {_validVehiclestate = false};
_emptyPos = (getPosASL _vehicle) call EFUNC(common,ASLtoPosition);
_emptyPos = [(_emptyPos select 0) + random(5), (_emptyPos select 1) + random(5), _emptyPos select 2 ];
} else {
if !(speed _vehicle <1 && {(((getPosATL _vehicle) select 2) < 2)}) then {_validVehiclestate = false};
_emptyPos = ((getPosASL _vehicle) call EFUNC(common,ASLtoPosition) findEmptyPosition [0, 15, typeOf _item]);
};
};
if (!_validVehiclestate) exitWith {false};
(count _emptyPos != 0)

View File

@ -0,0 +1,37 @@
/*
* Author: Glowbal
* Get nearest vehicle from unit, priority: Car-Air-Tank-Ship.
*
* Arguments:
* 0: Unit <OBJECT>
*
* Return value:
* Vehicle in Distance <OBJECT>
*
* Example:
* [unit] call ace_cargo_fnc_findNearestVehicle
*
* Public: No
*/
#include "script_component.hpp"
private ["_loadCar", "_loadHelicopter", "_loadTank", "_loadShip", "_loadContainer"];
params ["_unit"];
_loadCar = nearestObject [_unit, "car"];
if (_unit distance _loadCar <= MAX_LOAD_DISTANCE) exitWith {_loadCar};
_loadHelicopter = nearestObject [_unit, "air"];
if (_unit distance _loadHelicopter <= MAX_LOAD_DISTANCE) exitWith {_loadHelicopter};
_loadTank = nearestObject [_unit, "tank"];
if (_unit distance _loadTank <= MAX_LOAD_DISTANCE) exitWith {_loadTank};
_loadShip = nearestObject [_unit, "ship"];
if (_unit distance _loadShip <= MAX_LOAD_DISTANCE) exitWith {_loadShip};
_loadContainer = nearestObject [_unit,"Cargo_base_F"];
if (_unit distance _loadContainer <= MAX_LOAD_DISTANCE) exitWith {_loadContainer};
objNull

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