Northup 6 Posted February 7, 2023 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