Merge branch 'master' into missile_guidance_rewrite

This commit is contained in:
PabstMirror
2024-08-18 14:10:38 -05:00
703 changed files with 9168 additions and 77244 deletions

View File

@ -11,5 +11,8 @@ trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.yml]
indent_size = 2
[Makefile]
indent_style = tab

View File

@ -27,15 +27,6 @@ jobs:
- name: Validate function headers
run: python3 docs/tools/document_functions.py --debug
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout the source code
uses: actions/checkout@v4
- name: Lint (sqflint)
uses: arma-actions/sqflint@master
continue-on-error: true # No failure due to many false-positives
build:
runs-on: ubuntu-latest
steps:

View File

@ -1,29 +1,65 @@
name: Extensions
on:
pull_request:
push:
paths:
- 'extensions/**'
- 'extension/**'
- 'Cargo.toml'
- 'Cargo.lock'
- '.github/workflows/extensions.yml'
jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout the source code
uses: actions/checkout@master
- name: Install dependencies
run: |
rustup toolchain update stable --no-self-update
rustup default stable
rustup component add clippy rustfmt
- name: Run rustfmt
run: cargo fmt -- --check
- name: Run clippy
run: cargo clippy --all -- -Dwarnings
test:
runs-on: ubuntu-latest
container:
image: xd009642/tarpaulin
options: --security-opt seccomp=unconfined
steps:
- name: Checkout the source code
uses: actions/checkout@master
- name: Test & Coverage
run: cargo tarpaulin --verbose --no-default-features --workspace --timeout 240
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-latest]
arrays: [
os: { tag: "windows-latest", target: "i686-pc-windows-msvc" },
os: { tag: "windows-latest", target: "x86_64-pc-windows-msvc" },
]
runs-on: ${{ matrix.arrays.os.tag }}
steps:
- name: Checkout the source code
uses: actions/checkout@v4
- name: Build
shell: cmd
run: |
cd extensions
mkdir build
cd build
cmake .. && cmake --build .
- name: Upload Artifact
uses: actions/upload-artifact@v4
- name: Install stable Rust
uses: actions-rs/toolchain@v1
with:
name: ace3_extensions-${{ matrix.os }}-debug
path: extensions/build
target: ${{ matrix.arrays.os.target }}
toolchain: stable
default: true
- name: Rust Cache
uses: Swatinem/rust-cache@v2
- name: Build
run: cargo build --verbose
- name: Upload
uses: actions/upload-artifact@v2
with:
name: ${{ matrix.arrays.os.target }}
path: target/debug/ace.dll
if-no-files-found: error
retention-days: 30

View File

@ -33,6 +33,8 @@ jobs:
xcopy /e /h /q pullrequest\addons addons\
xcopy /e /h /q pullrequest\optionals optionals\
xcopy /e /h /q pullrequest\include include\
xcopy /y /h /q pullrequest\ace.dll ace.dll
xcopy /y /h /q pullrequest\ace_x64.dll ace_x64.dll
- name: Run HEMTT build
run: hemtt build
- name: Rename build folder

3
.gitignore vendored
View File

@ -2,8 +2,6 @@
*.zip
release/*
releases/*
extensions/vcproj32/*
extensions/vcproj64/*
.vscode/*
hemtt
hemtt.exe
@ -20,4 +18,5 @@ CHANGELOG.md
sqfvm.exe
ArmaScriptCompiler.exe
*.sqfc
target/
!extras/**/*.zip

1364
Cargo.lock generated Normal file

File diff suppressed because it is too large Load Diff

11
Cargo.toml Normal file
View File

@ -0,0 +1,11 @@
[workspace]
resolver = "2"
members = [
"extension"
]
[profile.release]
opt-level = "z"
lto = true
codegen-units = 1
strip = true

BIN
ace.dll Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
ace_x64.dll Normal file

Binary file not shown.

View File

@ -1,10 +1,10 @@
#include "script_component.hpp"
GVAR(currentbulletID) = -1;
#include "initKeybinds.inc.sqf"
GVAR(Protractor) = false;
GVAR(ProtractorStart) = CBA_missionTime;
GVAR(allBullets) = [];
GVAR(allBullets) = createHashMap;
GVAR(currentGrid) = 0;
if (!hasInterface) exitWith {};
@ -24,22 +24,6 @@ if (!hasInterface) exitWith {};
// Register Perframe Handler
[LINKFUNC(handleFirePFH), GVAR(simulationInterval)] call CBA_fnc_addPerFrameHandler;
//Add warnings for missing compat PBOs (only if AB is on)
{
_x params ["_modPBO", "_compatPBO"];
if ([_modPBO] call EFUNC(common,isModLoaded) && {!([_compatPBO] call EFUNC(common,isModLoaded))}) then {
WARNING_2("Weapon Mod [%1] missing ace compat pbo [%2] (from @ace\optionals)",_modPBO,_compatPBO);
};
} forEach [
["RH_acc","ace_compat_rh_acc"],
["RH_de_cfg","ace_compat_rh_de"],
["RH_m4_cfg","ace_compat_rh_m4"],
["RH_PDW","ace_compat_rh_pdw"],
["RKSL_PMII","ace_compat_rksl_pm_ii"],
["iansky_opt","ace_compat_sma3_iansky"],
["R3F_Armes","ace_compat_r3f"]
];
}] call CBA_fnc_addEventHandler;
#ifdef DEBUG_MODE_FULL

View File

@ -18,10 +18,3 @@ class CfgPatches {
#include "CfgVehicles.hpp"
#include "RscTitles.hpp"
#include "ACE_Settings.hpp"
class ACE_Extensions {
class ace_advanced_ballistics {
windows = 1;
client = 1;
};
};

View File

@ -1,6 +1,6 @@
#include "..\script_component.hpp"
/*
* Author: Glowbal, Ruthberg, joko // Jonas
* Author: Glowbal, Ruthberg, joko // Jonas, Brett Mayson
* Handle the PFH for Bullets
*
* Arguments:
@ -17,7 +17,7 @@
private _deleted = false;
{
_x params ["_bullet","_caliber","_bulletTraceVisible","_index"];
_y params ["_bullet","_caliber","_bulletTraceVisible"];
if (alive _bullet) then {
private _bulletVelocity = velocity _bullet;
@ -27,13 +27,21 @@ private _deleted = false;
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,"","",""];
};
_bullet setVelocity (_bulletVelocity vectorAdd (parseSimpleArray ("ace_advanced_ballistics" callExtension format["simulate:%1:%2:%3:%4:%5:%6", _index, _bulletVelocity, _bulletPosition, wind, ASLToATL(_bulletPosition) select 2, CBA_missionTime toFixed 6])));
(
"ace" callExtension ["ballistics:bullet:simulate", [
_x,
_bulletVelocity,
_bulletPosition,
wind,
ASLToATL(_bulletPosition) select 2,
CBA_missionTime toFixed 6
]]
) params ["_data", "_code"];
if (_code == 0) then {
_bullet setVelocity (_bulletVelocity vectorAdd (parseSimpleArray (_data)));
};
} else {
GVAR(allBullets) set [_forEachIndex, objNull];
_deleted = true;
GVAR(allBullets) deleteAt _x;
"ace" callExtension ["ballistics:bullet:delete", [_x]];
};
} forEach GVAR(allBullets);
if (_deleted) then {
GVAR(allBullets) = GVAR(allBullets) - [objNull];
};
} forEach GVAR(allBullets)

View File

@ -1,6 +1,6 @@
#include "..\script_component.hpp"
/*
* Author: Glowbal, Ruthberg
* Author: Glowbal, Ruthberg, Brett Mayson
*
* Handles advanced ballistics for (BulletBase) projectiles. Called from the unified fired EH only for players.
*
@ -62,11 +62,11 @@ if (_abort) exitWith {};
// Get Weapon and Ammo Configurations
private _AmmoCacheEntry = uiNamespace getVariable format[QGVAR(%1), _ammo];
if (isNil "_AmmoCacheEntry") then {
_AmmoCacheEntry = _ammo call FUNC(readAmmoDataFromConfig);
_AmmoCacheEntry = _ammo call FUNC(readAmmoDataFromConfig);
};
private _WeaponCacheEntry = uiNamespace getVariable format[QGVAR(%1), _weapon];
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", "_muzzleVelocityVariationSD"];
@ -120,8 +120,26 @@ if (_caliber * _bulletLength * _bulletMass * _barrelTwist > 0) then {
_stabilityFactor = [_caliber, _bulletLength, _bulletMass, _barrelTwist, _muzzleVelocity, _temperature, _barometricPressure] call FUNC(calculateStabilityFactor);
};
GVAR(currentbulletID) = (GVAR(currentbulletID) + 1) % 10000;
"ace_advanced_ballistics" callExtension format["new:%1:%2:%3:%4:%5:%6:%7:%8:%9:%10:%11:%12:%13:%14:%15:%16:%17:%18", GVAR(currentbulletID), _ammoCount, _airFriction, _ballisticCoefficients, _velocityBoundaries, _atmosphereModel, _dragModel, _stabilityFactor, _twistDirection, _transonicStabilityCoef, getPosASL _projectile, _bulletVelocity, EGVAR(common,mapLatitude), EGVAR(weather,currentTemperature), EGVAR(common,mapAltitude), EGVAR(weather,currentHumidity), EGVAR(weather,currentOvercast), CBA_missionTime toFixed 6];
GVAR(allBullets) pushBack [_projectile, _caliber, _bulletTraceVisible, GVAR(currentbulletID)];
("ace" callExtension [
"ballistics:bullet:new", [
_ammoCount,
_airFriction,
_ballisticCoefficients,
_velocityBoundaries,
_atmosphereModel,
_dragModel,
_stabilityFactor,
_twistDirection,
_transonicStabilityCoef,
_bulletVelocity,
EGVAR(common,mapLatitude),
EGVAR(weather,currentTemperature),
EGVAR(common,mapAltitude),
EGVAR(weather,currentHumidity),
EGVAR(weather,currentOvercast),
CBA_missionTime toFixed 6
]
]) params ["_id", "_code"];
if (_code == 0) then {
GVAR(allBullets) set [_id, [_projectile, _caliber, _bulletTraceVisible]];
};

View File

@ -21,7 +21,14 @@ if (!GVAR(enabled)) exitWith {};
private _initStartTime = diag_tickTime;
private _mapSize = worldSize;
if (("ace_advanced_ballistics" callExtension format["init:%1:%2", worldName, _mapSize]) == "Terrain already initialized") exitWith {
(
"ace" callExtension ["ballistics:map:init", [worldName, _mapSize]]
) params ["_data", "_code"];
if (_code != 0) exitWith {
ERROR("Error initializing map")
};
if (_data == "true") exitWith {
INFO_1("Terrain already initialized [world: %1]",worldName);
#ifdef DEBUG_MODE_FULL
systemChat "AdvancedBallistics: Terrain already initialized";
@ -53,8 +60,7 @@ INFO_2("Starting Terrain Extension [cells: %1] [world: %2]",_gridCells,worldName
private _gridCenter = [_x + 25, _y + 25];
private _gridHeight = round(getTerrainHeightASL _gridCenter);
private _gridNumObjects = count (_gridCenter nearObjects ["Building", 50]);
private _gridSurfaceIsWater = parseNumber (surfaceIsWater _gridCenter);
"ace_advanced_ballistics" callExtension format["set:%1:%2:%3", _gridHeight, _gridNumObjects, _gridSurfaceIsWater];
"ace" callExtension ["ballistics:map:set", [GVAR(currentGrid), _gridHeight, _gridNumObjects, surfaceIsWater _gridCenter]];
GVAR(currentGrid) = GVAR(currentGrid) + 1;
if (GVAR(currentGrid) >= _gridCells) exitWith {};
};

View File

@ -5,7 +5,9 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)];
[LSTRING(enabled_DisplayName), LSTRING(enabled_Description)],
_category,
false,
1
1,
{[QGVAR(enabled), _this] call EFUNC(common,cbaSettings_settingChanged)},
true // Needs mission restart
] call CBA_fnc_addSetting;
[
@ -45,5 +47,7 @@ private _category = format ["ACE %1", localize LSTRING(DisplayName)];
[LSTRING(simulationInterval_DisplayName), LSTRING(simulationInterval_Description)],
_category,
[0, 0.2, 0.05, 2],
1
1,
{[QGVAR(simulationInterval), _this] call EFUNC(common,cbaSettings_settingChanged)},
true // Needs mission restart
] call CBA_fnc_addSetting;

View File

@ -78,6 +78,7 @@ PREP(removeStat);
PREP(removeVirtualItems);
PREP(renameDefaultLoadout);
PREP(replaceUniqueItemsLoadout);
PREP(saveLoadout);
PREP(scanConfig);
PREP(showItem);
PREP(sortPanel);

View File

@ -26,28 +26,27 @@ if (GVAR(shiftState)) then {
switch (true) do {
// Beginning
case (_index == -1): {
"ace_clipboard" callExtension (format ["[%1", endl]);
"ace" callExtension ["clipboard:append", [format ["[%1", endl]]];
};
// End
case (_index == _listLength): {
"ace_clipboard" callExtension "];";
"ace" callExtension ["clipboard:append", ["];"]];
};
// Rest
default {
"ace_clipboard" callExtension ([" ", str (GVAR(defaultLoadoutsList) select _index), [",", ""] select (_index == _listLength - 1), endl] joinString "");
"ace" callExtension ["clipboard:append", [[" ", str (GVAR(defaultLoadoutsList) select _index), [",", ""] select (_index == _listLength - 1), endl] joinString ""]];
};
};
};
"ace_clipboard" callExtension "--COMPLETE--";
"ace" callExtension ["clipboard:complete", []];
[_display, LLSTRING(exportDefault)] call FUNC(message);
} else {
// Export singular loadout
private _export = str (GVAR(center) call CBA_fnc_getLoadout);
"ace_clipboard" callExtension (_export + ";");
"ace_clipboard" callExtension "--COMPLETE--";
"ace" callExtension ["clipboard:append", [_export]];
"ace" callExtension ["clipboard:complete", []];
[_display, LLSTRING(exportCurrent)] call FUNC(message);
};

View File

@ -16,7 +16,13 @@
params ["_display"];
// Can be either a singular loadout or an array of loadouts
private _extendedLoadout = call compile copyFromClipboard;
private _extendedLoadout = if (isMultiplayer) then {
("ace" callExtension ["clipboard:loadout", []]) params ["_loadout", "_code"];
if (_code != 0) exitWith {};
parseSimpleArray _loadout
} else {
call compile copyFromClipboard
};
// If error, exit
if (isNil "_extendedLoadout" || {!(_extendedLoadout isEqualType [])}) exitWith {

View File

@ -138,14 +138,6 @@ _actionsBoxCtrl ctrlSetPosition [
];
_actionsBoxCtrl ctrlCommit 0;
// Disable import in MP
if (isMultiplayer) then {
private _importButtonCtrl = _display displayCtrl IDC_buttonImport;
_importButtonCtrl ctrlEnable false;
_importButtonCtrl ctrlSetFade 0.6;
_importButtonCtrl ctrlCommit 0;
};
//--------------- Camera prep
cutText ["", "PLAIN"];
showCommandingMenu "";

View File

@ -94,8 +94,8 @@ if (!isNull _loadoutsDisplay) then {
};
} params ["_className"];
"ace_clipboard" callExtension (_className + ";");
"ace_clipboard" callExtension "--COMPLETE--";
"ace" callExtension ["clipboard:append", [_className]];
"ace" callExtension ["clipboard:complete", []];
[_display, LLSTRING(exportedClassnameText)] call FUNC(message);
} else {

View File

@ -0,0 +1,37 @@
#include "..\script_component.hpp"
/*
* Author: DartRuffian
* Saves a given loadout to the client's profile.
*
* Arguments:
* 0: Name of loadout <STRING>
* 1: CBA extended loadout or getUnitLoadout array <ARRAY>
* 2: Replace existing loadout <BOOL> (default: false)
*
* Return Value:
* True if loadout was saved, otherwise false <BOOL>
*
* Example:
* ["Current Loadout", getUnitLoadout ACE_player] call ace_arsenal_fnc_saveLoadout
*
* Public: Yes
*/
params [["_name", "", [""]], ["_loadout", [], [[]]], ["_replaceExisting", false, [false]]];
if (_name == "" || {_loadout isEqualTo []}) exitWith { false };
private _loadouts = profileNamespace getVariable [QGVAR(saved_loadouts), []];
private _loadoutIndex = _loadouts findIf {(_x#0) == _name};
// If a loadout with same name already exists and no overwriting enabled, quit
if (!_replaceExisting && {_loadoutIndex != -1}) exitWith { false };
if (_loadoutIndex == -1) then {
_loadouts pushBack [_name, _loadout];
} else {
_loadouts set [_loadoutIndex, [_name, _loadout]];
};
profileNamespace setVariable [QGVAR(saved_loadouts), _loadouts];
true

View File

@ -14,4 +14,9 @@
params ["_config"];
(modParams [_config call EFUNC(common,getAddon), ["name"]]) param [0, ""]
private _addon = _config call EFUNC(common,getAddon);
// Calling modParams with "" prints 'ModParams - Undefined or empty mod directory' in RPT
if (_addon == "") exitWith {""};
(modParams [_addon, ["name"]]) param [0, ""]

View File

@ -1,8 +1,14 @@
TRACE_1("prep",_this);
PREP(adjustFire);
PREP(calculateElevation);
PREP(calculateMaxAngle);
PREP(calculateMuzzleVelocity);
PREP(calculateSolution);
PREP(firedEH);
PREP(interactMenuOpened);
PREP(rangeTableOpen);
PREP(rangeTableUpdate);
PREP(simulateShot);
PREP(turretChanged);
PREP(turretPFEH);

View File

@ -4,10 +4,13 @@
TRACE_2("CBA_settingsInitialized",GVAR(advancedCorrections),GVAR(disableArtilleryComputer));
if (hasInterface) then {
// Add hud overlay for actuall azimuth and elevation:
// Add hud overlay for actual azimuth and elevation:
GVAR(pfID) = -1;
["turret", LINKFUNC(turretChanged), true] call CBA_fnc_addPlayerEventHandler;
// Handles being teleported from one vehicle to another
["vehicle", {[_this select 0, (_this select 1) unitTurret (_this select 0)] call FUNC(turretChanged)}] call CBA_fnc_addPlayerEventHandler;
// Add ability to dynamically open rangetables:
["ace_interactMenuOpened", LINKFUNC(interactMenuOpened)] call CBA_fnc_addEventHandler;
};
@ -30,6 +33,33 @@
};
}] call CBA_fnc_addEventHandler;
addMissionEventHandler ["ExtensionCallback", {
params ["_name", "_function", "_data"];
if (_name == "ace:artillery" && {_function == "calculate_table"}) then {
(parseSimpleArray _data) params ["_line", "_data"];
if (_data isEqualType []) then {
GVAR(tableData) set [_line, _data];
};
GVAR(tableSizeReceived) = GVAR(tableSizeReceived) + 1;
if (GVAR(tableSizeReceived) == GVAR(tableSizeActual)) then {
private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE;
if (isNull _dialog) exitWith {true};
for "_i" from 0 to GVAR(tableSizeActual) do {
private _row = GVAR(tableData) getOrDefault [_i, []];
if (count _row == 12) then {
_ctrlRangeTable lnbAddRow _row;
};
};
private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE;
if (isNull _dialog) exitWith {TRACE_1("dialog closed",_this);};
_ctrlRangeTable lnbAddRow ["", "", "", "", "", "", "", "", "", "", ""];
TRACE_1("table filled",_ctrlRangeTable);
};
};
}];
#ifdef DEBUG_MODE_FULL
#include "dev\showShotInfo.inc.sqf"
#include "dev\checkConfigs.inc.sqf"

View File

@ -14,13 +14,6 @@ class CfgPatches {
};
};
class ACE_Extensions {
class ace_artillerytables {
windows = 1;
client = 1;
};
};
#include "CfgEventHandlers.hpp"
#include "CfgMagazines.hpp"
#include "CfgVehicles.hpp"

View File

@ -0,0 +1,41 @@
#include "..\script_component.hpp"
/*
* Author: LorenLuke
* Adjusts a target point north and east, and recalculates a solution in air based on atmospheric conditions
*
* Arguments:
* 0: Gun Position ASL <ARRAY>
* 1: Target Position ASL <ARRAY>
* 2: Adjustment to the East (negative is West); meters <NUMBER>
* 3: Adjustment to the North (negative is South); meters <NUMBER>
* 4: Adjustment vertically (negative is Down); meters <NUMBER>
* 5: Muzzle velocity; meters/second <NUMBER>
* 6: Air Friction; meters^-1 (m/s^2)/(m^2/s^2) <NUMBER>
* 7: High angle boolean (true is high angle) <BOOL>
* 8: Temperature; degrees Celsius <NUMBER>
* 9: Atmospheric Density; kg/(meters^3) <NUMBER>
* 10: Direction of wind; degrees clockwise from north <NUMBER>
* 11: Speed of wind; meters/second <NUMBER>
*
* Return Value:
* Array of returns <ARRAY>
* 0: Angle of shot; Milliradians <NUMBER>
* 1: Angle adjust left or right; Milliradians <NUMBER>
* 2: Time of flight; seconds <NUMBER>
*
* Example:
* [getposASL vehicle player, targetPos, 20, 50, 0, 200, -0.0001, true, 15, 1.225, 225, 5] call ace_artilleryTables_fnc_adjustFire
*
* Public: No
*/
params ["_gunPos", "_targetPos", "_adjustEast", "_adjustNorth", "_adjustUp", "_muzzleVelocity", "_airFriction", ["_highAngle", true], ["_temperature", 15], ["_airDensity", 1.225], ["_windDir", 0], ["_windSpeed", 0]];
//DEFAULT_AIR_FRICTION == -0.00006
//MK6_82mm_AIR_FRICTION == -0.0001
private _resultPos = [_adjustEast + _targetPos select 0, _adjustNorth + _targetPos select 1, _adjustUp + _targetPos select 2];
private _returns = ["_gunPos", "_resultPos", "_muzzleVelocity", "_highAngle", "_airFriction", "_temperature", "_airDensity", "_windDir", "_windSpeed"] call FUNC(calculateSolution);
_returns

View File

@ -0,0 +1,71 @@
#include "..\script_component.hpp"
/*
* Author: LorenLuke
* Adjusts a target point north and east, and recalculates a solution in air based on atmospheric conditions
*
* Arguments:
* 0: Distance to Target; meters <NUMBER>
* 1: Height of target; meters, relative to gun altitude (positive means target higher than gun) <NUMBER>
* 2: Muzzle velocity; meters/second <NUMBER>
* 3: High angle boolean (true is high angle) <BOOL>
* 4: Air Friction; meters^-1 [(m/s^2)/(m^2/s^2)] <NUMBER>
* 5: Temperature; degrees Celsius <NUMBER>
* 6: Atmospheric Density; kg/(meters^3) <NUMBER>
* 7: Cross wind; meters/second (negative is Right to Left) <NUMBER>
* 8: Tail wind; meters/second (negative is flying against the wind) <NUMBER>
*
* Return Value:
* Array of returns <ARRAY>
* 0: Angle of shot; Milliradians <NUMBER>
* 1: Angle adjust left or right; Milliradians <NUMBER>
* 2: Time of flight; seconds <NUMBER>
*
* Example:
* [myPos, 0, 200, true, -0.0001, 15, 1.225, 5, -10] call ace_artilleryTables_fnc_calculateElevation
*
* Public: No
*/
params ["_targetDistance", "_targetHeight", "_muzzleVelocity", ["_highArc", true], ["_airFriction", 0], ["_temperature", 15], ["_airDensity", 1.225], ["_crossWind", 0], ["_tailWind", 0]];
//DEFAULT_AIR_FRICTION == -0.00006
//MK6_82mm_AIR_FRICTION == -0.0001
if (_airFriction != 0) then {
_muzzleVelocity = [_muzzleVelocity, _temperature, _atmosphericDensity] call FUNC(calculateMuzzleVelocity);
};
private _maxResults = [_muzzleVelocity, _airFriction] call FUNC(calculateMaxAngle);
private _testShot = [_maxResults select 0, _targetHeight, _muzzleVelocity, _airFriction, _crossWind, _tailWind, _temperature, _airDensity] call FUNC(simulateShot);
if (_testShot select 1 < _targetDistance) exitWith {
//No way we can hit it so don't bother;
[-1, -1, -1]
};
private _useDistance = _targetDistance;
private _useAngle = 0;
private _resultDistance = 0;
private _xDeviation = 0;
private _tof = 0;
while {abs(_resultDistance - _targetDistance) > 0.5} do {
TRACE_7("callExtension:artillery:simulate_find_solution",_useDistance,_targetHeight,_muzzleVelocity,_airFriction,_higharc,DEFAULT_MIN_ELEV,DEFAULT_MAX_ELEV);
(
"ace" callExtension ["artillery:simulate_find_solution", [_useDistance, _targetHeight, _muzzleVelocity, _airFriction, _higharc, DEFAULT_MIN_ELEV, DEFAULT_MAX_ELEV]]
) params ["_data", "_code"];
TRACE_1("",_code);
(parseSimpleArray _data) params ["", "_useAngleRad", ""];
_useAngle = deg(_useAngleRad) * DEGTOMILS;
private _shotResults = [_useAngle, _targetHeight, _muzzleVelocity, _airFriction, _crossWind, _tailWind, _temperature, _airDensity] call FUNC(simulateShot);
_xDeviation = _shotResults select 0;
_resultDistance = _shotResults select 1;
_tof = _shotResults select 2;
_useDistance = (2 * _targetDistance) - _resultDistance;
};
private _angleOffsetDeg = _xDeviation atan2 _resultDistance;
private _angleOffset = _angleOffsetDeg * DEGTOMILS;
[_useAngle, -_angleOffset, _tof]

View File

@ -0,0 +1,31 @@
#include "..\script_component.hpp"
/*
* Author: LorenLuke
* Calculates the best possible angle to shoot farthest based on muzzle velocity and air friction.
*
* Arguments:
* 0: Initial Muzzle Velocity; meters/second <NUMBER>
* 1: Air Friction; meters^-1 (m/s^2)/(m^2/s^2) <NUMBER>
*
* Return Values: <ARRAY>
* 1: Best Angle; Milliradians <NUMBER>
* 2: Furthest Distance; Meters <NUMBER>
*
* Example:
* [200, -0.00006] call ace_artilleryTables_fnc_calculateMaxAngle
*
* Public: No
*/
params ["_muzzleVelocity", "_airFriction"];
TRACE_2("callExtension:artillery:find_max_angle",_muzzleVelocity,_airFriction);
(
"ace" callExtension ["artillery:find_max_angle", [_muzzleVelocity, _airFriction]]
) params ["_data", "_code"];
TRACE_1("",_code)
(parseSimpleArray _data) params ["_bestAngle", "_bestDistance", ""];
_returns = [deg _bestAngle * 6400 / 360, _bestDistance];
_returns params ["_bestAngle", "_bestDistance"];
_returns

View File

@ -0,0 +1,28 @@
#include "..\script_component.hpp"
/*
* Author: LorenLuke
* Calculates the muzzleVelocity change with advanced calculations.
*
* Arguments:
* 0: Initial Muzzle velocity; meters/second <NUMBER>
* 1: Temperature; degrees Celsius <NUMBER>
* 2: Atmospheric Density; kg/(meters^3) <NUMBER>
*
* Return Value:
* Adjusted Muzzle Velocity; Meters <NUMBER>
*
* Example:
* [200, 15, 1.225] call ace_artilleryTables_fnc_calculateMuzzleVelocity
*
* Public: No
*/
params ["_muzzleVelocity", "_temperature", "_airDensity"];
// Calculate air density
private _relativeDensity = _airDensity / 1.225;
private _newMuzzleVelocityCoefficient = (((_temperature + 273.13) / 288.13 - 1) / 40 + 1);
private _newMuzzleVelocity = _muzzleVelocity * _newMuzzleVelocityCoefficient;
_newMuzzleVelocity

View File

@ -0,0 +1,44 @@
#include "..\script_component.hpp"
/*
* Author: LorenLuke
* Provides fire angle and deflection solutions on a target of set distance and height, including accounting for drag and atmospheric wind conditions.
*
* Arguments:
* 0: Gun Position ASL; <ARRAY>
* 1: Target Position ASL; <ARRAY>
* 2: Muzzle Velocity; meters/second <NUMBER>
* 3: High angle boolean (true is high angle) <BOOL>
* 4: Air Friction; meters^-1 [(m/s^2)/(m^2/s^2)] <NUMBER>
* 5: Temperature; degrees Celsius <NUMBER>
* 6: Atmospheric Density; kg/(meters^3) <NUMBER>
* 7: Direction of wind; degrees clockwise from north <NUMBER>
* 8: Speed of wind; meters/second <NUMBER>
*
* Return Value:
* array of returns <ARRAY>
* 0: Angle of shot; Milliradians <NUMBER>
* 1: Angle adjust left or right; Milliradians <NUMBER>
* 2: Time of flight; seconds <NUMBER>
*
* Example:
* [myPos, targetPos, 200, true, -0.0001, 15, 1.225, 225, 5] call ace_artilleryTables_fnc_calculateSolution
*
* Public: No
*/
params ["_ownPos", "_targetPos", "_muzzleVelocity", ["_highAngle", true], ["_airFriction", 0], ["_temperature", 15], ["_airDensity", 1.225], ["_windDir", 0], ["_windSpeed", 0]];
//DEFAULT_AIR_FRICTION == -0.00006
//MK6_82mm_AIR_FRICTION == -0.0001
private _relPos = _targetPos vectorDiff _ownPos;
private _targetDir = (_relpos select 0) atan2 (_relPos select 1);
private _targetDist = sqrt( (_relPos select 0)^2 + (_relpos select 1)^2 );
private _heightDif = _relPos select 2;
private _crossWind = sin(_targetDir - _windDir) * _windSpeed;
private _tailWind = -cos(_targetDir - _windDir) * _windSpeed;
private _solutionReturns = [_targetDist, _heightDif, _muzzleVelocity, _highAngle, _airFriction, _crossWind, _tailWind, _temperature, _airDensity] call FUNC(calculateElevation);
_solutionReturns

View File

@ -34,31 +34,12 @@ _ctrlElevationLow ctrlSetTextColor ([[1,1,1,1],[0.25,0.25,0.25,1]] select GVAR(l
lnbClear _ctrlRangeTable;
// Call extension with current data and start workers
TRACE_5("callExtension:start",_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode));
private _ret = "ace_artillerytables" callExtension ["start", [_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode)]];
TRACE_1("",_ret);
TRACE_5("callExtension:artillery:calculate_table",_muzzleVelocity,_airFriction,_elevMin,_elevMax,GVAR(lastElevationMode));
(
"ace" callExtension ["artillery:calculate_table", [_muzzleVelocity, _airFriction, _elevMin, _elevMax, GVAR(lastElevationMode)]]
) params ["_data", "_code"];
TRACE_1("",_code)
// Non-blocking read data out of extension as it becomes availiable
[{
private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE;
if (isNull _dialog) exitWith {true};
private _status = 1; // 1 = data on line, 2 - data not ready, 3 - done
while {_status == 1} do {
private _ret = ("ace_artillerytables" callExtension ["getline", []]);
// TRACE_1("callExtension:getline",_ret);
_status = _ret select 1;
if (_status == 1) then { _ctrlRangeTable lnbAddRow parseSimpleArray (_ret select 0) };
};
(_status == 3) // exit loop when all data read
}, {
// put dummy line at end because scrolling is problematic and can't see last line
private _dialog = uiNamespace getVariable [QGVAR(rangeTableDialog), displayNull];
private _ctrlRangeTable = _dialog displayCtrl IDC_TABLE;
if (isNull _dialog) exitWith {TRACE_1("dialog closed",_this);};
_ctrlRangeTable lnbAddRow ["", "", "", "", "", "", "", "", "", "", ""];
TRACE_1("table filled",_ctrlRangeTable);
}, []] call CBA_fnc_waitUntilAndExecute;
GVAR(tableData) = createHashMap;
GVAR(tableSizeActual) = (parseSimpleArray _data) select 1;
GVAR(tableSizeReceived) = 0;

View File

@ -0,0 +1,47 @@
#include "..\script_component.hpp"
/*
* Author: LorenLuke
* Simulates an indirect shot on a target of known height with given drag, wind, and atmospheric conditions
*
* Arguments:
* 0: Gun Elevation Angle; milliradians <NUMBER>
* 1: Relative Target Height; meters, relative to gun altitude (positive means target higher than gun) <NUMBER>
* 2: Muzzle Velocity; meters/second <NUMBER>
* 3: Air Friction; meters^-1 [(m/s^2)/(m^2/s^2)] <NUMBER>
* 4: Cross wind; meters/second (negative is Right to Left) <NUMBER>
* 5: Tail wind; meters/second (negative is flying against the wind) <NUMBER>
* 6: Temperature; degrees Celsius <NUMBER>
* 7: Atmospheric Density; kg/(meters^3) <NUMBER>
*
* Return Value:
* array of returns <ARRAY>
* 0: Deflection Adjustment To Hit; Milliradians (negative is Left) <NUMBER>
* 1: Distance of Shot; meters <NUMBER>
* 2: Time of Flight; seconds <NUMBER>
*
* Example:
* [900, 10, 200, -0.0001, 4, 0, 15, 1.225] call ace_artilleryTables_fnc_simulateShot
*
* Public: No
*/
params ["_angle", "_targetHeight", "_muzzleVelocity", ["_airFriction", 0], ["_crossWind", 0], ["_tailWind", 0], ["_temperature", 15], ["_atmosphericDensity", 1.225]];
//DEFAULT_AIR_FRICTION == -0.00006
//MK6_82mm_AIR_FRICTION == -0.0001
if (_airFriction != 0) then {
_muzzleVelocity = [_muzzleVelocity, _temperature, _atmosphericDensity] call FUNC(calculateMuzzleVelocity);
};
private _atmosphericDensityRatio = _atmosphericDensity / 1.225;
private _radAngle = rad(_angle / DEGTOMILS);
TRACE_8("callExtension:artillery:simulate_shot",_radAngle,_targetHeight,_muzzleVelocity,_airFriction,_crossWind,_tailWind,_temperature,_atmosphericDensityRatio);
(
"ace" callExtension ["artillery:simulate_shot", [_radAngle, _targetHeight, _muzzleVelocity, _airFriction, _crossWind, _tailWind, _temperature, _atmosphericDensityRatio]]
) params ["_data", "_code"];
TRACE_1("",_code)
//[xDeviation, yDistance, timeOfFlight]
parseSimpleArray _data

View File

@ -30,7 +30,10 @@ if (isNull (uiNamespace getVariable [QGVAR(display), displayNull])) then {
};
private _ctrlGroup = (uiNamespace getVariable [QGVAR(display), displayNull]) displayCtrl 1000;
if (cameraView != "GUNNER") exitWith { // need to be in gunner mode, so we can check where the optics are aiming at
// Need to be in gunner mode, so we can check where the optics are aiming at
// However, if there are no optics, ignore the above
if (!_invalidGunnerMem && {cameraView != "GUNNER"}) exitWith {
_ctrlGroup ctrlShow false;
};
_ctrlGroup ctrlShow true;

View File

@ -12,6 +12,10 @@
// This is a good fit for most large artillery, but a little low for lighter mortars
#define DEFAULT_AIR_FRICTION -0.00006
#define DEFAULT_MIN_ELEV 0
// 90 degrees in radians
#define DEFAULT_MAX_ELEV 1.5708
#define DEGTOMILS 17.7777778
#define IDC_MODECONTROLGROUP 1000

View File

@ -6,7 +6,7 @@ class CfgPatches {
units[] = {"ACE_Item_ATragMX"};
weapons[] = {"ACE_ATragMX"};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ACE_Advanced_Ballistics", "ACE_common", "ACE_weather"};
requiredAddons[] = {"ace_advanced_ballistics", "ace_common", "ace_weather"};
author = ECSTRING(common,ACETeam);
authors[] = {"Ruthberg"};
url = ECSTRING(main,URL);

View File

@ -30,9 +30,16 @@ while {_velocity > _thresholdVelocity} do {
private _bc = GVAR(targetSolutionInput) select 14;
private _dragModel = GVAR(targetSolutionInput) select 15;
private _temperature = GVAR(targetSolutionInput) select 5;
private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3:%4", _dragModel, _bc, _velocity, _temperature]));
_distance = _distance + _velocity * __DELTA_T;
_velocity = _velocity - (_drag * __DELTA_T);
private _data = (
"ace" callExtension ["ballistics:retard", [
_dragModel,
_bc,
_velocity,
_temperature
]]
) select 0;
_velocity = _velocity - ((parseNumber _data) * __DELTA_T);
};
_distance

View File

@ -90,7 +90,14 @@ private _wind1 = [cos(270 - _windDirection * 30) * _windSpeed1, sin(270 - _windD
private _wind2 = [cos(270 - _windDirection * 30) * _windSpeed2, sin(270 - _windDirection * 30) * _windSpeed2, 0];
private _windDrift = 0;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
_bc = parseNumber(("ace_advanced_ballistics" callExtension format["atmosphericCorrection:%1:%2:%3:%4:%5", _bc, _temperature, _barometricPressure, _relativeHumidity, _atmosphereModel]));
_bc = parseNumber (("ace" callExtension ["ballistics:atmospheric_correction", [
_bc,
_temperature,
_barometricPressure,
_relativeHumidity,
_atmosphereModel
]]
) select 0);
};
private _eoetvoesMultiplier = 0;
@ -113,8 +120,15 @@ while {_TOF < 15 && (_bulletPos select 1) < _targetRange} do {
_trueSpeed = vectorMagnitude _trueVelocity;
if (missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
private _drag = parseNumber(("ace_advanced_ballistics" callExtension format["retard:%1:%2:%3:%4", _dragModel, _bc, _trueSpeed, _temperature]));
_bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * _drag);
private _data = (
"ace" callExtension ["ballistics:retard", [
_dragModel,
_bc,
_trueSpeed,
_temperature
]]
) select 0;
_bulletAccel = (vectorNormalized _trueVelocity) vectorMultiply (-1 * (parseNumber _data));
} else {
_bulletAccel = _trueVelocity vectorMultiply (_trueSpeed * _airFriction);
};

View File

@ -36,11 +36,25 @@ if (!GVAR(atmosphereModeTBH)) then {
};
private _scopeBaseAngle = if !(missionNamespace getVariable [QEGVAR(advanced_ballistics,enabled), false]) then {
private _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZero:%1:%2:%3:%4", _zeroRange, _muzzleVelocity, _airFriction, _boreHeight];
(parseNumber _zeroAngle)
parseNumber (("ace" callExtension ["ballistics:zero_vanilla", [
_zeroRange,
_muzzleVelocity,
_airFriction,
_boreHeight
]]) select 0)
} else {
private _zeroAngle = "ace_advanced_ballistics" callExtension format ["calcZeroAB:%1:%2:%3:%4:%5:%6:%7:%8:%9", _zeroRange, _muzzleVelocity, _boreHeight, _temperature, _barometricPressure, _relativeHumidity, _bc, _dragModel, _atmosphereModel];
(parseNumber _zeroAngle)
parseNumber (("ace" callExtension ["ballistics:zero_advanced", [
_zeroRange,
_muzzleVelocity,
_airFriction,
_boreHeight,
_temperature,
_barometricPressure,
_relativeHumidity,
_bc,
_dragModel,
_atmosphereModel
]]) select 0)
};
GVAR(workingMemory) set [2, _zeroRange];

View File

@ -50,8 +50,8 @@ if (_unit == _attachToVehicle) then { //Self Attachment
} else {
GVAR(placeAction) = PLACE_WAITING;
[_unit, "forceWalk", "ACE_Attach", true] call EFUNC(common,statusEffect_set);
[_unit, "blockThrow", "ACE_Attach", true] call EFUNC(common,statusEffect_set);
[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
[{[localize LSTRING(PlaceAction), ""] call EFUNC(interaction,showMouseHint)}, []] call CBA_fnc_execNextFrame;
_unit setVariable [QGVAR(placeActionEH), [_unit, "DefaultAction", {true}, {GVAR(placeAction) = PLACE_APPROVE;}] call EFUNC(common,AddActionEventHandler)];
@ -88,8 +88,8 @@ if (_unit == _attachToVehicle) then { //Self Attachment
{!([_attachToVehicle, _unit, _itemClassname] call FUNC(canAttach))}) then {
[_idPFH] call CBA_fnc_removePerFrameHandler;
[_unit, "forceWalk", "ACE_Attach", false] call EFUNC(common,statusEffect_set);
[_unit, "blockThrow", "ACE_Attach", false] call EFUNC(common,statusEffect_set);
[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
[] call EFUNC(interaction,hideMouseHint);
[_unit, "DefaultAction", (_unit getVariable [QGVAR(placeActionEH), -1])] call EFUNC(common,removeActionEventHandler);
_unit removeAction _actionID;

View File

@ -40,12 +40,12 @@ if (_respawn > 3) then {
if (_unit getVariable [QGVAR(isHandcuffed), false]) then {
[_unit, false] call FUNC(setHandcuffed);
};
[_unit, "setCaptive", QGVAR(Handcuffed), false] call EFUNC(common,statusEffect_set);
[_unit, "setCaptive", QGVAR(handcuffed), false] call EFUNC(common,statusEffect_set);
if (_unit getVariable [QGVAR(isSurrendering), false]) then {
[_unit, false] call FUNC(setSurrendered);
};
[_unit, "setCaptive", QGVAR(Surrendered), false] call EFUNC(common,statusEffect_set);
[_unit, "setCaptive", QGVAR(surrendered), false] call EFUNC(common,statusEffect_set);
if (_unit getVariable [QGVAR(isEscorting), false]) then {
_unit setVariable [QGVAR(isEscorting), false, true];

View File

@ -41,8 +41,8 @@ if ((_unit getVariable [QGVAR(isHandcuffed), false]) isEqualTo _state) exitWith
if (_state) then {
_unit setVariable [QGVAR(isHandcuffed), true, true];
[_unit, "setCaptive", QGVAR(Handcuffed), true] call EFUNC(common,statusEffect_set);
[_unit, "blockRadio", QGVAR(Handcuffed), true] call EFUNC(common,statusEffect_set);
[_unit, "setCaptive", QGVAR(handcuffed), true] call EFUNC(common,statusEffect_set);
[_unit, "blockRadio", QGVAR(handcuffed), true] call EFUNC(common,statusEffect_set);
if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop
[_unit, false] call FUNC(setSurrendered);
@ -82,8 +82,8 @@ if (_state) then {
}, [_unit], 0.01] call CBA_fnc_waitAndExecute;
} else {
_unit setVariable [QGVAR(isHandcuffed), false, true];
[_unit, "setCaptive", QGVAR(Handcuffed), false] call EFUNC(common,statusEffect_set);
[_unit, "blockRadio", QGVAR(Handcuffed), false] call EFUNC(common,statusEffect_set);
[_unit, "setCaptive", QGVAR(handcuffed), false] call EFUNC(common,statusEffect_set);
[_unit, "blockRadio", QGVAR(handcuffed), false] call EFUNC(common,statusEffect_set);
//remove AnimChanged EH
private _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1];

View File

@ -44,8 +44,8 @@ if (_state) then {
_unit setVariable [QGVAR(isSurrendering), true, true];
[_unit, "setCaptive", QGVAR(Surrendered), true] call EFUNC(common,statusEffect_set);
[_unit, "blockRadio", QGVAR(Surrendered), true] call EFUNC(common,statusEffect_set);
[_unit, "setCaptive", QGVAR(surrendered), true] call EFUNC(common,statusEffect_set);
[_unit, "blockRadio", QGVAR(surrendered), true] call EFUNC(common,statusEffect_set);
if (_unit == ACE_player) then {
["captive", [false, false, false, false, false, false, false, false, false, true]] call EFUNC(common,showHud);
@ -71,8 +71,8 @@ if (_state) then {
}, [_unit], 0.01] call CBA_fnc_waitAndExecute;
} else {
_unit setVariable [QGVAR(isSurrendering), false, true];
[_unit, "setCaptive", QGVAR(Surrendered), false] call EFUNC(common,statusEffect_set);
[_unit, "blockRadio", QGVAR(Surrendered), false] call EFUNC(common,statusEffect_set);
[_unit, "setCaptive", QGVAR(surrendered), false] call EFUNC(common,statusEffect_set);
[_unit, "blockRadio", QGVAR(surrendered), false] call EFUNC(common,statusEffect_set);
//remove AnimChanged EH
private _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1];

View File

@ -158,6 +158,7 @@
<Japanese>目隠しを外す</Japanese>
<Russian>Снять повязку с глаз</Russian>
<Spanish>Quitar vendas de los ojos</Spanish>
<Portuguese>Remover a venda</Portuguese>
</Key>
<Key ID="STR_ACE_Captives_CableTie">
<English>Cable Tie</English>

View File

@ -3,6 +3,7 @@
class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {"ACE_Box_Chemlights","ACE_Item_Chemlight_Shield","ACE_Item_Chemlight_Shield_Green","ACE_Item_Chemlight_Shield_Red","ACE_Item_Chemlight_Shield_Blue","ACE_Item_Chemlight_Shield_Yellow","ACE_Item_Chemlight_Shield_Orange","ACE_Item_Chemlight_Shield_White","ModuleChemlightOrange","ModuleChemlightWhite","ModuleChemlightHiRed","ModuleChemlightHiYellow","ModuleChemlightHiWhite","ModuleChemlightHiBlue","ModuleChemlightHiGreen","ModuleChemlightUltraHiOrange"};
weapons[] = {"ACE_Chemlight_Shield", "ACE_Chemlight_Shield_Green","ACE_Chemlight_Shield_Red","ACE_Chemlight_Shield_Blue","ACE_Chemlight_Shield_Yellow","ACE_Chemlight_Shield_Orange","ACE_Chemlight_Shield_White"};
requiredVersion = REQUIRED_VERSION;

View File

@ -1,4 +1,5 @@
#define COMPONENT chemlights
#define COMPONENT_BEAUTIFIED Chemlights
#include "\z\ace\addons\main\script_mod.hpp"
// #define DEBUG_MODE_FULL

View File

@ -178,6 +178,7 @@ PREP(setupLocalUnitsHandler);
PREP(setVariableJIP);
PREP(setVariablePublic);
PREP(setVolume);
PREP(setWeaponLightLaserState);
PREP(showHud);
PREP(statusEffect_addType);
PREP(statusEffect_get);

View File

@ -19,16 +19,16 @@
//Status Effect EHs:
[QGVAR(setStatusEffect), LINKFUNC(statusEffect_set)] call CBA_fnc_addEventHandler;
["forceWalk", false, ["ace_advanced_fatigue", "ACE_SwitchUnits", "ACE_Attach", "ace_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_Sandbag", "ACE_refuel", "ACE_rearm", "ACE_Trenches", "ace_medical_fracture"]] call FUNC(statusEffect_addType);
["blockSprint", false, ["ace_advanced_fatigue", "ace_dragging", "ace_medical_fracture"]] call FUNC(statusEffect_addType);
["setCaptive", true, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered)]] call FUNC(statusEffect_addType);
["blockDamage", false, ["fixCollision", "ACE_cargo"]] call FUNC(statusEffect_addType);
["blockEngine", false, ["ACE_Refuel"]] call FUNC(statusEffect_addType);
["blockThrow", false, ["ACE_Attach", "ACE_concertina_wire", "ace_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_rearm", "ACE_refuel", "ACE_Sandbag", "ACE_Trenches", "ACE_tripod"]] call FUNC(statusEffect_addType);
["forceWalk", false, ["ace_advanced_fatigue", "ace_attach", "ace_dragging", "ace_explosives", QEGVAR(medical,fracture), "ace_rearm", "ace_refuel", "ace_sandbag", "ace_switchunits", "ace_tacticalladder", "ace_trenches"]] call FUNC(statusEffect_addType);
["blockSprint", false, ["ace_advanced_fatigue", "ace_dragging", QEGVAR(medical,fracture)]] call FUNC(statusEffect_addType);
["setCaptive", true, [QEGVAR(captives,handcuffed), QEGVAR(captives,surrendered)]] call FUNC(statusEffect_addType);
["blockDamage", false, ["fixCollision", "ace_cargo"]] call FUNC(statusEffect_addType);
["blockEngine", false, ["ace_refuel"]] call FUNC(statusEffect_addType);
["blockThrow", false, ["ace_attach", "ace_concertina_wire", "ace_dragging", "ace_explosives", "ace_rearm", "ace_refuel", "ace_sandbag", "ace_tacticalladder", "ace_trenches", "ace_tripod"]] call FUNC(statusEffect_addType);
["setHidden", true, ["ace_unconscious"]] call FUNC(statusEffect_addType);
["blockRadio", false, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered), "ace_unconscious"]] call FUNC(statusEffect_addType);
["blockRadio", false, [QEGVAR(captives,handcuffed), QEGVAR(captives,surrendered), "ace_unconscious"]] call FUNC(statusEffect_addType);
["blockSpeaking", false, ["ace_unconscious"]] call FUNC(statusEffect_addType);
["disableWeaponAssembly", false, ["ace_common", "ace_common_lockVehicle", "ace_csw"]] call FUNC(statusEffect_addType);
["disableWeaponAssembly", false, ["ace_common", QGVAR(lockVehicle), "ace_csw"]] call FUNC(statusEffect_addType);
["lockInventory", true, [], true] call FUNC(statusEffect_addType);
[QGVAR(forceWalk), {
@ -216,6 +216,7 @@ if (isServer) then {
[QGVAR(setVectorDirAndUp), {(_this select 0) setVectorDirAndUp (_this select 1)}] call CBA_fnc_addEventHandler;
[QGVAR(addWeaponItem), {(_this select 0) addWeaponItem [(_this select 1), (_this select 2)]}] call CBA_fnc_addEventHandler;
[QGVAR(removeMagazinesTurret), {(_this select 0) removeMagazinesTurret [_this select 1, _this select 2]}] call CBA_fnc_addEventHandler;
[QGVAR(triggerAmmo), {triggerAmmo _this}] call CBA_fnc_addEventHandler;
[QGVAR(setVanillaHitPointDamage), {
params ["_object", "_hitPointAnddamage"];

View File

@ -12,6 +12,8 @@ GVAR(showHudHash) = createHashMap;
GVAR(vehicleIconCache) = createHashMap; // for getVehicleIcon
GVAR(wheelSelections) = createHashMap;
GVAR(InteractionConditions) = createHashMap;
GVAR(blockItemReplacement) = false;
// Cache for FUNC(isModLoaded)

View File

@ -15,3 +15,25 @@ uiNamespace setVariable [QGVAR(addonCache), createHashMap];
// Cache for FUNC(getConfigName)
uiNamespace setVariable [QGVAR(configNames), createHashMap];
//Add warnings for missing compat PBOs
GVAR(isModLoadedCache) = createHashMap;
{
_x params ["_modPBO", "_compatPBO"];
if ([_modPBO] call FUNC(isModLoaded) && {!([_compatPBO] call FUNC(isModLoaded))}) then {
WARNING_2("Weapon Mod [%1] missing ace compat pbo [%2]",_modPBO,_compatPBO);
};
} forEach [
["CUP_Creatures_People_LoadOrder","ace_compat_cup_units"],
["CUP_Vehicles_LoadOrder","ace_compat_cup_vehicles"],
["CUP_Weapons_LoadOrder","ace_compat_cup_weapons"],
["r3f_armes_c","ace_compat_r3f"],
["RF_Data_Loadorder","ace_compat_rf"],
["RH_acc","ace_compat_rh_acc"],
["RH_de_cfg","ace_compat_rh_de"],
["RH_m4_cfg","ace_compat_rh_m4"],
["RH_PDW","ace_compat_rh_pdw"],
["RKSL_PMII","ace_compat_rksl_pm_ii"],
["iansky_opt","ace_compat_sma3_iansky"],
["R3F_Armes","ace_compat_r3f"]
];

View File

@ -70,8 +70,6 @@ class ctrlMapEmpty;
#include "CompassControl.hpp"
#include "CfgUIGrids.hpp"
class ACE_Extensions {};
class ACE_Tests {
vehicleTransportInventory = QPATHTOF(dev\test_vehicleInventory.sqf);
mapConfigs = QPATHTOF(dev\test_mapConfigs.sqf);

View File

@ -19,17 +19,4 @@
params ["_conditionName", "_conditionFunc"];
_conditionName = toLowerANSI _conditionName;
private _conditions = missionNamespace getVariable [QGVAR(InteractionConditions), [[],[]]];
_conditions params ["_conditionNames", "_conditionFuncs"];
private _index = _conditionNames find _conditionName;
if (_index == -1) then {
_index = count _conditionNames;
};
_conditionNames set [_index, _conditionName];
_conditionFuncs set [_index, _conditionFunc];
GVAR(InteractionConditions) = _conditions;
GVAR(InteractionConditions) set [_conditionName, _conditionFunc];

View File

@ -27,15 +27,11 @@ private _owner = _target getVariable [QGVAR(owner), objNull];
if (!isNull _owner && {_unit != _owner}) exitWith {false};
// check general conditions
private _conditions = missionNamespace getVariable [QGVAR(InteractionConditions), [[],[]]];
_conditions params ["_conditionNames", "_conditionFuncs"];
private _canInteract = true;
{
if (!(_x in _exceptions) && {!([_unit, _target] call (_conditionFuncs select _forEachIndex))}) exitWith {
if (!(_x in _exceptions) && {!([_unit, _target] call _y)}) exitWith {
_canInteract = false;
};
} forEach _conditionNames;
} forEach GVAR(InteractionConditions);
_canInteract

View File

@ -103,47 +103,29 @@ if (_oldCompats isNotEqualTo []) then {
///////////////
private _platform = toLowerANSI (productVersion select 6);
if (!isServer && {_platform in ["linux", "osx"]}) then {
if (_platform in ["linux", "osx"]) then {
// Linux and OSX client ports do not support extensions at all
INFO("Operating system does not support extensions");
if (hasInterface) then {
WARNING("Operating system does not support extensions");
} else {
INFO("Operating system does not support extensions");
};
} else {
{
private _extension = configName _x;
private _isWindows = _platform == "windows" && {getNumber (_x >> "windows") == 1};
private _isLinux = _platform == "linux" && {getNumber (_x >> "linux") == 1};
private _isClient = hasInterface && {getNumber (_x >> "client") == 1};
private _isServer = !hasInterface && {getNumber (_x >> "server") == 1};
("ace" callExtension ["version", []]) params [["_versionEx", "", [""]], ["_returnCode", -1, [-1]]];
if ((_isWindows || _isLinux) && {_isClient || _isServer}) then {
private _versionEx = _extension callExtension "version";
if (_returnCode != 0 || {_versionEx == ""}) then {
private _errorMsg = format ["Extension not found. [Return Code: %1]", _returnCode];
ERROR(_errorMsg);
if (_versionEx == "") then {
private _extensionFile = _extension;
if (productVersion select 7 == "x64") then {
_extensionFile = format ["%1_x64", _extensionFile];
};
private _platformExt = [".dll", ".so"] select (_platform == "linux");
_extensionFile = format ["%1%2", _extensionFile, _platformExt];
private _errorMsg = format ["Extension %1 not found.", _extensionFile];
ERROR(_errorMsg);
if (hasInterface) then {
["[ACE] ERROR", _errorMsg] call FUNC(errorMessage);
};
} else {
// Print the current extension version
INFO_2("Extension version: %1: %2",_extension,_versionEx);
};
if (hasInterface) then {
["[ACE] ERROR", _errorMsg] call FUNC(errorMessage);
};
} forEach ("true" configClasses (configFile >> "ACE_Extensions"));
} else {
_versionEx = _versionEx select [0, 8]; // git hash
INFO_1("Extension [Version: %1]",_versionEx);
};
};
if (isArray (configFile >> "ACE_Extensions" >> "extensions")) then {
WARNING("extensions[] array no longer supported");
};
///////////////
// Check server version/addons

View File

@ -1,6 +1,6 @@
#include "..\script_component.hpp"
/*
* Author: commy2
* Author: commy2, johnb43
* Get the muzzles of a weapon.
*
* Arguments:
@ -10,19 +10,30 @@
* All weapon muzzles <ARRAY>
*
* Example:
* ["gun"] call ace_common_fnc_getWeaponMuzzles
* "arifle_AK12_F" call ace_common_fnc_getWeaponMuzzles
*
* Public: Yes
*/
params [["_weapon", "", [""]]];
private _muzzles = getArray (configFile >> "CfgWeapons" >> _weapon >> "muzzles");
private _config = configFile >> "CfgWeapons" >> _weapon;
if (!isClass _config) exitWith {
[] // return
};
private _muzzles = [];
// Get config case muzzle names
{
if (_x == "this") then {
_muzzles set [_forEachIndex, configName (configFile >> "CfgWeapons" >> _weapon)];
_muzzles pushBack (configName _config);
} else {
if (isClass (_config >> _x)) then {
_muzzles pushBack (configName (_config >> _x));
};
};
} forEach _muzzles;
} forEach getArray (_config >> "muzzles");
_muzzles
_muzzles // return

View File

@ -17,4 +17,4 @@
params ["_unit"];
alive _unit && {!(_unit getVariable ["ACE_isUnconscious", false])}
lifeState _unit in ["HEALTHY", "INJURED"]

View File

@ -18,16 +18,4 @@
params ["_conditionName"];
_conditionName = toLowerANSI _conditionName;
private _conditions = missionNamespace getVariable [QGVAR(InteractionConditions), [[],[]]];
_conditions params ["_conditionNames", "_conditionFuncs"];
private _index = _conditionNames find _conditionName;
if (_index == -1) exitWith {};
_conditionNames deleteAt _index;
_conditionFuncs deleteAt _index;
GVAR(InteractionConditions) = _conditions;
GVAR(InteractionConditions) deleteAt _conditionName;

View File

@ -0,0 +1,59 @@
#include "..\script_component.hpp"
/*
* Author: johnb43
* Toggles the unit's current weapon's light & laser.
* API for persistent lasers. Doesn't work on AI, as they have their own logic.
*
* Arguments:
* 0: Unit <OBJECT>
* 1: Weapon light/laser state <BOOL> (default: false)
*
* Return Value:
* None
*
* Example:
* [player, true] call ace_common_fnc_setWeaponLightLaserState
*
* Public: Yes
*/
params [["_unit", objNull, [objNull]], ["_state", false, [false]]];
if (!local _unit || {!alive _unit} || {!(_unit call FUNC(isPlayer))}) exitWith {};
if !(_unit call CBA_fnc_canUseWeapon) exitWith {};
private _currentWeapon = currentWeapon _unit;
// Exit if unit has no weapon selected
if (_currentWeapon == "") exitWith {};
private _weaponIndex = [_unit, _currentWeapon] call FUNC(getWeaponIndex);
// Ignore binoculars
if (_weaponIndex == -1) exitWith {};
_unit setVariable [QGVAR(laserEnabled_) + str _weaponIndex, _state];
// Turn off light/laser (switching between weapons can leave previous weapon laser on)
action ["GunLightOff", _unit];
action ["IRLaserOff", _unit];
// Light/laser is off, don't need to do anything more
if (!_state) exitWith {};
// Turn laser on next frame (if weapon hasn't changed)
[{
params ["_unit", "_currentWeapon"];
private _weaponState = (weaponState _unit) select [0, 3];
if (_weaponState select 0 != _currentWeapon) exitWith {};
action ["GunLightOn", _unit];
action ["IRLaserOn", _unit];
_unit selectWeapon _weaponState;
}, [_unit, _currentWeapon]] call CBA_fnc_execNextFrame;
nil

View File

@ -2,26 +2,31 @@
/*
* Author: PabstMirror
* Switch attachment from one mode to another - based on CBA_accessory_fnc_switchAttachment
* ToDo: Port this to CBA?
*
* Arguments:
* 0: Unit <OBJECT>
* 1: From <STRING>
* 2: To <STRING>
* 1: Weapon (String or CBA-Weapon-Index (not ace's getWeaponIndex)) <STRING|NUMBER>
* 2: From <STRING>
* 3: To <STRING>
*
* Return Value:
* None
*
* Example:
* [player, "ACE_DBAL_A3_Green_VP", "ACE_DBAL_A3_Green"] call ace_common_fnc_switchAttachmentMode
* [player, 0, "ACE_DBAL_A3_Green_VP", "ACE_DBAL_A3_Green"] call ace_common_fnc_switchAttachmentMode
*
* Public: No
*/
params ["_unit", "_currItem", "_switchItem"];
TRACE_3("switchAttachmentMode",_unit,_currItem,_switchItem);
switch (currentWeapon _unit) do {
case (""): {};
params ["_unit", "_weapon", "_currItem", "_switchItem"];
TRACE_4("switchAttachmentMode",_unit,_weapon,_currItem,_switchItem);
if (_weapon isEqualTo "") exitWith {};
private _exit = _unit != ACE_player;
switch (_weapon) do {
case 0;
case (primaryWeapon _unit): {
private _currWeaponType = 0;
_unit removePrimaryWeaponItem _currItem;
@ -31,6 +36,7 @@ switch (currentWeapon _unit) do {
["CBA_attachmentSwitched", _this] call CBA_fnc_localEvent;
}, [_unit, _currItem, _switchItem, _currWeaponType]] call CBA_fnc_execNextFrame;
};
case 1;
case (handgunWeapon _unit): {
private _currWeaponType = 1;
_unit removeHandgunItem _currItem;
@ -40,6 +46,7 @@ switch (currentWeapon _unit) do {
["CBA_attachmentSwitched", _this] call CBA_fnc_localEvent;
}, [_unit, _currItem, _switchItem, _currWeaponType]] call CBA_fnc_execNextFrame;
};
case 2;
case (secondaryWeapon _unit): {
private _currWeaponType = 2;
_unit removeSecondaryWeaponItem _currItem;
@ -49,13 +56,18 @@ switch (currentWeapon _unit) do {
["CBA_attachmentSwitched", _this] call CBA_fnc_localEvent;
}, [_unit, _currItem, _switchItem, _currWeaponType]] call CBA_fnc_execNextFrame;
};
default {
ERROR_1("bad weapon - %1",_this);
_exit = true;
};
};
if (_exit) exitWith {}; // Don't notify if the unit isn't the local player or if an invalid weapon was passed
private _configSwitchItem = configfile >> "CfgWeapons" >> _switchItem;
private _switchItemHintText = getText (_configSwitchItem >> "MRT_SwitchItemHintText");
private _switchItemHintImage = getText (_configSwitchItem >> "picture");
if (_switchItemHintText isNotEqualTo "") then {
playSound "click";
if (_switchItemHintText != "") then {
[[_switchItemHintImage, 2.0], [_switchItemHintText], true] call CBA_fnc_notify;
};
if (_unit == ACE_player) then {
playSound "click";
};

View File

@ -1,6 +1,6 @@
#include "..\script_component.hpp"
/*
* Author: Dystopian
* Author: Dystopian, johnb43
* Controls persistent laser state.
*
* Arguments:
@ -17,51 +17,87 @@
params ["_enabled"];
if (!hasInterface) exitwith {};
// Reset state
{
ACE_player setVariable [QGVAR(laserEnabled_) + str _x, nil];
} forEach [0, 1, 2];
if (!_enabled) exitWith {
if (isNil QGVAR(laserKeyDownEH)) exitWith {};
["KeyDown", GVAR(laserKeyDownEH)] call CBA_fnc_removeDisplayHandler;
removeUserActionEventHandler ["headlights", "Activate", GVAR(laserKeyDownEH)];
["loadout", GVAR(laserLoadoutEH)] call CBA_fnc_removePlayerEventHandler;
["turret", GVAR(laserTurretEH)] call CBA_fnc_removePlayerEventHandler;
["vehicle", GVAR(laserVehicleEH)] call CBA_fnc_removePlayerEventHandler;
["weapon", GVAR(laserWeaponEH)] call CBA_fnc_removePlayerEventHandler;
GVAR(laserKeyDownEH) = nil;
GVAR(laserLoadoutEH) = nil;
GVAR(laserTurretEH) = nil;
GVAR(laserVehicleEH) = nil;
GVAR(laserWeaponEH) = nil;
};
GVAR(laserKeyDownEH) = ["KeyDown", {
if !((_this select 1) in actionKeys "headlights") exitWith {false};
private _weapon = currentWeapon ACE_player;
[
{
params ["_weapon", "_laserWasEnabled"];
private _laserEnabled = ACE_player isIRLaserOn _weapon || {ACE_player isFlashlightOn _weapon};
if (_laserEnabled && {_laserWasEnabled} || {!_laserEnabled && {!_laserWasEnabled}}) exitWith {};
private _weaponIndex = [ACE_player, _weapon] call FUNC(getWeaponIndex);
ACE_player setVariable [QGVAR(laserEnabled_) + str _weaponIndex, [nil, true] select _laserEnabled];
},
[_weapon, ACE_player isIRLaserOn _weapon || {ACE_player isFlashlightOn _weapon}]
] call CBA_fnc_execNextFrame;
false
}] call CBA_fnc_addDisplayHandler;
private _fnc_getLightLaserState = {
private _currentWeapon = currentWeapon ACE_player;
private _laserEH = {
if (sunOrMoon == 1) exitWith {};
params ["_player"];
private _weaponIndex = [_player, currentWeapon _player] call FUNC(getWeaponIndex);
if (
!(_player getVariable [QGVAR(laserEnabled_) + str _weaponIndex, false])
|| {_weaponIndex > 0 && {"" != primaryWeapon _player}} // Arma switches to primary weapon if exists
|| {!(_player call CBA_fnc_canUseWeapon)} // ignore in vehicle except FFV
) exitWith {};
[
// wait for weapon in "ready to fire" direction
{0.01 > getCameraViewDirection _this vectorDistance (_this weaponDirection currentWeapon _this)},
{{_this action [_x, _this]} forEach ["GunLightOn", "IRLaserOn"]},
_player,
3,
{{_this action [_x, _this]} forEach ["GunLightOn", "IRLaserOn"]}
] call CBA_fnc_waitUntilAndExecute;
if (_currentWeapon == "") exitWith {};
// Ignore in vehicle except FFV
if !(ACE_player call CBA_fnc_canUseWeapon) exitWith {};
private _weaponIndex = [ACE_player, _currentWeapon] call FUNC(getWeaponIndex);
if (_weaponIndex == -1) exitWith {};
// Light/laser state only changes in the next frame
// However, as by default changing attachment modes is CTRL + L, the vanilla EH triggers when lights are bound to L (even despite CBA intercepting keystroke)
// Therefore, add an extra frame of delay, after which the previous laser state will have been restored
[{
ACE_player setVariable [
QGVAR(laserEnabled_) + str (_this select 1),
ACE_player isIRLaserOn (_this select 0) || {ACE_player isFlashlightOn (_this select 0)}
];
}, [_currentWeapon, _weaponIndex], 2] call CBA_fnc_execAfterNFrames;
};
GVAR(laserLoadoutEH) = ["loadout", _laserEH] call CBA_fnc_addPlayerEventHandler;
GVAR(laserTurretEH) = ["turret", _laserEH] call CBA_fnc_addPlayerEventHandler;
GVAR(laserVehicleEH) = ["vehicle", _laserEH] call CBA_fnc_addPlayerEventHandler;
GVAR(laserWeaponEH) = ["weapon", _laserEH] call CBA_fnc_addPlayerEventHandler;
// Get current weapon light/laser state
call _fnc_getLightLaserState;
// Update state every time it's changed
GVAR(laserKeyDownEH) = addUserActionEventHandler ["headlights", "Activate", _fnc_getLightLaserState];
// Dropping weapons, as well as switching light/laser attachments turns off lights/lasers
GVAR(lastWeapons) = (getUnitLoadout ACE_player) select [0, 3];
// Monitor weapon addition/removal here
GVAR(laserLoadoutEH) = ["loadout", {
params ["_unit", "_loadout"];
private _weapons = _loadout select [0, 3];
if (_weapons isEqualTo GVAR(lastWeapons)) exitWith {};
GVAR(lastWeapons) = _weapons;
[
_unit,
_unit getVariable [QGVAR(laserEnabled_) + str ([_unit, currentWeapon _unit] call FUNC(getWeaponIndex)), false]
] call FUNC(setWeaponLightLaserState);
}] call CBA_fnc_addPlayerEventHandler;
private _fnc_switchPersistentLaserEH = {
params ["_unit"];
[
_unit,
_unit getVariable [QGVAR(laserEnabled_) + str ([_unit, currentWeapon _unit] call FUNC(getWeaponIndex)), false]
] call FUNC(setWeaponLightLaserState);
};
GVAR(laserTurretEH) = ["turret", _fnc_switchPersistentLaserEH] call CBA_fnc_addPlayerEventHandler;
GVAR(laserVehicleEH) = ["vehicle", _fnc_switchPersistentLaserEH] call CBA_fnc_addPlayerEventHandler;
GVAR(laserWeaponEH) = ["weapon", _fnc_switchPersistentLaserEH] call CBA_fnc_addPlayerEventHandler;

View File

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

View File

@ -0,0 +1,82 @@
class CfgVehicles {
class Tank;
class Tank_F: Tank {
class Turrets {
class MainTurret;
};
};
class MBT_01_base_F: Tank_F {
class Turrets: Turrets {
class MainTurret: MainTurret {
// Overwrite the changes Aegis makes for the .338 coax MG on the Slammer/Merkava
// The idea is:
// 1) keep it as realistic as possible
// 2) easier to overwrite something with skipWhenMissingDependencies than to not overwrite something if another mod is loaded
weapons[] = {"cannon_120mm", "ACE_LMG_coax_MAG58_mem3"}; // Base 1.82: "cannon_120mm","LMG_coax"
magazines[] = {
"24Rnd_120mm_APFSDS_shells_Tracer_Red",
"12Rnd_120mm_HE_shells_Tracer_Red",
"12Rnd_120mm_HEAT_MP_T_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"4Rnd_120mm_LG_cannon_missiles" // Aegis adds laser-guided munitions
};
};
};
};
class B_MBT_01_base_F: MBT_01_base_F {};
class B_MBT_01_cannon_F: B_MBT_01_base_F {};
class B_MBT_01_TUSK_F: B_MBT_01_cannon_F {
class Turrets: Turrets {
class MainTurret: MainTurret {
weapons[] = {"cannon_120mm", "ACE_LMG_coax_MAG58_mem3"}; // Base 1.82: "cannon_120mm","LMG_coax"
magazines[] = {
"24Rnd_120mm_APFSDS_shells_Tracer_Red",
"12Rnd_120mm_HE_shells_Tracer_Red",
"12Rnd_120mm_HEAT_MP_T_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"200Rnd_762x51_Belt_Red",
"4Rnd_120mm_LG_cannon_missiles" // Aegis adds laser-guided munitions
};
};
};
};
};

View File

@ -0,0 +1,18 @@
#include "script_component.hpp"
class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_vehicles", "A3_Aegis_Armor_F_Aegis_MBT_01"};
skipWhenMissingDependencies = 1;
author = ECSTRING(common,ACETeam);
authors[] = {"johnb43"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgVehicles.hpp"

View File

@ -0,0 +1,5 @@
#define COMPONENT compat_aegis
#define COMPONENT_BEAUTIFIED Aegis Compatibility
#include "\z\ace\addons\main\script_mod.hpp"
#include "\z\ace\addons\main\script_macros.hpp"

View File

@ -1,15 +1,15 @@
class CfgMagazines {
class US85_Magazine;
class US85_ATMine_mag: US85_Magazine {
EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_ATMine_mag";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_US85_ATMine_mag";
useAction = 0;
};
class US85_M14Mine_mag: US85_Magazine {
EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_M14Mine";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_US85_M14Mine";
useAction = 0;
};
class US85_SatchelCharge_Mag: US85_Magazine {
EGVAR(explosives,SetupObject) = "ACE_Explosives_Place_US85_SatchelCharge_Mag";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_US85_SatchelCharge_Mag";
useAction = 0;
};
};

View File

@ -65,7 +65,7 @@ class CfgVehicles {
class ace_csw {
enabled = 1;
proxyWeapon = "CUP_proxy_DSHKM";
magazineLocation = "_target selectionPosition 'magazine'";
magazineLocation = "_target selectionPosition 'otocvez'";
disassembleWeapon = "CUP_DSHKM_carry";
disassembleTurret = "ace_csw_kordTripod";
desiredAmmo = 100;
@ -119,7 +119,7 @@ class CfgVehicles {
class ace_csw {
enabled = 1;
proxyWeapon = "CUP_proxy_MK19";
magazineLocation = "_target selectionPosition 'magazine'";
magazineLocation = "_target selectionPosition 'otochlaven'";
disassembleWeapon = "CUP_MK19_carry";
disassembleTurret = "ace_csw_m3TripodLow";
desiredAmmo = 48;
@ -165,7 +165,7 @@ class CfgVehicles {
class ace_csw {
enabled = 1;
proxyWeapon = "CUP_proxy_SPG9";
magazineLocation = "_target selectionPosition 'otochlaven'";
magazineLocation = "_target selectionPosition 'handle'";
disassembleWeapon = "CUP_SPG9_carry";
disassembleTurret = "ace_csw_spg9Tripod";
desiredAmmo = 1;

View File

@ -9,6 +9,7 @@
<German>[CSW] AGS30 Gurt</German>
<Spanish>[CSW] Cinta de AGS30</Spanish>
<Italian>[CSW] Nastro AGS30</Italian>
<Portuguese>[CSW] Cinto de AGS30</Portuguese>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_MK19_displayName">
<English>[CSW] MK19 Belt</English>
@ -18,6 +19,7 @@
<German>[CSW] MK19 Gurt</German>
<Spanish>[CSW] Cinta de MK19</Spanish>
<Italian>[CSW] Nastro MK19</Italian>
<Portuguese>[CSW] Cinto de MK19</Portuguese>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_TOW_displayName">
<English>[CSW] TOW Tube</English>
@ -27,6 +29,7 @@
<German>[CSW] TOW Rohr</German>
<Spanish>[CSW] Tubo de TOW</Spanish>
<Italian>[CSW] Tubo TOW</Italian>
<Portuguese>[CSW] Tubo de TOW</Portuguese>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_TOW2_displayName">
<English>[CSW] TOW2 Tube</English>
@ -36,6 +39,7 @@
<German>[CSW] TOW2 Rohr</German>
<Spanish>[CSW] Tubo de TOW2</Spanish>
<Italian>[CSW] Tubo TOW2</Italian>
<Portuguese>[CSW] Tubo de TOW2</Portuguese>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_PG9_displayName">
<English>[CSW] PG-9 Round</English>
@ -45,6 +49,7 @@
<German>[CSW] PG-9 Rakete</German>
<Spanish>[CSW] Carga de PG-9</Spanish>
<Italian>[CSW] Razzo PG-9</Italian>
<Portuguese>[CSW] Cartucho PG-9</Portuguese>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_OG9_displayName">
<English>[CSW] OG-9 Round</English>
@ -54,6 +59,7 @@
<German>[CSW] OG-9 Rakete</German>
<Spanish>[CSW] Carga de OG-9</Spanish>
<Italian>[CSW] Razzo OG-9</Italian>
<Portuguese>[CSW] Cartucho OG-9</Portuguese>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M1HE_displayName">
<English>[CSW] M1 HE</English>
@ -74,6 +80,7 @@
<German>[CSW] M84 Rauch</German>
<Spanish>[CSW] Humo M84</Spanish>
<Italian>[CSW] M84 Fumogeno</Italian>
<Portuguese>[CSW] M84 Fumígeno</Portuguese>
</Key>
<Key ID="STR_ACE_Compat_CUP_Weapons_CSW_mag_M60A2_displayName">
<English>[CSW] M60A2 WP</English>

View File

@ -4,18 +4,18 @@ class CfgAmmo {
hit = 3000;
indirectHit = 3000;
indirectHitRange = 5;
ace_explosives_explodeOnDefuse = 0.02;
EGVAR(explosives,explodeOnDefuse) = 0.02;
};
class CUP_PipeBomb_Ammo: PipeBombBase {
hit = 3000;
indirectHit = 3000;
indirectHitRange = 5;
ace_explosives_explodeOnDefuse = 0.02;
EGVAR(explosives,explodeOnDefuse) = 0.02;
};
class CUP_Mine_Ammo;
class CUP_IED_V1_Ammo: CUP_Mine_Ammo {
ace_explosives_explodeOnDefuse = 0.06;
EGVAR(explosives,explodeOnDefuse) = 0.06;
triggerWhenDestroyed = 1;
};
};

View File

@ -2,9 +2,9 @@ class CfgMagazines {
class CA_Magazine;
class CUP_TimeBomb_M: CA_Magazine {
scope = 1;
ace_explosives_placeable = 1;
EGVAR(explosives,placeable) = 1;
useAction = 0;
ace_explosives_setupObject = "ACE_PipeBomb_place_CUP";
EGVAR(explosives,setupObject) = "ACE_PipeBomb_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch", "Cellphone"};
class Timer {
@ -16,9 +16,9 @@ class CfgMagazines {
};
};
class CUP_Mine_M: CUP_TimeBomb_M {
ace_explosives_placeable = 1;
EGVAR(explosives,placeable) = 1;
useAction = 0;
ace_explosives_setupObject = "ACE_Mine_place_CUP";
EGVAR(explosives,setupObject) = "ACE_Mine_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -27,9 +27,9 @@ class CfgMagazines {
};
};
class CUP_MineE_M: CUP_TimeBomb_M {
ace_explosives_placeable = 1;
EGVAR(explosives,placeable) = 1;
useAction = 0;
ace_explosives_setupObject = "ACE_MineE_place_CUP";
EGVAR(explosives,setupObject) = "ACE_MineE_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -39,20 +39,20 @@ class CfgMagazines {
};
class CUP_IED_V1_M: CUP_Mine_M {
ace_explosives_placeable = 1;
EGVAR(explosives,placeable) = 1;
useAction = 0;
ace_explosives_setupObject = "ACE_IED_V1_place_CUP";
EGVAR(explosives,setupObject) = "ACE_IED_V1_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch", "Cellphone", "PressurePlate"};
};
};
class CUP_IED_V2_M: CUP_IED_V1_M {
useAction = 0;
ace_explosives_setupObject = "ACE_IED_V2_place_CUP";
EGVAR(explosives,setupObject) = "ACE_IED_V2_place_CUP";
};
class CUP_IED_V3_M: CUP_IED_V1_M {
useAction = 0;
ace_explosives_setupObject = "ACE_IED_V3_place_CUP";
EGVAR(explosives,setupObject) = "ACE_IED_V3_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch", "Cellphone", "PressurePlate"};
class Timer {
@ -77,7 +77,7 @@ class CfgMagazines {
};
class CUP_IED_V4_M: CUP_IED_V1_M {
useAction = 0;
ace_explosives_setupObject = "ACE_IED_V4_place_CUP";
EGVAR(explosives,setupObject) = "ACE_IED_V4_place_CUP";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch", "Cellphone", "PressurePlate"};
class Timer {

View File

@ -1,32 +1,31 @@
class CfgVehicles {
class ACE_Explosives_Place;
class ACE_PipeBomb_place_CUP: ACE_Explosives_Place {
displayName = "Satchel Charge";
displayName = "$STR_CUP_dn_PipeBomb";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_Satchel.p3d";
ace_explosives_offset[] = {0, 0, 0};
};
class ACE_Mine_place_CUP: ACE_Explosives_Place {
displayName = "AT-15 Anti-Tank Mine";
displayName = "$STR_CUP_dn_Mine";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_AT15.p3d";
ace_explosives_offset[] = {0, 0, 0};
};
class ACE_MineE_place_CUP: ACE_Explosives_Place {
displayName = "TM46 Anti-Tank Mine";
displayName = "$STR_CUP_dn_MineE";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_TM46.p3d";
ace_explosives_offset[] = {0, 0, 0};
};
class ACE_IED_V1_place_CUP: ACE_Explosives_Place {
displayName = "IED";
displayName = "$STR_A3_CfgVehicles_IEDUrbanSmall_F";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_IED_V1.p3d";
ace_explosives_offset[] = {0, 0, 0};
};
class ACE_IED_V2_place_CUP: ACE_IED_V1_place_CUP {
displayName = "$STR_A3_CfgVehicles_IEDUrbanBig_F";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_IED_V2.p3d";
};
class ACE_IED_V3_place_CUP: ACE_IED_V1_place_CUP {
displayName = "$STR_A3_CfgVehicles_IEDLandSmall_F";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_IED_V3.p3d";
};
class ACE_IED_V4_place_CUP: ACE_IED_V1_place_CUP {
displayName = "$STR_A3_CfgVehicles_IEDLandBig_F";
model = "\CUP\Weapons\CUP_Weapons_Put\CUP_IED_V4.p3d";
};
};

View File

@ -2,9 +2,8 @@ class CfgMagazines {
// Explosives
class gm_explosive_petn_charge_base;
class gm_explosive_petn_charge: gm_explosive_petn_charge_base {
EGVAR(explosives,DelayTime) = 1;
EGVAR(explosives,Placeable) = 1;
EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_petn);
EGVAR(explosives,placeable) = 1;
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_petn);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
@ -21,9 +20,8 @@ class CfgMagazines {
class gm_explosive_plnp_charge_base;
class gm_explosive_plnp_charge: gm_explosive_plnp_charge_base {
EGVAR(explosives,DelayTime) = 1;
EGVAR(explosives,Placeable) = 1;
EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_plnp);
EGVAR(explosives,placeable) = 1;
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_plnp);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
@ -40,8 +38,8 @@ class CfgMagazines {
class gm_mine_at_base;
class gm_mine_at_tm46: gm_mine_at_base {
EGVAR(explosives,Placeable) = 1;
EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_mine_tm46);
EGVAR(explosives,placeable) = 1;
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_mine_tm46);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@ -51,8 +49,8 @@ class CfgMagazines {
};
};
class gm_mine_at_dm21: gm_mine_at_base {
EGVAR(explosives,Placeable) = 1;
EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_dm21);
EGVAR(explosives,placeable) = 1;
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_dm21);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@ -62,8 +60,8 @@ class CfgMagazines {
};
};
class gm_mine_at_mn111: gm_mine_at_base {
EGVAR(explosives,Placeable) = 1;
EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_m111);
EGVAR(explosives,placeable) = 1;
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_m111);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
@ -74,8 +72,8 @@ class CfgMagazines {
};
class gm_mine_ap_dm31: gm_mine_at_base {
EGVAR(explosives,Placeable) = 1;
EGVAR(explosives,SetupObject) =QEGVAR(explosives,Place_gm_explosive_dm31);
EGVAR(explosives,placeable) = 1;
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_gm_explosive_dm31);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};

View File

@ -1,5 +1,7 @@
#include "script_component.hpp"
if !(["ace_nametags"] call EFUNC(common,isModLoaded)) exitWith {};
private _russianRankIcons = [
QPATHTOEF(nametags,UI\icons_russia\private_gs.paa),
QPATHTOEF(nametags,UI\icons_russia\corporal_gs.paa),

View File

@ -6,4 +6,12 @@ PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
// Disable RHS' wheel replacement mechanic
if (["ace_repair"] call EFUNC(common,isModLoaded)) then {
RHS_Retread_Enabled = false;
rhs_btr70_EnableRetread = false;
rhs_TypeTirePressure = 1;
RHS_BTR_Effects_Init = true;
};
ADDON = true;

View File

@ -2,7 +2,7 @@ class CfgMagazines {
// ACE Explosives
class ATMine_Range_Mag;
class rhs_mine_tm62m_mag: ATMine_Range_Mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_tm62m);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_tm62m);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -12,7 +12,7 @@ class CfgMagazines {
};
class rhs_mine_pmn2_mag: ATMine_Range_Mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_pmn2);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_pmn2);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -22,7 +22,7 @@ class CfgMagazines {
};
class rhs_mag_mine_ptm1: ATMine_Range_Mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ptm1);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_ptm1);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -32,7 +32,7 @@ class CfgMagazines {
};
class rhs_mag_mine_pfm1: ATMine_Range_Mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_pfm1);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_pfm1);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -42,8 +42,7 @@ class CfgMagazines {
};
class rhs_ec75_mag: ATMine_Range_Mag {
EGVAR(explosives,DelayTime) = 1;
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec75);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_ec75);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
@ -59,27 +58,27 @@ class CfgMagazines {
};
class rhs_ec75_sand_mag: rhs_ec75_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec75_sand);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_ec75_sand);
};
class rhs_ec200_mag: rhs_ec75_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec200);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_ec200);
};
class rhs_ec200_sand_mag: rhs_ec200_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec200_sand);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_ec200_sand);
};
class rhs_ec400_mag: rhs_ec75_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec400);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_ec400);
};
class rhs_ec400_sand_mag: rhs_ec400_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_ec400_sand);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_ec400_sand);
};
class rhs_mine_msk40p_white_mag: ATMine_Range_Mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_white);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_white);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -89,19 +88,19 @@ class CfgMagazines {
};
class rhs_mine_msk40p_red_mag: rhs_mine_msk40p_white_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_red);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_red);
};
class rhs_mine_msk40p_green_mag: rhs_mine_msk40p_white_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_green);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_green);
};
class rhs_mine_msk40p_blue_mag: rhs_mine_msk40p_white_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_blue);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_msk40p_blue);
};
class rhs_mine_sm320_white_mag: rhs_mine_msk40p_white_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_white);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_white);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -111,15 +110,15 @@ class CfgMagazines {
};
class rhs_mine_sm320_red_mag: rhs_mine_sm320_white_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_red);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_red);
};
class rhs_mine_sm320_green_mag: rhs_mine_sm320_white_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_green);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_sm320_green);
};
class rhs_mine_ozm72_a_mag: ATMine_Range_Mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_a);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_a);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -129,12 +128,11 @@ class CfgMagazines {
};
class rhs_mine_ozm72_b_mag: rhs_mine_ozm72_a_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_b);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_b);
};
class rhs_mine_ozm72_c_mag: rhs_mine_ozm72_a_mag {
EGVAR(explosives,DelayTime) = 1;
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_c);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhs_mine_ozm72_c);
useAction = 0;
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};

View File

@ -0,0 +1,123 @@
class CfgVehicles {
class Wheeled_APC_F;
class rhs_btr_base: Wheeled_APC_F {
class EGVAR(interaction,anims) {
class wheel_1_unhide {
positions[] = {{-0.8, -1.7, 0}};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
class wheel_2_unhide {
positions[] = {{0.35, -2.9, -0.1}};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class rhs_btr70_vmf: rhs_btr_base {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class wheel_1_unhide: wheel_1_unhide {
positions[] = {{-1.2, -2.6, 0.2}};
};
class wheel_2_unhide: wheel_2_unhide {
positions[] = {{-0.3, -3.8, 0}};
};
};
};
class rhs_btr70_msv: rhs_btr70_vmf {};
class rhs_btr80_msv: rhs_btr70_msv {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class wheel_1_unhide: wheel_1_unhide {
positions[] = {{-1, -2.5, 0.6}};
};
class wheel_2_unhide: wheel_2_unhide {
enabled = 0;
};
};
};
class Truck_F;
class rhs_truck: Truck_F {
class EGVAR(interaction,anims) {
class spare_hide {
selections[] = {"spare"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class RHS_Ural_BaseTurret: Truck_F {
class EGVAR(interaction,anims) {
class spare_hide {
selections[] = {"spare"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class rhs_zil131_base: Truck_F {
class EGVAR(interaction,anims) {
class spare_hide {
selections[] = {"spare"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class rhs_kraz255_base;
class rhs_kraz255b1_base: rhs_kraz255_base {
class EGVAR(interaction,anims) {
class spare_hide {
selections[] = {"spare"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class O_Truck_02_covered_F;
class rhs_kamaz5350: O_Truck_02_covered_F {
class EGVAR(interaction,anims) {
class spare_hide {
selections[] = {"spare"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class MRAP_02_base_F;
class rhs_tigr_base: MRAP_02_base_F {
class EGVAR(interaction,anims) {
class spare_hide {
selections[] = {"spare"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class Offroad_01_base_f;
class RHS_UAZ_Base: Offroad_01_base_f {
class EGVAR(interaction,anims) {
class spare_hide {
selections[] = {"spare"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
};

View File

@ -0,0 +1,21 @@
#include "script_component.hpp"
class CfgPatches {
class SUBADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {
"rhs_main_loadorder",
"ace_repair"
};
skipWhenMissingDependencies = 1;
author = ECSTRING(common,ACETeam);
authors[] = {"Dystopian", "johnb43"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgVehicles.hpp"

View File

@ -0,0 +1,3 @@
#define SUBCOMPONENT repair
#define SUBCOMPONENT_BEAUTIFIED Repair
#include "..\script_component.hpp"

View File

@ -1,83 +1,83 @@
class CfgAmmo {
class APERSMine_Range_Ammo;
class rhs_mine_a200_bz_ammo: APERSMine_Range_Ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.035};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.035};
};
class rhs_mine_a200_dz35_ammo: rhs_mine_a200_bz_ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.02};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
class rhs_mine_glasmine43_hz_ammo: APERSMine_Range_Ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.015};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.015};
};
class rhs_mine_glasmine43_bz_ammo: rhs_mine_glasmine43_hz_ammo {
ace_minedetector_detectable = 0;
EGVAR(minedetector,detectable) = 0;
};
class rhs_mine_bounding_trigger_base;
class rhs_mine_m2a3b_press_ammo: rhs_mine_bounding_trigger_base {
ace_explosives_defuseObjectPosition[] = {0, 0.046, 0.02};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0.046, 0.02};
};
class rhs_mine_m2a3b_trip_ammo: rhs_mine_m2a3b_press_ammo {
ace_explosives_defuseObjectPosition[] = {0, 0.046, 0.055};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0.046, 0.055};
};
class rhs_mine_M3_pressure_ammo: APERSMine_Range_Ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.015};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.015};
};
class rhs_mine_M3_tripwire_ammo: rhs_mine_M3_pressure_ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.055};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.055};
};
class ATMine_Range_Ammo;
class rhs_mine_TM43_ammo: ATMine_Range_Ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.072};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.072};
};
class rhs_mine_M7A2_ammo: APERSMine_Range_Ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.067};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.067};
};
class rhs_mine_Mk2_pressure_ammo: APERSMine_Range_Ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.02};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.02};
};
class rhs_mine_Mk2_tripwire_ammo: rhs_mine_Mk2_pressure_ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.055};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.055};
};
class APERSBoundingMine_Range_Ammo;
class rhs_mine_smine35_press_ammo: APERSBoundingMine_Range_Ammo {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.03};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.03};
};
class rhs_mine_smine35_trip_ammo: rhs_mine_bounding_trigger_base {
ace_explosives_defuseObjectPosition[] = {0, 0, 0.04};
EGVAR(explosives,defuseObjectPosition)[] = {0, 0, 0.04};
};
class rhs_mine_smine44_trip_ammo: rhs_mine_smine35_trip_ammo {
ace_explosives_defuseObjectPosition[] = {-0.03, 0, 0.015};
EGVAR(explosives,defuseObjectPosition)[] = {-0.03, 0, 0.015};
};
class rhs_mine_smine44_press_ammo: APERSBoundingMine_Range_Ammo {
ace_explosives_defuseObjectPosition[] = {-0.02, 0, 0.02};
EGVAR(explosives,defuseObjectPosition)[] = {-0.02, 0, 0.02};
};
class APERSTripMine_Wire_Ammo;
class rhs_mine_stockmine43_2m_ammo: APERSTripMine_Wire_Ammo {
ace_explosives_defuseObjectPosition[] = {-1, 0, 0.25};
EGVAR(explosives,defuseObjectPosition)[] = {-1, 0, 0.25};
};
class rhs_mine_stockmine43_4m_ammo: rhs_mine_stockmine43_2m_ammo {
ace_explosives_defuseObjectPosition[] = {-2, 0, 0.25};
EGVAR(explosives,defuseObjectPosition)[] = {-2, 0, 0.25};
};
class DemoCharge_Remote_Ammo;
class rhs_charge_M2tet_x2_ammo: DemoCharge_Remote_Ammo {
ace_explosives_defuseObjectPosition[] = {0.095, 0, 0.055};
EGVAR(explosives,defuseObjectPosition)[] = {0.095, 0, 0.055};
};
};

View File

@ -1,7 +1,7 @@
class CfgMagazines {
class APERSMine_Range_Mag;
class rhs_mine_a200_bz_mag: APERSMine_Range_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_a200_bz";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_a200_bz";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -11,7 +11,7 @@ class CfgMagazines {
};
class rhs_mine_a200_dz35_mag: rhs_mine_a200_bz_mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_a200_dz35";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_a200_dz35";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -21,7 +21,7 @@ class CfgMagazines {
};
class rhs_mine_glasmine43_hz_mag: APERSMine_Range_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_glasmine43_hz";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_glasmine43_hz";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -31,12 +31,12 @@ class CfgMagazines {
};
class rhs_mine_glasmine43_bz_mag: rhs_mine_glasmine43_hz_mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_glasmine43_bz";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_glasmine43_bz";
};
class APERSBoundingMine_Range_Mag;
class rhs_mine_m2a3b_press_mag: APERSBoundingMine_Range_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_m2a3b_press";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_m2a3b_press";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -46,7 +46,7 @@ class CfgMagazines {
};
class rhs_mine_m2a3b_trip_mag: rhs_mine_m2a3b_press_mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_m2a3b_trip";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_m2a3b_trip";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -56,7 +56,7 @@ class CfgMagazines {
};
class rhs_mine_m3_pressure_mag: APERSMine_Range_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_m3_pressure";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_m3_pressure";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -67,7 +67,7 @@ class CfgMagazines {
class APERSTripMine_Wire_Mag;
class rhs_mine_M3_tripwire_mag: APERSTripMine_Wire_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_M3_tripwire";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_M3_tripwire";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -78,7 +78,7 @@ class CfgMagazines {
class ATMine_Range_Mag;
class rhs_mine_TM43_mag: ATMine_Range_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_TM43";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_TM43";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -88,7 +88,7 @@ class CfgMagazines {
};
class rhs_mine_M7A2_mag: APERSMine_Range_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_M7A2";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_M7A2";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -98,7 +98,7 @@ class CfgMagazines {
};
class rhs_mine_mk2_pressure_mag: APERSMine_Range_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_mk2_pressure";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_mk2_pressure";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -108,7 +108,7 @@ class CfgMagazines {
};
class rhs_mine_Mk2_tripwire_mag: APERSTripMine_Wire_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_Mk2_tripwire";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_Mk2_tripwire";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -118,7 +118,7 @@ class CfgMagazines {
};
class rhs_mine_smine35_press_mag: APERSBoundingMine_Range_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine35_press";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_smine35_press";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -128,7 +128,7 @@ class CfgMagazines {
};
class rhs_mine_smine35_trip_mag: rhs_mine_smine35_press_mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine35_trip";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_smine35_trip";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -138,7 +138,7 @@ class CfgMagazines {
};
class rhs_mine_smine44_trip_mag: APERSBoundingMine_Range_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine44_trip";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_smine44_trip";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -148,7 +148,7 @@ class CfgMagazines {
};
class rhs_mine_smine44_press_mag: rhs_mine_smine44_trip_mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_smine44_press";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_smine44_press";
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -158,7 +158,7 @@ class CfgMagazines {
};
class rhs_mine_stockmine43_2m_mag: APERSTripMine_Wire_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_stockmine43_2m";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_stockmine43_2m";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -168,7 +168,7 @@ class CfgMagazines {
};
class rhs_mine_stockmine43_4m_mag: rhs_mine_stockmine43_2m_mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_mine_stockmine43_4m";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_mine_stockmine43_4m";
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
class Tripwire {
@ -179,7 +179,7 @@ class CfgMagazines {
class DemoCharge_Remote_Mag;
class rhs_charge_M2tet_x2_mag: DemoCharge_Remote_Mag {
ace_explosives_SetupObject = "ACE_Explosives_Place_rhs_charge_M2tet_x2";
EGVAR(explosives,setupObject) = "ACE_Explosives_Place_rhs_charge_M2tet_x2";
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter", "DeadmanSwitch"};
class Timer {

View File

@ -3,22 +3,22 @@ class CfgMagazines {
// ACE Explosives
class ATMine_Range_Mag;
class rhssaf_mine_mrud_a_mag: ATMine_Range_Mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_a);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_a);
class ACE_Triggers {
SupportedTriggers[] = {"Tripwire"};
};
};
class rhssaf_mine_mrud_b_mag: rhssaf_mine_mrud_a_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_b);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_b);
};
class rhssaf_mine_mrud_c_mag: rhssaf_mine_mrud_a_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_c);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_c);
};
class rhssaf_mine_mrud_d_mag: rhssaf_mine_mrud_a_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_d);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_mine_mrud_d);
class ACE_Triggers {
SupportedTriggers[] = {"Command", "MK16_Transmitter"};
class Command {
@ -29,7 +29,7 @@ class CfgMagazines {
};
class rhssaf_mine_pma3_mag: ATMine_Range_Mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_pma3);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_mine_pma3);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -39,7 +39,7 @@ class CfgMagazines {
};
class rhssaf_mine_tma4_mag: ATMine_Range_Mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_mine_tma4);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_mine_tma4);
class ACE_Triggers {
SupportedTriggers[] = {"PressurePlate"};
class PressurePlate {
@ -51,9 +51,8 @@ class CfgMagazines {
class CA_Magazine;
class rhssaf_tm100_mag: CA_Magazine {
useAction = 0;
EGVAR(explosives,DelayTime) = 1;
EGVAR(explosives,Placeable) = 1;
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm100);
EGVAR(explosives,placeable) = 1;
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_tm100);
class ACE_Triggers {
SupportedTriggers[] = {"Timer", "Command", "MK16_Transmitter"};
class Timer {
@ -67,10 +66,10 @@ class CfgMagazines {
};
class rhssaf_tm200_mag: rhssaf_tm100_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm200);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_tm200);
};
class rhssaf_tm500_mag: rhssaf_tm100_mag {
EGVAR(explosives,SetupObject) = QEGVAR(explosives,Place_rhssaf_tm500);
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhssaf_tm500);
};
};

View File

@ -43,8 +43,7 @@ class CfgVehicles {
EGVAR(refuel,fuelCapacity) = 302;
};
class Truck_F;
class Truck_01_base_F: Truck_F {};
class Truck_01_base_F;
class rhsusf_fmtv_base: Truck_01_base_F {
EGVAR(refuel,fuelCapacity) = 219;
};
@ -55,8 +54,7 @@ class CfgVehicles {
EGVAR(refuel,fuelCargo) = 900; // 45 jerrycans
};
class rhsusf_HEMTT_A4_base: Truck_01_base_F {};
class rhsusf_M977A4_usarmy_wd: rhsusf_HEMTT_A4_base {};
class rhsusf_M977A4_usarmy_wd;
class rhsusf_M977A4_AMMO_usarmy_wd: rhsusf_M977A4_usarmy_wd {
EGVAR(rearm,defaultSupply) = 1200;
};

View File

@ -1,7 +1,6 @@
class CfgMagazines {
class CA_Magazine;
class rhsusf_m112_mag: CA_Magazine {
EGVAR(explosives,delayTime) = 1;
EGVAR(explosives,placeable) = 1;
EGVAR(explosives,setupObject) = QEGVAR(explosives,Place_rhsusf_explosive_m112);
useAction = 0;

View File

@ -0,0 +1,52 @@
class CfgVehicles {
class rhsusf_stryker_base;
class rhsusf_stryker_m1126_base: rhsusf_stryker_base {
class EGVAR(interaction,anims) {
class Hide_FCans {
positions[] = {{-0.7, -3, -0.4}};
items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
name = ECSTRING(refuel,TakeFuelCanister);
text = ECSTRING(refuel,TakeFuelCanisterAction);
};
};
};
class rhsusf_stryker_m1127_base: rhsusf_stryker_m1126_base {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class Hide_FCans: Hide_FCans {
positions[] = {{-0.5, -3, -0.4}};
};
};
};
class rhsusf_stryker_m1126_m2_base: rhsusf_stryker_m1126_base {};
class rhsusf_stryker_m1132_m2_base: rhsusf_stryker_m1126_m2_base {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class Hide_FCans: Hide_FCans {
positions[] = {{-1, -4, -0.4}};
};
};
};
class rhsusf_stryker_m1134_base: rhsusf_stryker_m1132_m2_base {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class Hide_FCans: Hide_FCans {
positions[] = {{-0.7, -3, -0.7}};
};
};
};
class rhsusf_m1a2tank_base;
class rhsusf_m1a2sep2_base: rhsusf_m1a2tank_base {
class EGVAR(interaction,anims) {
class fuelcans_hide {
// Rotate interactions with turret rotation
positions[] = {
"[0.23, -0.6, 0] vectorAdd ([[1.1, -3.6, 0.6], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)",
"[0.23, -0.6, 0] vectorAdd ([[-1.1, -3.6, 0.6], [0, 0, 1], deg (_target animationPhase 'MainTurret')] call CBA_fnc_vectRotate3D)"
};
items[] = {"Land_CanisterFuel_F", "Land_CanisterFuel_F"};
name = ECSTRING(refuel,TakeFuelCanister);
text = ECSTRING(refuel,TakeFuelCanisterAction);
};
};
};
};

View File

@ -21,3 +21,4 @@ class CfgPatches {
};
#include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp"

View File

@ -0,0 +1,126 @@
class CfgVehicles {
class Truck_01_base_F;
class rhsusf_fmtv_base: Truck_01_base_F {
class EGVAR(interaction,anims) {
class hide_spare {
positions[] = {{1, 1.4, 0}};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class rhsusf_M1078A1P2_fmtv_usarmy: rhsusf_fmtv_base {};
class rhsusf_M1078A1P2_B_fmtv_usarmy: rhsusf_M1078A1P2_fmtv_usarmy {};
class rhsusf_M1078A1P2_B_M2_fmtv_usarmy: rhsusf_M1078A1P2_B_fmtv_usarmy {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class hide_spare: hide_spare {
positions[] = {{1, 1.4, -0.5}};
};
};
};
class rhsusf_M1078A1R_SOV_M2_D_fmtv_socom: rhsusf_M1078A1P2_B_M2_fmtv_usarmy {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class hide_spare: hide_spare {
positions[] = {{1, 1, -0.5}};
};
};
};
class rhsusf_M1083A1P2_fmtv_usarmy: rhsusf_M1078A1P2_fmtv_usarmy {};
class rhsusf_M1083A1P2_B_fmtv_usarmy: rhsusf_M1083A1P2_fmtv_usarmy {};
class rhsusf_M1083A1P2_B_M2_fmtv_usarmy: rhsusf_M1083A1P2_B_fmtv_usarmy {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class hide_spare: hide_spare {
positions[] = {{1, 1.4, -0.5}};
};
};
};
class rhsusf_M1084A1P2_fmtv_usarmy: rhsusf_M1083A1P2_fmtv_usarmy {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class hide_spare: hide_spare {
positions[] = {{1, 1.8, 0}};
};
};
};
class rhsusf_M1084A1P2_B_M2_fmtv_usarmy: rhsusf_M1083A1P2_B_M2_fmtv_usarmy {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class hide_spare: hide_spare {
positions[] = {{1, 1.8, -0.5}};
};
};
};
class rhsusf_M1085A1P2_B_Medical_fmtv_usarmy: rhsusf_M1083A1P2_B_fmtv_usarmy {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class hide_spare: hide_spare {
positions[] = {{1, 6.1, 0}};
};
};
};
class rhsusf_HEMTT_A4_base: Truck_01_base_F {
class EGVAR(interaction,anims) {
class hide_spare {
positions[] = {"_target selectionPosition 'sparewheel' vectorAdd [0.6, 0.6, -0.4]"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class MRAP_01_base_F;
class rhsusf_m1151_base: MRAP_01_base_F {
class EGVAR(interaction,anims) {
class hide_spare {
positions[] = {"_target selectionPosition 'sparewheel' vectorAdd [-0.465, 0, 0]"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
// Don't inherit, as it's easier for the trenches compat
class rhsusf_M1165A1_GMV_SAG2_base: rhsusf_m1151_base {
class EGVAR(interaction,anims) {
class hide_spare {
positions[] = {"_target selectionPosition 'sparewheel_gmv' vectorAdd [0, -0.44, 0]"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class rhsusf_rg33_base: MRAP_01_base_F {
class EGVAR(interaction,anims) {
class hide_spare {
selections[] = {"sparewheel"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class rhsusf_M1239_base: MRAP_01_base_F {
class EGVAR(interaction,anims) {
class hide_spare {
selections[] = {"sparewheel"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
class rhsusf_MATV_base: MRAP_01_base_F {
class EGVAR(interaction,anims) {
class hide_spare {
selections[] = {"sparewheel"};
items[] = {"ACE_Wheel"};
name = ECSTRING(repair,RemoveWheel);
text = ECSTRING(repair,RemovingWheel);
};
};
};
};

View File

@ -0,0 +1,23 @@
#include "script_component.hpp"
class CfgPatches {
class SUBADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {
"rhsusf_main_loadorder",
"ace_repair"
};
skipWhenMissingDependencies = 1;
author = ECSTRING(common,ACETeam);
authors[] = {"johnb43"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
addonRootClass = QUOTE(ADDON);
};
};
#include "CfgVehicles.hpp"

View File

@ -0,0 +1,3 @@
#define SUBCOMPONENT repair
#define SUBCOMPONENT_BEAUTIFIED Repair
#include "..\script_component.hpp"

View File

@ -0,0 +1,48 @@
class CfgVehicles {
class rhsusf_stryker_base;
class rhsusf_stryker_m1126_base: rhsusf_stryker_base {
class EGVAR(interaction,anims) {
class Hide_PioKit {
positions[] = {{-1, -2.2, -0.5}};
items[] = {"ACE_EntrenchingTool"};
name = ECSTRING(trenches,EntrenchingToolName);
text = ECSTRING(trenches,EntrenchingToolName);
};
};
};
class rhsusf_stryker_m1127_base: rhsusf_stryker_m1126_base {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class Hide_PioKit: Hide_PioKit {
positions[] = {{-0.8, -2.2, -0.5}};
};
};
};
class rhsusf_stryker_m1126_m2_base: rhsusf_stryker_m1126_base {};
class rhsusf_stryker_m1132_m2_base: rhsusf_stryker_m1126_m2_base {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class Hide_PioKit: Hide_PioKit {
positions[] = {{-1.3, -3.3, -0.5}};
};
};
};
class rhsusf_stryker_m1134_base: rhsusf_stryker_m1132_m2_base {
class EGVAR(interaction,anims): EGVAR(interaction,anims) {
class Hide_PioKit: Hide_PioKit {
positions[] = {{-1, -2.2, -0.8}};
};
};
};
class rhsusf_m1151_base;
class rhsusf_M1165A1_GMV_SAG2_base: rhsusf_m1151_base {
class EGVAR(interaction,anims) {
class tools_hide {
positions[] = {{0.365, 1.5, -0.4}};
items[] = {"ACE_EntrenchingTool"};
name = ECSTRING(trenches,EntrenchingToolName);
text = ECSTRING(trenches,EntrenchingToolName);
};
};
};
};

View File

@ -0,0 +1,23 @@
#include "script_component.hpp"
class CfgPatches {
class SUBADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {
"rhsusf_main_loadorder",
"ace_trenches"
};
skipWhenMissingDependencies = 1;
author = ECSTRING(common,ACETeam);
authors[] = {"johnb43"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
addonRootClass = QUOTE(ADDON);
};
};
#include "CfgVehicles.hpp"

View File

@ -0,0 +1,3 @@
#define SUBCOMPONENT trenches
#define SUBCOMPONENT_BEAUTIFIED Trenches
#include "..\script_component.hpp"

View File

@ -2,7 +2,7 @@ class ACE_CSW_Groups {
// --- Gun Turrets -------------------------------------------------------------
class ace_csw_100Rnd_127x99_mag {
class EGVAR(csw,100Rnd_127x99_mag) {
vn_m2_v_100_mag = 1;
};

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