mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
revert old weapons, pt1
This commit is contained in:
@ -38,8 +38,9 @@ class CfgAmmo {
|
||||
EGVAR(vehicle_damage,incendiary) = 1.0;
|
||||
|
||||
class ace_missileguidance {
|
||||
pitchRate = 0;
|
||||
yawRate = 0;
|
||||
minDeflection = 0;
|
||||
maxDeflection = 0;
|
||||
incDeflection = 0;
|
||||
|
||||
canVanillaLock = 0;
|
||||
|
||||
@ -50,9 +51,6 @@ class CfgAmmo {
|
||||
defaultSeekerLockMode = "LOAL";
|
||||
seekerLockModes[] = { "LOAL", "LOBL" };
|
||||
|
||||
defaultNavigationType = "LineOfSight";
|
||||
navigationTypes[] = { "LineOfSight" };
|
||||
|
||||
seekLastTargetPos = 0;
|
||||
seekerAngle = 30;
|
||||
seekerAccuracy = 1;
|
||||
@ -84,9 +82,6 @@ class CfgAmmo {
|
||||
class ace_missileguidance {
|
||||
enabled = 1;
|
||||
|
||||
pitchRate = 0;
|
||||
yawRate = 0;
|
||||
|
||||
// Guidance type for munitions
|
||||
defaultSeekerType = "SACLOS";
|
||||
seekerTypes[] = { "SACLOS" };
|
||||
|
@ -8,7 +8,7 @@ class CfgPatches {
|
||||
requiredVersion = REQUIRED_VERSION;
|
||||
requiredAddons[] = {"ace_hot","ace_csw"};
|
||||
author = ECSTRING(common,ACETeam);
|
||||
authors[] = {"tcvm"};
|
||||
authors[] = {"Dani (TCVM)"};
|
||||
url = ECSTRING(main,URL);
|
||||
VERSION_CONFIG;
|
||||
};
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: tcvm (Code inspired by NouberNou's Dragon Guidance)
|
||||
* Author: Dani (TCVM) (Code inspired by NouberNou's Dragon Guidance)
|
||||
* Attack profile: Dragon Guidance
|
||||
*
|
||||
* Arguments:
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: tcvm
|
||||
* Author: Dani (TCVM)
|
||||
* Determines if you can pick-up the Dragon missile. If the missile was fired you will not be able to pick up the tripod.
|
||||
*
|
||||
* Arguments:
|
||||
@ -21,4 +21,5 @@ params ["_target", "_unit"];
|
||||
&& {!alive (gunner _target)}
|
||||
&& {!(_target getVariable [QGVAR(fired), false])}
|
||||
&& {!(_target getVariable [QGVAR(sightAttached), ((typeOf _target) == QGVAR(staticAssembled))])}
|
||||
&& EFUNC(csw,canPickupTripod)
|
||||
&& EFUNC(csw,assemble_canPickupTripod)
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: tcvm
|
||||
* Author: Dani (TCVM)
|
||||
* Runs when Dragon is fired
|
||||
*
|
||||
* Arguments:
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: tcvm
|
||||
* Author: Dani (TCVM)
|
||||
* Attaches the sighting unit to the Dragon missile.
|
||||
*
|
||||
* Arguments:
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: tcvm
|
||||
* Author: Dani (TCVM)
|
||||
* Determines if you can attach the sighting unit to the Dragon missile.
|
||||
*
|
||||
* Arguments:
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: tcvm
|
||||
* Author: Dani (TCVM)
|
||||
* Determines if you can attach the sighting unit to the Dragon missile.
|
||||
*
|
||||
* Arguments:
|
||||
|
@ -1,6 +1,6 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: tcvm
|
||||
* Author: Dani (TCVM)
|
||||
* Attaches the sighting unit to the Dragon missile.
|
||||
*
|
||||
* Arguments:
|
||||
|
1
addons/dragon/functions/script_component.hpp
Normal file
1
addons/dragon/functions/script_component.hpp
Normal file
@ -0,0 +1 @@
|
||||
#include "\z\ace\addons\dragon\script_component.hpp"
|
@ -71,7 +71,7 @@
|
||||
<Japanese>SU-36/P デイサイト</Japanese>
|
||||
<Chinese>SU-36/P 日間瞄具</Chinese>
|
||||
<Chinesesimp>SU-36/P 常规瞄具</Chinesesimp>
|
||||
<Italian>SU-36/P Mirino Diurno</Italian>
|
||||
<Italian>SU-36/P Daysight</Italian>
|
||||
<Czech>SU-36/P denní puškohled</Czech>
|
||||
<Polish>SU-36/P Celownik dzienny</Polish>
|
||||
<Turkish>SU-36/P Daysight</Turkish>
|
||||
@ -84,10 +84,10 @@
|
||||
<German>Ein leichte, billige Visierung for Tageseinsätze. Beinhaltet den Zielsuchcomputer für das ganze System.</German>
|
||||
<Portuguese>Uma mira leve e comum utilizada para operações de dia. Contêm o computador de orientação para todo o sistema.</Portuguese>
|
||||
<French>Un viseur léger et bon marché utilisé pour les opérations de jour.\nContient l'ordinateur de guidage pour tout le système.</French>
|
||||
<Japanese>昼間時に使用される軽量で、低価格の照準器。システム全体の誘導コンピュータを備えている。</Japanese>
|
||||
<Japanese>昼間時に使用される軽量で、低価格の照準器です。システム全体の誘導コンピュータを備えています。</Japanese>
|
||||
<Chinese>一個輕量,便宜適合日間行動使用的廉價瞄具。內含全套制導電腦系統</Chinese>
|
||||
<Chinesesimp>一种用于日间作战的轻型廉价瞄准具。包含整个系统的制导计算机</Chinesesimp>
|
||||
<Italian>Un mirino leggero ed economico usato per le operazioni diurne. Contiene il computer di guida per l'intero sistema.</Italian>
|
||||
<Italian>Una luce,un mirino usato per le operazioni diurne.Contiene il computer di guida per l'intero sistema </Italian>
|
||||
<Czech>Lehký a levný puškohled pro použití za denního světla. Obsahuje navigační počítač pro celý systém.</Czech>
|
||||
<Polish>Lekki, tani celownik używany do działania w trakcie dnia. Zawiera komputer naprowadząjący dla całego systemu</Polish>
|
||||
<Russian>Лёгкий дешёвый прицел, используемый для дневных операций. Содержит компьютер для всей системы</Russian>
|
||||
@ -102,7 +102,7 @@
|
||||
<Japanese>特徴的な飛行特性を持つ、ワイヤ誘導の SACLOS ミサイルです。</Japanese>
|
||||
<Chinese>一個有線制導半自動指令型飛彈並有著獨特的飛航動作</Chinese>
|
||||
<Chinesesimp>具有独特飞行特性的线导半自动指令型导弹</Chinesesimp>
|
||||
<Italian>Un missile SACLOS filo-guidato con una caratterisca di volo particolare</Italian>
|
||||
<Italian>Un missile SACLOS filo-guidato con uniche caratterische di volo </Italian>
|
||||
<Czech>Drátem naváděná SACLOS raketa s unikátními letovými vlastnostmi</Czech>
|
||||
<Polish>Naprowadzany przewodowo rakietowy pocisk SACLOS o unikalnej charakterystyce lotu</Polish>
|
||||
<Russian>Ракета SACLOS с проводным наведением с уникальной характеристикой полета</Russian>
|
||||
|
@ -26,8 +26,9 @@ class CfgAmmo {
|
||||
class ace_missileguidance {
|
||||
enabled = 1;
|
||||
|
||||
pitchRate = 30; // degrees per second
|
||||
yawRate = 30;
|
||||
minDeflection = 0.0005; // Minium flap deflection for guidance
|
||||
maxDeflection = 0.01; // Maximum flap deflection for guidance
|
||||
incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
|
||||
|
||||
canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
|
||||
|
||||
@ -38,9 +39,6 @@ class CfgAmmo {
|
||||
defaultSeekerLockMode = "LOAL";
|
||||
seekerLockModes[] = { "LOAL", "LOBL" };
|
||||
|
||||
defaultNavigationType = "Direct";
|
||||
navigationTypes[] = { "Direct", "ZeroEffortMiss" };
|
||||
|
||||
seekLastTargetPos = 1; // seek last target position [if seeker loses LOS of target, continue to last known pos]
|
||||
seekerAngle = 70; // Angle in front of the missile which can be searched
|
||||
seekerAccuracy = 1; // seeker accuracy multiplier
|
||||
@ -51,19 +49,6 @@ class CfgAmmo {
|
||||
// Attack profile type selection
|
||||
defaultAttackProfile = "hellfire";
|
||||
attackProfiles[] = {"hellfire", "hellfire_hi", "hellfire_lo"};
|
||||
|
||||
class navigationStates {
|
||||
class initial {
|
||||
transitionCondition = QFUNC(midCourseTransition);
|
||||
navigationType = "Direct";
|
||||
};
|
||||
class terminal {
|
||||
transitionCondition = "";
|
||||
navigationType = "ZeroEffortMiss";
|
||||
};
|
||||
// transitions from initial -> termimal
|
||||
states[] = {"initial", "terminal"};
|
||||
};
|
||||
};
|
||||
};
|
||||
class ACE_Hellfire_AGM114N: ACE_Hellfire_AGM114K {
|
||||
@ -90,8 +75,8 @@ class CfgAmmo {
|
||||
canVanillaLock = 1;
|
||||
enabled = 1; // Missile Guidance must be explicitly enabled
|
||||
seekLastTargetPos = 0;
|
||||
defaultSeekerType = "MillimeterWaveRadar";
|
||||
seekerTypes[] = { "MillimeterWaveRadar" };
|
||||
defaultSeekerType = "ARH";
|
||||
seekerTypes[] = { "ARH" };
|
||||
defaultSeekerLockMode = "LOBL";
|
||||
seekerLockModes[] = { "LOBL" };
|
||||
|
||||
|
@ -16,7 +16,7 @@ class CfgMagazines {
|
||||
count = 1;
|
||||
mass = 70;
|
||||
pylonWeapon = QGVAR(launcher);
|
||||
hardpoints[] = {"SCALPEL_1RND", "HellfireRail_MELB"};
|
||||
hardpoints[] = {"SCALPEL_1RND"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonMissile_1x_Bomb_04_F.p3d";
|
||||
};
|
||||
class PylonRack_1Rnd_ACE_Hellfire_AGM114K: 6Rnd_ACE_Hellfire_AGM114K { // 1x Launcher Support Rack
|
||||
|
@ -2,4 +2,3 @@ LOG("prep");
|
||||
PREP(attackProfile);
|
||||
PREP(getAttackProfileSettings);
|
||||
PREP(setupVehicle);
|
||||
PREP(midCourseTransition);
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Hellfire attack profile. Handles all 4 modes LOBL, LOAL-DIR, LOAL-HI, LOAL-LO
|
||||
@ -18,99 +18,80 @@
|
||||
*/
|
||||
|
||||
params ["_seekerTargetPos", "_args", "_attackProfileStateParams"];
|
||||
_args params ["_firedEH", "_launchParams", "_flightParams", "", "_stateParams"];
|
||||
_args params ["_firedEH", "_launchParams", "", "", "_stateParams"];
|
||||
_stateParams params ["", "_seekerStateParams"];
|
||||
_launchParams params ["","_targetLaunchParams","_seekerType"];
|
||||
|
||||
_targetLaunchParams params ["", "", "_launchPos", "_launchDir"];
|
||||
_targetLaunchParams params ["", "", "_launchPos"];
|
||||
_firedEH params ["","","","","","","_projectile"];
|
||||
|
||||
// Get state params:
|
||||
if (_attackProfileStateParams isEqualTo []) then {
|
||||
_this call FUNC(getAttackProfileSettings);
|
||||
};
|
||||
_attackProfileStateParams params ["_attackStage", "_configLaunchHeightClear", "_missileStateData"];
|
||||
_attackProfileStateParams params ["_attackStage", "_configLaunchHeightClear"];
|
||||
|
||||
|
||||
private _projectilePos = getPosASL _projectile;
|
||||
private _distanceFromLaunch2d = _launchPos distance2d _projectilePos;
|
||||
private _heightAboveLaunch = (_projectilePos select 2) - (_launchPos select 2);
|
||||
|
||||
// Add height depending on distance for compensate
|
||||
private _returnTargetPos = _seekerTargetPos;
|
||||
if (_returnTargetPos isEqualTo [0, 0, 0]) then {
|
||||
private _initialDistanceToTarget = 8000;
|
||||
_returnTargetPos = _launchPos vectorAdd (_launchDir vectorMultiply _initialDistanceToTarget);
|
||||
};
|
||||
|
||||
private _closingRate = vectorMagnitude velocity _projectile;
|
||||
// subtract 500 meters to account for the fact that we don't want to be at the perfect pitch exactly when we cross the target
|
||||
// 500 seemed good in testing
|
||||
private _timeToGo = ((_projectilePos distance2d _seekerTargetPos) - 500) / _closingRate;
|
||||
|
||||
// we could do stuff like desired attack angle, but I'm not going that far today
|
||||
private _los = _projectilePos vectorFromTo _seekerTargetPos;
|
||||
|
||||
_flightParams params ["_pitchRate", "_yawRate"];
|
||||
|
||||
private _angleToTarget = acos ((vectorDir _projectile) vectorCos _los);
|
||||
private _atMinRotationAngle = _angleToTarget >= (_pitchRate * _timeToGo);
|
||||
private _returnTargetPos = nil;
|
||||
|
||||
switch (_attackStage) do {
|
||||
case STAGE_LAUNCH: { // Gain height quickly to pass terrain mask
|
||||
_missileStateData params ["_heightBeforeStateSwitch", "_initialDistanceToTarget"];
|
||||
|
||||
_returnTargetPos set [2, _heightBeforeStateSwitch + (_initialDistanceToTarget * sin 20)]; // 100 and 36.4 gives a 20 deg angle
|
||||
_returnTargetPos = _projectilePos getPos [100, getDir _projectile];
|
||||
_returnTargetPos set [2, (_projectilePos select 2) + 36.4]; // 100 and 36.4 gives a 20 deg angle
|
||||
|
||||
if (_heightAboveLaunch > _configLaunchHeightClear) then {
|
||||
_attackProfileStateParams set [0, STAGE_SEEK_CRUISE];
|
||||
|
||||
_attackProfileStateParams set [2, [_projectilePos select 2, _seekerTargetPos distance2d _projectilePos]];
|
||||
TRACE_2("New Stage: STAGE_SEEK_CRUISE",_distanceFromLaunch2d,_heightAboveLaunch);
|
||||
};
|
||||
|
||||
if (_atMinRotationAngle) then {
|
||||
_attackProfileStateParams set [0, STAGE_ATTACK_TERMINAL];
|
||||
|
||||
_attackProfileStateParams set [2, [_projectilePos select 2, _seekerTargetPos distance2d _projectilePos]];
|
||||
TRACE_2("New Stage: STAGE_ATTACK_TERMINAL",_distanceToTarget2d,_currentHeightOverTarget);
|
||||
};
|
||||
};
|
||||
case STAGE_SEEK_CRUISE: { // Slowly gain altitude while searching for target
|
||||
_missileStateData params ["_heightBeforeStateSwitch", "_initialDistanceToTarget"];
|
||||
|
||||
// Before 4000 cruise at 5.7 degrees up, then level out
|
||||
_returnTargetPos set [2, _heightBeforeStateSwitch + (_initialDistanceToTarget * sin 5.7)];
|
||||
|
||||
private _cruiseHeight = linearConversion [3000, 5000, _distanceFromLaunch2d, 10, 0, true];
|
||||
|
||||
_returnTargetPos = _projectilePos getPos [100, getDir _projectile];
|
||||
_returnTargetPos set [2, (_projectilePos select 2) + _cruiseHeight];
|
||||
|
||||
if (_seekerTargetPos isNotEqualTo [0,0,0]) then {
|
||||
_attackProfileStateParams set [0, STAGE_ATTACK_CRUISE];
|
||||
|
||||
_attackProfileStateParams set [2, [_projectilePos select 2, _seekerTargetPos distance2d _projectilePos]];
|
||||
TRACE_1("New Stage: STAGE_ATTACK_CRUISE",_distanceFromLaunch2d);
|
||||
};
|
||||
};
|
||||
case STAGE_ATTACK_CRUISE: {
|
||||
_missileStateData params ["_heightBeforeStateSwitch", "_initialDistanceToTarget"];
|
||||
|
||||
private _currentHeightOverTarget = (_projectilePos select 2) - (_seekerTargetPos select 2);
|
||||
private _distanceToTarget2d = _seekerTargetPos distance2d _projectilePos;
|
||||
private _distToGoRatio = _distanceToTarget2d / (_launchPos distance2d _seekerTargetPos);
|
||||
|
||||
_returnTargetPos set [2, _heightBeforeStateSwitch + (_initialDistanceToTarget * sin 7)];
|
||||
// arcing up at 7 degrees to start until 50% left, then smooth curve to a downward attack
|
||||
private _gainSlope = linearConversion [0.5, 0.1, _distToGoRatio, 7, -7, true];
|
||||
_returnTargetPos = +_seekerTargetPos;
|
||||
_returnTargetPos set [2, ((_projectilePos select 2) + (_distanceToTarget2d * sin _gainSlope)) max (_seekerTargetPos select 2)];
|
||||
|
||||
// if we are at the rotation limit, rotate to target
|
||||
if (_atMinRotationAngle || {(_currentHeightOverTarget atan2 _distanceToTarget2d) > 15}) then { // Wait until we can come down at a sharp angle
|
||||
if ((_distanceToTarget2d < 500) || {(_currentHeightOverTarget atan2 _distanceToTarget2d) > 15}) then { // Wait until we can come down at a sharp angle
|
||||
_attackProfileStateParams set [0, STAGE_ATTACK_TERMINAL];
|
||||
|
||||
_attackProfileStateParams set [2, [_projectilePos select 2, _seekerTargetPos distance2d _projectilePos]];
|
||||
TRACE_2("New Stage: STAGE_ATTACK_TERMINAL",_distanceToTarget2d,_currentHeightOverTarget);
|
||||
};
|
||||
};
|
||||
case STAGE_ATTACK_TERMINAL: {
|
||||
private _distanceToTarget2d = _seekerTargetPos distance2d _projectilePos;
|
||||
_returnTargetPos = _seekerTargetPos vectorAdd [0, 0, _distanceToTarget2d * 0.02];
|
||||
};
|
||||
};
|
||||
|
||||
// missile guidance defines this variable in doAttackProfile
|
||||
//IGNORE_PRIVATE_WARNING ["_attackProfileName"];
|
||||
_attackProfileName = ["na", "hellfire - LAUNCH", "hellfire - SEEK CRUISE", "hellfire - ATTACK CRUISE", "hellfire - TERMINAL"] select _attackStage;
|
||||
// Special radar case. Adjust target position such that we are leading it
|
||||
if (_attackStage >= 3 && { _seekerType isEqualTo "ARH" }) then {
|
||||
_seekerStateParams params ["", "", "", "", "", "", "", "_lastKnownVelocity"];
|
||||
private _projectileVelocity = velocity _projectile;
|
||||
if (_projectileVelocity#2 < 0) then {
|
||||
private _projectileSpeed = vectorMagnitude _projectileVelocity; // this gives a precise impact time versus using speed _projectile. Dont change
|
||||
private _timeUntilImpact = (_seekerTargetPos distance _projectilePos) / _projectileSpeed;
|
||||
_returnTargetPos = _returnTargetPos vectorAdd (_lastKnownVelocity vectorMultiply _timeUntilImpact);
|
||||
};
|
||||
};
|
||||
|
||||
TRACE_1("Adjusted target position",_returnTargetPos);
|
||||
// TRACE_1("Adjusted target position", _returnTargetPos);
|
||||
_returnTargetPos;
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Gets attack profile parameters for first run of hellfire attack profile function
|
||||
@ -27,24 +27,19 @@ private _attackConfig = configFile >> QEGVAR(missileguidance,AttackProfiles) >>
|
||||
// Launch (clearing terrain mask for LO/HI):
|
||||
private _configLaunchHeightClear = getNumber (_attackConfig >> QGVAR(launchHeightClear));
|
||||
|
||||
private _projectilePos = getPosASL _projectile;
|
||||
|
||||
// Get starting stage
|
||||
private _startingStage = if (_configLaunchHeightClear > 0) then {
|
||||
STAGE_LAUNCH; // LOAL-HI / LO
|
||||
} else {
|
||||
[
|
||||
STAGE_ATTACK_CRUISE,
|
||||
STAGE_SEEK_CRUISE
|
||||
] select (_seekerTargetPos isEqualTo [0,0,0]);
|
||||
if (_seekerTargetPos isEqualTo [0,0,0]) then {
|
||||
STAGE_SEEK_CRUISE; // LOAL-DIR
|
||||
} else {
|
||||
STAGE_ATTACK_CRUISE // LOBL
|
||||
};
|
||||
};
|
||||
|
||||
// Set data in param array
|
||||
_attackProfileStateParams set [0, _startingStage];
|
||||
_attackProfileStateParams set [1, _configLaunchHeightClear];
|
||||
_attackProfileStateParams set [2, [
|
||||
_projectilePos select 2,
|
||||
_seekerTargetPos distance2d _projectilePos
|
||||
]];
|
||||
|
||||
TRACE_1("new shot settings",_attackProfileStateParams);
|
||||
|
@ -1,29 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: tcvm
|
||||
* Condition to switch to next navigation profile
|
||||
*
|
||||
* Arguments:
|
||||
* Guidance Arg Array <ARRAY>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_hellfire_fnc_midCourseTransition
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
_args params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams", "_targetData", "_navigationStateData"];
|
||||
_firedEH params ["_shooter","","","","_ammo","","_projectile"];
|
||||
_launchParams params ["_shooter","_targetLaunchParams","_seekerType","_attackProfile","_lockMode","_laserInfo","_navigationType"];
|
||||
_targetLaunchParams params ["_target", "_targetPos", "_launchPos", "_launchDir", "_launchTime"];
|
||||
_flightParams params ["_pitchRate", "_yawRate", "_isBangBangGuidance"];
|
||||
_stateParams params ["_lastRunTime", "_seekerStateParams", "_attackProfileStateParams", "_lastKnownPosState","_navigationParams", "_guidanceParameters"];
|
||||
_seekerParams params ["_seekerAngle", "_seekerAccuracy", "_seekerMaxRange", "_seekerMinRange"];
|
||||
_targetData params ["_targetDirection", "_attackProfileDirection", "_targetRange", "_targetVelocity", "_targetAcceleration"];
|
||||
|
||||
_attackProfileStateParams params ["_state"];
|
||||
_state isEqualTo STAGE_ATTACK_TERMINAL;
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Adds interaction menu actions to switch the firemode to a vehicle.
|
||||
|
1
addons/hellfire/functions/script_component.hpp
Normal file
1
addons/hellfire/functions/script_component.hpp
Normal file
@ -0,0 +1 @@
|
||||
#include "\z\ace\addons\hellfire\script_component.hpp"
|
@ -22,39 +22,33 @@
|
||||
<Russian>Самонаводящаяся Ракета с фугасной противотанковой боевой частью и полуактивной лазерной системой наведения</Russian>
|
||||
<Spanish>Misil de guiado láser semi-activo con cabeza de alto explosivo anti-tanque</Spanish>
|
||||
<French>Missile antichar à guidage laser semi-actif (charge HEAT)</French>
|
||||
<Italian>Missile a guida laser semi-attiva con una testata HEAT</Italian>
|
||||
<Japanese>セミ アクティブ レーダー誘導の対戦車弾頭</Japanese>
|
||||
<Polish>Rakieta naprowadzana laserowo z głowicą przeciwpancerną</Polish>
|
||||
<German>Halbaktive Laser-Zielsuchrakete mit HEAT-Gefechtskopf</German>
|
||||
<Chinesesimp>高爆反坦克弹头半主动激光制导导弹</Chinesesimp>
|
||||
<Korean>반능동 레이저 유도미사일로 대전차 고폭 탄두를 탑재하고 있습니다.</Korean>
|
||||
<Portuguese>Míssil teleguiado a laser semi-ativo com ogiva antitanque altamente explosiva</Portuguese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Hellfire_LDescriptionShort">
|
||||
<English>Millimeter-wave radar guided missile with high explosive anti-tank warhead</English>
|
||||
<Russian>Радиолокационная управляемая ракета миллиметрового диапазона с фугасной противотанковой боевой частью</Russian>
|
||||
<Spanish>Misil guiado por radar de onda milimétrica con cabeza de alto explosivo anti-tanque</Spanish>
|
||||
<French>Missile antichar à guidage radar à ondes courtes (charge HEAT)</French>
|
||||
<Italian>Missile a guida radar con una testata HEAT</Italian>
|
||||
<Japanese>ミリ波レーダー誘導の対戦車弾頭</Japanese>
|
||||
<Polish>Rakieta namierzana radarowo z głowicą przeciwpancerną</Polish>
|
||||
<German>Millimeterwellenradar-Lenkflugkörper mit HEAT-Gefechtskopf</German>
|
||||
<Chinesesimp>高爆反坦克弹头毫米波雷达制导导弹</Chinesesimp>
|
||||
<Korean>밀리미터파 레이더 유도 미사일로 대전차 고폭 탄두를 탑재하고 있습니다.</Korean>
|
||||
<Portuguese>Míssil guiado por radar de ondas milimétricas com ogiva antitanque altamente explosiva</Portuguese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Hellfire_NDescriptionShort">
|
||||
<English>Semi-active laser homing missile with metal augmented charge anti-personnel warhead</English>
|
||||
<Russian>Самонаводящаяся ракета с металлической увеличенной зарядной противопехотной боевой частью и полуактивной лазерной системой наведения</Russian>
|
||||
<Spanish>Misil guiado por láser semi-activo con cabeza de carga de metal aumentada anti-persona</Spanish>
|
||||
<Italian>Missile a guida laser semi-attiva con una testata a frammentazione antiuomo</Italian>
|
||||
<French>Missile antipersonnel thermobarique à guidage laser semi-actif</French>
|
||||
<Japanese>セミ アクティブ レーダー誘導の対人弾</Japanese>
|
||||
<Polish>Rakieta naprowadzana laserowo z głowicą odłamkową</Polish>
|
||||
<German>Halbaktive Laser-Zielsuchrakete mit metallverstärktem Antipersonen-Gefechtskopf</German>
|
||||
<Chinesesimp>金属增强人员杀伤弹头半主动激光制导导弹</Chinesesimp>
|
||||
<Korean>반능동 레이저 유도 미사일로 대인 금속 강화 탄두가 탑재하고 있습니다.</Korean>
|
||||
<Portuguese>Míssil teleguiado a laser semi-ativo com ogiva antipessoal de carga aumentada de metal</Portuguese>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
||||
|
2
addons/hot/$PBOPREFIX$
Normal file
2
addons/hot/$PBOPREFIX$
Normal file
@ -0,0 +1,2 @@
|
||||
z\ace\addons\hot
|
||||
|
141
addons/hot/CfgAmmo.hpp
Normal file
141
addons/hot/CfgAmmo.hpp
Normal file
@ -0,0 +1,141 @@
|
||||
class CfgAmmo {
|
||||
class M_Scalpel_AT;
|
||||
class ammo_Penetrator_Base;
|
||||
|
||||
class GVAR(ammo_Penetrator_HOT1): ammo_Penetrator_Base {
|
||||
caliber = 60;
|
||||
warheadName = "HEAT";
|
||||
hit = 720;
|
||||
};
|
||||
|
||||
class GVAR(ammo_Penetrator_HOT2): ammo_Penetrator_Base {
|
||||
caliber = 65;
|
||||
warheadName = "HEAT";
|
||||
hit = 900;
|
||||
};
|
||||
|
||||
class GVAR(ammo_Penetrator_HOT3): ammo_Penetrator_Base {
|
||||
caliber = 80;
|
||||
warheadName = "TandemHEAT";
|
||||
hit = 1000;
|
||||
};
|
||||
|
||||
class GVAR(HOT1): M_Scalpel_AT {
|
||||
aiAmmoUsageFlags = "128+512";
|
||||
model = "\A3\Weapons_F_Tank\Launchers\Vorona\Vorona_missile_heat_fly";
|
||||
proxyShape = "\A3\Weapons_F\Ammo\Missile_AT_03_F";
|
||||
submunitionAmmo = QGVAR(ammo_Penetrator_HOT1);
|
||||
submunitionDirectionType = "SubmunitionModelDirection";
|
||||
submunitionInitSpeed = 1000;
|
||||
submunitionParentSpeedCoef = 0;
|
||||
submunitionInitialOffset[] = { 0, 0, -0.2 };
|
||||
hit = 150;
|
||||
warheadName = "HEAT";
|
||||
indirectHit = 25;
|
||||
indirectHitRange = 3.5;
|
||||
explosive = 0.8;
|
||||
|
||||
displayName = CSTRING(hot1);
|
||||
displayNameShort = CSTRING(hot1);
|
||||
description = CSTRING(missileType_Description);
|
||||
descriptionShort = CSTRING(missileType);
|
||||
|
||||
effectsMissile = "missile2";
|
||||
|
||||
irLock = 0;
|
||||
laserLock = 0;
|
||||
manualControl = 0;
|
||||
maxSpeed = 240;
|
||||
|
||||
thrustTime = 17;
|
||||
thrust = 125;
|
||||
timeToLive = 40;
|
||||
initTime = 0.3;
|
||||
|
||||
EGVAR(rearm,caliber) = 178;
|
||||
EGVAR(vehicle_damage,incendiary) = 1.0;
|
||||
|
||||
class ace_missileguidance {
|
||||
enabled = 1;
|
||||
|
||||
minDeflection = 0; // Minium flap deflection for guidance
|
||||
maxDeflection = 0.0030; // Maximum flap deflection for guidance
|
||||
incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
|
||||
|
||||
canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
|
||||
|
||||
// Guidance type for munitions
|
||||
defaultSeekerType = "SACLOS";
|
||||
seekerTypes[] = { "SACLOS" };
|
||||
|
||||
defaultSeekerLockMode = "LOAL";
|
||||
seekerLockModes[] = { "LOAL", "LOBL" };
|
||||
|
||||
seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
|
||||
seekerAngle = 30; // Angle from the shooter's view that can track the missile
|
||||
seekerAccuracy = 1; // seeker accuracy multiplier
|
||||
|
||||
seekerMinRange = 75;
|
||||
seekerMaxRange = 4000; // Range from the missile which the seeker can visually search
|
||||
|
||||
correctionDistance = 8; // distance from center of crosshair where missile slows down
|
||||
offsetFromCrosshair[] = { 0, 0, 0.5 }; // where the missile wants to stay in relation to the center of the crosshair.
|
||||
|
||||
// Attack profile type selection
|
||||
defaultAttackProfile = "WIRE";
|
||||
attackProfiles[] = {"WIRE"};
|
||||
};
|
||||
};
|
||||
|
||||
class GVAR(HOT2): GVAR(HOT1) {
|
||||
submunitionAmmo = QGVAR(ammo_Penetrator_HOT2);
|
||||
displayName = CSTRING(hot2);
|
||||
displayNameShort = CSTRING(hot2);
|
||||
|
||||
class ace_missileguidance: ace_missileguidance {
|
||||
enabled = 1;
|
||||
};
|
||||
};
|
||||
|
||||
class GVAR(HOT2MP): GVAR(HOT2) {
|
||||
aiAmmoUsageFlags = "64+128";
|
||||
submunitionAmmo = "";
|
||||
warheadName = "HE";
|
||||
allowAgainstInfantry = 1;
|
||||
hit = 200;
|
||||
indirectHit = 200;
|
||||
indirectHitRange = 5;
|
||||
explosionEffects = "BombExplosion";
|
||||
explosive = 0.7;
|
||||
|
||||
EGVAR(frag,enabled) = 1;
|
||||
EGVAR(frag,metal) = 7100; // 1000 steel balls
|
||||
EGVAR(frag,charge) = 4100;
|
||||
EGVAR(frag,gurney_c) = 2700;
|
||||
EGVAR(frag,gurney_k) = "3/5";
|
||||
EGVAR(frag,classes)[] = {"ACE_frag_small"};
|
||||
|
||||
displayName = CSTRING(hot2mp);
|
||||
displayNameShort = CSTRING(hot2mp);
|
||||
description = CSTRING(missileType_Description_AP);
|
||||
|
||||
EGVAR(vehicle_damage,incendiary) = 0.1;
|
||||
|
||||
class ace_missileguidance: ace_missileguidance {
|
||||
enabled = 1;
|
||||
};
|
||||
};
|
||||
|
||||
class GVAR(HOT3): GVAR(HOT2) {
|
||||
submunitionAmmo = QGVAR(ammo_Penetrator_HOT3);
|
||||
warheadName = "TandemHEAT";
|
||||
displayName = CSTRING(hot3);
|
||||
displayNameShort = CSTRING(hot3);
|
||||
|
||||
class ace_missileguidance: ace_missileguidance {
|
||||
enabled = 1;
|
||||
seekerMaxRange = 4300;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
205
addons/hot/CfgMagazines.hpp
Normal file
205
addons/hot/CfgMagazines.hpp
Normal file
@ -0,0 +1,205 @@
|
||||
class CfgMagazines {
|
||||
class 12Rnd_PG_missiles;
|
||||
|
||||
// HOT1 - HEAT (anti-tank)
|
||||
class GVAR(1_6Rnd): 12Rnd_PG_missiles { // Old style vehicle magazine
|
||||
count = 6;
|
||||
initSpeed = 100;
|
||||
ammo = QGVAR(HOT1);
|
||||
displayName = CSTRING(hot1);
|
||||
displayNameShort = CSTRING(hot1);
|
||||
descriptionShort = CSTRING(missileType);
|
||||
};
|
||||
|
||||
class GVAR(1_2Rnd): GVAR(1_6Rnd) {
|
||||
count = 2;
|
||||
};
|
||||
|
||||
// 1.70 pylon magazines:
|
||||
class GVAR(1_PylonMissile_1Rnd): GVAR(1_6Rnd) { // Bare missle
|
||||
displayName = CSTRING(hot1_1);
|
||||
count = 1;
|
||||
mass = 70;
|
||||
pylonWeapon = QGVAR(1_launcher);
|
||||
hardpoints[] = {"SCALPEL_1RND"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonMissile_1x_Bomb_04_F.p3d";
|
||||
};
|
||||
class GVAR(1_PylonRack_1Rnd): GVAR(1_6Rnd) { // 1x Launcher Support Rack
|
||||
displayName = CSTRING(hot1_1);
|
||||
count = 1;
|
||||
mass = 85;
|
||||
pylonWeapon = QGVAR(1_launcher);
|
||||
hardpoints[] = {"B_MISSILE_PYLON", "SCALPEL_1RND_EJECTOR", "B_ASRRAM_EJECTOR", "UNI_SCALPEL", "CUP_NATO_HELO_SMALL", "CUP_NATO_HELO_LARGE", "RHS_HP_MELB"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_1x_Missile_AA_04_F.p3d";
|
||||
};
|
||||
class GVAR(1_PylonRack_3Rnd): GVAR(1_6Rnd) { // 3x Launcher Support Rack
|
||||
displayName = CSTRING(hot1_3);
|
||||
count = 3;
|
||||
mass = 250;
|
||||
pylonWeapon = QGVAR(1_launcher);
|
||||
hardpoints[] = {"B_MISSILE_PYLON", "UNI_SCALPEL", "CUP_NATO_HELO_LARGE", "RHS_HP_LONGBOW_RACK"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_3x_Missile_LG_scalpel_F.p3d";
|
||||
mirrorMissilesIndexes[] = {2, 1, 3};
|
||||
};
|
||||
class GVAR(1_PylonRack_4Rnd): GVAR(1_6Rnd) { // 4x Launcher Support Rack
|
||||
displayName = CSTRING(hot1_4);
|
||||
count = 4;
|
||||
mass = 340;
|
||||
pylonWeapon = QGVAR(1_launcher);
|
||||
hardpoints[] = {"UNI_SCALPEL", "CUP_NATO_HELO_LARGE", "RHS_HP_HELLFIRE_RACK", "RHS_HP_LONGBOW_RACK"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_4x_Missile_LG_scalpel_F.p3d";
|
||||
mirrorMissilesIndexes[] = {2, 1, 4, 3};
|
||||
};
|
||||
|
||||
// HOT2 - HEAT (anti-tank)
|
||||
class GVAR(2_6Rnd): 12Rnd_PG_missiles { // Old style vehicle magazine
|
||||
count = 6;
|
||||
initSpeed = 100;
|
||||
ammo = QGVAR(HOT2);
|
||||
displayName = CSTRING(hot2);
|
||||
displayNameShort = CSTRING(hot2);
|
||||
descriptionShort = CSTRING(missileType);
|
||||
};
|
||||
|
||||
class GVAR(2_2Rnd): GVAR(2_6Rnd) {
|
||||
count = 2;
|
||||
};
|
||||
|
||||
// 1.70 pylon magazines:
|
||||
class GVAR(2_PylonMissile_1Rnd): GVAR(2_6Rnd) { // Bare missle
|
||||
displayName = CSTRING(hot2_1);
|
||||
pylonWeapon = QGVAR(2_launcher);
|
||||
count = 1;
|
||||
mass = 70;
|
||||
hardpoints[] = {"SCALPEL_1RND"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonMissile_1x_Bomb_04_F.p3d";
|
||||
};
|
||||
class GVAR(2_PylonRack_1Rnd): GVAR(2_6Rnd) { // 1x Launcher Support Rack
|
||||
displayName = CSTRING(hot2_1);
|
||||
pylonWeapon = QGVAR(2_launcher);
|
||||
count = 1;
|
||||
mass = 85;
|
||||
hardpoints[] = {"B_MISSILE_PYLON", "SCALPEL_1RND_EJECTOR", "B_ASRRAM_EJECTOR", "UNI_SCALPEL", "CUP_NATO_HELO_SMALL", "CUP_NATO_HELO_LARGE", "RHS_HP_MELB"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_1x_Missile_AA_04_F.p3d";
|
||||
};
|
||||
class GVAR(2_PylonRack_3Rnd): GVAR(2_6Rnd) { // 3x Launcher Support Rack
|
||||
displayName = CSTRING(hot2_3);
|
||||
pylonWeapon = QGVAR(2_launcher);
|
||||
count = 3;
|
||||
mass = 250;
|
||||
hardpoints[] = {"B_MISSILE_PYLON", "UNI_SCALPEL", "CUP_NATO_HELO_LARGE", "RHS_HP_LONGBOW_RACK"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_3x_Missile_LG_scalpel_F.p3d";
|
||||
mirrorMissilesIndexes[] = {2, 1, 3};
|
||||
};
|
||||
class GVAR(2_PylonRack_4Rnd): GVAR(2_6Rnd) { // 4x Launcher Support Rack
|
||||
displayName = CSTRING(hot2_4);
|
||||
pylonWeapon = QGVAR(2_launcher);
|
||||
count = 4;
|
||||
mass = 340;
|
||||
hardpoints[] = {"UNI_SCALPEL", "CUP_NATO_HELO_LARGE", "RHS_HP_HELLFIRE_RACK", "RHS_HP_LONGBOW_RACK"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_4x_Missile_LG_scalpel_F.p3d";
|
||||
mirrorMissilesIndexes[] = {2, 1, 4, 3};
|
||||
};
|
||||
|
||||
// HOT2MP - HE Anti-Infantry
|
||||
class GVAR(2MP_6Rnd): 12Rnd_PG_missiles { // Old style vehicle magazine
|
||||
count = 6;
|
||||
initSpeed = 100;
|
||||
ammo = QGVAR(HOT2MP);
|
||||
displayName = CSTRING(hot2mp);
|
||||
displayNameShort = CSTRING(hot2mp);
|
||||
descriptionShort = CSTRING(missileType);
|
||||
};
|
||||
|
||||
class GVAR(2MP_2Rnd): GVAR(2MP_6Rnd) {
|
||||
count = 2;
|
||||
};
|
||||
|
||||
// 1.70 pylon magazines:
|
||||
class GVAR(2MP_PylonMissile_1Rnd): GVAR(2MP_6Rnd) { // Bare missle
|
||||
displayName = CSTRING(hot2mp_1);
|
||||
pylonWeapon = QGVAR(2mp_launcher);
|
||||
count = 1;
|
||||
mass = 70;
|
||||
hardpoints[] = {"SCALPEL_1RND"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonMissile_1x_Bomb_04_F.p3d";
|
||||
};
|
||||
class GVAR(2MP_PylonRack_1Rnd): GVAR(2MP_6Rnd) { // 1x Launcher Support Rack
|
||||
displayName = CSTRING(hot2mp_1);
|
||||
pylonWeapon = QGVAR(2mp_launcher);
|
||||
count = 1;
|
||||
mass = 85;
|
||||
hardpoints[] = {"B_MISSILE_PYLON", "SCALPEL_1RND_EJECTOR", "B_ASRRAM_EJECTOR", "UNI_SCALPEL", "CUP_NATO_HELO_SMALL", "CUP_NATO_HELO_LARGE", "RHS_HP_MELB"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_1x_Missile_AA_04_F.p3d";
|
||||
};
|
||||
class GVAR(2MP_PylonRack_3Rnd): GVAR(2MP_6Rnd) { // 3x Launcher Support Rack
|
||||
displayName = CSTRING(hot2mp_3);
|
||||
pylonWeapon = QGVAR(2mp_launcher);
|
||||
count = 3;
|
||||
mass = 250;
|
||||
hardpoints[] = {"B_MISSILE_PYLON", "UNI_SCALPEL", "CUP_NATO_HELO_LARGE", "RHS_HP_LONGBOW_RACK"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_3x_Missile_LG_scalpel_F.p3d";
|
||||
mirrorMissilesIndexes[] = {2, 1, 3};
|
||||
};
|
||||
class GVAR(2MP_PylonRack_4Rnd): GVAR(2MP_6Rnd) { // 4x Launcher Support Rack
|
||||
displayName = CSTRING(hot2mp_4);
|
||||
pylonWeapon = QGVAR(2mp_launcher);
|
||||
count = 4;
|
||||
mass = 340;
|
||||
hardpoints[] = {"UNI_SCALPEL", "CUP_NATO_HELO_LARGE", "RHS_HP_HELLFIRE_RACK", "RHS_HP_LONGBOW_RACK"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_4x_Missile_LG_scalpel_F.p3d";
|
||||
mirrorMissilesIndexes[] = {2, 1, 4, 3};
|
||||
};
|
||||
|
||||
// HOT3 - tandem shaped charge HEAT (anti-tank)
|
||||
class GVAR(3_6Rnd): 12Rnd_PG_missiles { // Old style vehicle magazine
|
||||
count = 6;
|
||||
initSpeed = 100;
|
||||
ammo = QGVAR(HOT3);
|
||||
displayName = CSTRING(hot3);
|
||||
displayNameShort = CSTRING(hot3);
|
||||
descriptionShort = CSTRING(missileType);
|
||||
};
|
||||
|
||||
class GVAR(3_2Rnd): GVAR(3_6Rnd) { // Old style vehicle magazine
|
||||
count = 2;
|
||||
};
|
||||
|
||||
// 1.70 pylon magazines:
|
||||
class GVAR(3_PylonMissile_1Rnd): GVAR(3_6Rnd) { // Bare missle
|
||||
displayName = CSTRING(hot3_1);
|
||||
pylonWeapon = QGVAR(3_launcher);
|
||||
count = 1;
|
||||
mass = 70;
|
||||
hardpoints[] = {"SCALPEL_1RND"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonMissile_1x_Bomb_04_F.p3d";
|
||||
};
|
||||
|
||||
class GVAR(3_PylonRack_1Rnd): GVAR(3_6Rnd) { // 1x Launcher Support Rack
|
||||
displayName = CSTRING(hot3_1);
|
||||
pylonWeapon = QGVAR(3_launcher);
|
||||
count = 1;
|
||||
mass = 85;
|
||||
hardpoints[] = {"B_MISSILE_PYLON", "SCALPEL_1RND_EJECTOR", "B_ASRRAM_EJECTOR", "UNI_SCALPEL", "CUP_NATO_HELO_SMALL", "CUP_NATO_HELO_LARGE", "RHS_HP_MELB"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_1x_Missile_AA_04_F.p3d";
|
||||
};
|
||||
class GVAR(3_PylonRack_3Rnd): GVAR(3_6Rnd) { // 3x Launcher Support Rack
|
||||
displayName = CSTRING(hot3_3);
|
||||
pylonWeapon = QGVAR(3_launcher);
|
||||
count = 3;
|
||||
mass = 250;
|
||||
hardpoints[] = {"B_MISSILE_PYLON", "UNI_SCALPEL", "CUP_NATO_HELO_LARGE", "RHS_HP_LONGBOW_RACK"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_3x_Missile_LG_scalpel_F.p3d";
|
||||
mirrorMissilesIndexes[] = {2, 1, 3};
|
||||
};
|
||||
class GVAR(3_PylonRack_4Rnd): GVAR(3_6Rnd) { // 4x Launcher Support Rack
|
||||
displayName = CSTRING(hot3_4);
|
||||
pylonWeapon = QGVAR(3_launcher);
|
||||
count = 4;
|
||||
mass = 340;
|
||||
hardpoints[] = {"UNI_SCALPEL", "CUP_NATO_HELO_LARGE", "RHS_HP_HELLFIRE_RACK", "RHS_HP_LONGBOW_RACK"};
|
||||
model = "\A3\Weapons_F\DynamicLoadout\PylonPod_4x_Missile_LG_scalpel_F.p3d";
|
||||
mirrorMissilesIndexes[] = {2, 1, 4, 3};
|
||||
};
|
||||
};
|
||||
|
19
addons/hot/CfgVehicles.hpp
Normal file
19
addons/hot/CfgVehicles.hpp
Normal file
@ -0,0 +1,19 @@
|
||||
class CfgVehicles {
|
||||
class Tank;
|
||||
class Tank_F: Tank {
|
||||
class Turrets;
|
||||
};
|
||||
class LT_01_base_F: Tank_F {
|
||||
class Turrets: Turrets {
|
||||
class MainTurret;
|
||||
};
|
||||
};
|
||||
class LT_01_AT_base_F: LT_01_base_F {
|
||||
class Turrets: Turrets {
|
||||
class MainTurret: MainTurret {
|
||||
weapons[] = {"SmokeLauncher","HMG_127",QGVAR(generic_launcher)};
|
||||
magazines[] = {"SmokeLauncherMag",QGVAR(2_2Rnd),QGVAR(2_2Rnd),QGVAR(2_2Rnd),QGVAR(2MP_2Rnd),"100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red","100Rnd_127x99_mag_Tracer_Red"};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
62
addons/hot/CfgWeapons.hpp
Normal file
62
addons/hot/CfgWeapons.hpp
Normal file
@ -0,0 +1,62 @@
|
||||
class CfgWeapons {
|
||||
class RocketPods;
|
||||
class MissileLauncher;
|
||||
class GVAR(1_launcher): RocketPods {
|
||||
displayName = CSTRING(hot1);
|
||||
magazines[] = {QGVAR(1_6Rnd), QGVAR(1_2Rnd), QGVAR(1_PylonMissile_1Rnd), QGVAR(1_PylonRack_1Rnd), QGVAR(1_PylonRack_3Rnd), QGVAR(1_PylonRack_4Rnd)};
|
||||
initSpeed = 100;
|
||||
autoFire = 0;
|
||||
canLock = 0;
|
||||
weaponLockSystem = 0;
|
||||
lockingTargetSound[] = {"",0,1};
|
||||
lockedTargetSound[] = {"",0,1};
|
||||
soundFly[] = {"A3\Sounds_F\weapons\Rockets\rocket_fly_1",1,1.1,700};
|
||||
nameSound = "MissileLauncher";
|
||||
sounds[] = {"StandardSound"};
|
||||
class StandardSound {
|
||||
begin1[] = {"A3\Sounds_F\weapons\Rockets\missile_1",1.12202,1.3,1000};
|
||||
soundBegin[] = {"begin1",1};
|
||||
soundsetshot[] = {"RocketsMedium_Shot_SoundSet"};
|
||||
};
|
||||
cursor = "EmptyCursor";
|
||||
cursorAim = "missile";
|
||||
showAimCursorInternal = 0;
|
||||
};
|
||||
class GVAR(2_launcher): GVAR(1_launcher) {
|
||||
displayName = CSTRING(hot2);
|
||||
magazines[] = {QGVAR(2_6Rnd), QGVAR(2_2Rnd), QGVAR(2_PylonMissile_1Rnd), QGVAR(2_PylonRack_1Rnd), QGVAR(2_PylonRack_3Rnd), QGVAR(2_PylonRack_4Rnd)};
|
||||
};
|
||||
class GVAR(2mp_launcher): GVAR(1_launcher) {
|
||||
displayName = CSTRING(hot2mp);
|
||||
magazines[] = {QGVAR(2MP_6Rnd), QGVAR(2MP_2Rnd), QGVAR(2MP_PylonMissile_1Rnd), QGVAR(2MP_PylonRack_1Rnd), QGVAR(2MP_PylonRack_3Rnd), QGVAR(2MP_PylonRack_4Rnd)};
|
||||
};
|
||||
class GVAR(3_launcher): GVAR(1_launcher) {
|
||||
displayName = CSTRING(hot3);
|
||||
magazines[] = {QGVAR(3_6Rnd), QGVAR(3_2Rnd), QGVAR(3_PylonMissile_1Rnd), QGVAR(3_PylonRack_1Rnd), QGVAR(3_PylonRack_3Rnd), QGVAR(3_PylonRack_4Rnd)};
|
||||
};
|
||||
class GVAR(generic_launcher): MissileLauncher {
|
||||
displayName = CSTRING(hotMissile);
|
||||
magazines[] = {QGVAR(1_6Rnd), QGVAR(1_2Rnd), QGVAR(2_6Rnd), QGVAR(2_2Rnd), QGVAR(2MP_6Rnd), QGVAR(2MP_2Rnd), QGVAR(3_6Rnd), QGVAR(3_2Rnd)};
|
||||
initSpeed = 100;
|
||||
autoFire = 0;
|
||||
canLock = 0;
|
||||
weaponLockSystem = 0;
|
||||
lockingTargetSound[] = {"",0,1};
|
||||
lockedTargetSound[] = {"",0,1};
|
||||
soundFly[] = {"A3\Sounds_F\weapons\Rockets\rocket_fly_1",1,1.1,700};
|
||||
nameSound = "MissileLauncher";
|
||||
sounds[] = {"StandardSound"};
|
||||
class StandardSound {
|
||||
begin1[] = {"A3\Sounds_F\weapons\Rockets\missile_1",1.12202,1.3,1000};
|
||||
soundBegin[] = {"begin1",1};
|
||||
soundsetshot[] = {"RocketsMedium_Shot_SoundSet"};
|
||||
};
|
||||
cursor = "EmptyCursor";
|
||||
cursorAim = "missile";
|
||||
showAimCursorInternal = 0;
|
||||
|
||||
autoReload = 1;
|
||||
magazineReloadTime = 20;
|
||||
};
|
||||
};
|
||||
|
4
addons/hot/README.md
Normal file
4
addons/hot/README.md
Normal file
@ -0,0 +1,4 @@
|
||||
ace_hot
|
||||
===================
|
||||
|
||||
Adds HOT1/2/3 Missiles
|
@ -6,16 +6,16 @@ class CfgPatches {
|
||||
units[] = {};
|
||||
weapons[] = {};
|
||||
requiredVersion = REQUIRED_VERSION;
|
||||
requiredAddons[] = {"ace_main", "ace_common", "ace_missileguidance"};
|
||||
requiredAddons[] = {"ace_common","ace_missileguidance"};
|
||||
author = ECSTRING(common,ACETeam);
|
||||
authors[] = {"Dani (TCVM)"};
|
||||
url = ECSTRING(main,URL);
|
||||
VERSION_CONFIG;
|
||||
};
|
||||
};
|
||||
|
||||
#include "CfgEventhandlers.hpp"
|
||||
#include "RscInGameUI.hpp"
|
||||
#include "CfgSounds.hpp"
|
||||
#include "CfgAmmo.hpp"
|
||||
#include "CfgMagazines.hpp"
|
||||
#include "CfgWeapons.hpp"
|
||||
#include "CfgVehicles.hpp"
|
||||
#include "CfgMagazines.hpp"
|
||||
|
18
addons/hot/script_component.hpp
Normal file
18
addons/hot/script_component.hpp
Normal file
@ -0,0 +1,18 @@
|
||||
#define COMPONENT hot
|
||||
#define COMPONENT_BEAUTIFIED HOT
|
||||
#include "\z\ace\addons\main\script_mod.hpp"
|
||||
|
||||
// #define DEBUG_MODE_FULL
|
||||
// #define DISABLE_COMPILE_CACHE
|
||||
// #define ENABLE_PERFORMANCE_COUNTERS
|
||||
|
||||
#ifdef DEBUG_ENABLED_HOT
|
||||
#define DEBUG_MODE_FULL
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SETTINGS_HOT
|
||||
#define DEBUG_SETTINGS DEBUG_SETTINGS_HOT
|
||||
#endif
|
||||
|
||||
#include "\z\ace\addons\main\script_macros.hpp"
|
||||
|
341
addons/hot/stringtable.xml
Normal file
341
addons/hot/stringtable.xml
Normal file
@ -0,0 +1,341 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project name="ACE">
|
||||
<Package name="HOT">
|
||||
<Key ID="STR_ACE_HOT_missileType">
|
||||
<English>Wire-Guided</English>
|
||||
<German>Drahtgelenkt</German>
|
||||
<Polish>Kierowany przewodem</Polish>
|
||||
<Italian>Filoguidato</Italian>
|
||||
<Japanese>ワイヤ有線誘導</Japanese>
|
||||
<Russian>Проводное управление</Russian>
|
||||
<Portuguese>Guiado por Fio</Portuguese>
|
||||
<Chinese>有線制導</Chinese>
|
||||
<Chinesesimp>有线制导</Chinesesimp>
|
||||
<French>Filoguidé</French>
|
||||
<Czech>Drátem naváděné</Czech>
|
||||
<Turkish>Tel-Güdümlü</Turkish>
|
||||
<Spanish>Guiado por cable</Spanish>
|
||||
<Korean>유선 유도</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_SACLOS_Description">
|
||||
<English>Semi-automatic command to line of sight</English>
|
||||
<German>Halbautomatische Steuerung über Sichtverbindung (SACLOS)</German>
|
||||
<Polish>Semi-automatyczna komenda do pola widzenia</Polish>
|
||||
<Italian>Comando Semi-Automatico via Contatto Visivo(SACLOS)</Italian>
|
||||
<Japanese>半自動指令照準線一致誘導方式</Japanese>
|
||||
<Russian>Полуавтоматическое командное наведение по линии визирования (SACLOS)</Russian>
|
||||
<Portuguese>Comando semi-automático para a linha de visão (SACLOS)</Portuguese>
|
||||
<Chinese>視線內半自動指令</Chinese>
|
||||
<Chinesesimp>半自动指令到视线(SACLOS)</Chinesesimp>
|
||||
<French>Contrôle semi-automatique par contact visuel (SACLOS)</French>
|
||||
<Czech>Poloautomatický povelový systém dalkového navedení pro záměrné cíle (SACLOS)</Czech>
|
||||
<Spanish>Control semi-automático por línea de visión</Spanish>
|
||||
<Turkish>Görüş alanına yarı otomatik komut</Turkish>
|
||||
<Korean>반자동 가시선 지령 유도방식</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_missileType_Description">
|
||||
<English>Wire-Guided Missile</English>
|
||||
<German>Drahtgelenkte Rakete</German>
|
||||
<Polish>Pocisk kierowany przewodowo</Polish>
|
||||
<Italian>Missile filoguidato</Italian>
|
||||
<Japanese>ワイヤ有線誘導ミサイル</Japanese>
|
||||
<Russian>Ракета с проводным управлением</Russian>
|
||||
<Portuguese>Míssil Guiado por Fio</Portuguese>
|
||||
<Chinese>有線制導飛彈</Chinese>
|
||||
<Chinesesimp>线导导弹</Chinesesimp>
|
||||
<French>Missile filoguidé</French>
|
||||
<Czech>Drátem naváděná střela</Czech>
|
||||
<Turkish>Tel Güdümlü Füze</Turkish>
|
||||
<Spanish>Misil guiado por cable</Spanish>
|
||||
<Korean>유선 유도 미사일</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hotMissile">
|
||||
<English>HOT Missile</English>
|
||||
<German>Lenkflugkörper</German>
|
||||
<Polish>Pocisk HOT</Polish>
|
||||
<Italian>Missile HOT</Italian>
|
||||
<Japanese>HOT ミサイル</Japanese>
|
||||
<Russian>Ракета HOT</Russian>
|
||||
<Portuguese>Míssil HOT</Portuguese>
|
||||
<Chinese>高次音速(HOT)飛彈</Chinese>
|
||||
<Chinesesimp>高次音速(HOT)导弹</Chinesesimp>
|
||||
<French>Missile HOT</French>
|
||||
<Czech>HOT Střela</Czech>
|
||||
<Turkish>HOT Missile</Turkish>
|
||||
<Spanish>Misil HOT</Spanish>
|
||||
<Korean>HOT 미사일</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot1">
|
||||
<English>HOT 1</English>
|
||||
<German>HOT 1</German>
|
||||
<Polish>HOT 1</Polish>
|
||||
<Italian>HOT 1</Italian>
|
||||
<Japanese>HOT 1</Japanese>
|
||||
<Russian>HOT 1</Russian>
|
||||
<Portuguese>HOT 1</Portuguese>
|
||||
<French>HOT 1</French>
|
||||
<Chinese>HOT 1</Chinese>
|
||||
<Chinesesimp>HOT 1</Chinesesimp>
|
||||
<Czech>HOT 1</Czech>
|
||||
<Turkish>HOT 1</Turkish>
|
||||
<Spanish>HOT 1</Spanish>
|
||||
<Korean>HOT 1</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot2">
|
||||
<English>HOT 2</English>
|
||||
<German>HOT 2</German>
|
||||
<Polish>HOT 2</Polish>
|
||||
<Italian>HOT 2</Italian>
|
||||
<Japanese>HOT 2</Japanese>
|
||||
<Russian>HOT 2</Russian>
|
||||
<Portuguese>HOT 2</Portuguese>
|
||||
<French>HOT 2</French>
|
||||
<Chinese>HOT 2</Chinese>
|
||||
<Chinesesimp>HOT 2</Chinesesimp>
|
||||
<Czech>HOT 2</Czech>
|
||||
<Turkish>HOT 2</Turkish>
|
||||
<Spanish>HOT 2</Spanish>
|
||||
<Korean>HOT 2</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot2mp">
|
||||
<English>HOT 2MP</English>
|
||||
<German>HOT 2MP</German>
|
||||
<Polish>HOT 2MP</Polish>
|
||||
<Italian>HOT 2MP</Italian>
|
||||
<Japanese>HOT 2MP</Japanese>
|
||||
<Russian>HOT 2MP</Russian>
|
||||
<Portuguese>HOT 2MP</Portuguese>
|
||||
<French>HOT 2MP</French>
|
||||
<Chinese>HOT 2MP</Chinese>
|
||||
<Chinesesimp>HOT 2MP</Chinesesimp>
|
||||
<Czech>HOT 2MP</Czech>
|
||||
<Turkish>HOT 2MP</Turkish>
|
||||
<Spanish>HOT 2MP</Spanish>
|
||||
<Korean>HOT 2MP</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot3">
|
||||
<English>HOT 3</English>
|
||||
<German>HOT 3</German>
|
||||
<Polish>HOT 3</Polish>
|
||||
<Italian>HOT 3</Italian>
|
||||
<Japanese>HOT 3</Japanese>
|
||||
<Russian>HOT 3</Russian>
|
||||
<Portuguese>HOT 3</Portuguese>
|
||||
<French>HOT 3</French>
|
||||
<Chinese>HOT 3</Chinese>
|
||||
<Chinesesimp>HOT 3</Chinesesimp>
|
||||
<Czech>HOT 3</Czech>
|
||||
<Turkish>HOT 3</Turkish>
|
||||
<Spanish>HOT 3</Spanish>
|
||||
<Korean>HOT 3</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_missileType_Description_AP">
|
||||
<English>Wire-Guided Missile (Anti-Personnel)</English>
|
||||
<German>Anti Personen Lenkflugkörper</German>
|
||||
<Polish>Pocisk kierowany przewodowo (przeciwpiechotny)</Polish>
|
||||
<Italian>Missile filoguidato antiuomo</Italian>
|
||||
<Japanese>ワイヤ有線誘導ミサイル (対人)</Japanese>
|
||||
<Russian>Ракета с проводным управлением (Противопехотная)</Russian>
|
||||
<Portuguese>Míssil Guiado por Fio (Anti-Pessoal)</Portuguese>
|
||||
<Chinese>有線制導飛彈(反步兵)</Chinese>
|
||||
<Chinesesimp>线导导弹(反人员)</Chinesesimp>
|
||||
<French>Missile filoguidé (antipersonnel)</French>
|
||||
<Czech>Drátem naváděná střela (protipěchotní)</Czech>
|
||||
<Turkish>Tel Güdümlü Füze (Anti-Personelı)</Turkish>
|
||||
<Spanish>Misil guiado por cable (Antipersona)</Spanish>
|
||||
<Korean>유선 유도 미사일 (대인)</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot1_1">
|
||||
<English>1x HOT 1 [ACE]</English>
|
||||
<German>1x HOT 1 [ACE]</German>
|
||||
<Polish>1x HOT 1 [ACE]</Polish>
|
||||
<Italian>1x HOT1 [ACE]</Italian>
|
||||
<Japanese>1x HOT 1 [ACE]</Japanese>
|
||||
<Russian>1x HOT 1 [ACE]</Russian>
|
||||
<Portuguese>1x HOT 1 [ACE]</Portuguese>
|
||||
<French>1x HOT 1 [ACE]</French>
|
||||
<Chinese>1x HOT 1 [ACE]</Chinese>
|
||||
<Chinesesimp>1x HOT 1 [ACE]</Chinesesimp>
|
||||
<Czech>1x HOT 1 [ACE]</Czech>
|
||||
<Turkish>1x HOT 1 [ACE]</Turkish>
|
||||
<Spanish>1x HOT 1 [ACE]</Spanish>
|
||||
<Korean>1x HOT 1 [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot1_3">
|
||||
<English>3x HOT 1 [ACE]</English>
|
||||
<German>3x HOT 1 [ACE]</German>
|
||||
<Polish>3x HOT 1 [ACE]</Polish>
|
||||
<Italian>3x HOT 1 [ACE]</Italian>
|
||||
<Japanese>3x HOT 1 [ACE]</Japanese>
|
||||
<Russian>3x HOT 1 [ACE]</Russian>
|
||||
<Portuguese>3x HOT 1 [ACE]</Portuguese>
|
||||
<French>3x HOT 1 [ACE]</French>
|
||||
<Chinese>3x HOT 1 [ACE]</Chinese>
|
||||
<Chinesesimp>3x HOT 1 [ACE]</Chinesesimp>
|
||||
<Czech>3x HOT 1 [ACE]</Czech>
|
||||
<Turkish>3x HOT 1 [ACE]</Turkish>
|
||||
<Spanish>3x HOT 1 [ACE]</Spanish>
|
||||
<Korean>3x HOT 1 [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot1_4">
|
||||
<English>4x HOT 1 [ACE]</English>
|
||||
<German>4x HOT 1 [ACE]</German>
|
||||
<Polish>4x HOT 1 [ACE]</Polish>
|
||||
<Italian>4x HOT 1 [ACE]</Italian>
|
||||
<Japanese>4x HOT 1 [ACE]</Japanese>
|
||||
<Russian>4x HOT 1 [ACE]</Russian>
|
||||
<Portuguese>4x HOT 1 [ACE]</Portuguese>
|
||||
<French>4x HOT 1 [ACE]</French>
|
||||
<Chinese>4x HOT 1 [ACE]</Chinese>
|
||||
<Chinesesimp>4x HOT 1 [ACE]</Chinesesimp>
|
||||
<Czech>4x HOT 1 [ACE]</Czech>
|
||||
<Turkish>4x HOT 1 [ACE]</Turkish>
|
||||
<Spanish>4x HOT 1 [ACE]</Spanish>
|
||||
<Korean>4x HOT 1 [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot2_1">
|
||||
<English>1x HOT 2 [ACE]</English>
|
||||
<German>1x HOT 2 [ACE]</German>
|
||||
<Polish>1x HOT 2 [ACE]</Polish>
|
||||
<Italian>1x HOT 2 [ACE]</Italian>
|
||||
<Japanese>1x HOT 2 [ACE]</Japanese>
|
||||
<Russian>1x HOT 2 [ACE]</Russian>
|
||||
<Portuguese>1x HOT 2 [ACE]</Portuguese>
|
||||
<French>1x HOT 2 [ACE]</French>
|
||||
<Chinese>1x HOT 2 [ACE]</Chinese>
|
||||
<Chinesesimp>1x HOT 2 [ACE]</Chinesesimp>
|
||||
<Czech>1x HOT 2 [ACE]</Czech>
|
||||
<Turkish>1x HOT 2 [ACE]</Turkish>
|
||||
<Spanish>1x HOT 2 [ACE]</Spanish>
|
||||
<Korean>1x HOT 2 [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot2_3">
|
||||
<English>3x HOT 2 [ACE]</English>
|
||||
<German>3x HOT 2 [ACE]</German>
|
||||
<Polish>3x HOT 2 [ACE]</Polish>
|
||||
<Italian>3x HOT 2 [ACE]</Italian>
|
||||
<Japanese>3x HOT 2 [ACE]</Japanese>
|
||||
<Russian>3x HOT 2 [ACE]</Russian>
|
||||
<Portuguese>3x HOT 2 [ACE]</Portuguese>
|
||||
<French>3x HOT 2 [ACE]</French>
|
||||
<Chinese>3x HOT 2 [ACE]</Chinese>
|
||||
<Chinesesimp>3x HOT 2 [ACE]</Chinesesimp>
|
||||
<Czech>3x HOT 2 [ACE]</Czech>
|
||||
<Turkish>3x HOT 2 [ACE]</Turkish>
|
||||
<Spanish>3x HOT 2 [ACE]</Spanish>
|
||||
<Korean>3x HOT 2 [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot2_4">
|
||||
<English>4x HOT 2 [ACE]</English>
|
||||
<German>4x HOT 2 [ACE]</German>
|
||||
<Polish>4x HOT 2 [ACE]</Polish>
|
||||
<Italian>4x HOT 2 [ACE]</Italian>
|
||||
<Japanese>4x HOT 2 [ACE]</Japanese>
|
||||
<Russian>4x HOT 2 [ACE]</Russian>
|
||||
<Portuguese>4x HOT 2 [ACE]</Portuguese>
|
||||
<French>4x HOT 2 [ACE]</French>
|
||||
<Chinese>4x HOT 2 [ACE]</Chinese>
|
||||
<Chinesesimp>4x HOT 2 [ACE]</Chinesesimp>
|
||||
<Czech>4x HOT 2 [ACE]</Czech>
|
||||
<Turkish>4x HOT 2 [ACE]</Turkish>
|
||||
<Spanish>4x HOT 2 [ACE]</Spanish>
|
||||
<Korean>4x HOT 2 [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot2mp_1">
|
||||
<English>1x HOT 2MP [ACE]</English>
|
||||
<German>1x HOT 2MP [ACE]</German>
|
||||
<Polish>1x HOT 2MP [ACE]</Polish>
|
||||
<Italian>1x HOT 2MP [ACE]</Italian>
|
||||
<Japanese>1x HOT 2MP [ACE]</Japanese>
|
||||
<Russian>1x HOT 2MP [ACE]</Russian>
|
||||
<Portuguese>1x HOT 2MP [ACE]</Portuguese>
|
||||
<French>1x HOT 2MP [ACE]</French>
|
||||
<Chinese>1x HOT 2MP [ACE]</Chinese>
|
||||
<Chinesesimp>1x HOT 2MP [ACE]</Chinesesimp>
|
||||
<Czech>1x HOT 2MP [ACE]</Czech>
|
||||
<Turkish>1x HOT 2MP [ACE]</Turkish>
|
||||
<Spanish>1x HOT 2MP [ACE]</Spanish>
|
||||
<Korean>1x HOT 2MP [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot2mp_3">
|
||||
<English>3x HOT 2MP [ACE]</English>
|
||||
<German>3x HOT 2MP [ACE]</German>
|
||||
<Polish>3x HOT 2MP [ACE]</Polish>
|
||||
<Italian>3x HOT 2MP [ACE]</Italian>
|
||||
<Japanese>3x HOT 2MP [ACE]</Japanese>
|
||||
<Russian>3x HOT 2MP [ACE]</Russian>
|
||||
<Portuguese>3x HOT 2MP [ACE]</Portuguese>
|
||||
<French>3x HOT 2MP [ACE]</French>
|
||||
<Chinese>3x HOT 2MP [ACE]</Chinese>
|
||||
<Chinesesimp>3x HOT 2MP [ACE]</Chinesesimp>
|
||||
<Czech>3x HOT 2MP [ACE]</Czech>
|
||||
<Turkish>3x HOT 2MP [ACE]</Turkish>
|
||||
<Spanish>3x HOT 2MP [ACE]</Spanish>
|
||||
<Korean>3x HOT 2MP [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot2mp_4">
|
||||
<English>4x HOT 2MP [ACE]</English>
|
||||
<German>4x HOT 2MP [ACE]</German>
|
||||
<Polish>4x HOT 2MP [ACE]</Polish>
|
||||
<Italian>4x HOT 2MP [ACE]</Italian>
|
||||
<Japanese>4x HOT 2MP [ACE]</Japanese>
|
||||
<Russian>4x HOT 2MP [ACE]</Russian>
|
||||
<Portuguese>4x HOT 2MP [ACE]</Portuguese>
|
||||
<French>4x HOT 2MP [ACE]</French>
|
||||
<Chinese>4x HOT 2MP [ACE]</Chinese>
|
||||
<Chinesesimp>4x HOT 2MP [ACE]</Chinesesimp>
|
||||
<Czech>4x HOT 2MP [ACE]</Czech>
|
||||
<Turkish>4x HOT 2MP [ACE]</Turkish>
|
||||
<Spanish>4x HOT 2MP [ACE]</Spanish>
|
||||
<Korean>4x HOT 2MP [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot3_1">
|
||||
<English>1x HOT 3 [ACE]</English>
|
||||
<German>1x HOT 3 [ACE]</German>
|
||||
<Polish>1x HOT 3 [ACE]</Polish>
|
||||
<Italian>1x HOT 3 [ACE]</Italian>
|
||||
<Japanese>1x HOT 3 [ACE]</Japanese>
|
||||
<Russian>1x HOT 3 [ACE]</Russian>
|
||||
<Portuguese>1x HOT 3 [ACE]</Portuguese>
|
||||
<French>1x HOT 3 [ACE]</French>
|
||||
<Chinese>1x HOT 3 [ACE]</Chinese>
|
||||
<Chinesesimp>1x HOT 3 [ACE]</Chinesesimp>
|
||||
<Czech>1x HOT 3 [ACE]</Czech>
|
||||
<Turkish>1x HOT 3 [ACE]</Turkish>
|
||||
<Spanish>1x HOT 3 [ACE]</Spanish>
|
||||
<Korean>1x HOT 3 [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot3_4">
|
||||
<English>4x HOT 3 [ACE]</English>
|
||||
<German>4x HOT 3 [ACE]</German>
|
||||
<Polish>4x HOT 3 [ACE]</Polish>
|
||||
<Italian>4x HOT 3 [ACE]</Italian>
|
||||
<Japanese>4x HOT 3 [ACE]</Japanese>
|
||||
<Russian>4x HOT 3 [ACE]</Russian>
|
||||
<Portuguese>4x HOT 3 [ACE]</Portuguese>
|
||||
<French>4x HOT 3 [ACE]</French>
|
||||
<Chinese>4x HOT 3 [ACE]</Chinese>
|
||||
<Chinesesimp>4x HOT 3 [ACE]</Chinesesimp>
|
||||
<Czech>4x HOT 3 [ACE]</Czech>
|
||||
<Turkish>4x HOT 3 [ACE]</Turkish>
|
||||
<Spanish>4x HOT 3 [ACE]</Spanish>
|
||||
<Korean>4x HOT 3 [ACE]</Korean>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_HOT_hot3_3">
|
||||
<English>3x HOT 3 [ACE]</English>
|
||||
<German>3x HOT 3 [ACE]</German>
|
||||
<Polish>3x HOT 3 [ACE]</Polish>
|
||||
<Italian>3x HOT 3 [ACE]</Italian>
|
||||
<Japanese>3x HOT 3 [ACE]</Japanese>
|
||||
<Russian>3x HOT 3 [ACE]</Russian>
|
||||
<Portuguese>3x HOT 3 [ACE]</Portuguese>
|
||||
<French>3x HOT 3 [ACE]</French>
|
||||
<Chinese>3x HOT 3 [ACE]</Chinese>
|
||||
<Chinesesimp>3x HOT 3 [ACE]</Chinesesimp>
|
||||
<Czech>3x HOT 3 [ACE]</Czech>
|
||||
<Turkish>3x HOT 3 [ACE]</Turkish>
|
||||
<Spanish>3x HOT 3 [ACE]</Spanish>
|
||||
<Korean>3x HOT 3 [ACE]</Korean>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
@ -1 +0,0 @@
|
||||
z\ace\addons\javelin
|
@ -1,18 +0,0 @@
|
||||
|
||||
class Extended_PreStart_EventHandlers {
|
||||
class ADDON {
|
||||
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
|
||||
};
|
||||
};
|
||||
|
||||
class Extended_PreInit_EventHandlers {
|
||||
class ADDON {
|
||||
init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
|
||||
};
|
||||
};
|
||||
|
||||
class Extended_PostInit_EventHandlers {
|
||||
class ADDON {
|
||||
clientInit = QUOTE(call COMPILE_SCRIPT(XEH_clientInit));
|
||||
};
|
||||
};
|
@ -1,18 +0,0 @@
|
||||
class CfgMagazines {
|
||||
//Static Titan Magazine
|
||||
class 5Rnd_GAT_missiles;
|
||||
class 1Rnd_GAT_missiles: 5Rnd_GAT_missiles {
|
||||
ammo = "ACE_Javelin_FGM148_static"; //from misssileGuidance, was "M_Titan_AT_static"
|
||||
};
|
||||
|
||||
//Handheld Titan "AT" Magazine (Locking - "Anti-Tank")
|
||||
class Titan_AA;
|
||||
class Titan_AT: Titan_AA {
|
||||
ammo = "ACE_Javelin_FGM148"; //from misssileGuidance, was "M_Titan_AT"
|
||||
};
|
||||
|
||||
//Handheld Titan "AP" Magazine (SACLOS? "Anti-personal")
|
||||
// class Titan_AP: Titan_AA {
|
||||
//???
|
||||
// };
|
||||
};
|
@ -1,13 +0,0 @@
|
||||
|
||||
class CfgSounds {
|
||||
class ACE_Javelin_Locking {
|
||||
name = "ACE_Javelin_Locking";
|
||||
sound[] = {QPATHTOF(data\sounds\javelin_locking.ogg), "db+0", 1.0};
|
||||
titles[] = {};
|
||||
};
|
||||
class ACE_Javelin_Locked {
|
||||
name = "ACE_Javelin_Locked";
|
||||
sound[] = {QPATHTOF(data\sounds\javelin_locked.ogg), "db+0", 1.0};
|
||||
titles[] = {};
|
||||
};
|
||||
};
|
@ -1,86 +0,0 @@
|
||||
class CfgVehicles {
|
||||
class LandVehicle;
|
||||
class StaticWeapon: LandVehicle {
|
||||
class Turrets;
|
||||
};
|
||||
|
||||
class StaticMGWeapon: StaticWeapon {
|
||||
class Turrets: Turrets {
|
||||
class MainTurret;
|
||||
};
|
||||
};
|
||||
class AT_01_base_F: StaticMGWeapon {};
|
||||
|
||||
class B_static_AT_F: AT_01_base_F {
|
||||
class Turrets: Turrets {
|
||||
class MainTurret: MainTurret {
|
||||
weapons[] = { QGVAR(Titan_Static) };
|
||||
magazines[] = {"1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles"};
|
||||
|
||||
turretInfoType = "ACE_RscOptics_javelin";
|
||||
gunnerOpticsModel = QPATHTOF(data\reticle_titan.p3d);
|
||||
opticsZoomMin = 0.08333;
|
||||
opticsZoomMax = 0.04167;
|
||||
opticsZoomInit = 0.08333;
|
||||
opticsPPEffects[] = {"OpticsCHAbera1","OpticsBlur1"};
|
||||
opticsFlare = 0;
|
||||
discretefov[] = {0.08333,0.04167};
|
||||
discreteInitIndex = 0;
|
||||
};
|
||||
};
|
||||
};
|
||||
class O_static_AT_F: AT_01_base_F {
|
||||
class Turrets: Turrets {
|
||||
class MainTurret: MainTurret {
|
||||
weapons[] = { QGVAR(Titan_Static) };
|
||||
magazines[] = {"1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles"};
|
||||
|
||||
turretInfoType = "ACE_RscOptics_javelin";
|
||||
gunnerOpticsModel = QPATHTOF(data\reticle_titan.p3d);
|
||||
opticsZoomMin = 0.08333;
|
||||
opticsZoomMax = 0.04167;
|
||||
opticsZoomInit = 0.08333;
|
||||
opticsPPEffects[] = {"OpticsCHAbera1","OpticsBlur1"};
|
||||
opticsFlare = 0;
|
||||
discretefov[] = {0.08333,0.04167};
|
||||
discreteInitIndex = 0;
|
||||
};
|
||||
};
|
||||
};
|
||||
class I_static_AT_F: AT_01_base_F {
|
||||
class Turrets: Turrets {
|
||||
class MainTurret: MainTurret {
|
||||
weapons[] = { QGVAR(Titan_Static) };
|
||||
magazines[] = {"1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles","1Rnd_GAT_missiles"};
|
||||
|
||||
turretInfoType = "ACE_RscOptics_javelin";
|
||||
gunnerOpticsModel = QPATHTOF(data\reticle_titan.p3d);
|
||||
opticsZoomMin = 0.08333;
|
||||
opticsZoomMax = 0.04167;
|
||||
opticsZoomInit = 0.08333;
|
||||
opticsPPEffects[] = {"OpticsCHAbera1","OpticsBlur1"};
|
||||
opticsFlare = 0;
|
||||
discretefov[] = {0.08333,0.04167};
|
||||
discreteInitIndex = 0;
|
||||
};
|
||||
};
|
||||
};
|
||||
class Car;
|
||||
class Car_F: Car {
|
||||
class Turrets {
|
||||
class MainTurret;
|
||||
};
|
||||
};
|
||||
class LSV_01_base_F: Car_F {
|
||||
class Turrets: Turrets {};
|
||||
};
|
||||
class LSV_01_AT_base_F: LSV_01_base_F { // Prowler / Polaris DAGOR
|
||||
class Turrets: Turrets {
|
||||
class TopTurret: MainTurret {
|
||||
weapons[] = { QGVAR(Titan_Static) };
|
||||
turretInfoType = "ACE_RscOptics_javelin";
|
||||
gunnerOpticsModel = QPATHTOF(data\reticle_titan.p3d);
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
@ -1,80 +0,0 @@
|
||||
class Mode_SemiAuto;
|
||||
class CfgWeapons {
|
||||
class MissileLauncher;
|
||||
class missiles_titan: MissileLauncher {
|
||||
class Player: MissileLauncher {
|
||||
EGVAR(missileGuidance,attackProfile) = "JAV_DIR";
|
||||
};
|
||||
class TopDown: Player {
|
||||
EGVAR(missileGuidance,attackProfile) = "JAV_TOP";
|
||||
};
|
||||
};
|
||||
class missiles_titan_static: missiles_titan {};
|
||||
class GVAR(Titan_Static): missiles_titan_static {
|
||||
GVAR(enabled) = 1;
|
||||
weaponInfoType = "ACE_RscOptics_javelin";
|
||||
modelOptics = QPATHTOF(data\reticle_titan.p3d);
|
||||
|
||||
canLock = 0;
|
||||
magazines[] = {"1Rnd_GAT_missiles"};
|
||||
lockingTargetSound[] = {"",0,1};
|
||||
lockedTargetSound[] = {"",0,1};
|
||||
};
|
||||
|
||||
class Launcher_Base_F;
|
||||
class launch_Titan_base: Launcher_Base_F {
|
||||
class Single: Mode_SemiAuto {
|
||||
EGVAR(missileGuidance,attackProfile) = "JAV_DIR";
|
||||
};
|
||||
class TopDown: Single {
|
||||
EGVAR(missileGuidance,attackProfile) = "JAV_TOP";
|
||||
};
|
||||
};
|
||||
class launch_Titan_short_base: launch_Titan_base {};
|
||||
class launch_B_Titan_short_F: launch_Titan_short_base {
|
||||
GVAR(enabled) = 1;
|
||||
weaponInfoType = "ACE_RscOptics_javelin";
|
||||
modelOptics = QPATHTOF(data\reticle_titan.p3d);
|
||||
|
||||
canLock = 0;
|
||||
|
||||
lockingTargetSound[] = {"",0,1};
|
||||
lockedTargetSound[] = {"",0,1};
|
||||
};
|
||||
class launch_B_Titan_short_tna_F: launch_B_Titan_short_F {
|
||||
GVAR(enabled) = 1;
|
||||
};
|
||||
class launch_I_Titan_short_F: launch_Titan_short_base {
|
||||
GVAR(enabled) = 1;
|
||||
weaponInfoType = "ACE_RscOptics_javelin";
|
||||
modelOptics = QPATHTOF(data\reticle_titan.p3d);
|
||||
|
||||
canLock = 0;
|
||||
|
||||
lockingTargetSound[] = {"",0,1};
|
||||
lockedTargetSound[] = {"",0,1};
|
||||
};
|
||||
class launch_O_Titan_short_F: launch_Titan_short_base {
|
||||
GVAR(enabled) = 1;
|
||||
weaponInfoType = "ACE_RscOptics_javelin";
|
||||
modelOptics = QPATHTOF(data\reticle_titan.p3d);
|
||||
|
||||
canLock = 0;
|
||||
|
||||
lockingTargetSound[] = {"",0,1};
|
||||
lockedTargetSound[] = {"",0,1};
|
||||
};
|
||||
class launch_O_Titan_short_ghex_F: launch_O_Titan_short_F {
|
||||
GVAR(enabled) = 1;
|
||||
};
|
||||
class launch_Titan_short_F: launch_Titan_short_base {
|
||||
GVAR(enabled) = 1;
|
||||
weaponInfoType = "ACE_RscOptics_javelin";
|
||||
modelOptics = QPATHTOF(data\reticle_titan.p3d);
|
||||
|
||||
canLock = 0;
|
||||
|
||||
lockingTargetSound[] = {"",0,1};
|
||||
lockedTargetSound[] = {"",0,1};
|
||||
};
|
||||
};
|
@ -1,4 +0,0 @@
|
||||
ace_javelin
|
||||
===============
|
||||
|
||||
Adds the Javelin AT launcher.
|
@ -1,423 +0,0 @@
|
||||
class RscOpticsValue;
|
||||
class RscControlsGroupNoScrollbars;
|
||||
class RscPicture;
|
||||
class RscLine;
|
||||
class RscMapControl;
|
||||
|
||||
|
||||
// Taken from AGM for optics management.
|
||||
|
||||
class RscInGameUI {
|
||||
class ACE_RscOptics_javelin {
|
||||
idd = 300;
|
||||
controls[] = { QGVAR(elements_group), "ACE_Targeting", QGVAR(mapHelper) };
|
||||
onLoad = QUOTE(with uiNamespace do {ACE_RscOptics_javelin = _this select 0;};);
|
||||
|
||||
class GVAR(mapHelper): RscMapControl {
|
||||
onDraw = QUOTE(_this call FUNC(mapHelperDraw));
|
||||
x = -10;
|
||||
y = -10;
|
||||
w = 0;
|
||||
h = 0;
|
||||
};
|
||||
|
||||
class GVAR(elements_group): RscControlsGroupNoScrollbars {
|
||||
x = "safeZoneX";
|
||||
y = "safeZoneY";
|
||||
w = "safeZoneW";
|
||||
h = "safeZoneH";
|
||||
idc = 170;
|
||||
class Controls {
|
||||
class CA_Distance: RscOpticsValue {
|
||||
idc = 151;
|
||||
sizeEx = "0";
|
||||
colorText[] = {0,0,0,0};
|
||||
x = 0;
|
||||
y = 0;
|
||||
w = 0;
|
||||
h = 0;
|
||||
};
|
||||
class GVAR(Day_mode_off): RscPicture {
|
||||
idc = 1001;
|
||||
x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (0.03/4)*3*safeZoneH - safeZoneX";
|
||||
y = "safeZoneY+safeZoneH*0.031 - safeZoneY";
|
||||
w = "0.1045752* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)";
|
||||
h = "safeZoneH*0.1045752";
|
||||
colorText[] = {0.2941,0.2941,0.2941,1};
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\day_co.paa";
|
||||
};
|
||||
class GVAR(Day_mode): GVAR(Day_mode_off) {
|
||||
idc = 160;
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class GVAR(WFOV_mode_off): GVAR(Day_mode_off) {
|
||||
idc = 1004;
|
||||
x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (0.307/4)*3*safeZoneH - safeZoneX";
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\wfov_co.paa";
|
||||
};
|
||||
class GVAR(WFOV_mode_group): RscControlsGroupNoScrollbars {
|
||||
x = "safeZoneX";
|
||||
y = "safeZoneY";
|
||||
w = "safeZoneW";
|
||||
h = "safeZoneH";
|
||||
idc = 163;
|
||||
class Controls {
|
||||
class GVAR(WFOV_mode_on): GVAR(WFOV_mode_off) {
|
||||
idc = -1;
|
||||
y = "0.031*SafeZoneH - SafezoneY";
|
||||
x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.307/4)*3*SafezoneH - SafezoneX";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class StadiaL: RscLine {
|
||||
x = "0.4899*safeZoneW - safeZoneX";
|
||||
y = "0.171*safeZoneH - safeZoneY";
|
||||
w = 0;
|
||||
h = "0.049*safeZoneH";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class StadiaR: RscLine {
|
||||
x = "0.5109*safeZoneW- safeZoneX";
|
||||
y = "0.171*safeZoneH - safeZoneY";
|
||||
w = 0;
|
||||
h = "0.049*safeZoneH";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class BracketL: RscLine {
|
||||
x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.293/4)*3*safeZoneH - safeZoneX";
|
||||
y = "0.4677*safeZoneH - safeZoneY";
|
||||
w = 0;
|
||||
h = "0.0646*safeZoneH";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class BracketR: RscLine {
|
||||
x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.70/4)*3*safeZoneH - safeZoneX";
|
||||
y = "0.4677*safeZoneH - safeZoneY";
|
||||
w = 0;
|
||||
h = "0.0646*safeZoneH";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class BracketT: RscLine {
|
||||
x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.467/4)*3*safeZoneH - safeZoneX";
|
||||
y = "0.3535*safeZoneH - safeZoneY";
|
||||
w = "0.065* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)";
|
||||
h = 0;
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class BracketB: RscLine {
|
||||
x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.467/4)*3*safeZoneH - safeZoneX";
|
||||
y = "0.6465*safeZoneH - safeZoneY";
|
||||
w = "0.065* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)";
|
||||
h = 0;
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
class GVAR(NFOV_mode_off): GVAR(Day_mode_off) {
|
||||
idc = 1003;
|
||||
x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (0.586/4)*3*safeZoneH - safeZoneX";
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\nfov_co.paa";
|
||||
};
|
||||
class GVAR(NFOV_mode_group): RscControlsGroupNoScrollbars {
|
||||
x = "safeZoneX";
|
||||
y = "safeZoneY";
|
||||
w = "safeZoneW-safeZoneX";
|
||||
h = "safeZoneH-safeZoneY";
|
||||
idc = 162;
|
||||
class Controls {
|
||||
class GVAR(NFOV_mode_on): GVAR(NFOV_mode_off) {
|
||||
idc = -1;
|
||||
x = "((SafezoneW -SafezoneH*3/4)/2)+ (0.586/4)*3*SafezoneH - SafezoneX";
|
||||
y = "0.031*SafeZoneH - SafezoneY";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class StadiaL: RscLine {
|
||||
x = "0.4788*safeZoneW - safeZoneX";
|
||||
y = "0.171*safeZoneH - safeZoneY";
|
||||
w = 0;
|
||||
h = "0.049*safeZoneH";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class StadiaR: RscLine {
|
||||
x = "0.5212*safeZoneW - safeZoneX";
|
||||
y = "0.171*safeZoneH - safeZoneY";
|
||||
w = 0;
|
||||
h = "0.049*safeZoneH";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class LineHL: RscLine {
|
||||
x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.01/4)*3*safeZoneH - safeZoneX";
|
||||
y = "safeZoneH*0.5 - safeZoneY";
|
||||
w = "0.29* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)";
|
||||
h = "safeZoneH*0.0";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class LineHR: RscLine {
|
||||
x = "((safeZoneW -safeZoneH*3/4)/2)+ (0.695/4)*3*safeZoneH - safeZoneX";
|
||||
y = "safeZoneH*0.5 - safeZoneY";
|
||||
w = "0.29* (((safeZoneW*3)/4)/safeZoneW)/(1/safeZoneH)";
|
||||
h = "safeZoneH*0.0";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class LineVT: RscLine {
|
||||
x = "0.5*safeZoneW - safeZoneX";
|
||||
y = "0.171*safeZoneH - safeZoneY";
|
||||
w = 0;
|
||||
h = "0.1825*safeZoneH";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class LineVB: RscLine {
|
||||
x = "0.5*safeZoneW - safeZoneX";
|
||||
y = "0.6465*safeZoneH - safeZoneY";
|
||||
w = 0;
|
||||
h = "0.1895*safeZoneH";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class GVAR(SEEK_off): GVAR(Day_mode_off) {
|
||||
idc = 699000;
|
||||
x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (0.863/4)*3*safeZoneH - safeZoneX";
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\seek_co.paa";
|
||||
};
|
||||
class GVAR(SEEK): GVAR(SEEK_off) {
|
||||
idc = 166;
|
||||
colorText[] = {0.2941,0.8745,0.2157,0};
|
||||
};
|
||||
class GVAR(Missle_off): GVAR(Day_mode_off) {
|
||||
idc = 1032;
|
||||
x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (-0.134/4)*3*safeZoneH - safeZoneX";
|
||||
y = "(safeZoneY + 0.208*safeZoneH) - safeZoneY";
|
||||
colorText[] = {0.2941,0.2941,0.2941,1};
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\missle_co.paa";
|
||||
};
|
||||
class GVAR(Missle): GVAR(Missle_off) {
|
||||
idc = 167;
|
||||
colorText[] = {0.9255,0.5216,0.1216,0};
|
||||
};
|
||||
class GVAR(CLU_off): GVAR(Missle_off) {
|
||||
idc = 1027;
|
||||
y = "(safeZoneY + 0.436*safeZoneH) - safeZoneY";
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\clu_co.paa";
|
||||
};
|
||||
class GVAR(HangFire_off): GVAR(Missle_off) {
|
||||
idc = 1028;
|
||||
y = "(safeZoneY + 0.669*safeZoneH) - safeZoneY";
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\hangfire_co.paa";
|
||||
};
|
||||
class GVAR(TOP_off): GVAR(Day_mode_off) {
|
||||
idc = 699001;
|
||||
x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (1.023/4)*3*safeZoneH - safeZoneX";
|
||||
y = "(safeZoneY + 0.208*safeZoneH) - safeZoneY";
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\top_co.paa";
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
class GVAR(DIR): GVAR(Day_mode) {
|
||||
idc = 699002;
|
||||
x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (1.023/4)*3*safeZoneH - safeZoneX";
|
||||
y = "(safeZoneY + 0.436*safeZoneH) - safeZoneY";
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\dir_co.paa";
|
||||
colorText[] = {0.2941,0.2941,0.2941,1};
|
||||
};
|
||||
class GVAR(FLTR_mode_off): GVAR(Day_mode_off) {
|
||||
idc = 1002;
|
||||
x = "(safeZoneX+(safeZoneW -safeZoneH*3/4)/2)+ (1.023/4)*3*safeZoneH - safeZoneX";
|
||||
y = "(safeZoneY + 0.669*safeZoneH) - safeZoneY";
|
||||
text = "\A3\ui_f\data\igui\rscingameui\rscoptics_titan\fltr_co.paa";
|
||||
};
|
||||
class GVAR(FLTR_mode): GVAR(FLTR_mode_off) {
|
||||
idc = 161;
|
||||
colorText[] = {0.2941,0.8745,0.2157,1};
|
||||
};
|
||||
};
|
||||
};
|
||||
class ACE_Targeting: RscControlsGroupNoScrollbars {
|
||||
idc = 6999;
|
||||
x = "safeZoneX";
|
||||
y = "safeZoneY";
|
||||
w = "safeZoneW";
|
||||
h = "safeZoneH";
|
||||
enabled = 0;
|
||||
show = 0;
|
||||
class Controls {
|
||||
class ACE_TargetingConstrains: RscControlsGroupNoScrollbars {
|
||||
x = "safeZoneX";
|
||||
y = "safeZoneY";
|
||||
w = "safeZoneW-safeZoneX";
|
||||
h = "safeZoneH-safeZoneY";
|
||||
|
||||
enabled = 0;
|
||||
class Controls {
|
||||
class Top: RscPicture {
|
||||
idc = 699101;
|
||||
text = "#(argb,8,8,3)color(1,1,1,1)";
|
||||
colorText[] = {0.2941,0.2941,0.2941,1};
|
||||
x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX";
|
||||
y = "0.15*safeZoneH-safeZoneY";
|
||||
w = "(3/4)*safeZoneH";
|
||||
h = "0.21*safeZoneH";
|
||||
};
|
||||
class Bottom: Top {
|
||||
idc = 699102;
|
||||
y = "0.64*safeZoneH-safeZoneY";
|
||||
};
|
||||
class Left: Top {
|
||||
idc = 699103;
|
||||
x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX";
|
||||
y = "0.36*safeZoneH-safeZoneY";
|
||||
w = "0.31*(3/4)*safeZoneH";
|
||||
h = "0.28*safeZoneH";
|
||||
};
|
||||
class Right: Left {
|
||||
idc = 699104;
|
||||
x = "((safeZoneW -(3/4)*safeZoneH)/2)+ 0.69*(3/4)*safeZoneH - safeZoneX";
|
||||
};
|
||||
class OpticsBorders: RscPicture {
|
||||
idc = 699105;
|
||||
text = QPATHTOF(data\javelin_ui_border_ca.paa);
|
||||
colorText[] = {0,0,0,1};
|
||||
x = "((safeZoneW -(3.1/4)*safeZoneH)/2) - safeZoneX";
|
||||
y = "0.15*safeZoneH-safeZoneY";
|
||||
w = "(3.1/4)*safeZoneH";
|
||||
h = "0.7*safeZoneH";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class ACE_TargetingGate: ACE_TargetingConstrains {
|
||||
idc = 699200;
|
||||
class Controls {
|
||||
class TargetingGateTL: ACE_TargetingConstrains {
|
||||
x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX";
|
||||
y = "0.15*safeZoneH - safeZoneY";
|
||||
idc = 699201;
|
||||
class Controls {
|
||||
class LineH: RscLine {
|
||||
idc = 699210;
|
||||
x = "0";
|
||||
y = "0";
|
||||
w = "0.025*(3/4)*safeZoneH";
|
||||
h = "0";
|
||||
colorText[] = {0.8745,0.8745,0.8745,1};
|
||||
};
|
||||
class LineV: LineH {
|
||||
idc = 699211;
|
||||
w = "0";
|
||||
h = "0.025*safeZoneH";
|
||||
};
|
||||
};
|
||||
};
|
||||
class TargetingGateTR: TargetingGateTL {
|
||||
x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX + 0.975*(3/4)*safeZoneH";
|
||||
y = "0.15*safeZoneH - safeZoneY";
|
||||
idc = 699202;
|
||||
class Controls {
|
||||
class LineH: RscLine {
|
||||
idc = 699220;
|
||||
x = "0";
|
||||
y = "0";
|
||||
w = "0.025*(3/4)*safeZoneH";
|
||||
h = "0";
|
||||
colorText[] = {0.8745,0.8745,0.8745,1};
|
||||
};
|
||||
class LineV: LineH {
|
||||
idc = 699221;
|
||||
x = "0.025*(3/4)*safeZoneH";
|
||||
w = "0";
|
||||
h = "0.025*safeZoneH";
|
||||
};
|
||||
};
|
||||
};
|
||||
class TargetingGateBL: TargetingGateTL {
|
||||
x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX";
|
||||
y = "0.825*safeZoneH - safeZoneY";
|
||||
idc = 699203;
|
||||
class Controls {
|
||||
class LineH: RscLine {
|
||||
x = "0";
|
||||
y = "0.025*safeZoneH";
|
||||
w = "0.025*(3/4)*safeZoneH";
|
||||
h = "0";
|
||||
colorText[] = {0.8745,0.8745,0.8745,1};
|
||||
};
|
||||
class LineV: LineH {
|
||||
y = "0";
|
||||
w = "0";
|
||||
h = "0.025*safeZoneH";
|
||||
};
|
||||
};
|
||||
};
|
||||
class TargetingGateBR: TargetingGateBL {
|
||||
x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX + 0.975*(3/4)*safeZoneH";
|
||||
y = "0.825*safeZoneH - safeZoneY";
|
||||
idc = 699204;
|
||||
class Controls {
|
||||
class LineH: RscLine {
|
||||
x = "0";
|
||||
y = "0.025*safeZoneH";
|
||||
w = "0.025*(3/4)*safeZoneH";
|
||||
h = "0";
|
||||
colorText[] = {0.8745,0.8745,0.8745,1};
|
||||
};
|
||||
class LineV: LineH {
|
||||
x = "0.025*(3/4)*safeZoneH";
|
||||
y = "0";
|
||||
w = "0";
|
||||
h = "0.025*safeZoneH";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
class ACE_TargetingLines: ACE_TargetingConstrains {
|
||||
idc = 699300;
|
||||
class Controls {
|
||||
class LineH: RscLine {
|
||||
idc = 699301;
|
||||
x = "((safeZoneW -(3/4)*safeZoneH)/2) - safeZoneX";
|
||||
y = "0.5*safeZoneH - safeZoneY";
|
||||
w = "(3/4)*safeZoneH";
|
||||
h = "0";
|
||||
colorText[] = {0.8745,0.8745,0.8745,1};
|
||||
};
|
||||
class LineV: RscLine {
|
||||
idc = 699302;
|
||||
x = "0.5*safeZoneW - safeZoneX";
|
||||
y = "0.15*safeZoneH - safeZoneY";
|
||||
w = "0";
|
||||
h = "0.7*safeZoneH";
|
||||
colorText[] = {0.8745,0.8745,0.8745,1};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
// on colorText[] = {0.2941, 0.8745, 0.2157, 1.0};
|
||||
// off colorText[] = {0.2941, 0.2941, 0.2941, 1.0};
|
||||
// orange colorText[] = {0.9255, 0.5216, 0.1216, 1.0};
|
||||
|
||||
/*
|
||||
ACE_Titan_elements_group: 170
|
||||
ACE_Titan_Day_mode_off: 1001
|
||||
ACE_Titan_Day_mode: 160
|
||||
ACE_Titan_WFOV_mode_off: 1004
|
||||
ACE_Titan_WFOV_mode_group: 163
|
||||
ACE_Titan_NFOV_mode_off: 1003
|
||||
ACE_Titan_NFOV_mode_group: 162
|
||||
ACE_Titan_SEEK_off: 1005 //1001
|
||||
ACE_Titan_SEEK: 166
|
||||
ACE_Titan_Missle_off: 1032
|
||||
ACE_Titan_Missle: 167
|
||||
ACE_Titan_CLU_off: 1027
|
||||
ACE_Titan_HangFire_off: 1028
|
||||
ACE_Titan_TOP_off: 1006
|
||||
ACE_Titan_DIR: 1007
|
||||
ACE_Titan_FLTR_mode_off: 1002
|
||||
ACE_Titan_FLTR_mode: 161
|
||||
*/
|
@ -1,5 +0,0 @@
|
||||
|
||||
PREP(getTarget);
|
||||
PREP(mapHelperDraw);
|
||||
PREP(onOpticDraw);
|
||||
PREP(showFireMode);
|
@ -1,6 +0,0 @@
|
||||
// #define DEBUG_MODE_FULL
|
||||
#include "script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
#include "initKeybinds.inc.sqf"
|
@ -1,36 +0,0 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
ADDON = false;
|
||||
|
||||
PREP_RECOMPILE_START;
|
||||
#include "XEH_PREP.hpp"
|
||||
PREP_RECOMPILE_END;
|
||||
|
||||
GVAR(isLockKeyDown) = false;
|
||||
GVAR(pfehID) = -1;
|
||||
|
||||
DFUNC(disableFire) = {
|
||||
params ["_firedEH"];
|
||||
|
||||
if (_firedEH < 0 && {difficulty > 0}) then {
|
||||
_firedEH = [ACE_player, "DefaultAction", {true}, {
|
||||
private _canFire = (_this select 1) getVariable ["ace_missileguidance_target", nil];
|
||||
if (!isNil "_canFire") exitWith { false };
|
||||
true
|
||||
}] call EFUNC(common,addActionEventHandler);
|
||||
TRACE_1("Locking Fire Button",_firedEH);
|
||||
|
||||
};
|
||||
_firedEH
|
||||
};
|
||||
DFUNC(enableFire) = {
|
||||
params ["_firedEH"];
|
||||
|
||||
if (_firedEH >= 0 && {difficulty > 0}) then {
|
||||
TRACE_1("Unlocking Fire Button",_firedEH);
|
||||
[ACE_player, "DefaultAction", _firedEH] call EFUNC(common,removeActionEventHandler);
|
||||
};
|
||||
-1
|
||||
};
|
||||
|
||||
ADDON = true;
|
@ -1,3 +0,0 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
#include "XEH_PREP.hpp"
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -1,80 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Find a target within the optic range
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Last Target (seeds the scan) <OBJECT>
|
||||
* 1: Max Range (meters) <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* Target <OBJECT>
|
||||
*
|
||||
* Example:
|
||||
* [bob, 5] call ace_javelin_fnc_getTarget
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
params ["_lastTarget", "_maxRange"];
|
||||
|
||||
scopeName "main";
|
||||
|
||||
private _viewASL = AGLtoASL positionCameraToWorld [0,0,0];
|
||||
private _viewDir = _viewASL vectorFromTo (AGLtoASL positionCameraToWorld [0,0,1]);
|
||||
|
||||
// Attempt to lock onto current target if it is still valid
|
||||
if (!isNull _lastTarget) then {
|
||||
private _aimASL = aimPos _lastTarget;
|
||||
|
||||
if ((_viewASL vectorDistance _aimASL) > _maxRange) exitWith {};
|
||||
if ((acos ((_viewASL vectorFromTo _aimASL) vectorDotProduct _viewDir)) > 0.6) exitWith {};
|
||||
|
||||
private _relAngle = (_lastTarget getRelDir _viewASL);
|
||||
|
||||
for "_xOffset" from -2.5 to 2.5 step 0.5 do {
|
||||
for "_yOffset" from -2 to 1 step 0.5 do {
|
||||
// Find test points in the model based on the angle that we are viewing it from (not true 3d projection, but not bad)
|
||||
private _testPosASL = _lastTarget modelToWorldWorld [_xOffset * - cos _relAngle, _xOffset * sin _relAngle, _yOffset];
|
||||
private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, _testPosASL, ace_player, vehicle ace_player, true, 1];
|
||||
// drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [[0,1,1,1], [1,0,1,1]] select (count _intersectionsToCursorTarget), (ASLtoAGL _testPosASL), 0.25, 0.25, 0, "", 0.5, 0.025, "TahomaB"];
|
||||
if (_intersectionsToCursorTarget isNotEqualTo []) then {
|
||||
(_intersectionsToCursorTarget select 0) params ["", "", "_intersectedObject"];
|
||||
if (_intersectedObject isKindOf "AllVehicles") then {
|
||||
_intersectedObject breakOut "main";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
// Try cursorObject/Target as they are very fast
|
||||
if ((cursorObject isKindOf "AllVehicles") && {(cursorObject distance ace_player) < _maxRange}) then {
|
||||
private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, aimPos cursorObject, ace_player, cursorObject, true, 1];
|
||||
if (_intersectionsToCursorTarget isEqualTo []) then {
|
||||
cursorObject breakOut "main";
|
||||
};
|
||||
};
|
||||
if ((cursorTarget isKindOf "AllVehicles") && {(cursorObject distance ace_player) < _maxRange}) then {
|
||||
private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, aimPos cursorTarget, ace_player, cursorTarget, true, 1];
|
||||
if (_intersectionsToCursorTarget isEqualTo []) then {
|
||||
cursorTarget breakOut "main";
|
||||
};
|
||||
};
|
||||
|
||||
// Attempt to scan using multiple rayscasts - This is expensive (n^2) and care should be given to balance accuracy vs speed
|
||||
for "_xOffset" from -14 to 14 step 2 do {
|
||||
for "_yOffset" from -12 to 12 step 4 do {
|
||||
private _testPosASL = AGLtoASL (positionCameraToWorld [_xOffset, _yOffset, _maxRange]);
|
||||
private _intersectionsToCursorTarget = lineIntersectsSurfaces [_viewASL, _testPosASL, ace_player, vehicle ace_player, true, 1];
|
||||
// drawIcon3D ["\A3\ui_f\data\map\markers\military\dot_CA.paa", [[0,1,0,1], [1,0,0,1]] select (count _intersectionsToCursorTarget), (ASLtoAGL _testPosASL), 0.25, 0.25, 0, "", 0.5, 0.025, "TahomaB"];
|
||||
if (_intersectionsToCursorTarget isNotEqualTo []) then {
|
||||
(_intersectionsToCursorTarget select 0) params ["", "", "_intersectedObject"];
|
||||
if (_intersectedObject isKindOf "AllVehicles") then {
|
||||
_intersectedObject breakOut "main";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
objNull
|
@ -1,51 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Handles the map helper's draw event
|
||||
* Resets arguments if not run recently
|
||||
* And starts a watchdog to detect when weapon display unloaded
|
||||
*
|
||||
* Arguments:
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_javelin_fnc_mapHelperDraw
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
if (isNil QGVAR(arguments)) then {
|
||||
TRACE_1("Starting optic draw",_this);
|
||||
|
||||
// reset shooter var:
|
||||
private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player};
|
||||
_currentShooter setVariable ["ace_missileguidance_target", nil, false];
|
||||
|
||||
GVAR(arguments) = [
|
||||
diag_frameno, // Last run frame
|
||||
objNull, // currentTargetObject
|
||||
0, // Lock Start Time
|
||||
0, // Next Sound timer
|
||||
-1, // _fireDisabledEH
|
||||
0 // _nextTargetScan
|
||||
];
|
||||
|
||||
// Start up a watchdog for when the display is no longer shown (but might not be unloaded or null)
|
||||
[{
|
||||
if (isNull (uiNamespace getVariable ["ACE_RscOptics_javelin", displayNull])) exitWith {true};
|
||||
GVAR(arguments) params ["_lastRunFrame"];
|
||||
(diag_frameno < _lastRunFrame) || {diag_frameno > (_lastRunFrame + 1)}
|
||||
}, {
|
||||
TRACE_1("old/null display - ending optic draw",_this);
|
||||
private _fireDisabledEH = GVAR(arguments) param [4, -1];
|
||||
[_fireDisabledEH] call FUNC(enableFire);
|
||||
GVAR(arguments) = nil;
|
||||
}, []] call CBA_fnc_waitUntilAndExecute;
|
||||
};
|
||||
|
||||
BEGIN_COUNTER(onOpticDraw);
|
||||
GVAR(arguments) call FUNC(onOpticDraw);
|
||||
END_COUNTER(onOpticDraw);
|
@ -1,202 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: jaynus, PabstMirror
|
||||
* Main loop, handles scaning for targets and drawing the javelin optic
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Last run frame <NUMBER>
|
||||
* 0: Current target (what we locked last run) <OBJECT>
|
||||
* 0: Lock start time (cba mission time) <NUMBER>
|
||||
* 0: Next sound play time (ticktime) <NUMBER>
|
||||
* 0: Next target scan (ticktime) <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_javelin_fnc_onOpticDraw
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
// TRACE_1("onOpticDraw",diag_frameno);
|
||||
|
||||
#define __TRACKINTERVAL 0 // how frequent the ui update should be.
|
||||
#define __SCANNTERVAL 0.05 // how frequent the target scan check should be.
|
||||
#define __LOCKONTIME 3 // Lock on won't occur sooner
|
||||
|
||||
// Pull the arguments
|
||||
params ["_lastRunFrame", "_currentTarget", "_lockStartTime", "_soundNextPlayTime", "_fireDisabledEH", "_nextTargetScan"];
|
||||
|
||||
// Get shooter info
|
||||
private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player};
|
||||
private _currentWeapon = currentWeapon _currentShooter;
|
||||
private _currentMagazine = currentMagazine _currentShooter;
|
||||
|
||||
// Get weapon / ammo configs
|
||||
private _ammoCount = _currentShooter ammo _currentWeapon;
|
||||
private _weaponConfig = configProperties [configFile >> "CfgWeapons" >> _currentWeapon, QUOTE(configName _x == QUOTE(QGVAR(enabled))), false];
|
||||
private _ammoConfig = if (_currentMagazine != "") then {
|
||||
private _ammoType = getText (configFile >> "CfgMagazines" >> _currentMagazine >> "ammo");
|
||||
configProperties [(configFile >> "CfgAmmo" >> _ammoType), "(configName _x) == 'ace_missileguidance'", false];
|
||||
} else {
|
||||
[]
|
||||
};
|
||||
|
||||
// Check if loaded and javelin enabled for wepaon and missile guidance enabled for loaded ammo
|
||||
if ((_ammoCount == 0) || // No ammo loaded
|
||||
{(count _weaponConfig) < 1} || {(getNumber (_weaponConfig select 0)) != 1} || // Not enabled for weapon
|
||||
{(count _ammoConfig) < 1} || {(getNumber ((_ammoConfig select 0) >> "enabled")) != 1} // Not enabled for ammo
|
||||
) exitWith {
|
||||
|
||||
__JavelinIGUITargeting ctrlShow false;
|
||||
__JavelinIGUISeek ctrlSetTextColor __ColorGray;
|
||||
|
||||
_fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire);
|
||||
_this set [0, diag_frameno];
|
||||
_this set [4, _fireDisabledEH];
|
||||
|
||||
// Fix weapon being in top-attack when loading AP magazine (https://feedback.bistudio.com/T171012)
|
||||
if ((_currentShooter == ACE_player) && {_currentMagazine == "Titan_AP"} && {currentWeaponMode ACE_player == "TopDown"}) then {
|
||||
{
|
||||
_x params ["_xIndex", "", "", "", "_xMode"];
|
||||
if (_xMode == "Single") exitWith {
|
||||
ACE_player action ["SwitchWeapon", _currentShooter, ACE_player, _xIndex];
|
||||
__JavelinIGUITop ctrlSetTextColor __ColorGray;
|
||||
__JavelinIGUIDir ctrlSetTextColor __ColorGreen;
|
||||
TRACE_2("fix top-attack for AP",weaponState _currentShooter,_x);
|
||||
};
|
||||
} forEach (ACE_player weaponsInfo [_currentWeapon, true]);
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
// Bail on fast movement (keep it steady)
|
||||
if ((velocity ACE_player) distance [0,0,0] > 0.75 && {cameraView == "GUNNER"} && {cameraOn == ACE_player}) exitWith {
|
||||
TRACE_1("exiting gunner because movement",velocity ACE_player);
|
||||
ACE_player switchCamera "INTERNAL";
|
||||
if (player != ACE_player) then {
|
||||
TRACE_2("Zeus, manually reseting RC after switchCamera",player,ACE_player);
|
||||
player remoteControl ACE_player;
|
||||
};
|
||||
};
|
||||
|
||||
// Refresh the firemode (top/dir)
|
||||
[] call FUNC(showFireMode);
|
||||
|
||||
// Get UI constants
|
||||
private _offsetX = 0.5 * safeZoneW - safeZoneX - 0.5;
|
||||
private _offsetY = 0.5 * safeZoneH - safeZoneY - 0.5;
|
||||
|
||||
private _newTarget = objNull;
|
||||
if (GVAR(isLockKeyDown) && {cameraView == "GUNNER"} && {((currentVisionMode ACE_player) == 2) || {missionNamespace getVariable [QGVAR(ignoreVisionMode), false]}}) then {
|
||||
// Attempting to lock; getTarget can be expensive so it's rate is limited
|
||||
if (diag_tickTime > _nextTargetScan) then {
|
||||
BEGIN_COUNTER(getTarget);
|
||||
_newTarget = [_currentTarget, 2500, 0.6] call FUNC(getTarget);
|
||||
END_COUNTER(getTarget);
|
||||
_nextTargetScan = diag_tickTime + __SCANNTERVAL;
|
||||
} else {
|
||||
_newTarget = _currentTarget;
|
||||
};
|
||||
|
||||
// Show gate box
|
||||
private _boundsInput = if (_currentTarget isKindOf "CAManBase") then {
|
||||
[_currentTarget,[-0.5,-0.5,-0.25],[0,0,0]];
|
||||
} else {
|
||||
[_currentTarget,[-1,-1,-1],_currentTarget selectionPosition "zamerny"];
|
||||
};
|
||||
|
||||
private _bpos = _boundsInput call EFUNC(common,worldToScreenBounds);
|
||||
|
||||
private _lockTime = if (isNull _currentTarget) then {0} else {CBA_missionTime - _lockStartTime};
|
||||
private _minX = ((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 - 0.075*safeZoneW, (_bpos select 0), true]) + _offsetX) max __ConstraintLeft;
|
||||
private _minY = ((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 - 0.075*safeZoneH, (_bpos select 1), true]) + _offsetY) max __ConstraintTop;
|
||||
private _maxX = (((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 + 0.075*safeZoneW, (_bpos select 2), true]) + _offsetX) min __ConstraintRight) - (0.025 * (3 / 4) * safeZoneH);
|
||||
private _maxY = (((linearConversion [1, (__LOCKONTIME - 0.5), _lockTime, 0.5 + 0.075*safeZoneH, (_bpos select 3), true]) + _offsetY) min __ConstraintBottom) - (0.025 * safeZoneH);
|
||||
|
||||
// TRACE_3("",_boundsInput,_bpos,_lockTime);
|
||||
// TRACE_4("",_minX,_maxX,_minY,_maxY);
|
||||
|
||||
__JavelinIGUITargetingGateTL ctrlSetPosition [_minX, _minY];
|
||||
__JavelinIGUITargetingGateTR ctrlSetPosition [_maxX, _minY];
|
||||
__JavelinIGUITargetingGateBL ctrlSetPosition [_minX, _maxY];
|
||||
__JavelinIGUITargetingGateBR ctrlSetPosition [_maxX, _maxY];
|
||||
{_x ctrlCommit __TRACKINTERVAL} forEach [__JavelinIGUITargetingGateTL, __JavelinIGUITargetingGateTR, __JavelinIGUITargetingGateBL, __JavelinIGUITargetingGateBR];
|
||||
|
||||
__JavelinIGUITargeting ctrlShow true;
|
||||
__JavelinIGUITargetingGate ctrlShow true;
|
||||
} else {
|
||||
// Not trying to lock
|
||||
__JavelinIGUITargeting ctrlShow false;
|
||||
__JavelinIGUITargetingGate ctrlShow false;
|
||||
__JavelinIGUITargetingLines ctrlShow false;
|
||||
};
|
||||
|
||||
if (isNull _newTarget) then {
|
||||
// No target found
|
||||
_currentTarget = objNull;
|
||||
_lockStartTime = 0;
|
||||
__JavelinIGUISeek ctrlSetTextColor __ColorGray;
|
||||
_currentShooter setVariable ["ace_missileguidance_target", nil, false];
|
||||
|
||||
__JavelinIGUITargetingLines ctrlShow false;
|
||||
|
||||
// Disallow fire
|
||||
_fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire);
|
||||
} else {
|
||||
if ((!isNull _newTarget) && {_currentTarget != _newTarget}) then {
|
||||
TRACE_1("New Target, reseting locking",_newTarget);
|
||||
_lockStartTime = CBA_missionTime;
|
||||
_currentTarget = _newTarget;
|
||||
};
|
||||
|
||||
if ((CBA_missionTime - _lockStartTime) > __LOCKONTIME) then { // Lock on after 3 seconds
|
||||
TRACE_2("LOCKED!",_currentTarget,_lockStartTime);
|
||||
__JavelinIGUISeek ctrlSetTextColor __ColorGreen;
|
||||
__JavelinIGUITargetingLines ctrlShow true;
|
||||
|
||||
// Move target marker (the crosshair) to aimpoint on the target
|
||||
private _aimPointOnTarget = _currentTarget selectionPosition (["zamerny", "body"] select (_currentTarget isKindOf "CAManBase"));
|
||||
(worldToScreen (_currentTarget modelToWorld _aimPointOnTarget)) params [["_aposX", 0.5], ["_aposY", 0.5]];
|
||||
private _ctrlPos = ctrlPosition __JavelinIGUITargetingLineV;
|
||||
_ctrlPos set [0, _aposX + _offsetX];
|
||||
__JavelinIGUITargetingLineV ctrlSetPosition _ctrlPos;
|
||||
__JavelinIGUITargetingLineV ctrlCommit __TRACKINTERVAL;
|
||||
_ctrlPos = ctrlPosition __JavelinIGUITargetingLineH;
|
||||
_ctrlPos set [1, _aposY + _offsetY];
|
||||
__JavelinIGUITargetingLineH ctrlSetPosition _ctrlPos;
|
||||
__JavelinIGUITargetingLineH ctrlCommit __TRACKINTERVAL;
|
||||
|
||||
_currentShooter setVariable ["ace_missileguidance_target", _currentTarget, false];
|
||||
|
||||
// Allow fire
|
||||
_fireDisabledEH = [_fireDisabledEH] call FUNC(enableFire);
|
||||
|
||||
if (diag_tickTime > _soundNextPlayTime) then {
|
||||
playSound "ACE_Javelin_Locked";
|
||||
_soundNextPlayTime = diag_tickTime + 0.25;
|
||||
};
|
||||
} else {
|
||||
// Lock in progress
|
||||
__JavelinIGUISeek ctrlSetTextColor __ColorGray;
|
||||
__JavelinIGUITargetingLines ctrlShow false;
|
||||
|
||||
_currentShooter setVariable ["ace_missileguidance_target", nil, false];
|
||||
|
||||
if (diag_tickTime > _soundNextPlayTime) then {
|
||||
playSound "ACE_Javelin_Locking";
|
||||
_soundNextPlayTime = diag_tickTime + 0.25;
|
||||
};
|
||||
// Disallow fire
|
||||
_fireDisabledEH = [_fireDisabledEH] call FUNC(disableFire);
|
||||
};
|
||||
};
|
||||
|
||||
// Save arguments for next run
|
||||
_this set [0, diag_frameno];
|
||||
_this set [1, _currentTarget];
|
||||
_this set [2, _lockStartTime];
|
||||
_this set [3, _soundNextPlayTime];
|
||||
_this set [4, _fireDisabledEH];
|
||||
_this set [5, _nextTargetScan];
|
@ -1,41 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: jaynus
|
||||
* Updates fire mode on javelin display (top/dir)
|
||||
*
|
||||
* Arguments:
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_javelin_fnc_showFireMode
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
(if (((vehicle ACE_player) == ACE_player) || {ACE_player call CBA_fnc_canUseWeapon}) then {
|
||||
weaponState ACE_player
|
||||
} else {
|
||||
_turretPath = if (ACE_player == (driver _currentShooter)) then {[-1]} else {ACE_player call CBA_fnc_turretPath};
|
||||
weaponState [vehicle ACE_player, _turretPath]
|
||||
}) params ["_weapon", "", "_mode"];
|
||||
|
||||
private _currentFireMode = getText (configFile >> "CfgWeapons" >> _weapon >> _mode >> QEGVAR(missileGuidance,attackProfile));
|
||||
|
||||
TRACE_3("showFireMode",_weapon,_mode,_currentFireMode);
|
||||
|
||||
if (_currentFireMode == "") then { // backwards compatiblity for addons using ace_javelin (CUP)
|
||||
private _currentShooter = if (ACE_player call CBA_fnc_canUseWeapon) then {ACE_player} else {vehicle ACE_player};
|
||||
_currentFireMode = _currentShooter getVariable ["ace_missileguidance_attackProfile", "JAV_TOP"];
|
||||
TRACE_1("using getVar",_currentFireMode);
|
||||
};
|
||||
|
||||
if (_currentFireMode == "JAV_TOP") then {
|
||||
__JavelinIGUITop ctrlSetTextColor __ColorGreen;
|
||||
__JavelinIGUIDir ctrlSetTextColor __ColorGray;
|
||||
} else {
|
||||
__JavelinIGUITop ctrlSetTextColor __ColorGray;
|
||||
__JavelinIGUIDir ctrlSetTextColor __ColorGreen;
|
||||
};
|
@ -1,20 +0,0 @@
|
||||
// by commy2
|
||||
|
||||
["ACE3 Weapons", QGVAR(lockTarget), localize LSTRING(LockTarget),
|
||||
{
|
||||
if (GETGVAR(isLockKeyDown,false)) exitWith {false};
|
||||
|
||||
GVAR(isLockKeyDown) = true;
|
||||
TRACE_1("lock key down",GVAR(isLockKeyDown));
|
||||
|
||||
// Return false so it doesn't block the rest weapon action
|
||||
false
|
||||
},
|
||||
{
|
||||
// prevent holding down
|
||||
GVAR(isLockKeyDown) = false;
|
||||
TRACE_1("lock key up",GVAR(isLockKeyDown));
|
||||
|
||||
false
|
||||
},
|
||||
[15, [false, false, false]], false] call CBA_fnc_addKeybind; //Tab Key
|
@ -1,61 +0,0 @@
|
||||
#define COMPONENT javelin
|
||||
#define COMPONENT_BEAUTIFIED Javelin
|
||||
#include "\z\ace\addons\main\script_mod.hpp"
|
||||
|
||||
// #define DEBUG_MODE_FULL
|
||||
// #define DISABLE_COMPILE_CACHE
|
||||
// #define ENABLE_PERFORMANCE_COUNTERS
|
||||
|
||||
#ifdef DEBUG_ENABLED_JAVELIN
|
||||
#define DEBUG_MODE_FULL
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SETTINGS_JAVELIN
|
||||
#define DEBUG_SETTINGS DEBUG_SETTINGS_JAVELIN
|
||||
#endif
|
||||
|
||||
#include "\z\ace\addons\main\script_macros.hpp"
|
||||
|
||||
|
||||
// Javelin IGUI defines
|
||||
#define __JavelinIGUI (uinamespace getVariable "ACE_RscOptics_javelin")
|
||||
|
||||
// Custom controls
|
||||
#define __JavelinIGUITargeting (__JavelinIGUI displayCtrl 6999)
|
||||
|
||||
#define __JavelinIGUISeek (__JavelinIGUI displayCtrl 699000)
|
||||
#define __JavelinIGUITop (__JavelinIGUI displayCtrl 699001)
|
||||
#define __JavelinIGUIDir (__JavelinIGUI displayCtrl 699002)
|
||||
|
||||
// Constrains
|
||||
#define __JavelinIGUITargetingConstrains (__JavelinIGUI displayCtrl 699100)
|
||||
#define __JavelinIGUITargetingConstrainTop (__JavelinIGUI displayCtrl 699101)
|
||||
#define __JavelinIGUITargetingConstrainBottom (__JavelinIGUI displayCtrl 699102)
|
||||
#define __JavelinIGUITargetingConstrainLeft (__JavelinIGUI displayCtrl 699103)
|
||||
#define __JavelinIGUITargetingConstrainRight (__JavelinIGUI displayCtrl 699104)
|
||||
|
||||
// Targeting gate
|
||||
#define __JavelinIGUITargetingGate (__JavelinIGUI displayCtrl 699200)
|
||||
#define __JavelinIGUITargetingGateTL (__JavelinIGUI displayCtrl 699201)
|
||||
#define __JavelinIGUITargetingGateTR (__JavelinIGUI displayCtrl 699202)
|
||||
#define __JavelinIGUITargetingGateBL (__JavelinIGUI displayCtrl 699203)
|
||||
#define __JavelinIGUITargetingGateBR (__JavelinIGUI displayCtrl 699204)
|
||||
|
||||
// Rangefinder
|
||||
#define __JavelinIGUIRangefinder (__JavelinIGUI displayCtrl 151)
|
||||
|
||||
// Targeting lines
|
||||
#define __JavelinIGUITargetingLines (__JavelinIGUI displayCtrl 699300)
|
||||
#define __JavelinIGUITargetingLineH (__JavelinIGUI displayCtrl 699301)
|
||||
#define __JavelinIGUITargetingLineV (__JavelinIGUI displayCtrl 699302)
|
||||
|
||||
#define __ConstraintTop (((ctrlPosition __JavelinIGUITargetingConstrainTop) select 1) + ((ctrlPosition (__JavelinIGUITargetingConstrainTop)) select 3))
|
||||
#define __ConstraintBottom ((ctrlPosition __JavelinIGUITargetingConstrainBottom) select 1)
|
||||
#define __ConstraintLeft (((ctrlPosition __JavelinIGUITargetingConstrainLeft) select 0) + ((ctrlPosition (__JavelinIGUITargetingConstrainLeft)) select 2))
|
||||
#define __ConstraintRight ((ctrlPosition __JavelinIGUITargetingConstrainRight) select 0)
|
||||
|
||||
// Colors for controls
|
||||
#define __ColorOrange [0.9255,0.5216,0.1216,1]
|
||||
#define __ColorGreen [0.2941,0.8745,0.2157,1]
|
||||
#define __ColorGray [0.2941,0.2941,0.2941,1]
|
||||
#define __ColorNull [0,0,0,0]
|
@ -1,22 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project name="ACE">
|
||||
<Package name="Javelin">
|
||||
<Key ID="STR_ACE_Javelin_LockTarget">
|
||||
<English>Lock Target (Hold)</English>
|
||||
<German>Ziel aufschalten (Halten)</German>
|
||||
<Russian>Захватить цель (удерживать)</Russian>
|
||||
<Czech>Zamknout cíl (držet)</Czech>
|
||||
<Polish>Namierz cel (przytrzymaj)</Polish>
|
||||
<French>Javelin - Verrouiller la cible (maintenir)</French>
|
||||
<Hungarian>Célpontra állás (Lenyomva tartott)</Hungarian>
|
||||
<Italian>Aggangia il bersaglio</Italian>
|
||||
<Spanish>Fijar objetivo (Mantener)</Spanish>
|
||||
<Portuguese>Travar Alvo (Segurar)</Portuguese>
|
||||
<Japanese>目標を捕捉 (長押し)</Japanese>
|
||||
<Korean>표적 획득 (누르기)</Korean>
|
||||
<Chinesesimp>锁定目标(按住)</Chinesesimp>
|
||||
<Chinese>鎖定目標 (按住)</Chinese>
|
||||
<Turkish>Hedefe Kilitlen(Basılı Tut)</Turkish>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
@ -2,6 +2,6 @@ class EGVAR(missileguidance,AttackProfiles) {
|
||||
class maverick {
|
||||
name = "LOAL-DIR";
|
||||
nameLocked = "LOBL-DIR";
|
||||
functionName = QEFUNC(missileguidance,attackProfile_LIN);
|
||||
functionName = QEFUNC(missileguidance,attackProfile_DIR);
|
||||
};
|
||||
};
|
||||
|
@ -5,45 +5,6 @@ class CfgAmmo {
|
||||
};
|
||||
class Missile_AGM_02_F: MissileBase {};
|
||||
|
||||
class GVAR(D): Missile_AGM_02_F {
|
||||
author = "Dani (TCVM)";
|
||||
missileLockMaxDistance = 14000;
|
||||
maneuvrability = 0;
|
||||
class ace_missileguidance {
|
||||
enabled = 1;
|
||||
|
||||
pitchRate = 15;
|
||||
yawRate = 15;
|
||||
|
||||
canVanillaLock = 1;
|
||||
|
||||
defaultSeekerType = "Optic";
|
||||
seekerTypes[] = {"Optic"};
|
||||
|
||||
defaultSeekerLockMode = "LOBL";
|
||||
seekerLockModes[] = {"LOBL"};
|
||||
|
||||
defaultNavigationType = "AugmentedProportionalNavigation";
|
||||
navigationTypes[] = { "AugmentedProportionalNavigation" };
|
||||
|
||||
seekLastTargetPos = 1;
|
||||
seekerAngle = 60;
|
||||
seekerAccuracy = 1;
|
||||
|
||||
seekerMinRange = 1;
|
||||
seekerMaxRange = 14000;
|
||||
|
||||
defaultAttackProfile = "maverick";
|
||||
attackProfiles[] = {"maverick"};
|
||||
};
|
||||
};
|
||||
|
||||
class GVAR(G): GVAR(D) {
|
||||
class ace_missileguidance: ace_missileguidance {
|
||||
enabled = 1;
|
||||
};
|
||||
};
|
||||
|
||||
class GVAR(L): Missile_AGM_02_F {
|
||||
author = "xrufix";
|
||||
autoSeekTarget = 0;
|
||||
@ -55,8 +16,9 @@ class CfgAmmo {
|
||||
class ace_missileguidance {
|
||||
enabled = 1;
|
||||
|
||||
pitchRate = 15;
|
||||
yawRate = 15;
|
||||
minDeflection = 0;
|
||||
maxDeflection = 0.002;
|
||||
incDeflection = 0.001;
|
||||
|
||||
canVanillaLock = 0;
|
||||
|
||||
@ -66,9 +28,6 @@ class CfgAmmo {
|
||||
defaultSeekerLockMode = "LOAL";
|
||||
seekerLockModes[] = {"LOAL","LOBL"};
|
||||
|
||||
defaultNavigationType = "AugmentedProportionalNavigation";
|
||||
navigationTypes[] = { "AugmentedProportionalNavigation" };
|
||||
|
||||
seekLastTargetPos = 1;
|
||||
seekerAngle = 60;
|
||||
seekerAccuracy = 1;
|
||||
@ -90,8 +49,9 @@ class CfgAmmo {
|
||||
class ace_missileguidance {
|
||||
enabled = 1;
|
||||
|
||||
pitchRate = 20;
|
||||
yawRate = 20;
|
||||
minDeflection = 0;
|
||||
maxDeflection = 0.002;
|
||||
incDeflection = 0.001;
|
||||
|
||||
canVanillaLock = 0;
|
||||
|
||||
@ -101,9 +61,6 @@ class CfgAmmo {
|
||||
defaultSeekerLockMode = "LOAL";
|
||||
seekerLockModes[] = {"LOAL"};
|
||||
|
||||
defaultNavigationType = "AugmentedProportionalNavigation";
|
||||
navigationTypes[] = { "AugmentedProportionalNavigation" };
|
||||
|
||||
seekLastTargetPos = 1;
|
||||
seekerAngle = 40;
|
||||
seekerAccuracy = 1;
|
||||
|
@ -12,71 +12,7 @@ class CfgMagazines {
|
||||
|
||||
class PylonRack_Missile_AGM_02_x1: magazine_Missile_AGM_02_x1 {};
|
||||
class PylonRack_Missile_AGM_02_x2: magazine_Missile_AGM_02_x1 {};
|
||||
|
||||
// Optical Mavericks
|
||||
class GVAR(D_magazine): 6Rnd_Missile_AGM_02_F {
|
||||
ammo = QGVAR(D);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(d_mag_x1);
|
||||
};
|
||||
class GVAR(D_pylonRack_1Rnd): PylonRack_1Rnd_Missile_AGM_02_F {
|
||||
ammo = QGVAR(D);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(d_mag_x1);
|
||||
pylonWeapon = QGVAR(D_Launcher);
|
||||
};
|
||||
class GVAR(D_pylonRack_3Rnd): PylonRack_3Rnd_Missile_AGM_02_F {
|
||||
ammo = QGVAR(D);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(d_mag_x3);
|
||||
pylonWeapon = QGVAR(D_Launcher);
|
||||
};
|
||||
|
||||
class GVAR(G_magazine_x1): magazine_Missile_AGM_02_x1 {
|
||||
ammo = QGVAR(G);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(g_mag_x1);
|
||||
};
|
||||
class GVAR(G_pylonmissile_x1): PylonMissile_Missile_AGM_02_x1 {
|
||||
ammo = QGVAR(G);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(g_mag_x1);
|
||||
pylonWeapon = QGVAR(G_Launcher);
|
||||
};
|
||||
class GVAR(G_pylonmissile_x2): PylonMissile_Missile_AGM_02_x2 {
|
||||
ammo = QGVAR(G);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(g_mag_x2);
|
||||
pylonWeapon = QGVAR(G_Launcher);
|
||||
};
|
||||
|
||||
class GVAR(G_pylonRack_1Rnd): PylonRack_1Rnd_Missile_AGM_02_F {
|
||||
ammo = QGVAR(G);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(g_mag_x1);
|
||||
pylonWeapon = QGVAR(G_Launcher);
|
||||
};
|
||||
class GVAR(G_PylonRack_3Rnd): PylonRack_3Rnd_Missile_AGM_02_F {
|
||||
ammo = QGVAR(G);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(g_mag_x3);
|
||||
pylonWeapon = QGVAR(G_Launcher);
|
||||
};
|
||||
|
||||
class GVAR(G_PylonRack_x1): PylonRack_Missile_AGM_02_x1 {
|
||||
ammo = QGVAR(G);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(g_mag_x1);
|
||||
pylonWeapon = QGVAR(G_Launcher);
|
||||
};
|
||||
class GVAR(G_PylonRack_x2): PylonRack_Missile_AGM_02_x2 {
|
||||
ammo = QGVAR(G);
|
||||
author = "Dani (TCVM)";
|
||||
displayName = CSTRING(g_mag_x2);
|
||||
pylonWeapon = QGVAR(G_Launcher);
|
||||
};
|
||||
|
||||
// Laser Mavericks
|
||||
class GVAR(L_magazine_x1): magazine_Missile_AGM_02_x1 {
|
||||
ammo = QGVAR(L);
|
||||
author = "xrufix";
|
||||
|
@ -6,22 +6,6 @@ class CfgWeapons {
|
||||
class MissileLauncher: LauncherCore {};
|
||||
class Missile_AGM_02_Plane_CAS_01_F: MissileLauncher {};
|
||||
|
||||
class GVAR(D_Launcher): Missile_AGM_02_Plane_CAS_01_F {
|
||||
author = "Dani (TCVM)";
|
||||
displayname = CSTRING(D);
|
||||
magazines[] = {QGVAR(D_magazine), QGVAR(D_pylonRack_1Rnd), QGVAR(D_pylonRack_3Rnd)};
|
||||
weaponLockDelay = 0.1;
|
||||
weaponLockSystem = 2;
|
||||
};
|
||||
|
||||
class GVAR(G_Launcher): weapon_AGM_65Launcher {
|
||||
author = "Dani (TCVM)";
|
||||
displayname = CSTRING(G);
|
||||
magazines[] = {QGVAR(G_magazine_x1), QGVAR(G_pylonmissile_x1), QGVAR(G_pylonmissile_x2), QGVAR(G_pylonRack_1Rnd), QGVAR(G_PylonRack_3Rnd), QGVAR(G_PylonRack_x1), QGVAR(G_PylonRack_x2)};
|
||||
weaponLockDelay = 0.1;
|
||||
weaponLockSystem = 2;
|
||||
};
|
||||
|
||||
class GVAR(L_Launcher): weapon_AGM_65Launcher {
|
||||
author = "xrufix";
|
||||
displayname = CSTRING(L);
|
||||
|
@ -9,6 +9,10 @@ class CfgPatches {
|
||||
authors[] = {"xrufix"};
|
||||
url = ECSTRING(main,URL);
|
||||
VERSION_CONFIG;
|
||||
ammo[] = {
|
||||
QGVAR(L),
|
||||
"ace_kh25ml"
|
||||
};
|
||||
magazines[] = {
|
||||
QGVAR(L_magazine_x1),
|
||||
QGVAR(L_pylonmissile_x1),
|
||||
|
@ -5,7 +5,7 @@
|
||||
<Key ID="STR_ACE_Maverick_l_mag_descr">
|
||||
<English>AGM-65 Maverick L, Laser Guided Anti-Ground-Missile</English>
|
||||
<German>AGM-65 Maverick L, lasergelenkte Luft-Boden-Rakete</German>
|
||||
<Italian>AGM-65 Maverick L, Missile Aria-Terra Laserguidato</Italian>
|
||||
<Italian>AGM-65 Maverick L, Guida Laser Missile Anti-Terra</Italian>
|
||||
<Japanese>AGM-65 マーベリック L、レーザー誘導対地ミサイル</Japanese>
|
||||
<Chinese>AGM-65"小牛"飛彈L型,雷射導引對地導彈</Chinese>
|
||||
<Chinesesimp>AGM-65"小牛"L型激光制导对地导弹</Chinesesimp>
|
||||
@ -70,14 +70,12 @@
|
||||
<English>MAVL</English>
|
||||
<Spanish>MAVL</Spanish>
|
||||
<French>MAVL</French>
|
||||
<Italian>MAVL</Italian>
|
||||
<Russian>MAVL</Russian>
|
||||
<Polish>MAVL</Polish>
|
||||
<Japanese>MAVL</Japanese>
|
||||
<German>MAVL</German>
|
||||
<Korean>MAVL</Korean>
|
||||
<Chinesesimp>MAVL</Chinesesimp>
|
||||
<Portuguese>MAVL</Portuguese>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Maverick_kh25ml_mag_descr">
|
||||
<English>Kh-25ML, Laser Guided Air-to-Ground-Missile</English>
|
||||
@ -86,7 +84,7 @@
|
||||
<Chinese>Kh-25ML,雷射導引對地導彈</Chinese>
|
||||
<Chinesesimp>Kh-25ML,激光制导空地导弹</Chinesesimp>
|
||||
<Japanese>Kh-25ML、レーザー誘導対地ミサイル</Japanese>
|
||||
<Italian>Kh-25ML, Missile Aria-Terra Laserguidato</Italian>
|
||||
<Italian>Kh-25ML, a Guida Laser Missile Aria-Terra</Italian>
|
||||
<Polish>Kh-25ML, Kierowany laserowo pocisk powietrze-ziemia</Polish>
|
||||
<Russian>Х-25МЛ, ракета Воздух-Земля с лазерным наведением</Russian>
|
||||
<Portuguese>Kh-25ML, Míssil Ar para Chão Guiado a Laser</Portuguese>
|
||||
@ -111,27 +109,6 @@
|
||||
<Turkish>1x Kh-25ML [ACE]</Turkish>
|
||||
<Spanish>1x Kh-25ML [ACE]</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Maverick_d">
|
||||
<English>AGM-65 Maverick D</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Maverick_g">
|
||||
<English>AGM-65 Maverick G</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Maverick_d_mag_x1">
|
||||
<English>AGM-65 Maverick D [ACE]</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Maverick_d_mag_x3">
|
||||
<English>3x AGM-65 Maverick D [ACE]</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Maverick_g_mag_x1">
|
||||
<English>AGM-65 Maverick G [ACE]</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Maverick_g_mag_x2">
|
||||
<English>2x AGM-65 Maverick G [ACE]</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Maverick_g_mag_x3">
|
||||
<English>3x AGM-65 Maverick G [ACE]</English>
|
||||
</Key>
|
||||
</Container>
|
||||
<Container name="weapons">
|
||||
<Key ID="STR_ACE_Maverick_l">
|
||||
|
@ -10,14 +10,12 @@ class CfgAmmo {
|
||||
class ace_missileguidance {
|
||||
enabled = 1;
|
||||
|
||||
pitchRate = 50; // Minium flap deflection for guidance
|
||||
yawRate = 50; // Maximum flap deflection for guidance
|
||||
initialPitch = 2;
|
||||
minDeflection = 0; // Minium flap deflection for guidance
|
||||
maxDeflection = 0.0027; // Maximum flap deflection for guidance
|
||||
incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
|
||||
|
||||
canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
|
||||
|
||||
showTrail = 1;
|
||||
|
||||
// Guidance type for munitions
|
||||
defaultSeekerType = "SACLOS";
|
||||
seekerTypes[] = { "SACLOS" };
|
||||
@ -25,12 +23,6 @@ class CfgAmmo {
|
||||
defaultSeekerLockMode = "LOAL";
|
||||
seekerLockModes[] = { "LOAL", "LOBL" };
|
||||
|
||||
defaultNavigationType = "Line";
|
||||
navigationTypes[] = { "Line" };
|
||||
|
||||
lineGainP = 10;
|
||||
lineGainD = 9;
|
||||
|
||||
seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
|
||||
seekerAngle = 15; // Angle from the shooter's view that can track the missile
|
||||
seekerAccuracy = 1; // seeker accuracy multiplier
|
||||
@ -38,6 +30,7 @@ class CfgAmmo {
|
||||
seekerMinRange = 80;
|
||||
seekerMaxRange = 2000; // Range from the missile which the seeker can visually search
|
||||
|
||||
correctionDistance = 3; // distance from center of crosshair where missile slows down
|
||||
offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
|
||||
|
||||
// Attack profile type selection
|
||||
@ -57,8 +50,9 @@ class CfgAmmo {
|
||||
class ace_missileguidance {
|
||||
enabled = 1;
|
||||
|
||||
pitchRate = 25; // Minium flap deflection for guidance
|
||||
yawRate = 25; // Maximum flap deflection for guidance
|
||||
minDeflection = 0; // Minium flap deflection for guidance
|
||||
maxDeflection = 0.0027; // Maximum flap deflection for guidance
|
||||
incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
|
||||
|
||||
canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
|
||||
|
||||
@ -69,12 +63,6 @@ class CfgAmmo {
|
||||
defaultSeekerLockMode = "LOAL";
|
||||
seekerLockModes[] = { "LOAL", "LOBL" };
|
||||
|
||||
defaultNavigationType = "Line";
|
||||
navigationTypes[] = { "Line" };
|
||||
|
||||
lineGainP = 21;
|
||||
lineGainD = 18;
|
||||
|
||||
seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
|
||||
seekerAngle = 15; // Angle from the shooter's view that can track the missile
|
||||
seekerAccuracy = 1; // seeker accuracy multiplier
|
||||
@ -82,7 +70,7 @@ class CfgAmmo {
|
||||
seekerMinRange = 80;
|
||||
seekerMaxRange = 2000; // Range from the missile which the seeker can visually search
|
||||
|
||||
correctionDistance = 1; // distance from center of crosshair where missile slows down
|
||||
correctionDistance = 3; // distance from center of crosshair where missile slows down
|
||||
offsetFromCrosshair[] = { 0, 0, 0 }; // where the missile wants to stay in relation to the center of the crosshair.
|
||||
|
||||
// Attack profile type selection
|
||||
|
@ -8,7 +8,7 @@ class CfgPatches {
|
||||
requiredVersion = REQUIRED_VERSION;
|
||||
requiredAddons[] = {"ace_missileguidance"};
|
||||
author = ECSTRING(common,ACETeam);
|
||||
authors[] = {"tcvm"};
|
||||
authors[] = {"Dani (TCVM)"};
|
||||
url = ECSTRING(main,URL);
|
||||
VERSION_CONFIG;
|
||||
};
|
||||
|
@ -12,9 +12,3 @@ class EGVAR(missileguidance,SeekerTypes) {
|
||||
functionName = QFUNC(seeker);
|
||||
};
|
||||
};
|
||||
class EGVAR(missileguidance,NavigationTypes) {
|
||||
class GVAR(PLOS) {
|
||||
functionName = QFUNC(navigation);
|
||||
onFired = QFUNC(navigation_onFired);
|
||||
};
|
||||
};
|
||||
|
@ -6,8 +6,9 @@ class CfgAmmo {
|
||||
class ace_missileguidance {
|
||||
enabled = 1;
|
||||
|
||||
pitchRate = 5; // Minium flap deflection for guidance
|
||||
yawRate = 10; // Maximum flap deflection for guidance
|
||||
minDeflection = 0.0005; // Minium flap deflection for guidance
|
||||
maxDeflection = 0.01; // Maximum flap deflection for guidance
|
||||
incDeflection = 0.0005; // The incrmeent in which deflection adjusts.
|
||||
|
||||
canVanillaLock = 0; // Can this default vanilla lock? Only applicable to non-cadet mode
|
||||
|
||||
@ -18,9 +19,6 @@ class CfgAmmo {
|
||||
defaultSeekerLockMode = "LOBL";
|
||||
seekerLockModes[] = {"LOBL"};
|
||||
|
||||
defaultNavigationType = QGVAR(PLOS);
|
||||
navigationTypes[] = { QGVAR(PLOS) };
|
||||
|
||||
seekLastTargetPos = 0; // seek last target position [if seeker loses LOS of target, continue to last known pos]
|
||||
seekerAngle = 45; // Angle in front of the missile which can be searched
|
||||
seekerAccuracy = 1; // seeker accuracy multiplier
|
||||
|
@ -4,5 +4,3 @@ PREP(attackProfile);
|
||||
PREP(keyDown);
|
||||
PREP(onFired);
|
||||
PREP(seeker);
|
||||
PREP(navigation);
|
||||
PREP(navigation_onFired);
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* NLAW missile guidance attack profile.
|
||||
@ -18,13 +18,14 @@
|
||||
*/
|
||||
|
||||
params ["_seekerTargetPos", "_args", "_attackProfileStateParams"];
|
||||
|
||||
#ifdef DRAW_NLAW_INFO
|
||||
_args params ["_firedEH", "_launchParams"];
|
||||
_launchParams params ["","_targetLaunchParams", "", "_attackProfile"];
|
||||
_targetLaunchParams params ["", "", "_launchPos"];
|
||||
_firedEH params ["","","","","","","_projectile"];
|
||||
|
||||
// Use seeker (if terminal)
|
||||
if (_seekerTargetPos isNotEqualTo [0,0,0]) exitWith {_seekerTargetPos};
|
||||
|
||||
_attackProfileStateParams params ["_startTime", "_startLOS", "_yawChange", "_pitchChange"];
|
||||
(_startLOS call CBA_fnc_vect2Polar) params ["", "_yaw", "_pitch"];
|
||||
|
||||
@ -35,6 +36,14 @@ private _flightTime = CBA_missionTime - _startTime;
|
||||
private _realYaw = _yaw + _yawChange * _flightTime;
|
||||
private _realPitch = _pitch + _pitchChange * _flightTime;
|
||||
|
||||
private _returnTargetPos = _launchPos vectorAdd ([_distanceFromLaunch, _realYaw, _realPitch] call CBA_fnc_polar2vect);
|
||||
|
||||
if (_attackProfile == QGVAR(overflyTopAttack)) then { // Add 2m height in OTA attack mode
|
||||
_returnTargetPos = _returnTargetPos vectorAdd [0,0,2];
|
||||
};
|
||||
|
||||
|
||||
#ifdef DRAW_NLAW_INFO
|
||||
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,1,1], ASLtoAGL _launchPos, 0.75, 0.75, 0, "LAUNCH", 1, 0.025, "TahomaB"];
|
||||
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [0,1,1,1], ASLtoAGL (_launchPos vectorAdd (_startLOS vectorMultiply (_distanceFromLaunch + 50))), 0.75, 0.75, 0, "Original LOS", 1, 0.025, "TahomaB"];
|
||||
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,1,0,1], ASLtoAGL (_launchPos vectorAdd ([_distanceFromLaunch + 50, _realYaw, _realPitch] call CBA_fnc_polar2vect)), 0.75, 0.75, 0, format ["Predicted @%1sec",(floor(_flightTime * 10)/10)], 1, 0.025, "TahomaB"];
|
||||
@ -47,4 +56,5 @@ if ((count _test) > 0) then {
|
||||
};
|
||||
#endif
|
||||
|
||||
[0, 0, 1]
|
||||
// TRACE_1("Adjusted target position", _returnTargetPos);
|
||||
_returnTargetPos;
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Handles the track key being held down.
|
||||
@ -74,7 +74,7 @@ playSound "ACE_Sound_Click";
|
||||
_args set [1, _yaw];
|
||||
_args set [2, _pitch];
|
||||
|
||||
#ifdef DRAW_NLAW_INFO
|
||||
#ifdef DEBUG_MODE_FULL
|
||||
hintSilent format ["Instantaneous\nYaw: %1\n Pitch: %2\nGVAR\nYaw: %3\nPitch: %4", _yawChange, _pitchChange, GVAR(yawChange), GVAR(pitchChange)];
|
||||
#endif
|
||||
}, .25, [CBA_missionTime, _yaw, _pitch, true]] call CBA_fnc_addPerFrameHandler;
|
||||
|
@ -1,79 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: tcvm
|
||||
* Attempts to hold angle as fed to by seeker. Does so with a simple proportional controller
|
||||
*
|
||||
* Arguments:
|
||||
* Guidance Arg Array <ARRAY>
|
||||
*
|
||||
* Return Value:
|
||||
* Commanded acceleration normal to LOS in world space <ARRAY>
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_missileguidance_fnc_navigationType_line
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
// arbitrary constant
|
||||
#define PROPORTIONALITY_CONSTANT 20
|
||||
params ["_args", "_timestep", "_seekerTargetPos", "_profileAdjustedTargetPos", "_targetData", "_navigationParams"];
|
||||
_args params ["_firedEH"];
|
||||
_firedEH params ["","","","","","","_projectile"];
|
||||
|
||||
_navigationParams params ["_yawChange", "_pitchChange", "_lastPitch", "_lastYaw", "_initialPitch", "_pitchUp", "_lastYawRateDifference"];
|
||||
|
||||
// for some reason we need to multiply this. I don't know why, but it just works
|
||||
_pitchChange = _pitchChange * 1.5;
|
||||
_yawChange = _yawChange * 1.5;
|
||||
|
||||
((velocity _projectile) call CBA_fnc_vect2polar) params ["", "_currentYaw", "_currentPitch"];
|
||||
|
||||
private _pitchRate = if (_timestep == 0) then {
|
||||
0
|
||||
} else {
|
||||
(_currentPitch - _lastPitch) / _timestep
|
||||
};
|
||||
_navigationParams set [2, _currentPitch];
|
||||
|
||||
private _pitchModifier = if (_pitchChange == 0) then {
|
||||
1
|
||||
} else {
|
||||
abs (_pitchRate / _pitchChange)
|
||||
};
|
||||
private _desiredPitchChange = (_pitchChange - _pitchRate) * PROPORTIONALITY_CONSTANT * _pitchModifier;
|
||||
_desiredPitchChange = _desiredPitchChange + _pitchUp * (_initialPitch - _currentPitch) * PROPORTIONALITY_CONSTANT * _pitchModifier;
|
||||
|
||||
private _yawRate = if (_timestep == 0) then {
|
||||
0
|
||||
} else {
|
||||
(_currentYaw - _lastYaw) / _timestep
|
||||
};
|
||||
_navigationParams set [3, _currentYaw];
|
||||
|
||||
private _yawModifier = if (_yawChange == 0) then {
|
||||
1
|
||||
} else {
|
||||
abs (_yawRate / _yawChange)
|
||||
};
|
||||
|
||||
private _yawRateDifference = _yawChange - _yawRate;
|
||||
private _yawChangeDerivative = if (_timestep == 0) then {
|
||||
0
|
||||
} else {
|
||||
(_yawRateDifference - _lastYawRateDifference) / _timestep
|
||||
};
|
||||
_navigationParams set [6, _yawRateDifference];
|
||||
|
||||
private _desiredYawChange = _yawRateDifference * PROPORTIONALITY_CONSTANT + _yawRateDifference * 2;
|
||||
systemChat str [_yawChange, _yawRate];
|
||||
|
||||
#ifdef DRAW_NLAW_INFO
|
||||
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,1,1], ASLtoAGL getPosASLVisual _projectile, 0.75, 0.75, 0, format ["dP [%1] dY: [%2]", _desiredPitchChange, _desiredYawChange], 1, 0.025, "TahomaB"];
|
||||
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,1,1], [0, 0, 1] vectorAdd ASLtoAGL getPosASLVisual _projectile, 0.75, 0.75, 0, format ["pitch proportional [%1] yaw proportional [%2]", _pitchModifier, _yawModifier], 1, 0.025, "TahomaB"];
|
||||
#endif
|
||||
|
||||
TRACE_4("nlaw pitch/yaw info",_currentPitch,_lastPitch,_currentYaw,_lastYaw);
|
||||
TRACE_6("nlaw navigation",_yawChange,_desiredYawChange,_pitchChange,_desiredPitchChange,_yawRate,_pitchRate);
|
||||
|
||||
_projectile vectorModelToWorldVisual [_yawChange + _desiredYawChange, 0, _pitchChange + _desiredPitchChange]
|
||||
|
@ -1,70 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Sets up missile guidance state arrays (called from missileGuidance's onFired).
|
||||
*
|
||||
* Arguments:
|
||||
* Guidance Arg Array <ARRAY>
|
||||
*
|
||||
* Return Value:
|
||||
* Navigation Parameters <ARRAY>
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_nlaw_fnc_onFired
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_stateParams"];
|
||||
_firedEH params ["_shooter","","","","","","_projectile"];
|
||||
_launchParams params ["","_targetLaunchParams","","_attackProfile"];
|
||||
_targetLaunchParams params ["_target"];
|
||||
_stateParams params ["", "", "", "", "_navigationParams"];
|
||||
|
||||
// Reset _launchPos origin as projectile's height instead of player's foot
|
||||
_targetLaunchParams set [2, getPosASL _projectile];
|
||||
|
||||
// Get state params:
|
||||
TRACE_3("start of attack profile",_attackProfile,_shooter,vectorDir _projectile);
|
||||
|
||||
private _firedLOS = _shooter weaponDirection (currentWeapon _shooter);
|
||||
private _yawChange = 0;
|
||||
private _pitchChange = 0;
|
||||
|
||||
if (_shooter == ACE_player) then {
|
||||
TRACE_2("isPlayer",GVAR(yawChange),GVAR(pitchChange));
|
||||
_yawChange = GVAR(yawChange);
|
||||
_pitchChange = GVAR(pitchChange);
|
||||
TRACE_1("los check",_firedLOS call CBA_fnc_vect2Polar);
|
||||
} else {
|
||||
if ((!isNil "_target") && {!isNull _target}) then {
|
||||
_firedLOS = (getPosASL _projectile) vectorFromTo (aimPos _target);
|
||||
(((eyePos _shooter) vectorFromTo (aimPos _target)) call CBA_fnc_vect2Polar) params ["", "_startYaw", "_startPitch"];
|
||||
// Add some random error to AI's velocity prediction:
|
||||
private _random = random [(_shooter skillFinal "aimingAccuracy") min 0.9, 1, 2-((_shooter skillFinal "aimingAccuracy") min 0.9)];
|
||||
(((eyePos _shooter) vectorFromTo ((aimPos _target) vectorAdd ((velocity _target) vectorMultiply (_random)))) call CBA_fnc_vect2Polar) params ["", "_predictedYaw", "_predictedPitch"];
|
||||
_yawChange = ([_predictedYaw - _startYaw] call CBA_fnc_simplifyAngle180);
|
||||
_pitchChange = ([_predictedPitch - _startPitch] call CBA_fnc_simplifyAngle180);
|
||||
TRACE_1("AI",_target);
|
||||
} else {
|
||||
TRACE_1("AI - no target",_target);
|
||||
};
|
||||
};
|
||||
|
||||
// Limit Max Deflection
|
||||
//_yawChange = -10 max _yawChange min 10;
|
||||
//_pitchChange = -10 max _pitchChange min 10;
|
||||
|
||||
((velocity _projectile) call CBA_fnc_vect2polar) params ["", "_currentYaw", "_currentPitch"];
|
||||
((ACE_player weaponDirection (currentWeapon ACE_player)) call CBA_fnc_vect2Polar) params ["", "_yaw", "_pitch"];
|
||||
|
||||
TRACE_5("attackProfileStateParams",_firedLOS,_yawChange,_pitchChange,_currentPitch,_currentYaw);
|
||||
_navigationParams set [0, _yawChange];
|
||||
_navigationParams set [1, _pitchChange];
|
||||
_navigationParams set [2, _currentPitch]; // last pitch
|
||||
_navigationParams set [3, _currentYaw]; // last yaw
|
||||
_navigationParams set [4, _pitch]; // initial pitch
|
||||
_navigationParams set [5, 0]; // whether or not to zero out the pitch
|
||||
_navigationParams set [6, 0];
|
||||
_navigationParams
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Sets up missile guidance state arrays (called from missileGuidance's onFired).
|
||||
@ -19,7 +19,7 @@ params ["_firedEH", "_launchParams", "_flightParams", "_seekerParams", "_statePa
|
||||
_firedEH params ["_shooter","","","","","","_projectile"];
|
||||
_launchParams params ["","_targetLaunchParams","","_attackProfile"];
|
||||
_targetLaunchParams params ["_target"];
|
||||
_stateParams params ["", "_seekerStateParams", "_attackProfileStateParams"];
|
||||
_stateParams params ["", "", "_attackProfileStateParams"];
|
||||
|
||||
// Reset _launchPos origin as projectile's height instead of player's foot
|
||||
_targetLaunchParams set [2, getPosASL _projectile];
|
||||
@ -27,7 +27,7 @@ _targetLaunchParams set [2, getPosASL _projectile];
|
||||
// Get state params:
|
||||
TRACE_3("start of attack profile",_attackProfile,_shooter,vectorDir _projectile);
|
||||
|
||||
private _firedLOS = vectorDir _projectile;
|
||||
private _firedLOS = _shooter weaponDirection (currentWeapon _shooter);
|
||||
private _yawChange = 0;
|
||||
private _pitchChange = 0;
|
||||
|
||||
@ -55,10 +55,6 @@ if (_shooter == ACE_player) then {
|
||||
_yawChange = -10 max _yawChange min 10;
|
||||
_pitchChange = -10 max _pitchChange min 10;
|
||||
|
||||
_seekerStateParams set [2, _yawChange];
|
||||
_seekerStateParams set [3, _pitchChange];
|
||||
_seekerStateParams set [4, CBA_missionTime]
|
||||
|
||||
TRACE_3("attackProfileStateParams",_firedLOS,_yawChange,_pitchChange);
|
||||
_attackProfileStateParams set [0, CBA_missionTime];
|
||||
_attackProfileStateParams set [1, _firedLOS];
|
||||
|
@ -1,4 +1,4 @@
|
||||
#include "..\script_component.hpp"
|
||||
#include "script_component.hpp"
|
||||
/*
|
||||
* Author: PabstMirror
|
||||
* Handles the top down attack seeker for missile guidance.
|
||||
@ -16,27 +16,14 @@
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#define PITCH_UP_TIME 1
|
||||
|
||||
params ["", "_args", "_seekerStateParams", "", "", "_targetData"];
|
||||
params ["", "_args", "_seekerStateParams"];
|
||||
_args params ["_firedEH", "_launchParams", "", "_seekerParams", "_stateParams"];
|
||||
_firedEH params ["","","","","","","_projectile"];
|
||||
_launchParams params ["", "_targetLaunchParams", "", "_attackProfile"];
|
||||
_targetLaunchParams params ["", "", "_launchPos"];
|
||||
_stateParams params ["", "", "", "", "_navigationParams"];
|
||||
|
||||
if (_attackProfile == QGVAR(directAttack)) exitWith {
|
||||
_navigationParams set [5, 1];
|
||||
[0,0,0]
|
||||
};
|
||||
|
||||
_seekerStateParams params ["", "", "", "_originalPitchRate", "_startTime"];
|
||||
_navigationParams params ["", "_pitchRate"];
|
||||
|
||||
// pitch up for the first second of flight to begin an over-fly trajectory
|
||||
private _pitchChange = linearConversion [0, PITCH_UP_TIME, CBA_missionTime - _startTime, 2, 0, true];
|
||||
_navigationParams set [1, _originalPitchRate + _pitchChange];
|
||||
_navigationParams set [5, ((CBA_missionTime - _startTime) min PITCH_UP_TIME) / PITCH_UP_TIME];
|
||||
if (_attackProfile == QGVAR(directAttack)) exitWith {[0,0,0]};
|
||||
|
||||
private _projPos = getPosASL _projectile;
|
||||
|
||||
|
1
addons/nlaw/functions/script_component.hpp
Normal file
1
addons/nlaw/functions/script_component.hpp
Normal file
@ -0,0 +1 @@
|
||||
#include "\z\ace\addons\nlaw\script_component.hpp"
|
@ -4,8 +4,8 @@
|
||||
<Key ID="STR_ACE_NLAW_trackTarget">
|
||||
<English>NLAW Track Target (Hold)</English>
|
||||
<German>NLAW Zielverfolgung</German>
|
||||
<Italian>NLAW Traccia Bersaglio (Tieni Premuto)</Italian>
|
||||
<Japanese>NLAW 目標追跡 (ホールド)</Japanese>
|
||||
<Italian>NLAW Traccia Bersaglio (Mantieni)</Italian>
|
||||
<Japanese>NALW 目標の追跡 (押しっぱ)</Japanese>
|
||||
<Chinesesimp>NLAW 追踪目标(按住)</Chinesesimp>
|
||||
<Chinese>次世代輕型反坦克導彈發射器追蹤目標 (按住)</Chinese>
|
||||
<Polish>Śledzenie Celu NLAW (Przytrzymaj)</Polish>
|
||||
@ -25,7 +25,7 @@
|
||||
<Chinesesimp>直射模式</Chinesesimp>
|
||||
<Chinese>直射模式</Chinese>
|
||||
<Polish>Bezpośredni atak</Polish>
|
||||
<Korean>직사 타격</Korean>
|
||||
<Korean>직선 공격</Korean>
|
||||
<Russian>Прямая атака</Russian>
|
||||
<Portuguese>Ataque Direto</Portuguese>
|
||||
<French>Attaque directe</French>
|
||||
@ -41,7 +41,7 @@
|
||||
<Chinesesimp>飞越攻顶模式</Chinesesimp>
|
||||
<Chinese>攻頂模式</Chinese>
|
||||
<Polish>Atak z góry</Polish>
|
||||
<Korean>상부 타격</Korean>
|
||||
<Korean>탑어택</Korean>
|
||||
<Russian>Атака сверху</Russian>
|
||||
<Portuguese>Ataque por cima</Portuguese>
|
||||
<French>Attaque par le haut</French>
|
||||
|
Reference in New Issue
Block a user