Jump to content
Northup

Drawing Icon on trigger pos.

Recommended Posts

I am running a custom mission. 

I am trying to make a simple change that is proving to be a tad more complex than I'd thought. The simple short version is that I am simply trying to draw a (custom) 2d icon on the player map and gps with drawicon and using getmissionpath "\folder\genericimage.paa", and then update the position of that icon on a set interval. However, accessing the position of the bonuz zone is proving to be a challenge. 

 

The mission is a custom sector control mission. 

 

The mission selects either a random trigger or one chosen by name by the host. That trigger serves as the main AO. Inside, there is another trigger that acts as a moving zone. Here is how the zones are created:

Spoiler



/*///////////////////////////////////////////////////////////////////////////////////////////////////////

	ALP_fnc_sectorCreate.sqf
	by Alpha993
	made for Northup

	PURPOSE: Creates a capturable zone which different teams can fight over and gain points in accordance
	to each team's relative presence.

	INSTALLATION: Ensure the accompanying functions are inside a "functions" folder in
	your mission directory. Also, ensure the included functions.hpp and description.ext files are placed in
	your mission root directory.

	USAGE: call the function on SERVER at any time while mission is running.
	
	PARAMETERS:
	
	triggerName: String
	triggerPos: Array of numbers or Object
	triggerSize: Array of numbers
	triggerAngle: Number
	triggerShape: Boolean
	triggerInnerSize: Array of numbers
	triggerInnerPoints: Number
	triggerRefresh: Number
	triggerIcons: Array of strings
	triggerBackground: String
	triggerOpacity: Number
	
	EXAMPLE: 
	["ALP_area_1", [0,0,0], [50,50,-1], 0, false, [25,25,-1], 1, 60, ["flag_NATO", "flag_CSAT", "flag_AAF", "b_installation"], "SolidBorder", 0.75] call ALP_fnc_sectorCreate;
	
	
*///////////////////////////////////////////////////////////////////////////////////////////


if !(isServer) exitWith {};	// Exit if not called on server


_ALP_areaCount = count ALP_triggerArray; // Get number of elements in the zone trigger array

///////////////////////////////////////////////////////////////////////////////////////////




// Second, define the function parameters

_ALP_triggerName = param [0, format ["ALP_area_%1",_ALP_areaCount], [""]]; // STRING (Optional, default "ALP_area_xx") - name of the zone trigger

_ALP_triggerPos = param [1, [0,0,0], [[],objNull], [2,3]]; // ARRAY, (Optional, default [0,0,0]) - position2D, position3D or Object

_ALP_triggerSize = param [2, [450,450,100], [[]], 3]; // ARRAY, (Optional, default [50,50,-1]) - size of the zone trigger in meters as [x,y,z]. A Z of -1 makes the trigger have infinite height

_ALP_triggerAngle = param [3, 0, [0]]; // NUMBER, (Optional, default 0) - rotation angle of trigger. This matters only if the trigger is rectangular

_ALP_triggerShape = param [4, false, [true]]; // BOOLEAN, (Optional, default false) - true if zone is rectangular, false if elliptical

_ALP_triggerInnerSize = param [5, [((_ALP_triggerSize #0)*0.25),((_ALP_triggerSize #1)*0.25),100], [[]], 3]; // ARRAY, (Optional, default [25,25,-1]) - size of the inner bonus zone trigger in meters as [x,y]. A size of [0,0,0] deactivates the bonus zone. A Z of -1 makes the bonus zone trigger have infinite height

_ALP_triggerInnerPoints = param [6, 1, [0]]; // NUMBER, (Optional, default 1) - number of extra points awarded for being inside the inner bonus zone trigger

_ALP_triggerRefresh = param [7, 60, [0]]; // NUMBER, (Optional, default 60) - number of seconds before trigger refreshes and awards points according to each faction's relative strength

_ALP_triggerIcons = param [8, ["flag_NATO", "flag_CSAT", "flag_AAF", "b_installation"], [[]], 4]; // ARRAY, (Optional, default vanilla faction icons) - paths to faction icons for use as the trigger icon, ordered as BLUFOR, OPFOR, INDFOR, and empty. Custom icons placed in mission folder are also acceptable

_ALP_triggerBackground = param [9, "SolidBorder", [""]]; // STRING, (Optional, default "Solid") - style for the zone marker's background. Available styles are "Solid", "SolidFull", "Horizontal", "Vertical", "Grid", "FDiagonal", "BDiagonal", "DiagGrid", "Cross", "Border", "SolidBorder"

_ALP_triggerOpacity = param [10, 0.75, [0]]; // NUMBER, (Optional, default 0.75) - opacity for the zone marker's background from 0 to 1

_ALP_triggerTowers = param [11, [], [[]]]; // ARRAY, Optional - synchronized tower locations

///////////////////////////////////////////////////////////////////////////////////////////




// Third, create and set up trigger in accordance to defined parameters
 
 // Create trigger at defined position
_ALP_trigger = createTrigger ["EmptyDetector", _ALP_triggerPos, true]; 
ALP_mainZone = _ALP_trigger;

waitUntil {!isNil "_ALP_trigger"};

 // Adjust trigger dimensions according to defined axes, angle, and shape
_ALP_trigger setTriggerArea [(_ALP_triggerSize #0), (_ALP_triggerSize #1), _ALP_triggerAngle, _ALP_triggerShape, (_ALP_triggerSize #2)]; 

 // Set up trigger activation to anybody so that it can detect all factions
_ALP_trigger setTriggerActivation ["ANY","PRESENT",true]; 

 // Set up trigger condition to defaults so that it detects correctly
_ALP_trigger setTriggerStatements ["this","",""];

 // Store trigger object into defined variable name and broadcast to clients
missionNamespace setVariable [_ALP_triggerName, _ALP_trigger, true];
publicVariable _ALP_triggerName;
_ALP_trigger setVehicleVarName _ALP_triggerName;

 // Store trigger variable into trigger array and broadcast to clients
ALP_triggerArray pushBackUnique _ALP_triggerName;
publicVariable "ALP_triggerArray";
publicVariable "ALP_mainZone";

_ALP_trigger setVariable ["ALP_triggerRefresh", _ALP_triggerRefresh, true];


// Add synchronized towers

_ALP_trigger setVariable ["ALP_triggerTowers", _ALP_triggerTowers, true];

// Spawn towers

_ALP_trigger spawn ALP_fnc_sectorTowers;
 
///////////////////////////////////////////////////////////////////////////////////////////




// Fourth, create and set up bonus zone trigger in accordance to defined parameters
 
 // Create trigger at defined position
_ALP_triggerBonus = createTrigger ["EmptyDetector", _ALP_triggerPos]; 

waitUntil {!isNil "_ALP_triggerBonus"};

 // Adjust trigger dimensions according to defined axes, angle, and shape
_ALP_triggerBonus setTriggerArea [((_ALP_triggerSize #0)*0.25), ((_ALP_triggerSize #1)*0.25), _ALP_triggerAngle, _ALP_triggerShape, (_ALP_triggerInnerSize #2)]; 

 // Set up trigger activation to anybody so that it can detect all factions
_ALP_triggerBonus setTriggerActivation ["ANY","PRESENT",true]; 

 // Set up trigger condition to defaults so that it detects correctly
_ALP_triggerBonus setTriggerStatements ["this","",""];

 // Store bonus trigger into main trigger variable set for convenience
_ALP_trigger setVariable ["ALP_triggerBonus", _ALP_triggerBonus, true]; 


 
///////////////////////////////////////////////////////////////////////////////////////////
 
 
 
 
// Fifth, create and set up icons in accordance to defined parameters

 // Create the icon
_ALP_areaIconName = format ["ALP_icon_%1", _ALP_trigger];
_ALP_areaIconSize = [1,1];
_ALP_areaIcon = createMarker [_ALP_areaIconName, _ALP_trigger];

 // Get trigger data for icon text and trigger identification
 
_ALP_triggerPhoneticalWord = (str ((ALP_triggerArray find _ALP_triggerName) + 1)) call BIS_fnc_phoneticalWord;

 // Edit the main icon with defined parameters
_ALP_areaIcon setMarkerColorLocal "ColorWhite";
_ALP_areaIcon setMarkerSizeLocal _ALP_areaIconSize;
_ALP_areaIcon setMarkerAlphaLocal 0; 
_ALP_areaIcon setMarkertextLocal format [" ", _ALP_triggerPhoneticalWord];
_ALP_areaIcon setMarkerType (_ALP_triggerIcons #3);
	
 // Store main icon into trigger variable set for convenience
_ALP_trigger setVariable ["ALP_icon", _ALP_areaIconName, true]; 
_ALP_trigger setVariable ["ALP_iconTypes", _ALP_triggerIcons, true]; 

///////////////////////////////////////////////////////////////////////////////////////////
 
 
 
 
// Sixth, create and set up markers in accordance to defined parameters

 // Create the main zone marker
_ALP_areaMarkerName = format ["ALP_marker_%1", _ALP_trigger];
_ALP_areaMarkerSize = triggerArea _ALP_trigger;
_ALP_areaMarker = createMarker [_ALP_areaMarkerName, _ALP_trigger];

 // Edit the main zone marker with defined parameters
_ALP_areaMarker setMarkerShapeLocal (if (_ALP_areaMarkerSize #3) then {"RECTANGLE"} else {"ELLIPSE"});
_ALP_areaMarker setMarkerColorLocal "ColorBlack";
_ALP_areaMarker setMarkerSizeLocal  [(_ALP_areaMarkerSize #0), (_ALP_areaMarkerSize #1)];
_ALP_areaMarker setMarkerDirLocal (_ALP_areaMarkerSize #2);
_ALP_areaMarker setMarkerBrushLocal _ALP_triggerBackground;
_ALP_areaMarker setMarkerAlpha _ALP_triggerOpacity;
	
 // Store main zone marker into trigger variable set for convenience
_ALP_trigger setVariable ["ALP_marker",_ALP_areaMarkerName]; 

 // Create the bonus zone marker
_ALP_areaMarkerBonusName = format ["ALP_markerBonus_%1", _ALP_trigger];
_ALP_areaMarkerBonusSize = triggerArea _ALP_triggerBonus;
_ALP_areaMarkerBonus = createMarker [_ALP_areaMarkerBonusName, _ALP_triggerBonus];

 // Edit the bonus zone marker with defined parameters
_ALP_areaMarkerBonus setMarkerShapeLocal (if (_ALP_areaMarkerBonusSize #3) then {"RECTANGLE"} else {"ELLIPSE"});
_ALP_areaMarkerBonus setMarkerColorLocal "ColorOrange";
_ALP_areaMarkerBonus setMarkerSizeLocal  [(_ALP_areaMarkerBonusSize #0), (_ALP_areaMarkerBonusSize #1)];
_ALP_areaMarkerBonus setMarkerDirLocal (_ALP_areaMarkerBonusSize #2);
_ALP_areaMarkerBonus setMarkerBrushLocal "SolidBorder";
_ALP_areaMarkerBonus setMarkerAlpha 1;
	
 // Store bonus zone marker into trigger variable set for convenience
_ALP_trigger setVariable ["ALP_markerBonus",_ALP_areaMarkerBonusName];
 
///////////////////////////////////////////////////////////////////////////////////////////




// Seventh, spawn management script

[_ALP_trigger,_ALP_triggerName,_ALP_triggerInnerPoints,_ALP_triggerRefresh] spawn ALP_fnc_sectorManager;
 
///////////////////////////////////////////////////////////////////////////////////////////



/*
// Eighth, create objective for the zone


[true, _ALP_triggerName, [format ["Capture Zone %1",_ALP_triggerPhoneticalWord], format ["Capture %1",_ALP_triggerPhoneticalWord], _ALP_triggerPhoneticalWord], _ALP_triggerPos, "AUTOASSIGNED", 1, false, "", true] call BIS_fnc_taskCreate;


 

However, there isn't an actual position to grab there, since the bonus zone movement is handled in the sector manager:
 

Spoiler



params ["_ALP_trigger", "_ALP_triggerName", "_ALP_triggerInnerPoints", "_ALP_triggerRefresh"];


_ALP_sectorTimeout = time;
_ALP_triggerBonusNewPos_angle = floor random 360;

while {alive _ALP_trigger} do
{
	// First, define the main zone trigger marker, icon, and the bonus zone trigger
	
	_ALP_marker = _ALP_trigger getVariable "ALP_marker"; // Define respective marker
	_ALP_icon = _ALP_trigger getVariable "ALP_icon"; // Define respective icon
	_ALP_triggerIcons =  _ALP_trigger getVariable "ALP_iconTypes"; // Define respective icon types
	_ALP_triggerBonus = _ALP_trigger getVariable "ALP_triggerBonus"; // Define respective bonus trigger
	_ALP_markerBonus = _ALP_trigger getVariable "ALP_markerBonus"; // Define respective bonus marker
	//_ALP_triggerPhoneticalWord = (str ((ALP_triggerArray find _ALP_triggerName) + 1)) call BIS_fnc_phoneticalWord;
	_ALP_triggerPhoneticalWord = "THE ZONE";
	_ALP_trigger setVariable ["ALP_zoneWord",_ALP_triggerPhoneticalWord];

// SOME IRRELEVANT CODE HERE //

// Sixth, move bonus zone trigger to new position within main zone using parametric equations for an ellipse
	
	_ALP_triggerArea = triggerArea _ALP_trigger;
	_ALP_triggerBonusArea = triggerArea _ALP_triggerBonus;
	_ALP_triggerPos = getPos _ALP_trigger;
	
	_ALP_triggerBonusNewPos_theta = atan(((_ALP_triggerArea #1)/(_ALP_triggerArea #0))*tan(_ALP_triggerBonusNewPos_angle));

	 // Get the sine of the angle with ten times the period so that the bonus zone moves in and out
	_ALP_triggerBonusNewPos_multiplier = sin(10*_ALP_triggerBonusNewPos_theta);
	
	 // Get X-coordinate using X = a*cos(θ)
	_ALP_triggerBonusNewPos_X = (_ALP_triggerPos #0) + ((_ALP_triggerArea #0) - (_ALP_triggerBonusArea #0))*cos(_ALP_triggerBonusNewPos_theta)*_ALP_triggerBonusNewPos_multiplier;
	
	 // Get Y-coordinate using Y = b*sin(θ)
	_ALP_triggerBonusNewPos_Y = (_ALP_triggerPos #1) + ((_ALP_triggerArea #1) - (_ALP_triggerBonusArea #1))*sin(_ALP_triggerBonusNewPos_theta)*_ALP_triggerBonusNewPos_multiplier;
	
	 // Apply a rotation matrix to each point to compensate for the trigger zone's angle
	
	_ALP_triggerBonusNewPos = [[_ALP_triggerBonusNewPos_X - (_ALP_triggerPos #0), _ALP_triggerBonusNewPos_Y - (_ALP_triggerPos #1)], -1*(_ALP_triggerArea #2)] call BIS_fnc_rotateVector2D;
	
	_ALP_triggerBonusNewPos_X =  (_ALP_triggerBonusNewPos #0) + (_ALP_triggerPos #0);
	
	_ALP_triggerBonusNewPos_Y =  (_ALP_triggerBonusNewPos #1) + (_ALP_triggerPos #1);
	
	 // Increment angle around ellipse by one-half times a scalar for smoother movement
	 
	_ALP_scalar = ((_ALP_triggerArea #0) + (_ALP_triggerArea #1)/2);
	 
	_ALP_triggerBonusNewPos_angle = _ALP_triggerBonusNewPos_angle + ALP_triggerBonusSpeed*(25/_ALP_scalar); 
	
	 // Reset angle after a full rotation around zone
	if (_ALP_triggerBonusNewPos_angle > 360) then
	{
		_ALP_triggerBonusNewPos_angle = 0; 
	};

	 // Move bonus trigger and its marker to new position
	_ALP_triggerBonus setPos [_ALP_triggerBonusNewPos_X,_ALP_triggerBonusNewPos_Y,0];
	_ALP_markerBonus setMarkerPos [_ALP_triggerBonusNewPos_X,_ALP_triggerBonusNewPos_Y,0];
	
	///////////////////////////////////////////////////////////////////////////////////////
	
	
	_ALP_Trigger setVariable ["ALP_timeout", round ((_ALP_sectorTimeout + _ALP_triggerRefresh) - time), true];
	
	sleep 1;
};


 

I have tried to grab the pos from _ALP_triggerBonusNewPos_X and _ALP_triggerBonusNewPos_Y,0 to no avail. 
I wrote a script that is executed on initplayerlocal.ini:

Spoiler



params ["_ALP_trigger", "_ALP_triggerName", "_ALP_triggerInnerPoints", "_ALP_triggerRefresh"];
ALP_triggerArea = triggerArea _ALP_trigger;
_ALP_triggerBonusArea = triggerArea _ALP_triggerBonus;
_ALP_triggerPos = getPos _ALP_trigger;

drawIcon ["\a3\3den\data\cfgmarkers\flags\us_ca.paa", [1,1,1,1],  _ALP_triggerPos, 20, 20, 0, "", 2, 0.03, "TahomaB", "right"]; 
while {true} do {
  _ALP_triggerPos = getPos _ALP_trigger;
  drawIcon ["\a3\3den\data\cfgmarkers\flags\us_ca.paa", [1,1,1,1],  _ALP_triggerPos, 20, 20, 0, "", 2, 0.03, "TahomaB", "right"]; 
  sleep 1;
};


 

I'm sure I am doing it all wrong. If anyone has any insight, please let me know. 

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

×