summaryrefslogtreecommitdiffstats
path: root/Common/Functions/Common_HandleArtillery.sqf
blob: be8e243dfcfc9e608a07a42c7c4a20928e0b2ef5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/* Handle artillery Fired EH */
Private ['_ammo','_ammoList','_cannon','_destination','_direction','_dispersion','_distance','_keepShellAlive','_landDestination','_maxRange','_nearLaser','_percent','_projectile','_radius','_shellpos','_side','_smoke','_smokeOnImpact','_velocity','_xcoord','_ycoord'];

_ammo = _this select 0;
_ammoList = _this select 2;

//--- Only Catch allowed ammo.
if (_ammo in _ammoList) then {

	//--- Retrieve the parameters.
	_projectile = _this select 1;
	_destination = _this select 3;
	_velocity = _this select 4;
	_dispersion = _this select 5;
	_cannon = _this select 6;
	_distance = _this select 7;
	_radius = _this select 8;
	_maxRange = _this select 9;
	_side = _this select 10;
	
	//--- Do we have smoke on impact?
	_smokeOnImpact = false;

	//--- Randomize Land Area.
	_distance = random (_distance / _maxRange * 100) + random _radius;
	_direction = random 360;

	//--- Default Position.
	_landDestination = [((_destination select 0)+((sin _direction)*_distance))+(random _dispersion)-(random _dispersion),(_destination select 1)+((cos _direction)*_distance)+(random _dispersion)-(random _dispersion),0];
	_keepShellAlive = true;
	
	//--- SADARM Rounds.
	if (_ammo in (Format ["WFBE_%1_ARTILLERY_AMMO_SADARM",_side] Call GetNamespace)) then {
		[_projectile,_landDestination,_velocity] Spawn ARTY_HandleSADARM;
		//--- SADARM Destroy the original round.
		_keepShellAlive = false;
	};
		
	//--- ILLUM Rounds.
	if (_ammo in (Format ["WFBE_%1_ARTILLERY_AMMO_ILLUMN",_side] Call GetNamespace)) then {
		[_projectile,_landDestination,_velocity] Spawn ARTY_HandleILLUM;
		//--- ILLUM Destroy the original round.
		_keepShellAlive = false;
	};
	
	//--- Some rounds remove the projectile, make sure that it's not removed or anything.
	if (_keepShellAlive) then {
		//--- LASER Rounds.
		if (_ammo in (Format ["WFBE_%1_ARTILLERY_AMMO_LASER",_side] Call GetNamespace)) then {
			_nearLaser = _destination nearEntities ['LaserTarget','WFBE_ARTILLERYAMMOLASERRANGE' Call GetNamespace];
			if (count _nearLaser > 0) then {
				_nearLaser = getPos (([_destination,_nearLaser] Call SortByDistance) select 0);
				_landDestination = [(_nearLaser select 0)+(((random _dispersion)-(random _dispersion))/4),(((_nearLaser select 1)+(random _dispersion)-(random _dispersion))/4),0];
			};
		};
		
		//--- Calculate the shell estimated spawn area.
		_distance = _landDestination distance _cannon;
		_percent = ((500 * 100 / _distance) / 100);
		_xcoord = (_landDestination select 0) + _percent * ((_cannon select 0) - (_landDestination select 0));
		_ycoord = (_landDestination select 1) + _percent * ((_cannon select 1) - (_landDestination select 1));
		_shellpos = [_xcoord,_ycoord,1000];
		
		//--- Calculate the direction
		_xcoord = (_landDestination select 0) - (_cannon select 0);
		_ycoord = (_landDestination select 1) - (_cannon select 1);
		_direction =  -(((_ycoord atan2 _xcoord) + 270) % 360);
		if (_direction < 0) then {_direction = _direction + 360};
		
		//--- Track the shell (FX)?
		_smokeOnImpact = if (_ammo in (Format ["WFBE_%1_ARTILLERY_DEPLOY_SMOKE",_side] Call GetNamespace)) then {true} else {false};
		
		//--- Release the shell.
		if !(isNull _projectile) then {
			_projectile setPos _shellpos; 
			_projectile setVelocity [(sin _direction*_velocity),(cos _direction*_velocity),((_velocity * 2.03) * -1)];
			
			if (WF_A2_Vanilla) then {
				//---- MLRS ammo has some weird config problems on vanilla.
				if (_ammo == "R_MLRS" || _ammo == "ARTY_R_227mm_HE_Rocket") then {
					_projectile setPos _landDestination;
				};
			};
		};
	};
	
	//--- Release smoke on an impact.
	if (_smokeOnImpact) then {
		_shellPos = [];
		
		//--- Wait for the last known position.
		while {!isNull _projectile} do {
			_shellPos = getPos _projectile;
			sleep 0.02;
		};
		
		//--- If we have it, release it.
		if (count _shellPos > 0) then {
			_shellPos set [2,0];
			_smoke = "ARTY_SmokeShellWhite" createVehicle _shellPos;
			_smoke setPos _shellPos;
		};
	};
};