Jump to content
Tory Xiao

What does this scanner do?

Recommended Posts

I found this intersect scanner in A3W mission files

server\functions\fn_boundingBoxReal.sqf:

// Here is the intersect scanner, which is used in the editor. The resulting array is copied into the clipboard.

0 spawn
{
	_precision = 0.1; comment "change this for higher/lower precision";
	_lineColor1 = [0,1,0,1];
	_lineColor2 = [1,0,0,1];

	_parentClasses =
	[
		"ReammoBox_F",
		"Truck_F",
		"Tank_F",
		"Car_F",
		"Ship_F",
		"Air",
		"All"
	];

	_vehClasses =
	[
		["Box_NATO_Wps_F", "Box_NATO_Wps_F"],
		["Box_NATO_WpsSpecial_F", "Box_NATO_WpsSpecial_F"],
		["Box_NATO_Ammo_F", "Box_NATO_Ammo_F"],
		["Box_NATO_AmmoOrd_F", "Box_NATO_AmmoOrd_F"],
		["Box_NATO_Grenades_F", "Box_NATO_Grenades_F"],
		["Box_NATO_Support_F", "Box_NATO_Support_F"],
		["Box_NATO_WpsLaunch_F", "Box_NATO_WpsLaunch_F"],
		["Box_NATO_AmmoVeh_F", "Box_NATO_AmmoVeh_F"],
		["Box_East_Wps_F", "Box_East_Wps_F"],
		["Box_East_WpsSpecial_F", "Box_East_WpsSpecial_F"],
		["Box_East_Ammo_F", "Box_East_Ammo_F"],
		["Box_East_AmmoOrd_F", "Box_East_AmmoOrd_F"],
		["Box_East_Grenades_F", "Box_East_Grenades_F"],
		["Box_East_Support_F", "Box_East_Support_F"],
		["Box_East_WpsLaunch_F", "Box_East_WpsLaunch_F"],
		["Box_East_AmmoVeh_F", "Box_East_AmmoVeh_F"],
		["Box_IND_Wps_F", "Box_IND_Wps_F"],
		["Box_IND_WpsSpecial_F", "Box_IND_WpsSpecial_F"],
		["Box_IND_Ammo_F", "Box_IND_Ammo_F"],
		["Box_IND_AmmoOrd_F", "Box_IND_AmmoOrd_F"],
		["Box_IND_Grenades_F", "Box_IND_Grenades_F"],
		["Box_IND_Support_F", "Box_IND_Support_F"],
		["Box_IND_WpsLaunch_F", "Box_IND_WpsLaunch_F"],
		["Box_IND_AmmoVeh_F", "Box_IND_AmmoVeh_F"],
		["Box_FIA_Support_F", "Box_FIA_Support_F"],
		["B_supplyCrate_F", "B_supplyCrate_F"],
		["C_supplyCrate_F", "C_supplyCrate_F"],

		["C_Van_01_box_F", "Van_01_box_base_F"],
		["C_Van_01_fuel_F", "Van_01_fuel_base_F"],
		["C_Van_01_transport_F", "Van_01_base_F"],
		["C_Van_02_vehicle_F", "Van_02_base_F"],
		["B_Truck_01_ammo_F", "B_Truck_01_ammo_F"],
		["B_Truck_01_box_F", "B_Truck_01_box_F"],
		["B_Truck_01_fuel_F", "B_Truck_01_fuel_F"],
		["B_Truck_01_medical_F", "B_Truck_01_medical_F"],
		["B_Truck_01_Repair_F", "B_Truck_01_Repair_F"],
		["B_Truck_01_mover_F", "B_Truck_01_mover_F"],
		["B_Truck_01_covered_F", "Truck_01_base_F"],
		["O_Truck_02_ammo_F", "O_Truck_02_ammo_F"],
		["O_Truck_02_medical_F", "O_Truck_02_medical_F"],
		["O_Truck_02_box_F", "O_Truck_02_box_F"],
		["O_Truck_02_fuel_F", "O_Truck_02_fuel_F"],
		["I_Truck_02_ammo_F", "I_Truck_02_ammo_F"],
		["I_Truck_02_medical_F", "I_Truck_02_medical_F"],
		["I_Truck_02_box_F", "I_Truck_02_box_F"],
		["I_Truck_02_fuel_F", "I_Truck_02_fuel_F"],
		["I_Truck_02_MRL_F", "Truck_02_MRL_base_F"],
		["I_Truck_02_covered_F", "Truck_02_base_F"],
		["O_Truck_03_ammo_F", "O_Truck_03_ammo_F"],
		["O_Truck_03_device_F", "O_Truck_03_device_F"],
		["O_Truck_03_fuel_F", "O_Truck_03_fuel_F"],
		["O_Truck_03_medical_F", "O_Truck_03_medical_F"],
		["O_Truck_03_repair_F", "O_Truck_03_repair_F"],
		["O_Truck_03_covered_F", "Truck_03_base_F"],

		["I_LT_01_AT_F", "LT_01_AT_base_F"],
		["I_LT_01_AA_F", "LT_01_AA_base_F"],
		["I_LT_01_cannon_F", "LT_01_cannon_base_F"],
		["I_LT_01_scout_F", "LT_01_base_F"],
		["B_APC_Tracked_01_AA_F", "B_APC_Tracked_01_AA_F"],
		["B_APC_Tracked_01_CRV_F", "B_APC_Tracked_01_CRV_F"],
		["B_APC_Tracked_01_rcws_F", "APC_Tracked_01_base_F"],
		["O_APC_Tracked_02_AA_F", "O_APC_Tracked_02_AA_F"],
		["O_APC_Tracked_02_cannon_F", "APC_Tracked_02_base_F"],
		["I_APC_tracked_03_cannon_F", "APC_Tracked_03_base_F"],
		["B_MBT_01_arty_F", "MBT_01_arty_base_F"],
		["B_MBT_01_mlrs_F", "MBT_01_mlrs_base_F"],
		["B_MBT_01_TUSK_F", "B_MBT_01_TUSK_F"],
		["B_MBT_01_cannon_F", "MBT_01_base_F"],
		["O_MBT_02_arty_F", "MBT_02_arty_base_F"],
		["O_MBT_02_cannon_F", "MBT_02_base_F"],
		["I_MBT_03_cannon_F", "MBT_03_base_F"],
		["O_MBT_04_command_F", "MBT_04_command_base_F"],
		["O_MBT_04_cannon_F", "MBT_04_base_F"],

		["C_Kart_01_F", "Kart_01_Base_F"],
		["C_Quadbike_01_F", "Quadbike_01_base_F"],
		["C_Hatchback_01_F", "Hatchback_01_base_F"],
		["B_G_Offroad_01_armed_F", "Offroad_01_armed_base_F"],
		["C_Offroad_01_repair_F", "Offroad_01_repair_base_F"],
		["C_Offroad_01_F", "Offroad_01_base_F"],
		["I_C_Offroad_02_AT_F", "Offroad_02_AT_base_F"],
		["I_C_Offroad_02_LMG_F", "Offroad_02_LMG_base_F"],
		["C_Offroad_02_unarmed_F", "Offroad_02_base_F"],
		["C_SUV_01_F", "SUV_01_base_F"],
		["B_UGV_01_rcws_F", "UGV_01_rcws_base_F"],
		["B_UGV_01_F", "UGV_01_base_F"],
		["B_T_LSV_01_AT_F", "LSV_01_AT_base_F"],
		["B_T_LSV_01_armed_F", "LSV_01_armed_base_F"],
		["B_T_LSV_01_unarmed_F", "LSV_01_base_F"],
		["O_T_LSV_02_AT_F", "LSV_02_AT_base_F"],
		["O_T_LSV_02_armed_F", "LSV_02_armed_base_F"],
		["O_T_LSV_02_unarmed_F", "LSV_02_base_F"],
		["B_MRAP_01_gmg_F", "MRAP_01_gmg_base_F"],
		["B_MRAP_01_F", "MRAP_01_base_F"],
		["O_MRAP_02_hmg_F", "MRAP_02_hmg_base_F"],
		["O_MRAP_02_F", "MRAP_02_base_F"],
		["I_MRAP_03_hmg_F", "MRAP_03_hmg_base_F"],
		["I_MRAP_03_F", "MRAP_03_base_F"],
		["B_APC_Wheeled_01_cannon_F", "APC_Wheeled_01_base_F"],
		["O_APC_Wheeled_02_rcws_v2_F", "APC_Wheeled_02_base_F"],
		["I_APC_Wheeled_03_cannon_F", "APC_Wheeled_03_base_F"],
		["B_AFV_Wheeled_01_up_cannon_F", "AFV_Wheeled_01_up_base_F"],
		["B_AFV_Wheeled_01_cannon_F", "AFV_Wheeled_01_base_F"],

		["B_SDV_01_F", "SDV_01_base_F"],
		["C_Scooter_Transport_01_F", "Scooter_Transport_01_base_F"],
		["C_Rubberboat", "Rubber_duck_base_F"],
		["C_Boat_Civil_01_F", "Boat_Civil_01_base_F"],
		["C_Boat_Transport_02_F", "Boat_Transport_02_base_F"],
		["B_Boat_Armed_01_minigun_F", "Boat_Armed_01_base_F"],

		["C_Heli_Light_01_civil_F", "Heli_Light_01_civil_base_F"],
		["B_Heli_Light_01_armed_F", "Heli_Light_01_base_F"],
		["O_Heli_Light_02_F", "Heli_Light_02_base_F"],
		["I_Heli_light_03_F", "Heli_light_03_base_F"],
		["B_Heli_Transport_01_F", "Heli_Transport_01_base_F"],
		["I_Heli_Transport_02_F", "Heli_Transport_02_base_F"],
		["B_Heli_Transport_03_F", "Heli_Transport_03_base_F"],
		["O_Heli_Transport_04_box_F", "Heli_Transport_04_base_F"],
		["B_Heli_Attack_01_F", "Heli_Attack_01_base_F"],
		["O_Heli_Attack_02_F", "Heli_Attack_02_base_F"],
		["C_Plane_Civil_01_F", "Plane_Civil_01_base_F"],
		["B_Plane_Fighter_01_F", "Plane_Fighter_01_Base_F"],
		["O_Plane_Fighter_02_F", "Plane_Fighter_02_Base_F"],
		["I_Plane_Fighter_03_CAS_F", "Plane_Fighter_03_base_F"],
		["I_Plane_Fighter_04_F","Plane_Fighter_04_Base_F"],
		["B_Plane_CAS_01_F", "Plane_CAS_01_base_F"],
		["O_Plane_CAS_02_F", "Plane_CAS_02_base_F"],
		["B_T_VTOL_01_armed_F", "VTOL_01_base_F"],
		["O_T_VTOL_02_infantry_F", "VTOL_02_base_F"],
		["B_UAV_01_F", "UAV_01_base_F"],
		["B_UAV_02_CAS_F", "UAV_02_base_F"],
		["B_T_UAV_03_F", "UAV_03_base_F"],
		["O_T_UAV_04_CAS_F", "UAV_04_base_F"],
		["B_UAV_05_F", "UAV_05_Base_F"],
		["C_IDAP_UAV_06_antimine_F", "UAV_06_antimine_base_F"],
		["B_UAV_06_F", "UAV_06_base_F"]
	];

	comment "this is to take into account heli rotors";
	_extraOffsets =
	[
		["Heli_Light_01_base_F", [[0,0,0],[0,0.4,0]]],
		["Heli_Transport_03_base_F", [[0,0,0],[0,2.2,0]]]
	];

	_classesBBox = [];
	{ _classesBBox pushBack [_x, []] } forEach _parentClasses;

	_pos = getPosATL player;
	_pos set [1, (_pos select 1) + 15];
	_pos set [2, (_pos select 2) + 5];

	_dir = getDir player;
	_dir = _dir + 270;

	{
		_class = _x select 0;
		_kind = _x select 1;

		_vehicle = createVehicle [_class, _pos, [], 0, "None"];

		{
			_vehicle animate [configName _x, 0, true];
		} forEach configProperties [configFile >> "CfgVehicles" >> _class >> "AnimationSources", "(configName _x) select [0,4] == 'hide'"];

		{
			_vehicle animate [configName _x, 1, true];
		} forEach configProperties [configFile >> "CfgVehicles" >> _class >> "AnimationSources", "(configName _x) select [0,4] == 'show'"];

		_vehicle setDir _dir;
		_vehicle enableSimulation false;

		_minBBox = (boundingBox _vehicle) select 0;
		_maxBBox = (boundingBox _vehicle) select 1;

		_minX = floor (_minBBox select 0);
		_minY = floor (_minBBox select 1);
		_minZ = floor (_minBBox select 2);

		_maxX = ceil (_maxBBox select 0);
		_maxY = ceil (_maxBBox select 1);
		_maxZ = ceil (_maxBBox select 2);

		_minXreal = _maxX;
		_minYreal = _maxY;
		_minZreal = _maxZ;

		_maxXreal = _minX;
		_maxYreal = _minY;
		_maxZreal = _minZ;

		comment "intersect is used as a backup because lineIntersects doesn't detect some heli blades, 'GEOM' option is the most accurate for those";
		_found = { lineIntersects [ATLtoASL _pos1, ATLtoASL _pos2] || {count ([_vehicle, "GEOM"] intersect [_pos1, _pos2]) > 0} };

		for "_X" from _minX to _maxX step _precision do
		{
			for "_Y" from _minY to _maxY step _precision do
			{
				_pos1 = _vehicle modelToWorld [_X, _Y, _minZ];
				_pos2 = _vehicle modelToWorld [_X, _Y, _maxZ];

				if (call _found) then
				{
					if (_X < _minXreal) then { _minXreal = _X - _precision };
					if (_X >= _maxXreal) then { _maxXreal = _X + _precision };

					if (_Y < _minYreal) then { _minYreal = _Y - _precision };
					if (_Y >= _maxYreal) then { _maxYreal = _Y + _precision };

					drawLine3D [_pos1, _pos2, _lineColor2];
				}
				else
				{
					drawLine3D [_pos1, _pos2, _lineColor1];
				};
			};
		};

		for "_Y" from _minY to _maxY step _precision do
		{
			for "_Z" from _minZ to _maxZ step _precision do
			{
				_pos1 = _vehicle modelToWorld [_minX, _Y, _Z];
				_pos2 = _vehicle modelToWorld [_maxX, _Y, _Z];

				if (call _found) then
				{
					if (_Y < _minYreal) then { _minYreal = _Y - _precision };
					if (_Y >= _maxYreal) then { _maxYreal = _Y + _precision };

					if (_Z < _minZreal) then { _minZreal = _Z - _precision };
					if (_Z >= _maxZreal) then { _maxZreal = _Z + _precision };

					drawLine3D [_pos1, _pos2, _lineColor2];
				}
				else
				{
					drawLine3D [_pos1, _pos2, _lineColor1];
				};
			};
		};

		for "_Z" from _minZ to _maxZ step _precision do
		{
			for "_X" from _minX to _maxX step _precision do
			{
				_pos1 = _vehicle modelToWorld [_X, _minY, _Z];
				_pos2 = _vehicle modelToWorld [_X, _maxY, _Z];

				if (call _found) then
				{
					if (_X < _minXreal) then { _minXreal = _X - _precision };
					if (_X >= _maxXreal) then { _maxXreal = _X + _precision };

					if (_Z < _minZreal) then { _minZreal = _Z - _precision };
					if (_Z >= _maxZreal) then { _maxZreal = _Z + _precision };

					drawLine3D [_pos1, _pos2, _lineColor2];
				}
				else
				{
					drawLine3D [_pos1, _pos2, _lineColor1];
				};
			};
		};

		_minXreal = (round (_minXreal / _precision)) * _precision;
		_minYreal = (round (_minYreal / _precision)) * _precision;
		_minZreal = (round (_minZreal / _precision)) * _precision;

		_maxXreal = (round (_maxXreal / _precision)) * _precision;
		_maxYreal = (round (_maxYreal / _precision)) * _precision;
		_maxZreal = (round (_maxZreal / _precision)) * _precision;

		_minReal = [_minXreal, _minYreal, _minZreal];
		_maxReal = [_maxXreal, _maxYreal, _maxZreal];

		{
			if (_vehicle isKindOf (_x select 0)) exitWith
			{
				_minReal = _minReal vectorAdd (_x select 1 select 0);
				_maxReal = _maxReal vectorAdd (_x select 1 select 1);
			};
		} forEach _extraOffsets;

		{
			if (_vehicle isKindOf (_x select 0)) exitWith
			{
				(_x select 1) pushBack [_kind, [_minReal,_maxReal]];
			};
		} forEach _classesBBox;

		deleteVehicle _vehicle;

		sleep 0.1;

	} forEach _vehClasses;

	_validBBoxes = [];

	{
		if (count (_x select 1) > 0) then
		{
			_validBBoxes pushBack _x;
		};
	} forEach _classesBBox;

	copyToClipboard str _validBBoxes;
};

 

Share this post


Link to post
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now

×