Jump to content
sizraide

Converting string to variable

Recommended Posts

Hello people, I'm making a COOP mission and I have a trigger that spawns in AI in waves.

 

Quote

_spawnMarkers = ['enemySpawn_4', 'enemySpawn_5', 'enemySpawn_6'];
        attackingGroup_3 = createGroup [east, false];
        while{true} do {
            _groupIndex = 0; //index
            _enemyGroup = 'septemberGroup' + (str _groupIndex);  //add index to string
            _enemyGroup = createGroup [east, true];

        
            _enemyGroup = [getMarkerPos (selectRandom _spawnMarkers), east, (configFile >> 'CfgGroups' >> 'East' >> 'CUP_O_RU' >> 'Infantry_Ratnik_Summer' >> 'InfAssault')] call BIS_fnc_spawnGroup; //spawn group using new variable group name
            
            _SADwp = _enemyGroup addWaypoint [getPos waveTrg3, 0];
            _SADwp setWaypointType 'SAD';

            { if(_x inArea waveTrg3 && alive _x) then {_enemyGroup reveal _x} } forEach allUnits;
            {attackingGroup_3 reveal _x} forEach allPlayers;

            {defend3 reveal _x; apc4 reveal _x;} forEach units _enemyGroup;
            
            {_x forcespeed 10; _x setSkill 0.8; _x allowFleeing 0;} forEach units _enemyGroup;
            _enemyGroup setBehaviour 'COMBAT'; _enemyGroup setSpeedMode 'FULL';
            
            waitUntil { {alive _x} count units _enemyGroup < 5 }; //waits for previous group to have less than 5 units alive
            _groupIndex = _groupIndex + 1; //add +1 to index number for new group to be created
            sleep 1;
        };


The string is _enemyGroup where it holds septemberGroup0, septemberGroup1, septemberGroup2, etc... It creates a group every time the previous group has less than 5 units alive. So, the new group would be septemberGroup + new index at the end of the while loop.

My question is if this is the correct way of converting strings to variables for group names?

I could just use the same group name and spawn the same group every time the group has less than 5 units but from spectating the AI behavior they act really weird and stray away from their waypoint for some reason when the group respawns.


 

Share this post


Link to post
Share on other sites

If it works then it's good. I see no issue here for a mission that will not run 24/7.

Share this post


Link to post
Share on other sites
30 minutes ago, R3vo said:

If it works then it's good. I see no issue here for a mission that will not run 24/7.

 

is the variable _enemyGroup a string or a variable is my concern?

Share this post


Link to post
Share on other sites
2 minutes ago, sizraide said:

 

is the variable _enemyGroup a string or a variable is my concern?

It's group. You make it a string first but then you assign a group to it. The string is kinda redundant.

 

What I noticed is, you are potentially creating a new group every second so you need to keep track of the number of groups and either delete them if needed or make sure you are not exeeding a certain threshold.

  • Like 2

Share this post


Link to post
Share on other sites

A variable is a container or a reference for some kind of information.

 

_enemyGroup is a variable that contains some kind of data. The data that is held within _enemyGroup is what would be a string, or number, or object, or array, etc......

 

That's a pretty basic way of looking at it. But Revo is right. You're defining _enemyGroup as 'septemberGroup0' then just creating a group over the top of _enemyGroup so that _enemyGroup now just references that group.

 

 

  • Like 2

Share this post


Link to post
Share on other sites
2 hours ago, beno_83au said:

A variable is a container or a reference for some kind of information.

 

_enemyGroup is a variable that contains some kind of data. The data that is held within _enemyGroup is what would be a string, or number, or object, or array, etc......

 

That's a pretty basic way of looking at it. But Revo is right. You're defining _enemyGroup as 'septemberGroup0' then just creating a group over the top of _enemyGroup so that _enemyGroup now just references that group.

 

 

 

How can I create a new group to spawn after the previous group has less than 5 units living? By using new variables?

Share this post


Link to post
Share on other sites
1 hour ago, sizraide said:

 

How can I create a new group to spawn after the previous group has less than 5 units living? By using new variables?

You are already doing that.

  • Like 2

Share this post


Link to post
Share on other sites

Assuming you want each group to have a global variable so you can work with them outside this particular code block or outside the script, first you would declare the index before the while-do, then you would use call compile format (not tested)

_spawnMarkers = ['enemySpawn_4', 'enemySpawn_5', 'enemySpawn_6'];
_groupIndex = 0; //initial index

while {true} do 
{
	_enemyGroup = [getMarkerPos (selectRandom _spawnMarkers), east, (configFile >> 'CfgGroups' >> 'East' >> 'CUP_O_RU' >> 'Infantry_Ratnik_Summer' >> 'InfAssault')] call BIS_fnc_spawnGroup;

	// Define the group by the index# (septemberGroup0, septemberGroup1, septemberGroup2, etc.),
	Call Compile Format ['septemberGroup%1 = _enemyGroup',_groupIndex];

	_SADwp = _enemyGroup addWaypoint [getPos waveTrg3, 0];
	_SADwp setWaypointType 'SAD'; 

	{ if(_x inArea waveTrg3 && alive _x) then {_enemyGroup reveal _x} } forEach allUnits;

	{
		defend3 reveal _x;
		apc4 reveal _x;
		_x forcespeed 10;
		_x setSkill 0.8;
		_x allowFleeing 0;
	} forEach units _enemyGroup;

	_enemyGroup setBehaviour 'COMBAT';
	_enemyGroup setSpeedMode 'FULL';

	waitUntil {{alive _x} count units _enemyGroup < 5 }; //waits for previous group to have less than 5 units alive
	_groupIndex = _groupIndex + 1; //add +1 to index number for new group to be created
	sleep 1;
};

- Format creates the string: "septemberGroup0 = _enemyGroup"

- Compile converts the string to code: {septemberGroup0 = _enemyGroup}

- Call runs the code; you then have the variable defined so you can work with it.

- And as index increases, the strings contain "septemberGroup1", "septemberGroup2",  etc.

 

Assuming the server is running this: if clients also needed to work with those group variables, then you would use publicVariable to broadcast to all; but first format the variable to include its index.  After the call compile format line, you would insert:

	publicVariable Format ['septemberGroup%1',_groupIndex];

 

  • Like 1

Share this post


Link to post
Share on other sites

If you absolutely want to name a group this way, make it simple:


 

_groupIndex = 2; //example

missionNameSpace setVariable ["septemberGroup"+str _groupIndex, [getMarkerPos (selectRandom _spawnMarkers), east, (configFile >> 'CfgGroups' >> 'East' >> 'CUP_O_RU' >> 'Infantry_Ratnik_Summer' >> 'InfAssault')] call BIS_fnc_spawnGroup, TRUE];   // group is created and named septemberGroup2
private _enemyGroup = missionNameSpace getVariable ("septemberGroup"+str _groupIndex);  // same as septemberGroup2....

 

  • Like 2

Share this post


Link to post
Share on other sites
15 hours ago, pierremgi said:

If you absolutely want to name a group this way, make it simple:


 


_groupIndex = 2; //example

missionNameSpace setVariable ["septemberGroup"+str _groupIndex, [getMarkerPos (selectRandom _spawnMarkers), east, (configFile >> 'CfgGroups' >> 'East' >> 'CUP_O_RU' >> 'Infantry_Ratnik_Summer' >> 'InfAssault')] call BIS_fnc_spawnGroup, TRUE];   // group is created and named septemberGroup2
private _enemyGroup = missionNameSpace getVariable ("septemberGroup"+str _groupIndex);  // same as septemberGroup2....


 

 

If I want to refer to that group, I can type _enemyGroup?
For example if I type _enemyGroup setSpeedMode "FULL" it will refer to septemberGroup2?

Share this post


Link to post
Share on other sites

Yes, another way to call the group, if you follow the example.

The 1st line set the variable in mission namespace, so your variable:   missionNameSpace getVariable "septemberGroup2" (example above) is same as  septemberGroup2 (global variable, even public as 3rd parameter is set to true).

The second line is not mandatory:

private _enemyGroup = missionNameSpace getVariable ("septemberGroup"+str _groupIndex);

allows you to refer to _enemyGroup as another (local) variable. The only interest is this local reference is slightly faster for multiple commands, compared to global variables.

Time for you to read this page.

 

  • Like 1

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

×