revert old weapons, pt1

This commit is contained in:
Bailey Danyluk
2024-05-27 17:40:24 -06:00
parent f75f3d3e97
commit cbcc642bf8
73 changed files with 920 additions and 1694 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,6 @@
#include "..\script_component.hpp"
#include "script_component.hpp"
/*
* Author: tcvm
* Author: Dani (TCVM)
* Runs when Dragon is fired
*
* Arguments:

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,4 +2,3 @@ LOG("prep");
PREP(attackProfile);
PREP(getAttackProfileSettings);
PREP(setupVehicle);
PREP(midCourseTransition);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

@ -0,0 +1,2 @@
z\ace\addons\hot

141
addons/hot/CfgAmmo.hpp Normal file
View 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
View 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};
};
};

View 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
View 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
View File

@ -0,0 +1,4 @@
ace_hot
===================
Adds HOT1/2/3 Missiles

View File

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

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

View File

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

View File

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

View File

@ -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 {
//???
// };
};

View File

@ -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[] = {};
};
};

View File

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

View File

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

View File

@ -1,4 +0,0 @@
ace_javelin
===============
Adds the Javelin AT launcher.

View File

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

View File

@ -1,5 +0,0 @@
PREP(getTarget);
PREP(mapHelperDraw);
PREP(onOpticDraw);
PREP(showFireMode);

View File

@ -1,6 +0,0 @@
// #define DEBUG_MODE_FULL
#include "script_component.hpp"
if (!hasInterface) exitWith {};
#include "initKeybinds.inc.sqf"

View File

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

View File

@ -1,3 +0,0 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"

Binary file not shown.

Binary file not shown.

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,5 +4,3 @@ PREP(attackProfile);
PREP(keyDown);
PREP(onFired);
PREP(seeker);
PREP(navigation);
PREP(navigation_onFired);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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