mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Merge branch 'master' into tabCleanup
Conflicts: addons/explosives/functions/fnc_addClacker.sqf addons/explosives/functions/fnc_detonateExplosive.sqf addons/explosives/functions/fnc_getPlacedExplosives.sqf addons/explosives/functions/fnc_openDetonateUI.sqf addons/explosives/functions/fnc_openPlaceUI.sqf addons/explosives/functions/fnc_openTransmitterUI.sqf addons/explosives/functions/fnc_openTriggerSelectionUI.sqf addons/explosives/functions/fnc_placeExplosive.sqf addons/explosives/functions/fnc_place_Approve.sqf addons/explosives/functions/fnc_setPosition.sqf
This commit is contained in:
commit
765ae4ee64
BIN
ace_fcs.dll
BIN
ace_fcs.dll
Binary file not shown.
@ -1,5 +1,19 @@
|
||||
|
||||
class CfgAmmo {
|
||||
class BulletBase;
|
||||
class B_20mm;
|
||||
|
||||
class ACE_20mm_HEDP : B_20mm {
|
||||
hit = 80;
|
||||
indirectHit = 12;
|
||||
indirectHitRange = 2; //2;
|
||||
caliber = 1.4;
|
||||
tracerStartTime = 0.02;
|
||||
timeToLive = 40;
|
||||
explosive = 1.8;
|
||||
};
|
||||
|
||||
|
||||
// adjust minigun caliber and deflection to other ammo
|
||||
class SubmunitionBullet;
|
||||
class B_65x39_Minigun_Caseless: SubmunitionBullet {
|
||||
@ -13,7 +27,6 @@ class CfgAmmo {
|
||||
};
|
||||
|
||||
// also adjust tracer, "muh lightshow"; also adjust splash damage radius
|
||||
class BulletBase;
|
||||
class Gatling_30mm_HE_Plane_CAS_01_F: BulletBase {
|
||||
hit = 80;
|
||||
indirectHit = 12;
|
||||
@ -22,6 +35,7 @@ class CfgAmmo {
|
||||
deflecting = 3;
|
||||
fuseDistance = 3;
|
||||
tracerStartTime = 0.02;
|
||||
timeToLive = 40;
|
||||
};
|
||||
|
||||
// helper projectiles to simulate a rof > fps
|
||||
|
@ -10,6 +10,7 @@ class CfgMagazines {
|
||||
// an extended magazine for the comanche
|
||||
class 300Rnd_20mm_shells;
|
||||
class ACE_500Rnd_20mm_shells_Comanche: 300Rnd_20mm_shells {
|
||||
ammo = "ACE_20mm_HEDP";
|
||||
count = 500;
|
||||
};
|
||||
};
|
||||
|
@ -54,24 +54,24 @@ class CfgWeapons {
|
||||
|
||||
class manual: manual {
|
||||
reloadTime = 0.04;
|
||||
dispersion = 0.0022;
|
||||
dispersion = 0.006;
|
||||
displayName = "$STR_ACE_Aircraft_gatling_20mm_Name";
|
||||
};
|
||||
class close: close {
|
||||
reloadTime = 0.04;
|
||||
dispersion = 0.0022;
|
||||
dispersion = 0.006;
|
||||
};
|
||||
class short: short {
|
||||
reloadTime = 0.04;
|
||||
dispersion = 0.0022;
|
||||
dispersion = 0.006;
|
||||
};
|
||||
class medium: medium {
|
||||
reloadTime = 0.04;
|
||||
dispersion = 0.0022;
|
||||
dispersion = 0.006;
|
||||
};
|
||||
class far: far {
|
||||
reloadTime = 0.04;
|
||||
dispersion = 0.0022;
|
||||
dispersion = 0.006;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -863,12 +863,21 @@ class Heli_Attack_01_base_F: Helicopter_Base_F {
|
||||
|
||||
class Turrets: Turrets {
|
||||
class MainTurret: MainTurret {
|
||||
directionStabilized = 1;
|
||||
horizontallyStabilized = 1;
|
||||
|
||||
weapons[] = {"ACE_gatling_20mm_Comanche","missiles_DAGR","missiles_ASRAAM", "ACE_AIR_SAFETY"};
|
||||
magazines[] = {"ACE_500Rnd_20mm_shells_Comanche","4Rnd_AAA_missiles","24Rnd_PG_missiles"};
|
||||
|
||||
outGunnerMayFire = 1;
|
||||
commanding = -1;
|
||||
primaryGunner = 1;
|
||||
gunnerOpticsModel = "";
|
||||
gunnerOpticsEffect[] = {"TankCommanderOptics1"};
|
||||
gunnerForceOptics = 0;
|
||||
turretInfoType = "Rsc_ACE_Helo_UI_Turret";
|
||||
showAllTargets = 2;
|
||||
discretedistance[] = {100,200,300,400,500,600,700,800,900,1000,1100,1200,1300,1400,1500,1600,1700,1800,1900,2000,2100,2200,2300,2400,2500,2600,2700,2800,2900,3000};
|
||||
discretedistanceinitindex = 3;
|
||||
copilotHasFlares = 1;
|
||||
directionStabilized = 1;
|
||||
isCopilot = 1;
|
||||
showHMD = 1;
|
||||
CanEject = 1;
|
||||
@ -882,25 +891,6 @@ class Heli_Attack_01_base_F: Helicopter_Base_F {
|
||||
|
||||
class OpticsIn
|
||||
{
|
||||
class WideNGS
|
||||
{
|
||||
opticsDisplayName = "W";
|
||||
initAngleX = 0;
|
||||
minAngleX = -35;
|
||||
maxAngleX = 10;
|
||||
initAngleY = 0;
|
||||
minAngleY = -100;
|
||||
maxAngleY = 100;
|
||||
initFov = 0.466;
|
||||
minFov = 0.466;
|
||||
maxFov = 0.466;
|
||||
visionMode[] = {"Normal","Ti"};
|
||||
thermalMode[] = {0,1};
|
||||
gunnerOpticsColor[] = {0.15,1,0.15,1};
|
||||
gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_03_w_F.p3d";
|
||||
directionStabilized = 0;
|
||||
opticsPPEffects[] = {"OpticsCHAbera2","OpticsBlur2"};
|
||||
};
|
||||
class Wide
|
||||
{
|
||||
opticsDisplayName = "W";
|
||||
@ -913,54 +903,47 @@ class Heli_Attack_01_base_F: Helicopter_Base_F {
|
||||
initFov = 0.466;
|
||||
minFov = 0.466;
|
||||
maxFov = 0.466;
|
||||
visionMode[] = {"Normal","Ti"};
|
||||
visionMode[] = {"Normal","NVG","Ti"};
|
||||
thermalMode[] = {0,1};
|
||||
gunnerOpticsColor[] = {0.15,1,0.15,1};
|
||||
gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_w_F.p3d";
|
||||
directionStabilized = 1;
|
||||
opticsPPEffects[] = {"OpticsCHAbera2","OpticsBlur2"};
|
||||
gunnerOpticsEffect[] = {"TankCommanderOptics1"};
|
||||
};
|
||||
class WideL: Wide
|
||||
{
|
||||
opticsDisplayName = "WL";
|
||||
initFov = 0.2;
|
||||
minFov = 0.2;
|
||||
maxFov = 0.2;
|
||||
gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_m_F.p3d";
|
||||
gunnerOpticsColor[] = {0,0,0,1};
|
||||
directionStabilized = 1;
|
||||
opticsPPEffects[] = {"OpticsCHAbera2","OpticsBlur2"};
|
||||
horizontallyStabilized = 1;
|
||||
gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_wide_F";
|
||||
};
|
||||
class Medium: Wide
|
||||
{
|
||||
opticsDisplayName = "M";
|
||||
initFov = 0.1;
|
||||
minFov = 0.1;
|
||||
maxFov = 0.1;
|
||||
directionStabilized = 1;
|
||||
initFov = 0.093;
|
||||
minFov = 0.093;
|
||||
maxFov = 0.093;
|
||||
gunnerOpticsColor[] = {0,0,0,1};
|
||||
gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_m_F.p3d";
|
||||
directionStabilized = 1;
|
||||
horizontallyStabilized = 1;
|
||||
gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_medium_F";
|
||||
};
|
||||
class Narrow: Wide
|
||||
{
|
||||
opticsDisplayName = "N";
|
||||
initFov = 0.029;
|
||||
minFov = 0.029;
|
||||
maxFov = 0.029;
|
||||
gunnerOpticsColor[] = {0,0,0,1};
|
||||
gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_n_F.p3d";
|
||||
directionStabilized = 1;
|
||||
initFov = 0.02;
|
||||
minFov = 0.02;
|
||||
maxFov = 0.02;
|
||||
horizontallyStabilized = 1;
|
||||
gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_narrow_F";
|
||||
|
||||
};
|
||||
class Narrower: Wide
|
||||
{
|
||||
opticsDisplayName = "N";
|
||||
gunnerOpticsColor[] = {0,0,0,1};
|
||||
gunnerOpticsModel = "A3\Weapons_F\Reticle\Optics_Gunner_MBT_02_n_F.p3d";
|
||||
directionStabilized = 1;
|
||||
opticsDisplayName = "Z";
|
||||
initFov = 0.01;
|
||||
minFov = 0.01;
|
||||
maxFov = 0.01;
|
||||
gunnerOpticsColor[] = {0,0,0,1};
|
||||
directionStabilized = 1;
|
||||
horizontallyStabilized = 1;
|
||||
gunnerOpticsModel = "\A3\Weapons_F_Beta\Reticle\Heli_Attack_01_Optics_Gunner_narrow_F";
|
||||
|
||||
};
|
||||
};
|
||||
class OpticsOut
|
||||
@ -976,8 +959,7 @@ class Heli_Attack_01_base_F: Helicopter_Base_F {
|
||||
initFov = 1.1;
|
||||
minFov = 0.133;
|
||||
maxFov = 1.1;
|
||||
visionMode[] = {"Normal","NVG","Ti"};
|
||||
thermalMode[] = {2,3};
|
||||
visionMode[] = {"Normal","NVG"};
|
||||
gunnerOpticsModel = "";
|
||||
gunnerOpticsEffect[] = {};
|
||||
hideUnitInfo = 1;
|
||||
|
@ -3,7 +3,7 @@ ace_aircraft
|
||||
|
||||
Changes to air weaponry, flightmodels and HUDs.
|
||||
|
||||
* Contributations by Kimi for HUD updates
|
||||
* Contributations by Kimi (geraldbolso1899) for HUD updates
|
||||
|
||||
## Maintainers
|
||||
|
||||
|
@ -8,13 +8,16 @@ class RscOpticsValue;
|
||||
class VScrollbar;
|
||||
class HScrollbar;
|
||||
class RscLadderPicture;
|
||||
class RscControlsGroupNoScrollbars;
|
||||
|
||||
|
||||
class RscInGameUI
|
||||
{
|
||||
class RscUnitInfo;
|
||||
class Rsc_ACE_Helo_UI_Turret: RscUnitInfo
|
||||
{
|
||||
idd = 300;
|
||||
controls[] = {"CA_Zeroing","CA_IGUI_elements_group","CA_VehicleToggles"};
|
||||
controls[] = {"CA_IGUI_elements_group","CA_VehicleToggles"};
|
||||
class VScrollbar;
|
||||
class HScrollbar;
|
||||
class CA_IGUI_elements_group: RscControlsGroup
|
||||
|
@ -73,6 +73,7 @@ PREP(getStringFromMissionSQM);
|
||||
PREP(getTargetAzimuthAndInclination);
|
||||
PREP(getTargetDistance);
|
||||
PREP(getTargetObject);
|
||||
PREP(getTurnedOnLights);
|
||||
PREP(getTurretCommander);
|
||||
PREP(getTurretConfigPath);
|
||||
PREP(getTurretCopilot);
|
||||
@ -111,6 +112,7 @@ PREP(isModLoaded);
|
||||
PREP(isPlayer);
|
||||
PREP(isTurnedOut);
|
||||
PREP(letterToCode);
|
||||
PREP(lightIntensityFromObject);
|
||||
PREP(loadPerson);
|
||||
PREP(loadPersonLocal);
|
||||
PREP(loadSettingsFromProfile);
|
||||
@ -122,6 +124,7 @@ PREP(moveToTempGroup);
|
||||
PREP(muteUnit);
|
||||
PREP(numberToDigits);
|
||||
PREP(numberToDigitsString);
|
||||
PREP(numberToString);
|
||||
PREP(onAnswerRequest);
|
||||
PREP(onLoadRscDisplayChannel);
|
||||
PREP(owned);
|
||||
@ -188,6 +191,8 @@ PREP(getConfigGunner);
|
||||
PREP(getConfigCommander);
|
||||
PREP(getHitPoints);
|
||||
PREP(getHitPointsWithSelections);
|
||||
PREP(getReflectorsWithSelections);
|
||||
PREP(getLightProperties);
|
||||
PREP(getVehicleCrew);
|
||||
|
||||
// turrets
|
||||
|
@ -11,4 +11,4 @@
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
sunOrMoon * sunOrMoon * (1 - overcast * 0.25) + (moonIntensity/5 min 1) * (1 - overcast)
|
||||
(sunOrMoon * sunOrMoon * (1 - overcast * 0.25) + (moonIntensity/5) * (1 - overcast)) min 1
|
||||
|
@ -19,40 +19,35 @@ private ["_projectile", "_adjustDir", "_adjustUp", "_adjustSpeed", "_vdir", "_di
|
||||
_projectile = _this select 0;
|
||||
_adjustDir = _this select 1;
|
||||
_adjustUp = _this select 2;
|
||||
_adjustSpeed = _this select 3;
|
||||
|
||||
if (isNil "_adjustSpeed") then {
|
||||
_adjustSpeed = 0;
|
||||
_adjustSpeed = if (count _this > 3) then {
|
||||
_this select 3
|
||||
} else {
|
||||
0
|
||||
};
|
||||
|
||||
["CPD", [_fnc_scriptNameParent, _adjustDir, _adjustUp, _adjustSpeed], nil, false] call FUNC(log);
|
||||
|
||||
// get old direction vector
|
||||
_vdir = vectorDir _projectile;
|
||||
_vdir = vectorNormalized velocity _projectile;
|
||||
|
||||
// get azimuth and inclination and apply corrections
|
||||
_dir = (_vdir select 0) atan2 (_vdir select 1) + _adjustDir;
|
||||
_up = sqrt ((_vdir select 1) ^ 2 + (_vdir select 0) ^ 2) atan2 - (_vdir select 2) + _adjustUp;
|
||||
_up = asin (_vdir select 2) + _adjustUp;
|
||||
|
||||
// get new direction vector (this is a unit vector)
|
||||
_vdir = [
|
||||
sin _dir * sin _up,
|
||||
cos _dir * sin _up,
|
||||
- cos _up
|
||||
sin _dir * cos _up,
|
||||
cos _dir * cos _up,
|
||||
sin _up
|
||||
];
|
||||
|
||||
// get best up vector
|
||||
_l = sqrt ((_vdir select 0) ^ 2 + (_vdir select 1) ^ 2); if (_l == 0) then {diag_log text format ["[ACE] ERROR: %1, %2, %3, %4, %5, %6, %7", _projectile, _adjustDir, _adjustUp, vectorDir _projectile, _vdir, _dir, _up]};
|
||||
_r = -(_vdir select 2) / _l;
|
||||
|
||||
_vup = [
|
||||
(_vdir select 0) * _r,
|
||||
(_vdir select 1) * _r,
|
||||
_l
|
||||
];
|
||||
_vlat = vectorNormalized (_vdir vectorCrossProduct [0,0,1]);
|
||||
_vup = _vlat vectorCrossProduct _vdir;
|
||||
|
||||
// get new speed vector. Keep total speed, but change to new direction. Yay for vector commands.
|
||||
_vel = _vdir vectorMultiply _adjustSpeed + vectorMagnitude velocity _projectile;
|
||||
_vel = _vdir vectorMultiply (_adjustSpeed + vectorMagnitude velocity _projectile);
|
||||
|
||||
// set projectile direction dir and up. Projectiles are long objects, especially with tracers, so it would look dumb otherwise.
|
||||
_projectile setVectorDirAndUp [_vdir, _vup];
|
||||
|
63
addons/common/functions/fnc_getLightProperties.sqf
Normal file
63
addons/common/functions/fnc_getLightProperties.sqf
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Author: commy2
|
||||
* Read properties of given vehicles light.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Object with lights (Object)
|
||||
* 1: Light classname (String)
|
||||
*
|
||||
* Return Value:
|
||||
* Stuff from config (Array)
|
||||
*
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_vehicle", "_light"];
|
||||
|
||||
_vehicle = _this select 0;
|
||||
_light = _this select 1;
|
||||
|
||||
private "_config";
|
||||
_config = configFile >> "CfgVehicles" >> typeOf _vehicle >> "Reflectors" >> _light;
|
||||
|
||||
private ["_intensity", "_position", "_direction", "_innerAngle", "_outerAngle"];
|
||||
|
||||
_intensity = getNumber (_config >> "intensity");
|
||||
_position = getText (_config >> "position");
|
||||
_direction = getText (_config >> "direction");
|
||||
_innerAngle = getNumber (_config >> "innerAngle");
|
||||
_outerAngle = getNumber (_config >> "outerAngle");
|
||||
|
||||
[_intensity, _position, _direction, _innerAngle, _outerAngle]
|
||||
|
||||
/*
|
||||
class Reflectors
|
||||
{
|
||||
class Light_1
|
||||
{
|
||||
color[] = {1000,1000,1100};
|
||||
ambient[] = {10,10,11};
|
||||
intensity = 5;
|
||||
size = 1;
|
||||
innerAngle = 90;
|
||||
outerAngle = 130;
|
||||
coneFadeCoef = 2;
|
||||
position = "Light_1_pos";
|
||||
direction = "Light_1_dir";
|
||||
hitpoint = "Light_1_hitpoint";
|
||||
selection = "Light_1_hide";
|
||||
useFlare = 1;
|
||||
flareSize = 0.9;
|
||||
flareMaxDistance = 85;
|
||||
class Attenuation
|
||||
{
|
||||
start = 0;
|
||||
constant = 0;
|
||||
linear = 0;
|
||||
quadratic = 0.9;
|
||||
hardLimitStart = 40;
|
||||
hardLimitEnd = 60;
|
||||
};
|
||||
};
|
||||
};
|
||||
*/
|
45
addons/common/functions/fnc_getReflectorsWithSelections.sqf
Normal file
45
addons/common/functions/fnc_getReflectorsWithSelections.sqf
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Author: commy2
|
||||
*
|
||||
* Returns all lighting hitpoints of any vehicle.
|
||||
* Note: These are actual selections that are affected by setHit and getHit, not getHitPointDamage or setHitpointDamage.
|
||||
* They behave like having an armor value of 0.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: A vehicle, not the classname (Object)
|
||||
*
|
||||
* Return Value:
|
||||
* The light names and selections (Array)
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_vehicle", "_config", "_hitpoints", "_selections"];
|
||||
|
||||
_vehicle = _this select 0;
|
||||
|
||||
_config = configFile >> "CfgVehicles" >> typeOf _vehicle;
|
||||
|
||||
_hitpoints = [];
|
||||
_selections = [];
|
||||
|
||||
// iterate through all parents
|
||||
while {isClass _config} do {
|
||||
private "_class";
|
||||
_class = _config >> "Reflectors";
|
||||
|
||||
for "_i" from 0 to (count _class - 1) do {
|
||||
private ["_entry", "_selection"];
|
||||
|
||||
_entry = _class select _i;
|
||||
_selection = getText (_entry >> "hitpoint");
|
||||
|
||||
if (!(_selection in _selections) && {!isNil {_vehicle getHit _selection}}) then {
|
||||
_hitpoints pushBack configName _entry;
|
||||
_selections pushBack _selection;
|
||||
};
|
||||
};
|
||||
|
||||
_config = inheritsFrom _config;
|
||||
};
|
||||
|
||||
[_hitPoints, _selections]
|
36
addons/common/functions/fnc_getTurnedOnLights.sqf
Normal file
36
addons/common/functions/fnc_getTurnedOnLights.sqf
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* Author: commy2
|
||||
*
|
||||
* Returns all turned on lights of any vehicle or streetlamp.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: A vehicle, not the classname (Object)
|
||||
*
|
||||
* Return Value:
|
||||
* All burning lights (Array)
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private "_vehicle";
|
||||
|
||||
_vehicle = _this select 0;
|
||||
|
||||
if (!isLightOn _vehicle) exitWith {[]};
|
||||
|
||||
private ["_reflectorsWithSelections", "_lights", "_hitpoints"];
|
||||
|
||||
_reflectorsWithSelections = [_vehicle] call FUNC(getReflectorsWithSelections);
|
||||
|
||||
_lights = _reflectorsWithSelections select 0;
|
||||
_hitpoints = _reflectorsWithSelections select 1;
|
||||
|
||||
private "_turnedOnLights";
|
||||
_turnedOnLights = [];
|
||||
{
|
||||
if (_vehicle getHit _x <= 0.9) then {
|
||||
_turnedOnLights pushBack (_lights select _forEachIndex);
|
||||
};
|
||||
|
||||
} forEach _hitpoints;
|
||||
|
||||
_turnedOnLights
|
56
addons/common/functions/fnc_lightIntensityFromObject.sqf
Normal file
56
addons/common/functions/fnc_lightIntensityFromObject.sqf
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Author: commy2
|
||||
* Calculate light intensity object 1 recieves from object 2
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Object that recieves light (Object)
|
||||
* 1: Object that emits light (Object)
|
||||
*
|
||||
* Return Value:
|
||||
* Brightest light level
|
||||
*
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_unit", "_lightSource"];
|
||||
|
||||
_unit = _this select 0;
|
||||
_lightSource = _this select 1;
|
||||
|
||||
private "_unitPos";
|
||||
_unitPos = _unit modelToWorld (_unit selectionPosition "spine3");
|
||||
|
||||
private ["_lights", "_lightLevel"];
|
||||
|
||||
_lights = [_lightSource] call FUNC(getTurnedOnLights);
|
||||
|
||||
_lightLevel = 0;
|
||||
|
||||
{
|
||||
private ["_properties", "_intensity", "_innerAngle", "_outerAngle", "_position", "_direction", "_directionToUnit", "_distance", "_angle"];
|
||||
|
||||
_properties = [_lightSource, _x] call FUNC(getLightProperties);
|
||||
|
||||
// @todo intensity affects range?
|
||||
//_intensity = _properties select 0;
|
||||
|
||||
_innerAngle = (_properties select 3) / 2;
|
||||
_outerAngle = (_properties select 4) / 2;
|
||||
|
||||
// get world position and direction
|
||||
_position = _lightSource modelToWorld (_lightSource selectionPosition (_properties select 1));
|
||||
_direction = _lightSource modelToWorld (_lightSource selectionPosition (_properties select 2));
|
||||
|
||||
_direction = _position vectorFromTo _direction;
|
||||
_directionToUnit = _position vectorFromTo _unitPos;
|
||||
|
||||
_distance = _unitPos distance _position;
|
||||
_angle = acos (_direction vectorDotProduct _directionToUnit);
|
||||
|
||||
_lightLevel = _lightLevel max ((linearConversion [0, 30, _distance, 1, 0, true]) * (linearConversion [_innerAngle, _outerAngle, _angle, 1, 0, true]));
|
||||
|
||||
//systemChat format ["%1 %2", (linearConversion [0, 30, _distance, 1, 0, true]), (linearConversion [_innerAngle, _outerAngle, _angle, 1, 0, true])];
|
||||
|
||||
} forEach _lights;
|
||||
|
||||
_lightLevel
|
25
addons/common/functions/fnc_numberToString.sqf
Normal file
25
addons/common/functions/fnc_numberToString.sqf
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Author: commy2
|
||||
*
|
||||
* Converts a number to a string without losing as much precission as str or format.
|
||||
*
|
||||
* Argument:
|
||||
* 0: A number (Number)
|
||||
*
|
||||
* Return value:
|
||||
* The number as string (String)
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_number", "_decimals"];
|
||||
|
||||
_number = _this select 0;
|
||||
|
||||
_decimals = str (abs(_number) mod 1);
|
||||
_decimals = toArray _decimals;
|
||||
_decimals deleteAt 0;
|
||||
|
||||
if (_number < 0) exitWith {
|
||||
format ["-%1%2", floor abs(_number), toString _decimals];
|
||||
};
|
||||
format ["%1%2", floor _number, toString _decimals];
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Edited with tabler - 2014-12-16 -->
|
||||
<!-- Edited with tabler - 2015-04-06 -->
|
||||
<Project name="ACE">
|
||||
<Package name="Common">
|
||||
<Key ID="STR_ACE_Common_ACETeam">
|
||||
@ -296,24 +296,24 @@
|
||||
<Hungarian>Nincs hang</Hungarian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_ACTION_ACCEPT_REQUEST_KEY_TITLE">
|
||||
<Original>Accept Requests</Original>
|
||||
<Polish>Akceptuj prośby</Polish>
|
||||
<Spanish>Aceptar Peticiones</Spanish>
|
||||
<English>Accept Requests</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_ACTION_DECLINE_REQUEST_KEY_TITLE">
|
||||
<Original>Decline Requests</Original>
|
||||
<Polish>Ignoruj prośby</Polish>
|
||||
<Spanish>Rechazar Peticiones</Spanish>
|
||||
<English>Decline Requests</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_ACTION_ACCEPT_REQUEST_KEY_TOOLTIP">
|
||||
<Original>Accept Requests send by other players. These can be requests to use / share equipment, perform certain actions.</Original>
|
||||
<Polish>Akceptuj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności.</Polish>
|
||||
<Spanish>Acepta Peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones.</Spanish>
|
||||
<English>Accept Requests send by other players. These can be requests to use / share equipment, perform certain actions.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_ACTION_DECLINE_REQUEST_KEY_TOOLTIP">
|
||||
<Original>Decline Requests send by other players. These can be requests to use / share equipment, perform certain actions.</Original>
|
||||
<Polish>Ignoruj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności.</Polish>
|
||||
<Spanish>Rechazar Peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones.</Spanish>
|
||||
<English>Decline Requests send by other players. These can be requests to use / share equipment, perform certain actions.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Common_SettingFeedbackIconsName">
|
||||
<English>Feedback icons</English>
|
||||
@ -339,7 +339,6 @@
|
||||
<Key ID="STR_ACE_Common_SettingDisplayTextFontColorDesc">
|
||||
<English>The color of the text font from the ACE hints. This color is the default color for all text displayed through the ACE Hint system, if the hint text has no other color specified.</English>
|
||||
</Key>
|
||||
|
||||
<Key ID="STR_ACE_Common_bananaDisplayName">
|
||||
<English>Banana</English>
|
||||
</Key>
|
||||
@ -347,5 +346,4 @@
|
||||
<English>A banana is an edible fruit, botanically a berry, produced by several kinds of large herbaceous flowering plants in the genus Musa.</English>
|
||||
</Key>
|
||||
</Package>
|
||||
|
||||
</Project>
|
@ -1,13 +1,13 @@
|
||||
class CfgACE_Triggers {
|
||||
/* onPlace parameters:
|
||||
0: OBJECT - unit placing
|
||||
1: OBJECT - Placed explosive
|
||||
2: STRING - Magazine classname
|
||||
3: ARRAY - vars
|
||||
Last Index: CfgACE_Triggers config of trigger type.
|
||||
onSetup parameters:
|
||||
0: STRING - Magazine Classname
|
||||
*/
|
||||
/* onPlace parameters:
|
||||
0: OBJECT - unit placing
|
||||
1: OBJECT - Placed explosive
|
||||
2: STRING - Magazine classname
|
||||
3: ARRAY - vars
|
||||
Last Index: CfgACE_Triggers config of trigger type.
|
||||
onSetup parameters:
|
||||
0: STRING - Magazine Classname
|
||||
*/
|
||||
class Command {
|
||||
displayName = $STR_ACE_Explosives_clacker_displayName;
|
||||
picture = PATHTOF(Data\UI\Clacker.paa);
|
||||
|
@ -11,10 +11,10 @@ class Extended_PostInit_EventHandlers {
|
||||
|
||||
/*
|
||||
TODO: Move the addEventHandlers out of PostInit into here or separate eventHandlers,
|
||||
to enable them on all units, so unit switching works for explosives properly.
|
||||
to enable them on all units, so unit switching works for explosives properly.
|
||||
class Extended_Init_EventHandlers {
|
||||
class CAManBase {
|
||||
init = "";
|
||||
}
|
||||
class CAManBase {
|
||||
init = "";
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
@ -1,13 +1,12 @@
|
||||
class CfgVehicles {
|
||||
class Man;
|
||||
|
||||
class CAManBase: Man {
|
||||
class ACE_SelfActions {
|
||||
class ACE_Explosives {
|
||||
displayName = $STR_ACE_Explosives_Menu;
|
||||
condition = QUOTE(!(_player getVariable [ARR_2('ace_explosives_PlantingExplosive',false)]));
|
||||
statement = "";
|
||||
exceptions[] = {"isNotSwimming"};
|
||||
exceptions[] = {"isNotSwimming", "isNotInside"};
|
||||
showDisabled = 1;
|
||||
priority = 4;
|
||||
icon = PATHTOF(UI\Explosives_Menu_ca.paa);
|
||||
@ -16,8 +15,9 @@ class CfgVehicles {
|
||||
class ACE_Detonate {
|
||||
displayName = $STR_ACE_Explosives_Detonate;
|
||||
condition = QUOTE([_player] call FUNC(canDetonate));
|
||||
statement = QUOTE([_player] call FUNC(openTransmitterUI););
|
||||
exceptions[] = {"isNotSwimming"};
|
||||
statement = "";
|
||||
insertChildren = QUOTE([_player] call FUNC(addTransmitterActions););
|
||||
exceptions[] = {"isNotSwimming", "isNotInside"};
|
||||
showDisabled = 1;
|
||||
icon = PATHTOF(UI\Explosives_Menu_ca.paa);
|
||||
priority = 2;
|
||||
@ -26,28 +26,19 @@ class CfgVehicles {
|
||||
class ACE_Place {
|
||||
displayName = $STR_ACE_Explosives_Place;
|
||||
condition = QUOTE((vehicle _player == _player) and {[_player] call FUNC(hasExplosives)});
|
||||
statement = QUOTE([_player] call FUNC(openPlaceUI););
|
||||
statement = "";
|
||||
insertChildren = QUOTE([_player] call FUNC(addExplosiveActions););
|
||||
exceptions[] = {"isNotSwimming"};
|
||||
showDisabled = 1;
|
||||
icon = PATHTOF(UI\Place_Explosive_ca.paa);
|
||||
priority = 1;
|
||||
hotkey = "P";
|
||||
};
|
||||
class ACE_Defuse {
|
||||
displayName = $STR_ACE_Explosives_Defuse;
|
||||
condition = QUOTE([_player] call FUNC(canDefuse));
|
||||
statement = QUOTE([ARR_2(_player,EGVAR(Interaction,Target))] call FUNC(startDefuse););
|
||||
exceptions[] = {"isNotSwimming"};
|
||||
showDisabled = 0;
|
||||
icon = PATHTOF(UI\Defuse_ca.paa);
|
||||
priority = 0.8;
|
||||
hotkey = "F";
|
||||
};
|
||||
class ACE_Cellphone {
|
||||
displayName = $STR_ACE_Explosives_cellphone_displayName;
|
||||
condition = "('ACE_Cellphone' in (items ace_player))";
|
||||
statement = "closeDialog 0;createDialog 'Rsc_ACE_PhoneInterface';";
|
||||
exceptions[] = {"isNotSwimming"};
|
||||
exceptions[] = {"isNotSwimming", "isNotInside"};
|
||||
showDisabled = 0;
|
||||
icon = PATHTOF(Data\UI\Cellphone_UI.paa);
|
||||
priority = 0.8;
|
||||
@ -57,7 +48,38 @@ class CfgVehicles {
|
||||
};
|
||||
|
||||
class Items_base_F;
|
||||
class ACE_DefuseObject: Items_base_F {
|
||||
XEH_ENABLED;
|
||||
author = "ACE";
|
||||
_generalMacro = "ACE_DefuseObject";
|
||||
displayName = "ACE Defuse Helper";
|
||||
mapSize = 0.2;
|
||||
icon = "iconObject_1x2";
|
||||
model = "\A3\Weapons_f\dummyweapon.p3d";
|
||||
scope = 2;
|
||||
scopeCurator = 1;
|
||||
vehicleClass = "Cargo";
|
||||
class ACE_Actions {
|
||||
class ACE_MainActions {
|
||||
selection = "";
|
||||
distance = 5;
|
||||
condition = "true";
|
||||
class ACE_Defuse {
|
||||
displayName = $STR_ACE_Explosives_Defuse;
|
||||
condition = QUOTE([ARR_2(_player,_target)] call FUNC(canDefuse));
|
||||
statement = QUOTE([ARR_2(_player,_target)] call FUNC(startDefuse););
|
||||
exceptions[] = {"isNotSwimming"};
|
||||
showDisabled = 0;
|
||||
icon = PATHTOF(UI\Defuse_ca.paa);
|
||||
priority = 0.8;
|
||||
hotkey = "F";
|
||||
distance = 5;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
class ACE_Explosives_Place: Items_base_F {
|
||||
XEH_ENABLED;
|
||||
author = "ACE";
|
||||
_generalMacro = "ACE_Explosives_Place";
|
||||
displayName = "Multi-meter";
|
||||
@ -68,6 +90,36 @@ class CfgVehicles {
|
||||
scopeCurator = 1;
|
||||
vehicleClass = "Cargo";
|
||||
ACE_offset[] = {0,0,0};
|
||||
class ACE_Actions {
|
||||
class ACE_MainActions {
|
||||
selection = "";
|
||||
distance = 5;
|
||||
condition = "true";
|
||||
class ACE_SetTrigger {
|
||||
selection = "";
|
||||
displayName = "$STR_ACE_Explosives_TriggerMenu";
|
||||
distance = 4;
|
||||
condition = "true";
|
||||
statement = "";
|
||||
insertChildren = QUOTE([ARR_3(_target getVariable QUOTE(QGVAR(class)),_target,_player)] call FUNC(addTriggerActions););
|
||||
showDisabled = 0;
|
||||
exceptions[] = {};
|
||||
priority = 5;
|
||||
icon = QUOTE(PATHTOF(UI\Explosives_Menu_ca.paa));
|
||||
};
|
||||
class ACE_PickUp {
|
||||
selection = "";
|
||||
displayName = "$STR_ACE_Explosives_Pickup";
|
||||
distance = 4;
|
||||
condition = "true";
|
||||
statement = QUOTE([ARR_2(_player,_target getVariable QUOTE(QGVAR(class)))] call EFUNC(common,addToInventory);deleteVehicle _target;);
|
||||
showDisabled = 0;
|
||||
exceptions[] = {};
|
||||
priority = 5;
|
||||
icon = "\A3\ui_f\data\IGUI\Cfg\Actions\Obsolete\ui_action_takemine_ca.paa";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class ACE_Explosives_Place_DemoCharge:ACE_Explosives_Place {
|
||||
|
@ -19,7 +19,11 @@ ADDON = false;
|
||||
|
||||
PREP(addCellphoneIED);
|
||||
PREP(addClacker);
|
||||
PREP(addDetonateActions);
|
||||
PREP(addExplosiveActions);
|
||||
PREP(addToSpeedDial);
|
||||
PREP(addTransmitterActions);
|
||||
PREP(addTriggerActions);
|
||||
PREP(canDefuse);
|
||||
PREP(canDetonate);
|
||||
PREP(defuseExplosive);
|
||||
@ -36,11 +40,9 @@ PREP(getDetonators);
|
||||
PREP(getPlacedExplosives);
|
||||
PREP(getSpeedDialExplosive);
|
||||
|
||||
PREP(openDetonateUI);
|
||||
PREP(openPlaceUI);
|
||||
PREP(openTransmitterUI);
|
||||
PREP(onLanded);
|
||||
|
||||
PREP(openTimerSetUI);
|
||||
PREP(openTriggerSelectionUI);
|
||||
|
||||
PREP(place_Approve);
|
||||
PREP(place_Cancel);
|
||||
|
@ -5,7 +5,7 @@ class CfgPatches {
|
||||
units[] = {};
|
||||
weapons[] = {"ACE_Clacker", "ACE_DefusalKit", "ACE_M26_Clacker", "ACE_DeadManSwitch", "ACE_Cellphone"};
|
||||
requiredVersion = REQUIRED_VERSION;
|
||||
requiredAddons[] = {"ace_common", "ace_interaction"};
|
||||
requiredAddons[] = {"ace_interaction"};
|
||||
author[] = {"Garth 'L-H' de Wet"};
|
||||
authorUrl = "http://garth.snakebiteink.co.za/";
|
||||
VERSION_CONFIG;
|
||||
|
@ -17,10 +17,8 @@
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_unit", "_explosive", "_clacker", "_config", "_magazineClass", "_requiredItems", "_hasRequired"];
|
||||
_unit = _this select 0;
|
||||
_explosive = _this select 1;
|
||||
_magazineClass = _this select 2;
|
||||
private ["_clacker", "_config", "_requiredItems", "_hasRequired"];
|
||||
EXPLODE_3_PVT(_this,_unit,_explosive,_magazineClass);
|
||||
// Config is the last item in the list of passed in items.
|
||||
_config = (_this select 3) select (count (_this select 3) - 1);
|
||||
|
||||
@ -38,7 +36,9 @@ _config = ConfigFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> co
|
||||
|
||||
_clacker = _unit getVariable [QGVAR(Clackers), []];
|
||||
GVAR(PlacedCount) = GVAR(PlacedCount) + 1;
|
||||
|
||||
_clacker pushBack [_explosive, getNumber(_config >> "FuseTime"), format [localize "STR_ACE_Explosives_DetonateCode",
|
||||
GVAR(PlacedCount)], _magazineClass, configName ((_this select 3) select (count (_this select 3) - 1))];
|
||||
|
||||
_unit setVariable [QGVAR(Clackers), _clacker, true];
|
||||
_unit sideChat format [localize "STR_ACE_Explosives_DetonateCode", GVAR(PlacedCount)];
|
||||
|
49
addons/explosives/functions/fnc_addDetonateActions.sqf
Normal file
49
addons/explosives/functions/fnc_addDetonateActions.sqf
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet
|
||||
* Opens the UI for explosive detonation selection
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
* 1: Trigger classname <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [player, "ACE_M26_Clacker"] call ACE_Explosives_fnc_addDetonateActions;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_result", "_item", "_children"];
|
||||
call EFUNC(interaction,hideMenu);
|
||||
EXPLODE_2_PVT(_this,_unit,_detonator);
|
||||
_range = GetNumber (ConfigFile >> "CfgWeapons" >> _detonator >> "ACE_Range");
|
||||
|
||||
_result = [_unit] call FUNC(getPlacedExplosives);
|
||||
_children = [];
|
||||
{
|
||||
if (!isNull(_x select 0)) then {
|
||||
_required = getArray (ConfigFile >> "CfgACE_Triggers" >> (_x select 4) >> "requires");
|
||||
if (_detonator in _required) then {
|
||||
_item = ConfigFile >> "CfgMagazines" >> (_x select 3);
|
||||
|
||||
_children pushBack
|
||||
[
|
||||
[
|
||||
format ["Explosive_%1", _forEachIndex],
|
||||
_x select 2,
|
||||
getText(_item >> "picture"),
|
||||
{(_this select 2) call FUNC(detonateExplosive);},
|
||||
{true},
|
||||
{},
|
||||
[ACE_player,_range,_x]
|
||||
] call EFUNC(interact_menu,createAction),
|
||||
[],
|
||||
ACE_Player
|
||||
];
|
||||
};
|
||||
};
|
||||
} foreach _result;
|
||||
|
||||
_children
|
56
addons/explosives/functions/fnc_addExplosiveActions.sqf
Normal file
56
addons/explosives/functions/fnc_addExplosiveActions.sqf
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet and CAA-Picard
|
||||
*
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Actions
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_mags", "_item", "_index", "_children"];
|
||||
|
||||
EXPLODE_1_PVT(_this,_unit);
|
||||
|
||||
_mags = magazines _unit;
|
||||
_list = [];
|
||||
_itemCount = [];
|
||||
{
|
||||
_item = ConfigFile >> "CfgMagazines" >> _x;
|
||||
if (getNumber(_item >> "ACE_Placeable") == 1) then {
|
||||
_index = _list find _item;
|
||||
if (_index != -1) then {
|
||||
_itemCount set [_index, (_itemCount select _index) + 1];
|
||||
} else {
|
||||
_list pushBack _item;
|
||||
_itemCount pushBack 1;
|
||||
};
|
||||
};
|
||||
} forEach _mags;
|
||||
|
||||
_children = [];
|
||||
|
||||
{
|
||||
private "_name";
|
||||
_name = if(isText(_x >> "displayNameShort") && {getText(_x >> "displayNameShort") != ""}) then
|
||||
{getText (_x >> "displayNameShort")}else{getText(_x >> "displayName")};
|
||||
_children pushBack
|
||||
[
|
||||
[
|
||||
format ["Explosive_%1", _forEachIndex],
|
||||
format [_name + " (%1)", _itemCount select _foreachIndex],
|
||||
getText(_x >> "picture"),
|
||||
{(_this select 2) call FUNC(setupExplosive);},
|
||||
{true},
|
||||
{},
|
||||
[_unit, configName _x]
|
||||
] call EFUNC(interact_menu,createAction),
|
||||
[],
|
||||
_unit
|
||||
];
|
||||
} foreach _list;
|
||||
|
||||
_children
|
39
addons/explosives/functions/fnc_addTransmitterActions.sqf
Normal file
39
addons/explosives/functions/fnc_addTransmitterActions.sqf
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet
|
||||
* Opens the UI for selecting the transmitter
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* Example:
|
||||
* [player] call ACE_Explosives_fnc_addTransmitterActions;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_items", "_unit", "_children", "_config"];
|
||||
_unit = _this select 0;
|
||||
_detonators = [_unit] call FUNC(getDetonators);
|
||||
_children = [];
|
||||
{
|
||||
_config = ConfigFile >> "CfgWeapons" >> _x;
|
||||
_children pushBack
|
||||
[
|
||||
[
|
||||
format ["Trigger_%1", _forEachIndex],
|
||||
getText(_config >> "displayName"),
|
||||
getText(_config >> "picture"),
|
||||
{},
|
||||
{true},
|
||||
{(_this select 2) call FUNC(addDetonateActions);},
|
||||
[ACE_player,_x]
|
||||
] call EFUNC(interact_menu,createAction),
|
||||
[],
|
||||
ACE_Player
|
||||
];
|
||||
} foreach _detonators;
|
||||
|
||||
_children
|
56
addons/explosives/functions/fnc_addTriggerActions.sqf
Normal file
56
addons/explosives/functions/fnc_addTriggerActions.sqf
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet
|
||||
* Opens the UI for explosive trigger selection
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Explosive Magazine <STRING>
|
||||
* 1: Explosive <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [lbData [8866, lbCurSel 8866], _explosive] call ACE_Explosives_fnc_addTriggerActions;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_hasRequiredItems","_triggerTypes", "_children",
|
||||
"_detonators", "_required", "_magTriggers"];
|
||||
EXPLODE_2_PVT(_this,_magazine,_explosive);
|
||||
_detonators = [ACE_player] call FUNC(getDetonators);
|
||||
|
||||
_triggerTypes = [_magazine] call FUNC(triggerType);
|
||||
_magTriggers = ConfigFile >> "CfgMagazines" >> _magazine >> "ACE_Triggers";
|
||||
_children = [];
|
||||
{
|
||||
_required = getArray (_x >> "requires");
|
||||
_hasRequiredItems = true;
|
||||
{
|
||||
if !(_x in _detonators) exitWith {
|
||||
_hasRequiredItems = false;
|
||||
};
|
||||
} count _required;
|
||||
if (_hasRequiredItems) then {
|
||||
_children pushBack
|
||||
[
|
||||
[
|
||||
format ["Trigger_%1", _forEachIndex],
|
||||
if(isText(_magTriggers >> configName _x >> "displayName"))then
|
||||
{getText(_magTriggers >> configName _x >> "displayName")}
|
||||
else{getText(_x >> "displayName")},
|
||||
if(isText(_magTriggers >> configName _x >> "picture"))then
|
||||
{getText(_magTriggers >> configName _x >> "picture")}
|
||||
else{getText(_x >> "picture")},
|
||||
{(_this select 2) call FUNC(selectTrigger);},
|
||||
{true},
|
||||
{},
|
||||
[_explosive, _magazine, configName _x]
|
||||
] call EFUNC(interact_menu,createAction),
|
||||
[],
|
||||
ACE_Player
|
||||
];
|
||||
};
|
||||
} foreach _triggerTypes;
|
||||
|
||||
_children
|
@ -14,25 +14,15 @@
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private "_unit";
|
||||
_unit = _this select 0;
|
||||
private ["_specialist"];
|
||||
EXPLODE_2_PVT(_this,_unit,_target);
|
||||
if (isNull(_target getVariable [QGVAR(Explosive),objNull])) exitWith {
|
||||
deleteVehicle _target;
|
||||
false
|
||||
};
|
||||
if (vehicle _unit != _unit || {!("ACE_DefusalKit" in (items _unit))}) exitWith {false};
|
||||
_isSpecialist = [_unit] call EFUNC(Common,isEOD);
|
||||
|
||||
if (GVAR(RequireSpecialist) && {!_isSpecialist}) exitWith {false};
|
||||
|
||||
_timeBombCore = nearestObject [_unit, "TimeBombCore"];
|
||||
_mineBase = nearestObject [_unit, "MineBase"];
|
||||
|
||||
_distCore = _unit distance _timeBombCore;
|
||||
_distBase = _unit distance _mineBase;
|
||||
_distance = 10;
|
||||
if (_distCore < _distBase) then {
|
||||
_distance = _distCore;
|
||||
EGVAR(interaction,Target) = _timeBombCore;
|
||||
}else{
|
||||
_distance = _distBase;
|
||||
EGVAR(interaction,Target) = _mineBase;
|
||||
};
|
||||
if (isNil "_distance") exitWith {false};
|
||||
_distance < 4
|
||||
true
|
||||
|
@ -15,12 +15,16 @@
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_unit", "_explosive"];
|
||||
_unit = _this select 0;
|
||||
_explosive = _this select 1;
|
||||
EXPLODE_2_PVT(_this,_unit,_explosive);
|
||||
|
||||
if (getNumber (ConfigFile >> "CfgAmmo" >> typeof _explosive >> "ACE_explodeOnDefuse") == 1) exitWith {
|
||||
[_unit, -1, [_explosive, 1], true] call FUNC(detonateExplosive);
|
||||
};
|
||||
|
||||
{
|
||||
detach _x;
|
||||
deleteVehicle _x;
|
||||
false
|
||||
} count (attachedObjects (_explosive));
|
||||
|
||||
_unit action ["Deactivate", _unit, _explosive];
|
||||
|
@ -19,15 +19,19 @@
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_item","_result", "_ignoreRange", "_unit", "_range"];
|
||||
_unit = _this select 0;
|
||||
_range = _this select 1;
|
||||
_item = _this select 2;
|
||||
private ["_result", "_ignoreRange", "_helper"];
|
||||
EXPLODE_3_PVT(_this,_unit,_range,_item);
|
||||
_ignoreRange = (_range == -1);
|
||||
_result = true;
|
||||
|
||||
if (!_ignoreRange && {(_unit distance (_item select 0)) > _range}) exitWith {false};
|
||||
|
||||
_helper = (attachedTo (_item select 0));
|
||||
if (!isNull(_helper)) then {
|
||||
detach (_item select 0);
|
||||
deleteVehicle _helper;
|
||||
};
|
||||
|
||||
if (getNumber (ConfigFile >> "CfgAmmo" >> typeof (_item select 0) >> "TriggerWhenDestroyed") == 0) then {
|
||||
private ["_exp", "_previousExp"];
|
||||
_previousExp = _item select 0;
|
||||
|
@ -27,7 +27,7 @@ _adjustedList = false;
|
||||
_clackerList = _unit getVariable [QGVAR(Clackers), []];
|
||||
_list = [];
|
||||
{
|
||||
if isNull (_x select 0) then {
|
||||
if (isNull (_x select 0)) then {
|
||||
_clackerList set [_foreachIndex, "X"];
|
||||
_adjustedList = true;
|
||||
} else {
|
||||
|
@ -14,7 +14,6 @@
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_obj"];
|
||||
if (isNull(GVAR(Setup)) || {ACE_Modifier == 0} || !GVAR(pfeh_running)) exitWith {false};
|
||||
_this = _this * 5;
|
||||
GVAR(Setup) setDir ((getDir GVAR(Setup)) + _this);
|
||||
|
@ -20,7 +20,9 @@ _activated = _this select 2;
|
||||
|
||||
if !(_activated) exitWith {};
|
||||
|
||||
[_logic, QGVAR(RequireSpecialist), "RequireSpecialist" ] call EFUNC(Common,readSettingFromModule);
|
||||
[_logic, QGVAR(PunishNonSpecialists), "PunishNonSpecialists" ] call EFUNC(Common,readSettingFromModule);
|
||||
[_logic, QGVAR(RequireSpecialist), "RequireSpecialist"]
|
||||
call EFUNC(Common,readSettingFromModule);
|
||||
[_logic, QGVAR(PunishNonSpecialists),"PunishNonSpecialists"]
|
||||
call EFUNC(Common,readSettingFromModule);
|
||||
|
||||
diag_log text "[ACE]: Explosive Module Initialized.";
|
||||
|
39
addons/explosives/functions/fnc_onLanded.sqf
Normal file
39
addons/explosives/functions/fnc_onLanded.sqf
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet
|
||||
*
|
||||
* Arguments:
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* object addEventHandler ["EpeContactStart", ACE_explosive_fnc_onLanded];
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
EXPLODE_2_PVT(_this,_explosive,_hitTarget);
|
||||
|
||||
if ((_explosive getVariable [QGVAR(Handled), false])) exitWith {};
|
||||
|
||||
_explosive setVariable [QGVAR(Handled), true];
|
||||
if (!isNull _hitTarget && {_hitTarget isKindOf "AllVehicles"}) then {
|
||||
_explosive attachTo [_hitTarget];
|
||||
private "_dir";
|
||||
_dir = _setup getVariable [QGVAR(Direction), 0];
|
||||
_dir = _dir - (getDir _hitTarget);
|
||||
[[_explosive, _dir, 0], QFUNC(setPosition)] call EFUNC(common,execRemoteFnc);
|
||||
} else {
|
||||
[{
|
||||
EXPLODE_2_PVT(_this,_player,_explosive);
|
||||
private "_pos";
|
||||
_player setVariable [QGVAR(PlantingExplosive), false];
|
||||
if (surfaceIsWater _pos) then {
|
||||
_pos = getPosASL _explosive;
|
||||
_explosive setPosASL _pos;
|
||||
}else{
|
||||
_pos = getPosATL _explosive;
|
||||
_explosive setPosATL _pos;
|
||||
};
|
||||
}, [ACE_player, _explosive], 0.5, 0.1] call EFUNC(common,waitAndExecute);
|
||||
};
|
@ -1,61 +0,0 @@
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet
|
||||
* Opens the UI for explosive detonation selection
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
* 1: Trigger classname <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [player, "ACE_M26_Clacker"] call ACE_Explosives_fnc_openDetonateUI;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_unit","_result", "_item"];
|
||||
call EFUNC(interaction,hideMenu);
|
||||
_unit = _this select 0;
|
||||
_detonator = _this select 1;
|
||||
_range = GetNumber (ConfigFile >> "CfgWeapons" >> _detonator >> "ACE_Range");
|
||||
|
||||
_result = [_unit] call FUNC(getPlacedExplosives);
|
||||
_actions = [localize "STR_ACE_Explosives_DetonateMenu", localize "STR_ACE_Explosives_Detonate"]
|
||||
call EFUNC(interaction,prepareSelectMenu);
|
||||
_count = 0;
|
||||
{
|
||||
if (!isNull(_x select 0)) then {
|
||||
_required = getArray (ConfigFile >> "CfgACE_Triggers" >> (_x select 4) >> "requires");
|
||||
if (_detonator in _required) then {
|
||||
_item = ConfigFile >> "CfgMagazines" >> (_x select 3);
|
||||
_actions = [
|
||||
_actions,
|
||||
_x select 2,
|
||||
getText(_item >> "picture"),
|
||||
[_foreachIndex, _range]
|
||||
] call EFUNC(interaction,AddSelectableItem);
|
||||
_count = _count + 1;
|
||||
};
|
||||
};
|
||||
} foreach _result;
|
||||
if (_count > 0) then {
|
||||
[
|
||||
_actions,
|
||||
{
|
||||
[
|
||||
ACE_player,
|
||||
[_this select 1] call EFUNC(common,toNumber),
|
||||
(ACE_player getVariable [QGVAR(Clackers), []]) select ([_this select 0] call EFUNC(common,toNumber)),
|
||||
false
|
||||
] call FUNC(detonateExplosive);
|
||||
call EFUNC(interaction,hideMenu);
|
||||
},
|
||||
{[ACE_player] call FUNC(openTransmitterUI);}
|
||||
] call EFUNC(interaction,openSelectMenu);
|
||||
}else{
|
||||
call EFUNC(interaction,hideMenu);
|
||||
[ACE_player] call FUNC(openTransmitterUI);
|
||||
[localize "STR_ACE_Explosives_NoExplosivesAvailable"] call EFUNC(common,displayTextStructured);
|
||||
};
|
@ -1,55 +0,0 @@
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet
|
||||
* Opens the UI for explosive placement selection
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [player] call ACE_Explosives_fnc_openPlaceUI;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_unit","_mags", "_item", "_index", "_actions"];
|
||||
_unit = _this select 0;
|
||||
call FUNC(place_Cancel);
|
||||
|
||||
_mags = magazines _unit;
|
||||
_list = [];
|
||||
_itemCount = [];
|
||||
{
|
||||
_item = ConfigFile >> "CfgMagazines" >> _x;
|
||||
if (getNumber(_item >> "ACE_Placeable") == 1) then {
|
||||
_index = _list find _item;
|
||||
if (_index != -1) then {
|
||||
_itemCount set [_index, (_itemCount select _index) + 1];
|
||||
} else {
|
||||
_list pushBack _item;
|
||||
_itemCount pushBack 1;
|
||||
};
|
||||
};
|
||||
} forEach _mags;
|
||||
_actions = [localize "STR_ACE_Explosives_PlaceMenu", localize "STR_ACE_Explosives_Place"]
|
||||
call EFUNC(interaction,prepareSelectMenu);
|
||||
{
|
||||
_actions = [
|
||||
_actions,
|
||||
format [getText(_x >> "displayName") + " (%1)", _itemCount select _foreachIndex],
|
||||
getText(_x >> "picture"),
|
||||
configName _x
|
||||
] call EFUNC(interaction,AddSelectableItem);
|
||||
} foreach _list;
|
||||
|
||||
[
|
||||
_actions,
|
||||
{
|
||||
[_this] call FUNC(openTriggerSelectionUI);
|
||||
},
|
||||
{
|
||||
call EFUNC(interaction,hideMenu);
|
||||
}
|
||||
] call EFUNC(interaction,openSelectMenu);
|
@ -3,24 +3,39 @@
|
||||
* Opens the UI for timer setting of an explosive
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Magazine <STRING>
|
||||
* 0: Explosive <OBJECT>
|
||||
* 1: Magazine <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* ["SatchelCharge_Remote_Mag"] call ACE_Explosives_fnc_openTimerSetUI;
|
||||
* [_explosive, "SatchelCharge_Remote_Mag"] call ACE_Explosives_fnc_openTimerSetUI;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_mag"];
|
||||
_mag = _this select 0;
|
||||
EXPLODE_2_PVT(_this,_explosive,_mag);
|
||||
createDialog "RscACE_SelectTimeUI";
|
||||
sliderSetRange [8845, 5, 900]; // 5seconds - 15minutes
|
||||
sliderSetPosition [8845, 30];
|
||||
|
||||
buttonSetAction [8860, format[QUOTE([ARR_4(ACE_player,'%1','Timer',floor sliderPosition 8845)] call FUNC(setupExplosive);closeDialog 0;), _mag]];
|
||||
buttonSetAction [8855, format[QUOTE(['%1'] call FUNC(openTriggerSelectionUI);), _mag]];
|
||||
GVAR(explosive) = _explosive;
|
||||
|
||||
DFUNC(SetTimer) = {
|
||||
[
|
||||
ACE_player,
|
||||
getPosATL GVAR(explosive),
|
||||
GVAR(explosive) getVariable QGVAR(Direction),
|
||||
GVAR(explosive) getVariable QGVAR(class),
|
||||
"Timer",
|
||||
[floor sliderPosition 8845],
|
||||
GVAR(explosive)
|
||||
] call FUNC(placeExplosive);
|
||||
closeDialog 0;
|
||||
};
|
||||
|
||||
buttonSetAction [8860, QUOTE(call DFUNC(SetTimer);)];
|
||||
buttonSetAction [8855, QUOTE(closeDialog 0;)];
|
||||
|
||||
ctrlSetText [8870, format[localize "STR_ACE_Explosives_TimerMenu",0, 30]];
|
||||
|
@ -1,48 +0,0 @@
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet
|
||||
* Opens the UI for selecting the transmitter
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* Example:
|
||||
* [player] call ACE_Explosives_fnc_openTransmitterUI;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_items", "_unit", "_count", "_actions", "_config"];
|
||||
_unit = _this select 0;
|
||||
_items = (items _unit);
|
||||
|
||||
_actions = [localize "STR_ACE_Explosives_TriggerMenu", localize "STR_ACE_Explosives_SelectTrigger"]
|
||||
call EFUNC(interaction,prepareSelectMenu);
|
||||
_detonators = [_unit] call FUNC(getDetonators);
|
||||
{
|
||||
_config = ConfigFile >> "CfgWeapons" >> _x;
|
||||
_actions = [
|
||||
_actions,
|
||||
getText(_config >> "displayName"),
|
||||
getText(_config >> "picture"),
|
||||
_x
|
||||
] call EFUNC(interaction,addSelectableItem);
|
||||
} count _detonators;
|
||||
|
||||
if (count _detonators == 0) then {
|
||||
call EFUNC(interaction,hideMenu);
|
||||
"ACE_Explosives" call EFUNC(interaction,openMenuSelf);
|
||||
[format[localize "STR_ACE_Explosives_NoTriggersAvailable", "player"]] call EFUNC(Common,displayTextStructured);
|
||||
}else{
|
||||
[
|
||||
_actions,
|
||||
{
|
||||
[ACE_player, _this] call FUNC(openDetonateUI);
|
||||
},
|
||||
{
|
||||
call EFUNC(interaction,hideMenu);
|
||||
}
|
||||
] call EFUNC(interaction,openSelectMenu);
|
||||
};
|
@ -1,57 +0,0 @@
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet
|
||||
* Opens the UI for explosive trigger selection
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Explosive Magazine <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [lbData [8866, lbCurSel 8866]] call ACE_Explosives_fnc_openTriggerSelectionUI;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_magazine", "_hasRequiredItems","_triggerTypes", "_actions", "_detonators", "_required", "_magTriggers"];
|
||||
_magazine = _this select 0;
|
||||
_detonators = [ACE_player] call FUNC(getDetonators);
|
||||
|
||||
_triggerTypes = [_magazine] call FUNC(triggerType);
|
||||
_magTriggers = ConfigFile >> "CfgMagazines" >> _magazine >> "ACE_Triggers";
|
||||
_actions = [localize "STR_ACE_Explosives_TriggerMenu", localize "STR_ACE_Explosives_SelectTrigger"]
|
||||
call EFUNC(interaction,prepareSelectMenu);
|
||||
_count = 0;
|
||||
{
|
||||
_required = getArray (_x >> "requires");
|
||||
_hasRequiredItems = true;
|
||||
{
|
||||
if !(_x in _detonators) exitWith {
|
||||
_hasRequiredItems = false;
|
||||
};
|
||||
} count _required;
|
||||
if (_hasRequiredItems) then {
|
||||
_actions = [
|
||||
_actions,
|
||||
if(isText(_magTriggers >> configName _x >> "displayName"))then{getText(_magTriggers >> configName _x >> "displayName")}else{getText(_x >> "displayName")},
|
||||
if(isText(_magTriggers >> configName _x >> "picture"))then{getText(_magTriggers >> configName _x >> "picture")}else{getText(_x >> "picture")},
|
||||
[configName _x, _magazine]
|
||||
] call EFUNC(interaction,addSelectableItem);
|
||||
_count = _count + 1;
|
||||
};
|
||||
} count _triggerTypes;
|
||||
|
||||
if (_count == 0) then {
|
||||
[ACE_player] call FUNC(openPlaceUI);
|
||||
[format[localize "STR_ACE_Explosives_NoTriggersAvailable",
|
||||
getText(configFile >> "CfgMagazines" >> _magazine >> "DisplayName")]] call EFUNC(Common,displayTextStructured);
|
||||
}else{
|
||||
[
|
||||
_actions,
|
||||
{
|
||||
[_this select 1, _this select 0] call FUNC(selectTrigger);
|
||||
},
|
||||
{[ACE_player] call FUNC(openPlaceUI);}
|
||||
] call EFUNC(interaction,openSelectMenu);
|
||||
};
|
@ -7,9 +7,9 @@
|
||||
* 1: Position to place explosive <POSITION>
|
||||
* 2: Rotation <NUMBER>
|
||||
* 3: Magazine class <STRING>
|
||||
* 4: Config of trigger <CONFIG>
|
||||
* 4: Config of trigger <STRING>
|
||||
* 5: Variables required for the trigger type <ARRAY>
|
||||
* 6: Should direction be set <BOOL>
|
||||
* 6: Explosive placeholder <OBJECT> <OPTIONAL>
|
||||
*
|
||||
* Return Value:
|
||||
* Placed explosive <OBJECT>
|
||||
@ -21,16 +21,10 @@
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_pos", "_dir", "_magazineClass", "_ammo", "_triggerSpecificVars", "_unit", "_triggerConfig", "_explosive"];
|
||||
_unit = _this select 0;
|
||||
_pos = _this select 1;
|
||||
_dir = _this select 2;
|
||||
_magazineClass = _this select 3;
|
||||
_triggerConfig = _this select 4;
|
||||
_triggerSpecificVars = _this select 5;
|
||||
_setDir = true;
|
||||
private ["_ammo", "_explosive"];
|
||||
EXPLODE_6_PVT(_this,_unit,_pos,_dir,_magazineClass,_triggerConfig,_triggerSpecificVars);
|
||||
if (count _this > 6) then {
|
||||
_setDir = _this select 6;
|
||||
deleteVehicle (_this select 6);
|
||||
};
|
||||
|
||||
if (isNil "_triggerConfig") exitWith {
|
||||
@ -51,11 +45,19 @@ if (isText(_magazineTrigger >> "ammo")) then {
|
||||
_ammo = getText (_magazineTrigger >> "ammo");
|
||||
};
|
||||
_triggerSpecificVars pushBack _triggerConfig;
|
||||
private ["_defuseHelper"];
|
||||
_defuseHelper = createVehicle ["ACE_DefuseObject", _pos, [], 0, "NONE"];
|
||||
_defuseHelper setPosATL _pos;
|
||||
|
||||
_explosive = createVehicle [_ammo, _pos, [], 0, "NONE"];
|
||||
_defuseHelper attachTo [_explosive, [0,0,0], ""];
|
||||
_defuseHelper setVariable [QGVAR(Explosive),_explosive,true];
|
||||
|
||||
_expPos = getPosATL _explosive;
|
||||
_defuseHelper setPosATL (((getPosATL _defuseHelper) vectorAdd (_pos vectorDiff _expPos)));
|
||||
_explosive setPosATL _pos;
|
||||
|
||||
if (isText(_triggerConfig >> "onPlace") && {[_unit,_explosive,_magazineClass,_triggerSpecificVars]
|
||||
call compile (getText (_triggerConfig >> "onPlace"))}) exitWith {_explosive};
|
||||
if (_setDir) then {
|
||||
[[_explosive, _dir, getNumber (_magazineTrigger >> "pitch")], QFUNC(setPosition)]
|
||||
call EFUNC(common,execRemoteFnc);
|
||||
};
|
||||
[[_explosive, _dir, getNumber (_magazineTrigger >> "pitch")], QFUNC(setPosition)] call EFUNC(common,execRemoteFnc);
|
||||
_explosive
|
||||
|
@ -23,10 +23,10 @@ private ["_mag", "_setup", "_player"];
|
||||
_setup = GVAR(Setup);
|
||||
GVAR(Setup) = objNull;
|
||||
[GVAR(placer), "ACE_Explosives", false] call EFUNC(Common,setForceWalkStatus);
|
||||
[ACE_player, "DefaultAction", ACE_player getVariable [QGVAR(Place), -1]] call EFUNC(Common,removeActionEventHandler);
|
||||
[ACE_player, "MenuBack", ACE_player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler);
|
||||
GVAR(placer) = objNull;
|
||||
_player = ACE_player;
|
||||
[_player, "DefaultAction", _player getVariable [QGVAR(Place), -1]] call EFUNC(Common,removeActionEventHandler);
|
||||
[_player, "MenuBack", _player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler);
|
||||
call EFUNC(interaction,hideMouseHint);
|
||||
if ((_setup getVariable [QGVAR(Class), ""]) == "") exitWith {
|
||||
deleteVehicle _setup;
|
||||
@ -39,67 +39,7 @@ if (_dir > 180) then {
|
||||
};
|
||||
_setup setVariable [QGVAR(Direction), _dir];
|
||||
_player setVariable [QGVAR(PlantingExplosive), true];
|
||||
_setup addEventHandler ["EpeContactStart", {
|
||||
if (!((_this select 0) getVariable [QGVAR(Handled), false])) then {
|
||||
private ["_player", "_pos", "_attachTo"];
|
||||
_player = ACE_player;
|
||||
_player setVariable [QGVAR(PlantingExplosive), false];
|
||||
_pos = getPosATL (_this select 0);
|
||||
(_this select 0) enableSimulationGlobal false;
|
||||
if (surfaceIsWater _pos) then {
|
||||
_pos = getPosASL (_this select 0);
|
||||
(_this select 0) setPosASL _pos;
|
||||
}else{
|
||||
(_this select 0) setPosATL _pos;
|
||||
};
|
||||
(_this select 0) setVariable [QGVAR(Handled), true];
|
||||
_attachTo = objNull;
|
||||
if (!isNull (_this select 1) && {(_this select 1) isKindOf "AllVehicles"}) then {
|
||||
_attachTo = (_this select 1);
|
||||
};
|
||||
[(_this select 0),_attachTo, _pos] spawn { // TODO: Change to scheduled delay execution
|
||||
private ["_mag", "_setup", "_dir", "_player"];
|
||||
_setup = _this select 0;
|
||||
_player = ACE_player;
|
||||
_mag = _setup getVariable [QGVAR(Class), ""];
|
||||
_dir = _setup getVariable [QGVAR(Direction), 0];
|
||||
|
||||
sleep getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime");
|
||||
_explosive = [_player, _this select 2, _dir, _mag, _setup getVariable QGVAR(Trigger),
|
||||
[_setup getVariable QGVAR(Timer)], isNull (_this select 1)] call FUNC(placeExplosive);
|
||||
deleteVehicle _setup;
|
||||
if (!isNull(_explosive)) then {
|
||||
_player RemoveMagazine _mag;
|
||||
if (!isNull (_this select 1)) then {
|
||||
_explosive attachTo [(_this select 1)];
|
||||
_dir = _dir - (getDir (_this select 1));
|
||||
[[_explosive, _dir, 0], QFUNC(setPosition)] call EFUNC(common,execRemoteFnc);
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}];
|
||||
_setup addEventHandler ["EpeContactStart", FUNC(onLanded)];
|
||||
_setup enableSimulationGlobal true;
|
||||
_player playActionNow "MedicOther";
|
||||
[_setup] spawn { // TODO: Change to scheduled delay execution
|
||||
private ["_setup", "_player"];
|
||||
_setup = _this select 0;
|
||||
_player = ACE_player;
|
||||
sleep 5;
|
||||
_player setVariable [QGVAR(PlantingExplosive), false];
|
||||
if (!isNull _setup) then {
|
||||
private ["_mag", "_dir", "_delayTime"];
|
||||
_mag = _setup getVariable [QGVAR(Class), ""];
|
||||
_dir = _setup getVariable [QGVAR(Direction), 0];
|
||||
_delayTime = (getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime")) - 5;
|
||||
if (_delayTime > 0) then {
|
||||
sleep _delayTime;
|
||||
};
|
||||
if (!isNull _setup) then {
|
||||
[_player, GetPosATL _setup, _dir, _mag, _setup getVariable QGVAR(Trigger),
|
||||
[_setup getVariable QGVAR(Timer)], true] call FUNC(placeExplosive);
|
||||
deleteVehicle _setup;
|
||||
_player RemoveMagazine _mag;
|
||||
};
|
||||
};
|
||||
};
|
||||
_player removeMagazine (_setup getVariable [QGVAR(Class), ""]);
|
||||
|
@ -29,4 +29,4 @@ if (isNil {GVAR(placer)}) then {
|
||||
GVAR(placer) = objNull;
|
||||
call EFUNC(interaction,hideMouseHint);
|
||||
[ACE_player, "DefaultAction", ACE_player getVariable [QGVAR(Place), -1]] call EFUNC(Common,removeActionEventHandler);
|
||||
[ACE_player, "MenuBack", ACE_player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler);
|
||||
[ACE_player, "zoomtemp", ACE_player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler);
|
||||
|
@ -3,26 +3,26 @@
|
||||
* Selects a trigger for an explosive.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Magazine <STRING>
|
||||
* 1: Trigger mode <STRING>
|
||||
* 0: Explosive <OBJECT>
|
||||
* 1: Magazine <STRING>
|
||||
* 2: Trigger mode <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* ["SatchelCharge_Remote_Mag","Timer"] call ACE_Explosives_fnc_selectTrigger;
|
||||
* [_explosive, "SatchelCharge_Remote_Mag","Timer"] call ACE_Explosives_fnc_selectTrigger;
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_magazine","_trigger"];
|
||||
private ["_config"];
|
||||
closeDialog 0;
|
||||
_magazine = _this select 0;
|
||||
_trigger = _this select 1;
|
||||
_config = ConfigFile >> "CfgACE_Triggers" >> _trigger;
|
||||
call EFUNC(interaction,hideMenu);
|
||||
EXPLODE_3_PVT(_this,_explosive,_magazine,_trigger);
|
||||
_config = ConfigFile >> "CfgACE_Triggers" >> _trigger;
|
||||
|
||||
// If the onSetup function returns true, it is handled elsewhere
|
||||
if (isText(_config >> "onSetup") && {[_magazine] call compile getText (_config >> "onSetup")}) exitWith {};
|
||||
if (isText(_config >> "onSetup") && {[_explosive,_magazine] call compile getText (_config >> "onSetup")}) exitWith {};
|
||||
|
||||
[ACE_player, _magazine, _trigger] call FUNC(setupExplosive);
|
||||
[ACE_player, getPosATL _explosive, _explosive getVariable [QGVAR(Direction), 0],_magazine, _trigger, [], _explosive] call ACE_Explosives_fnc_placeExplosive;
|
||||
|
@ -16,10 +16,8 @@
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private "_ex";
|
||||
_ex = _this select 0;
|
||||
_ex setDir (_this select 1);
|
||||
if ((_this select 2) != 0) then {
|
||||
[_ex, _this select 2, 0] call CALLSTACK(BIS_fnc_setPitchBank);
|
||||
EXPLODE_3_PVT(_this,_explosive,_direction,_pitch);
|
||||
_explosive setDir _direction;
|
||||
if (_pitch != 0) then {
|
||||
[_explosive, _pitch, 0] call CALLSTACK(BIS_fnc_setPitchBank);
|
||||
};
|
||||
//_ex setVectorUp (surfaceNormal _pos);
|
||||
|
@ -5,43 +5,28 @@
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
* 1: Classname of explosive to place. (CfgMagazine class) <STRING>
|
||||
* 2: Trigger Config <CONFIG>
|
||||
* 3: Timer (optional) <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [player, "SatchelCharge_Remote_Mag", "Command"] call ACE_Explosives_fnc_SetupExplosive;
|
||||
* [player, "SatchelCharge_Remote_Mag"] call ACE_Explosives_fnc_SetupExplosive;
|
||||
*
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_unit", "_class", "_config", "_timer"];
|
||||
_unit = _this select 0;
|
||||
_class = _this select 1;
|
||||
_config = _this select 2;
|
||||
_timer = _this select 3;
|
||||
closeDialog 0;
|
||||
EXPLODE_2_PVT(_this,_unit,_class);
|
||||
GVAR(placer) = _unit;
|
||||
// Commented out due to the fact there is a distinction between who can deactivate mines and who can plant them in standard configs.
|
||||
// Would require custom config entries (ACE_ExplosiveSpecialist/ACE_Specialist) which excludes custom mods.
|
||||
//if (ACE_Explosives_RequireSpecialist && {!([_unit] call ACE_Core_fnc_isEOD)}) exitWith {};
|
||||
if (isNil "_config") then {
|
||||
_config = getArray(ConfigFile >> "CfgMagazines" >> _class >> "ACE_Triggers" >> "SupportedTriggers") select 0;
|
||||
};
|
||||
|
||||
GVAR(Setup) = getText(ConfigFile >> "CfgMagazines" >> _class >> "ACE_SetupObject") createVehicleLocal [0,0,-10000];
|
||||
// TODO: check MP performance and MP compatible.
|
||||
GVAR(Setup) = createVehicle [getText(ConfigFile >> "CfgMagazines" >> _class >> "ACE_SetupObject"),[0,0,-10000],[], 0, "NONE"];
|
||||
|
||||
GVAR(Setup) enableSimulationGlobal false;
|
||||
GVAR(Setup) setVariable [QGVAR(Class), _class];
|
||||
GVAR(Setup) setVariable [QGVAR(Trigger), _config];
|
||||
//GVAR(Setup) setVariable [QGVAR(Offset), GetArray(ConfigFile >> "CfgVehicles" >> typeof GVAR(Setup) >> "ACE_Offset")];
|
||||
if (!isNil "_timer") then {
|
||||
GVAR(Setup) setVariable [QGVAR(Timer), _timer];
|
||||
};
|
||||
GVAR(Setup) setVariable [QGVAR(class), _class, true];
|
||||
|
||||
[_unit, "ACE_Explosives", true] call EFUNC(common,setForceWalkStatus);
|
||||
GVAR(TweakedAngle) = 180;
|
||||
|
||||
[QGVAR(Placement),"OnEachFrame", {
|
||||
private "_player";
|
||||
_player = ACE_player;
|
||||
@ -50,15 +35,15 @@ GVAR(TweakedAngle) = 180;
|
||||
};
|
||||
GVAR(pfeh_running) = true;
|
||||
_pos = (ASLtoATL eyePos _player) vectorAdd (positionCameraToWorld [0,0,1] vectorDiff positionCameraToWorld [0,0,0]);
|
||||
//_pos = _pos vectorAdd ((VectorDir GVAR(Setup)) vectorCrossProduct (GVAR(Setup) getVariable [QGVAR(Offset), [0,0,0]]));
|
||||
GVAR(Setup) setPosATL _pos;
|
||||
if (ACE_Modifier == 0) then {
|
||||
GVAR(Setup) setDir (GVAR(TweakedAngle) + getDir _player);
|
||||
};
|
||||
}] call CALLSTACK(BIS_fnc_addStackedEventHandler);
|
||||
|
||||
[localize "STR_ACE_Explosives_PlaceAction", localize "STR_ACE_Explosives_CancelAction",
|
||||
localize "STR_ACE_Explosives_ScrollAction"] call EFUNC(interaction,showMouseHint);
|
||||
_unit setVariable [QGVAR(Place), [_unit, "DefaultAction",
|
||||
{GVAR(pfeh_running) AND !isNull (GVAR(Setup))}, {call FUNC(place_Approve);}] call EFUNC(common,AddActionEventHandler)];
|
||||
_unit setVariable [QGVAR(Cancel), [_unit, "MenuBack",
|
||||
_unit setVariable [QGVAR(Cancel), [_unit, "zoomtemp",
|
||||
{GVAR(pfeh_running) AND !isNull (GVAR(Setup))}, {call FUNC(place_Cancel);}] call EFUNC(common,AddActionEventHandler)];
|
||||
|
@ -15,18 +15,17 @@
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private ["_unit","_target"];
|
||||
_unit = _this select 0;
|
||||
_target = _this select 1;
|
||||
EXPLODE_2_PVT(_this,_unit,_target);
|
||||
_target = attachedTo (_target);
|
||||
|
||||
_fnc_DefuseTime = {
|
||||
_target = _this select 1;
|
||||
EXPLODE_2_PVT(_this,_specialist,_target);
|
||||
|
||||
_defuseTime = 5;
|
||||
if (isNumber(ConfigFile >> "CfgAmmo" >> typeOf (_target) >> "ACE_DefuseTime")) then {
|
||||
_defuseTime = getNumber(ConfigFile >> "CfgAmmo" >> typeOf (_target) >> "ACE_DefuseTime");
|
||||
};
|
||||
if (!(_this select 0) && {GVAR(PunishNonSpecialists)}) then {
|
||||
if (!_specialist && {GVAR(PunishNonSpecialists)}) then {
|
||||
_defuseTime = _defuseTime * 1.5;
|
||||
};
|
||||
_defuseTime
|
||||
|
@ -21,6 +21,6 @@ EXPLODE_2_PVT(_this,_explosive,_delay);
|
||||
[{
|
||||
_explosive = _this;
|
||||
if (!isNull _explosive) then {
|
||||
[_explosive, -1, [_explosive, 0], true] call FUNC(detonateExplosive);
|
||||
[_explosive, -1, [_explosive, 0]] call FUNC(detonateExplosive);
|
||||
};
|
||||
}, _explosive, _delay, 0] call EFUNC(common,waitAndExecute);
|
||||
|
@ -490,5 +490,8 @@
|
||||
<Hungarian>Robbanóanyagok távoli robbantásához</Hungarian>
|
||||
<Russian>Используется для дистанционного подрыва, после смерти оператора.</Russian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Explosives_Pickup">
|
||||
<English>Pick up</English>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
||||
|
@ -147,6 +147,14 @@ class RscInGameUI {
|
||||
MACRO_RANGEFINDER
|
||||
};
|
||||
};
|
||||
};
|
||||
class Rsc_ACE_Helo_UI_Turret: RscUnitInfo {
|
||||
onLoad = "uiNamespace setVariable ['ACE_dlgRangefinder', _this select 0]; ((_this select 0) displayCtrl 151) ctrlSetTextColor [0, 0, 0, 0]; [""onLoad"",_this,""RscUnitInfo"",'IGUI'] call compile preprocessfilelinenumbers ""A3\ui_f\scripts\initDisplay.sqf""";
|
||||
class CA_IGUI_elements_group: RscControlsGroup {
|
||||
class controls {
|
||||
MACRO_RANGEFINDER
|
||||
};
|
||||
};
|
||||
};
|
||||
class RscOptics_Heli_Attack_01_gunner: RscUnitInfo {
|
||||
onLoad = "uiNamespace setVariable ['ACE_dlgRangefinder', _this select 0]; ((_this select 0) displayCtrl 151) ctrlSetTextColor [0, 0, 0, 0]; [""onLoad"",_this,""RscUnitInfo"",'IGUI'] call compile preprocessfilelinenumbers ""A3\ui_f\scripts\initDisplay.sqf""";
|
||||
|
@ -48,7 +48,14 @@ _offset = 0;
|
||||
_velocityCorrection = (vectorMagnitude velocity _projectile) -
|
||||
getNumber (configFile >> "CfgMagazines" >> _magazine >> "initSpeed");
|
||||
|
||||
[_projectile, (_vehicle getVariable format ["%1_%2", QGVAR(Azimuth), _turret]), _offset, _velocityCorrection] call EFUNC(common,changeProjectileDirection);
|
||||
[_projectile, (_vehicle getVariable format ["%1_%2", QGVAR(Azimuth), _turret]), _offset, -_velocityCorrection] call EFUNC(common,changeProjectileDirection);
|
||||
|
||||
// Remove the platform velocity
|
||||
if( (vectorMagnitude velocity _vehicle) > 2) then {
|
||||
_sumVelocity = (velocity _projectile) vectorDiff (velocity _vehicle);
|
||||
_projectile setVelocity _sumVelocity;
|
||||
};
|
||||
|
||||
// Air burst missile
|
||||
|
||||
// handle locally only
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_vehicle", "_turret", "_turretConfig", "_distance", "_magazines", "_userChange"];
|
||||
private ["_vehicle", "_turret", "_turretConfig", "_distance", "_magazines", "_showHint", "_playSound"];
|
||||
|
||||
_vehicle = _this select 0;
|
||||
_turret = _this select 1;
|
||||
@ -162,11 +162,20 @@ _FCSElevation = [];
|
||||
[_vehicle, format ["%1_%2", QGVAR(Elevation), _turret], _FCSElevation] call EFUNC(common,setVariablePublic);
|
||||
[_vehicle, format ["%1_%2", QGVAR(Azimuth), _turret], _FCSAzimuth] call EFUNC(common,setVariablePublic);
|
||||
|
||||
_userChange = true;
|
||||
_showHint = false;
|
||||
if( (count _this) > 3) then {
|
||||
_userChange = _this select 3;
|
||||
_showHint = _this select 3;
|
||||
};
|
||||
|
||||
if(_userChange) then {
|
||||
_playSound = true;
|
||||
if( (count _this) > 3) then {
|
||||
_playSound = _this select 4;
|
||||
};
|
||||
|
||||
if(_playSound) then {
|
||||
playSound "ACE_Sound_Click";
|
||||
};
|
||||
|
||||
if(_showHint) then {
|
||||
[format ["%1: %2", localize "STR_ACE_FCS_ZeroedTo", _distance]] call EFUNC(common,displayTextStructured);
|
||||
};
|
@ -4,4 +4,4 @@ if !([ACE_player, vehicle ACE_player, []] call EFUNC(common,canInteractWith)) ex
|
||||
if !((!GVAR(enabled) && FUNC(canUseFCS)) || FUNC(canUseRangefinder)) exitWith {false};
|
||||
|
||||
[vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex), -1, false] call FUNC(keyDown);
|
||||
[vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex), -1, false] call FUNC(keyUp);
|
||||
[vehicle ACE_player, [ACE_player] call EFUNC(common,getTurretIndex), -1, false, false] call FUNC(keyUp);
|
@ -1,9 +1,9 @@
|
||||
// #define DEBUG_MODE_FULL
|
||||
//#define DEBUG_MODE_FULL
|
||||
#include "script_component.hpp"
|
||||
|
||||
TRACE_1("enter", _this);
|
||||
|
||||
#define FCS_UPDATE_DELAY 2.0
|
||||
#define FCS_UPDATE_DELAY 1
|
||||
|
||||
FUNC(magnitude) = {
|
||||
_this distance [0, 0, 0]
|
||||
@ -68,14 +68,13 @@ FUNC(laserHudDesignatePFH) = {
|
||||
["ace_fcs_forceUpdate", []] call ace_common_fnc_localEvent;
|
||||
};
|
||||
|
||||
if( ((getPosASL _laserTarget) vectorDistance _pos) > 2) then {
|
||||
if( (_laserTarget distance _pos) > 0.1) then {
|
||||
TRACE_1("LaserPos Update", "");
|
||||
_laserTarget setPosATL (ASLToATL _pos);
|
||||
|
||||
};
|
||||
|
||||
if(diag_tickTime > _forceUpdateTime) then {
|
||||
_args set[3, diag_tickTime + FCS_UPDATE_DELAY];
|
||||
_args set[2, diag_tickTime + FCS_UPDATE_DELAY];
|
||||
};
|
||||
#ifdef DEBUG_MODE_FULL
|
||||
drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,1], (getPosATL _laserTarget), 0.75, 0.75, 0, "", 0.5, 0.025, "TahomaB"];
|
||||
@ -101,7 +100,7 @@ if(isNil QGVAR(laser)) then {
|
||||
|
||||
GVAR(laserActive) = true;
|
||||
|
||||
_handle = [FUNC(laserHudDesignatePFH), 0, [_laserTarget, player]] call cba_fnc_addPerFrameHandler;
|
||||
_handle = [FUNC(laserHudDesignatePFH), 0.1, [_laserTarget, player]] call cba_fnc_addPerFrameHandler;
|
||||
_laserTarget setVariable ["ACE_PFH_HANDLE", _handle, false];
|
||||
|
||||
GVAR(laser) = _laserTarget;
|
||||
|
@ -17,7 +17,6 @@
|
||||
</Key>
|
||||
|
||||
<Key ID="STR_ACE_Laserpointer_useLaser">
|
||||
<Original><t color='#9cf953'>Use: </t>Turn Laser ON/OFF</Original>
|
||||
<English><t color='#9cf953'>Use: </t>Turn Laser ON/OFF</English>
|
||||
<Czech><t color='#9cf953'>Použití: </t>Zapnout/vypnout laser</Czech>
|
||||
<French><t color='#9cf953'>Utiliser : </t>laser on/off</French>
|
||||
|
@ -1,13 +0,0 @@
|
||||
class Extended_PreInit_EventHandlers {
|
||||
class ADDON {
|
||||
init = QUOTE(call COMPILE_FILE(XEH_preInit));
|
||||
};
|
||||
};
|
||||
|
||||
class Extended_FiredBIS_EventHandlers {
|
||||
class AllVehicles {
|
||||
class ADDON {
|
||||
firedBIS = QUOTE(_this call FUNC(forceMagazineMuzzleVelocity));
|
||||
};
|
||||
};
|
||||
};
|
@ -22,7 +22,6 @@ class CfgMagazines {
|
||||
descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_mag_SDDescription";
|
||||
picture = "\A3\weapons_f\data\ui\m_30stanag_caseless_green_CA.paa";
|
||||
initSpeed = 320;
|
||||
GVAR(forceMagazineMuzzleVelocity) = 1;
|
||||
};
|
||||
|
||||
class ACE_30Rnd_65x39_caseless_mag_AP: 30Rnd_65x39_caseless_mag {
|
||||
@ -58,7 +57,6 @@ class CfgMagazines {
|
||||
displayNameShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_SDNameShort";
|
||||
descriptionShort = "$STR_ACE_30Rnd_65x39_caseless_green_mag_SDDescription";
|
||||
initSpeed = 320;
|
||||
GVAR(forceMagazineMuzzleVelocity) = 1;
|
||||
};
|
||||
|
||||
class ACE_30Rnd_65x39_caseless_green_mag_AP: 30Rnd_65x39_caseless_green {
|
||||
@ -90,7 +88,6 @@ class CfgMagazines {
|
||||
displayNameShort = "$STR_ACE_30Rnd_556x45_mag_SDNameShort";
|
||||
descriptionShort = "$STR_ACE_30Rnd_556x45_mag_SDDescription";
|
||||
initSpeed = 320;
|
||||
GVAR(forceMagazineMuzzleVelocity) = 1;
|
||||
picture = "\A3\weapons_f\data\ui\m_30stanag_green_ca.paa";
|
||||
};
|
||||
|
||||
@ -130,7 +127,6 @@ class CfgMagazines {
|
||||
displayNameShort = "$STR_ACE_20Rnd_762x51_mag_SDNameShort";
|
||||
descriptionShort = "$STR_ACE_20Rnd_762x51_mag_SDDescription";
|
||||
initSpeed = 320;
|
||||
GVAR(forceMagazineMuzzleVelocity) = 1;
|
||||
};
|
||||
|
||||
class ACE_20Rnd_762x51_Mag_AP: 20Rnd_762x51_Mag {
|
||||
|
@ -1,7 +0,0 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
ADDON = false;
|
||||
|
||||
PREP(forceMagazineMuzzleVelocity);
|
||||
|
||||
ADDON = true;
|
@ -12,8 +12,6 @@ class CfgPatches {
|
||||
};
|
||||
};
|
||||
|
||||
#include "CfgEventHandlers.hpp"
|
||||
|
||||
#include "CfgAmmo.hpp"
|
||||
#include "CfgMagazines.hpp"
|
||||
#include "CfgVehicles.hpp"
|
||||
|
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* Author: commy2
|
||||
*
|
||||
* DESCRIPTION.
|
||||
*
|
||||
* Arguments:
|
||||
* firedBIS
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*/
|
||||
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_weapon", "_magazine", "_projectile"];
|
||||
|
||||
_weapon = _this select 1;
|
||||
_magazine = _this select 5;
|
||||
_projectile = _this select 6;
|
||||
|
||||
if (getNumber (configFile >> "CfgMagazines" >> _magazine >> QGVAR(forceMagazineMuzzleVelocity)) != 1) exitWith {
|
||||
//hint str (speed _projectile / 3.6);
|
||||
};
|
||||
|
||||
private ["_initSpeedWeapon", "_initSpeedMagazine"];
|
||||
|
||||
_initSpeedWeapon = getNumber (configFile >> "CfgWeapons" >> _weapon >> "initSpeed");
|
||||
_initSpeedMagazine = getNumber (configFile >> "CfgMagazines" >> _magazine >> "initSpeed");
|
||||
|
||||
//systemChat format ["W: %1m/s, M: %2m/s", _initSpeedWeapon, _initSpeedMagazine];
|
||||
|
||||
// force magazine initSpeed
|
||||
|
||||
private ["_credit", "_debit"];
|
||||
|
||||
_credit = vectorMagnitude velocity _projectile;
|
||||
_debit = _credit + (_initSpeedMagazine - _initSpeedWeapon);
|
||||
|
||||
_projectile setVelocity ((velocity _projectile) vectorMultiply (_debit / _credit));
|
||||
|
||||
//hint str (speed _projectile / 3.6);
|
@ -1 +0,0 @@
|
||||
#include "\z\ace\addons\magazines\script_component.hpp"
|
@ -886,7 +886,7 @@ class CfgVehicles {
|
||||
scope = 2;
|
||||
accuracy = 1000;
|
||||
displayName = "[ACE] Medical Supply Crate";
|
||||
model = "\A3\weapons_F\AmmoBoxes\AmmoBox_F";
|
||||
model = PATHTOF(data\ace_medcrate.p3d);
|
||||
author = "$STR_ACE_Common_ACETeam";
|
||||
class TransportItems {
|
||||
class ACE_fieldDressing {
|
||||
|
BIN
addons/medical/data/ace_medcrate.p3d
Normal file
BIN
addons/medical/data/ace_medcrate.p3d
Normal file
Binary file not shown.
BIN
addons/medical/data/ace_medcrate_co.paa
Normal file
BIN
addons/medical/data/ace_medcrate_co.paa
Normal file
Binary file not shown.
BIN
addons/medical/data/ace_medcrate_r.p3d
Normal file
BIN
addons/medical/data/ace_medcrate_r.p3d
Normal file
Binary file not shown.
@ -31,7 +31,9 @@ if (_show) then {
|
||||
[{
|
||||
private ["_target", "_display", "_alphaLevel", "_damaged", "_availableSelections", "_openWounds", "_selectionBloodLoss", "_red", "_green", "_blue", "_alphaLevel", "_allInjuryTexts", "_lbCtrl", "_genericMessages"];
|
||||
_target = (_this select 0) select 0;
|
||||
if (GVAR(displayPatientInformationTarget) != _target) exitwith {
|
||||
_selectionN = (_this select 0) select 1;
|
||||
|
||||
if (GVAR(displayPatientInformationTarget) != _target || GVAR(currentSelectedSelectionN) != _selectionN) exitwith {
|
||||
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
|
||||
@ -44,7 +46,7 @@ if (_show) then {
|
||||
_allInjuryTexts = [];
|
||||
_genericMessages = [];
|
||||
|
||||
_partText = ["STR_ACE_Interaction_Head", "STR_ACE_Interaction_Torso", "STR_ACE_Interaction_ArmLeft" ,"STR_ACE_Interaction_ArmRight" ,"STR_ACE_Interaction_LegLeft", "STR_ACE_Interaction_LegRight"] select GVAR(currentSelectedSelectionN);
|
||||
_partText = ["STR_ACE_Interaction_Head", "STR_ACE_Interaction_Torso", "STR_ACE_Interaction_ArmLeft" ,"STR_ACE_Interaction_ArmRight" ,"STR_ACE_Interaction_LegLeft", "STR_ACE_Interaction_LegRight"] select _selectionN;
|
||||
_genericMessages pushback [localize _partText, [1, 1, 1, 1]];
|
||||
|
||||
if (_target getvariable[QGVAR(isBleeding), false]) then {
|
||||
@ -54,7 +56,7 @@ if (_show) then {
|
||||
_genericMessages pushback [localize "STR_ACE_MEDICAL_STATUS_LOST_BLOOD", [1, 0.1, 0.1, 1]];
|
||||
};
|
||||
|
||||
if (((_target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select GVAR(currentSelectedSelectionN)) > 0) then {
|
||||
if (((_target getvariable [QGVAR(tourniquets), [0,0,0,0,0,0]]) select _selectionN) > 0) then {
|
||||
_genericMessages pushback [localize "STR_ACE_MEDICAL_STATUS_TOURNIQUET_APPLIED", [0.77, 0.51, 0.08, 1]];
|
||||
};
|
||||
if (_target getvariable[QGVAR(hasPain), false]) then {
|
||||
@ -192,7 +194,7 @@ if (_show) then {
|
||||
(_display displayCtrl 303) ctrlSetText (_triageStatus select 0);
|
||||
(_display displayCtrl 303) ctrlSetBackgroundColor (_triageStatus select 2);
|
||||
|
||||
}, 0, [_target]] call CBA_fnc_addPerFrameHandler;
|
||||
}, 0, [_target, GVAR(currentSelectedSelectionN)]] call CBA_fnc_addPerFrameHandler;
|
||||
|
||||
} else {
|
||||
("ACE_MedicalRscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"];
|
||||
|
@ -16,7 +16,6 @@
|
||||
private ["_target", "_show"];
|
||||
_target = _this select 0;
|
||||
_show = if (count _this > 1) then {_this select 1} else {true};
|
||||
GVAR(currentSelectedSelectionN) = if (count _this > 2) then {_this select 2} else {0};
|
||||
|
||||
GVAR(TriageCardTarget) = if (_show) then {_target} else {ObjNull};
|
||||
|
||||
|
@ -30,9 +30,6 @@
|
||||
<Portuguese>Injetar Morfina</Portuguese>
|
||||
<Italian>Inietta Morfina</Italian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Inject_Atropine">
|
||||
<English>Inject Atropine</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_Transfuse_Blood">
|
||||
<English>Transfuse Blood</English>
|
||||
<German>Bluttransfusion</German>
|
||||
|
@ -18,7 +18,7 @@ PREP(getHeightDistance);
|
||||
PREP(getRelativeAzimuthDistance);
|
||||
PREP(getRelativeDistance);
|
||||
PREP(getRelativeHeightLength);
|
||||
PREP(getFallOfShort);
|
||||
PREP(getFallOfShot);
|
||||
PREP(showAzimuth);
|
||||
PREP(showAzimuthInclination);
|
||||
PREP(showHeightDistance);
|
||||
@ -26,7 +26,7 @@ PREP(showDistance);
|
||||
PREP(showRelativeAzimuthDistance);
|
||||
PREP(showRelativeDistance);
|
||||
PREP(showRelativeHeightLength);
|
||||
PREP(showFallOfShort);
|
||||
PREP(showFallOfShot);
|
||||
PREP(showText);
|
||||
PREP(nextMode);
|
||||
PREP(adjustBrightness);
|
||||
|
@ -35,20 +35,20 @@ switch (_coordinate) do {
|
||||
if (_digit1 == 0) then {
|
||||
if (_digit2 == 0) then {
|
||||
if (_digit3 == 0) then {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_d.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_l.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit4];
|
||||
_digit3 = "";
|
||||
_digit4 = "";
|
||||
} else {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_d.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_l.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit3];
|
||||
_digit3 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit4];
|
||||
_digit4 = "";
|
||||
};
|
||||
} else {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_d.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_l.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit2];
|
||||
_digit3 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit3];
|
||||
@ -67,20 +67,20 @@ switch (_coordinate) do {
|
||||
if (_digit1 == 0) then {
|
||||
if (_digit2 == 0) then {
|
||||
if (_digit3 == 0) then {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_a.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_r.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit4];
|
||||
_digit3 = "";
|
||||
_digit4 = "";
|
||||
} else {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_a.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_r.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit3];
|
||||
_digit3 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit4];
|
||||
_digit4 = "";
|
||||
};
|
||||
} else {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_a.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_r.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit2];
|
||||
_digit3 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit3];
|
||||
@ -104,20 +104,20 @@ switch (_coordinate) do {
|
||||
if (_digit1 == 0) then {
|
||||
if (_digit2 == 0) then {
|
||||
if (_digit3 == 0) then {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_l.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_d.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit4];
|
||||
_digit3 = "";
|
||||
_digit4 = "";
|
||||
} else {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_l.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_d.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit3];
|
||||
_digit3 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit4];
|
||||
_digit4 = "";
|
||||
};
|
||||
} else {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_l.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_d.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit2];
|
||||
_digit3 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit3];
|
||||
@ -136,20 +136,20 @@ switch (_coordinate) do {
|
||||
if (_digit1 == 0) then {
|
||||
if (_digit2 == 0) then {
|
||||
if (_digit3 == 0) then {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_r.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_a.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit4];
|
||||
_digit3 = "";
|
||||
_digit4 = "";
|
||||
} else {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_r.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_a.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit3];
|
||||
_digit3 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit4];
|
||||
_digit4 = "";
|
||||
};
|
||||
} else {
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_r.paa));
|
||||
_digit0 = QUOTE(PATHTOF(rsc\vector_a.paa));
|
||||
_digit1 = "";
|
||||
_digit2 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit2];
|
||||
_digit3 = format [QUOTE(PATHTOF(rsc\vector_%1.paa)), _digit3];
|
||||
|
@ -128,11 +128,11 @@ switch (_this select 0) do {
|
||||
};
|
||||
|
||||
// prevent additinal modifier input if advanced mode it set, spaghetti
|
||||
if (GETGVAR(isKeyDownAzimuth,false) && {GETGVAR(currentMode,"") in ["relative_azimuth+distance", "fall_of_short"]}) exitWith {};
|
||||
if (GETGVAR(isKeyDownAzimuth,false) && {GETGVAR(currentMode,"") in ["relative_azimuth+distance", "fall_of_shot"]}) exitWith {};
|
||||
|
||||
// toggle fos values
|
||||
if (GETGVAR(currentMode,"") == "fall_of_short") exitWith {
|
||||
[!(GETGVAR(FOSState,true))] call FUNC(showFallOfShort);
|
||||
if (GETGVAR(currentMode,"") == "fall_of_shot") exitWith {
|
||||
[!(GETGVAR(FOSState,true))] call FUNC(showFallOfShot);
|
||||
};
|
||||
|
||||
["distance"] call FUNC(clearDisplay);
|
||||
|
@ -198,7 +198,7 @@ switch (_this select 0) do {
|
||||
|
||||
};
|
||||
|
||||
case ("fall_of_short"): {
|
||||
case ("fall_of_shot"): {
|
||||
|
||||
private "_isReady";
|
||||
_isReady = diag_tickTime > GVAR(keyDownTimeDistance) + 0.5;
|
||||
@ -207,8 +207,8 @@ switch (_this select 0) do {
|
||||
|
||||
if (!GVAR(isKeyDownAzimuth) && {!GVAR(isKeyDownDistance)}) then {
|
||||
if (_isReady) then {
|
||||
GVAR(FOSData) = call FUNC(getFallOfShort);//
|
||||
[false] call FUNC(showFallOfShort);
|
||||
GVAR(FOSData) = call FUNC(getFallOfShot);
|
||||
[false] call FUNC(showFallOfShot);
|
||||
};
|
||||
[false] call FUNC(showCenter);
|
||||
[false] call FUNC(showP1);
|
||||
|
@ -65,7 +65,7 @@ switch (_this select 0) do {
|
||||
["distance"] call FUNC(clearDisplay);
|
||||
[true] call FUNC(showP1);
|
||||
GVAR(pData) = [call FUNC(getDistance), call FUNC(getDirection)];
|
||||
"fall_of_short" call _fnc_setPFH;
|
||||
"fall_of_shot" call _fnc_setPFH;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -15,8 +15,8 @@ _fosData = GVAR(FOSData);
|
||||
if !(_this select 0) then {
|
||||
private "_digits";
|
||||
|
||||
// of abscissa
|
||||
_digits = [_fosData, 0] call FUNC(convertToTexturesFOS);
|
||||
// of ordinate
|
||||
_digits = [_fosData, 1] call FUNC(convertToTexturesFOS);
|
||||
|
||||
(_dlgVector displayCtrl 1310) ctrlSetText (_digits select 0);
|
||||
(_dlgVector displayCtrl 1311) ctrlSetText (_digits select 1);
|
||||
@ -24,8 +24,8 @@ if !(_this select 0) then {
|
||||
(_dlgVector displayCtrl 1313) ctrlSetText (_digits select 3);
|
||||
(_dlgVector displayCtrl 1314) ctrlSetText (_digits select 4);
|
||||
|
||||
// of ordinate
|
||||
_digits = [_fosData, 1] call FUNC(convertToTexturesFOS);
|
||||
// of abscissa
|
||||
_digits = [_fosData, 0] call FUNC(convertToTexturesFOS);
|
||||
|
||||
(_dlgVector displayCtrl 1315) ctrlSetText (_digits select 0);
|
||||
(_dlgVector displayCtrl 1316) ctrlSetText (_digits select 1);
|
@ -3,31 +3,26 @@
|
||||
<Package name="WindDeflection">
|
||||
<Container ID="Weather_Meter">
|
||||
<Key ID="STR_ACE_WEATHER_METER_WIND_CATEGORY">
|
||||
<Original>Wind Information</Original>
|
||||
<English>Wind Information</English>
|
||||
<Polish>Informacje o wietrze</Polish>
|
||||
<Spanish>Información del viento</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_WEATHER_METER_WIND_DIRECTION">
|
||||
<Original>Direction: %1</Original>
|
||||
<English>Direction: %1</English>
|
||||
<Polish>Kierunek: %1</Polish>
|
||||
<Spanish>Dirección: %1</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_WEATHER_METER_WIND_SPEED">
|
||||
<Original>Speed: %1 m/s</Original>
|
||||
<English>Speed: %1 m/s</English>
|
||||
<Polish>Prędkość: %1</Polish>
|
||||
<Spanish>Velocidad: %1 m/s</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_WEATHER_METER_WEATHER_CATEGORY">
|
||||
<Original>Weather Information</Original>
|
||||
<English>Weather Information</English>
|
||||
<Polish>Informacje o pogodzie</Polish>
|
||||
<Spanish>Información Meteorológica</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_WEATHER_METER_WEATHER_HUMIDITY">
|
||||
<Original>Humidity: %1%</Original>
|
||||
<English>Humidity: %1%</English>
|
||||
<Polish>Wilgotność: %1</Polish>
|
||||
<Spanish>Humedad: %1%</Spanish>
|
||||
|
@ -58,12 +58,13 @@ double traceBullet(double initSpeed, double airFriction, double angle, double an
|
||||
while (i < MAXITERATIONS) {
|
||||
lastPosX = posX;
|
||||
lastPosY = posY;
|
||||
simulationStep = 0.1 - 0.049 * (posX / posTargetX);
|
||||
velMag = sqrt(pow(velX, 2) + pow(velY, 2));
|
||||
posX += velX * simulationStep * 0.5;
|
||||
posY += velY * simulationStep * 0.5;
|
||||
velX += simulationStep * (velX * velMag * airFriction);
|
||||
velY += simulationStep * (velY * velMag * airFriction - 9.81);
|
||||
posX += velX * simulationStep;
|
||||
posY += velY * simulationStep;
|
||||
velY += simulationStep * (velY * velMag * airFriction - 9.80665);
|
||||
posX += velX * simulationStep * 0.5;
|
||||
posY += velY * simulationStep * 0.5;
|
||||
if (posX >= posTargetX) { break; }
|
||||
i++;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user