Jump to content
Sign in to follow this  
Angus S

Changing a units rank

Recommended Posts

Is it possible to change a units rank on a trigger activation?

Share this post


Link to post
Share on other sites
unitName [url="http://community.bistudio.com/wiki/setRank"]setRank[/url] "COLONEL";

Share this post


Link to post
Share on other sites
Is it possible to change a units rank on a trigger activation?

Hey

Did you get the setRank command to work on units??

and was this for a SP or MP game??

I am also trying to use the setRank on units but cannot get it to work.

Any pointers!!

thanks

Linrox

Share this post


Link to post
Share on other sites

I am also trying to use the setRank on units but cannot get it to work.

Any pointers!!

Well, we cant guess what you do wrong, so first post what you did that didnt work, then it would be alot easier to give pointers ;)

Share this post


Link to post
Share on other sites

I guess setRank effect is local.

So, one way to change rank in multiplayer would be using a publicVariableEventHandler.

Init.sqf

"changeRank" addPublicVariableEventHandler {
  _data = _this select 1;
  (_data select 0) setRank (_data select 1);
};

To change the rank (via Trigger or whatever) you can use:

changeRank = [_Unit, _Rank]; publicVariable "changeRank";

For example:

changeRank = [TheDude, "CAPTAIN"]; publicVariable "changeRank";

Share this post


Link to post
Share on other sites

as simple as this -

               requestedplayer= player;
	desiredrank = "PRIVATE";
	player setUnitRank desiredrank ;
	publicVariable "requestedplayer";
	publicVariable "desiredrank ";

Share this post


Link to post
Share on other sites

Well i though i would give you all an update.

I finally got it to work :D but it is rather messy.

Also this is not for MP, just SP.

Can any body tell me why it would not work like this even though the variables hold the right info.:confused:

//RankXmenu.sqf

Rank_menu = [
["Rank",false],
["Promote",[2],"#USER:Rank_menu",-5,[["expression","nul= [groupSelectedUnits player,('CAPTAIN')] execVM 'RankX\promote.sqf'"]],"1","1"]
];

BIS_MENU_GroupCommunication = [
[localize "STR_SOM_COMMUNICATIONS", false],["Rank",[2],"#USER:CUSTOM_menu",-5,[["expression",""]],"1","1"]
];
if (true) exitWith {};

//promote.sqf
_newRank = _this select 1;
_unit = _this selet 0;
_unit setRank (format ["%1",_newRank]);

instead i have to use this

//RankXmenu.sqf
sleep 1;
[] call BIS_fnc_commsMenuCreate;

CUSTOM_menu = [
["Rank",false],
["Promote",[2],"#USER:Rank_menu",-5,[["expression","player sidechat ""this is Rank (submenu)"]],"1","1"]
];

Rank_menu = [
["Rank",false],
["Corporal",[2],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\corporal.sqf'"]],"1","1"],
["Sergeant",[3],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\sergeant.sqf'"]],"1","1"],
["Lieutenant",[4],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\lieutenant.sqf'"]],"1","1"],
["Captain",[5],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\captain.sqf'"]],"1","1"],
["Major",[6],"",-5,[["expression","nul= groupSelectedUnits player execVM 'RankX\major.sqf'"]],"1","1"]
];

BIS_MENU_GroupCommunication = [
[localize "STR_SOM_COMMUNICATIONS", false],["Rank",[2],"#USER:CUSTOM_menu",-5,[["expression",""]],"1","1"]
];

if (true) exitWith {};

//Corporal.sqf

sleep 0.5;

_selected= _this select 0;

_newRank = "CORPORAL";

_selected setRank (format ["%1",_newRank]);

The Variable _newRank in both cases still holds the same value, but it only works when the variable is set in the same script.

I will be trying to clean it up. at the moment i need to use 1 file for each rank, which i don't like.

so i will keep reading forums and other scripts to help learn.

Linrox

Edited by Linrox

Share this post


Link to post
Share on other sites

Error in _unit = _this select 0 and it's an array.

so you need to decide which unit/units are getting promoted.

(_unit this select 0) setRank ect.

or { _x setrank (format ["%1",_newRank]);} foreach _unit;

I've not tested it so don't shoot me if I'm wrong.

Share this post


Link to post
Share on other sites

Yes i realized the typo error in that line after i had posted.

The typo does not exists in the actual script.

The unit/units being promoted are chosen by the

 nul = changeSelectedUnits player 

part in the menu script.

but i know i needed to add the foreach _unit; part as well

I have tested the value of both _unit and _newRank in both scripts and in both cases the _unit does hold the ID of the selected unit, and the _newRank does hold the rank to promote too.

so that's why i don't get it.

The only difference (that i can see) is the the first script receives the rank from the menu choice, and the second script gets the rank from the _newrank = "CAPTAIN"; in the promote.sqf script.

and yet if i use the hint format to print the content of the variables they are correct.

Share this post


Link to post
Share on other sites

I'm not that used to the custom menu scripting, I couldn't get your first RankXmenu.sqf to even allow the promote option to show.

Share this post


Link to post
Share on other sites

sorry that wasn't the full script.

Here is the init.sqf file and the menu.sqf files of both versions.

I have added for testing a few hint and hint format lines to make sure the script is reaching those points.

This is my current working version. but it is messy because i need a seperate file for each rank(i.e. corporoal.sqf,captain.sqf...).

You will also need to place a GL in the map editor with this

nul=[this] execVM "RankX\RankX_init.sqf";

in the initialization.

//RankX_init.sqf

waituntil {!isnil "bis_fnc_init"};
_HCLeader=_this select 0;
_UnitID=_this select 1;
_HCLeader hcSetGroup [group _HCLeader];

hint "init started";
sleep 1;
[] execVM "RankX\RankX_Menu.sqf";

//RankX_menu.swf
sleep 1;
[] call BIS_fnc_commsMenuCreate;

//This hint shows the SQF was started
hint "Menu Start";

CUSTOM_menu = [
["Rank",false],
["Promote",[2],"#USER:Rank_menu",-5,[["expression","player sidechat ""this is Rank (submenu)"]],"1","1"],
["Item 2",[3],"",-5,[["expression","hint 'Hello2!'"]],"1","1"]
];

Rank_menu = [
["Rank",false],
["Corporal",[2],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\corporal.sqf'"]],"1","1"],
["Sergeant",[3],"",-5,[["expression", "nul= groupSelectedUnits player execVM 'RankX\sergeant.sqf'"]],"1","1"]
];

BIS_MENU_GroupCommunication = [
[localize "STR_SOM_COMMUNICATIONS", false],["Rank",[2],"#USER:CUSTOM_menu",-5,[["expression",""]],"1","1"]
];

//if this hint is printed then script completed
hint "Menu Complete";

if (true) exitWith {};

//corporoal.sqf
//This hint shows the SQF was started
hint "Promote started";
sleep 0.5;

_unit= _this select 0;

_newRank = "CORPORAL";

_unit setRank (format ["%1",_newRank]);

//if this hint is printed then script completed
hint "Promote end";
sleep 0.5;

and here is the other version that i could not get to work.

you will notice the hint format prints the same results as the version that i am currently using.

The init.sqf is the same for both versions

//RankX_menu.swf
sleep 1;
[] call BIS_fnc_commsMenuCreate;

//This hint shows the SQF was started
hint "Menu Start";

CUSTOM_menu = [
["Rank",false],
["Promote",[2],"#USER:Rank_menu",-5,[["expression","player sidechat ""this is Rank (submenu)"]],"1","1"],
//["Item 2",[3],"",-5,[["expression","hint 'Hello2!'"]],"1","1"]
];

Rank_menu = [
["Rank",false],
["Corporal",[2],"",-5,[["expression", "nul= [groupSelectedUnits player,('CORPORAL')] execVM 'RankX\corporal.sqf'"]],"1","1"],
["Sergeant",[3],"",-5,[["expression", "nul= [groupSelectedUnits player,('SERGEANT')] execVM 'RankX\sergeant.sqf'"]],"1","1"]
];

BIS_MENU_GroupCommunication = [
[localize "STR_SOM_COMMUNICATIONS", false],["Rank",[2],"#USER:CUSTOM_menu",-5,[["expression",""]],"1","1"]
];

//if this hint is printed then script completed
hint "Menu Complete";

if (true) exitWith {};

If I can get this part of the script to work correctly then i would only need 1 file for the actual promotion, not 1 per rank.

//corporoal.sqf
//This hint shows the SQF was started
hint "Promote started";
sleep 0.5;

_unit= _this select 0;
_newRank = _this select 1;

//just prints results
hint format ["%1",_newRank];
sleep 1;
hint format ["%1",_unit];
sleep 1;

_unit setRank (format ["%1",_newRank]);

//if this hint is printed then script completed
hint "Promote end";
sleep 0.5;

Share this post


Link to post
Share on other sites

I have to ask as I'm getting several errors are you using _showscript http://forums.bistudio.com/showthread.php?t=121163

Anyway I still don't really see the problem, this is where I got earlier and as far as I can tell it works. I did change a file name and pass the player in case it's needed later.

As a final test I created a trigger and had a unit named bill set to private and when promoted the trigger will execute and the unit dies.

Cond rank bill != "private"

onact bill setdamage 1;

Bill only dies when his rank is changed.

//RankXmenu.sqf

waituntil {!isnil "bis_fnc_init"};
[] call BIS_fnc_commsMenuCreate ;


CUSTOM_menu = [
["Rank",false],
["Promote",[2],"#USER:Rank_menu",-5,[["expression","player sidechat ""this is Rank (submenu)"]],"1","1"]
];

Rank_menu = [
["Promote",false],
["Private",[2],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'PRIVATE'] execVM 'RankX\Change.sqf'"]],"1","1"],
["Corporal",[3],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'CORPORAL'] execVM 'RankX\Change.sqf'"]],"1","1"],
["Sergeant",[4],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'SERGEANT'] execVM 'RankX\Change.sqf'"]],"1","1"],
["Lieutenant",[5],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'LIEUTENANT'] execVM 'RankX\Change.sqf'"]],"1","1"],
["Captain",[6],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'CAPTAIN'] execVM 'RankX\Change.sqf'"]],"1","1"],
["Major",[7],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'MAJOR'] execVM 'RankX\Change.sqf'"]],"1","1"],
["Colonel",[8],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'COLONEL'] execVM 'RankX\Change.sqf'"]],"1","1"]
];



BIS_MENU_GroupCommunication = [
[localize "STR_SOM_COMMUNICATIONS", false],["Rank",[2],"#USER:CUSTOM_menu",-5,[["expression",""]],"1","1"]
];

if (true) exitWith {};

//change.sqf

_unit_player =_this select 0;
_unit = _this select 1;
_newRank = _this select 2;

{
hint format ["Current Rank %1",rank _x];
Sleep 1;

   _x setRank _newRank;
 //  _x setRank (format ["%1",_newRank]);
 Sleep 1;
 hint format ["New Rank is %1",rank _x];
} foreach _unit;

Edited by F2k Sel

Share this post


Link to post
Share on other sites

no, did not even know about the _showscript command

I think i might know why you are getting errors, i am using ARMA 2 OA, but i also have Reinforcements installed which includes BAF & PMC. http://www.arma2.com/rft

also remember this is for SP not MP, if that makes any difference.

Edited by Linrox

Share this post


Link to post
Share on other sites

Yeah i tried just using the setrank command (for SP) and it worked perfctly

Share this post


Link to post
Share on other sites
no, did not even know about the _showscript command

I think i might know why you are getting errors, i am using ARMA 2 OA, but i also have Reinforcements installed which includes BAF & PMC. http://www.arma2.com/rft

also remember this is for SP not MP, if that makes any difference.

I have the same content, the error was just a comma that should have been removed when you split the promote line.

Share this post


Link to post
Share on other sites

Thanks all for your help, especially F2k sel

I will give it a try.

UPDATE

Works well:bigsmile:, thank you.:icon_eek:

Edited by Linrox

Share this post


Link to post
Share on other sites

Str Sel:

I am trying to add an if statement in the {} brackets in the change.sqf file. but the script will not run.

the line i am trying to add is

{
if (rankId _x > rankId _unit_player) exitWith {};

I have also tried adding the line before the { but it stops at the line.

Any help?

I have also tried this

_unit_player =_this select 0;
_unit = _this select 1;
_newRank = _this select 2;
if (rankId _unit < rankId _unit_player)
{
   hint format ["Current Rank %1",rank _x];
   Sleep 1;

   _x setRank _newRank;
 //  _x setRank (format ["%1",_newRank]);
 Sleep 1;
 hint format ["New Rank is %1",rank _x];
} foreach _unit; 
};

but still no joy

Edited by Linrox

Share this post


Link to post
Share on other sites

Something like this should work.

//change.sqf

_unit_player =_this select 0;
_unit = _this select 1;
_newRank = _this select 2;


{
if (rankId _x  == rankid _unit_player) exitwith  {hint "Your already equal in rank"};
if (rankId _x  >= rankid _unit_player) exitwith  {hint "You cannot promote beyond your rank"};

sleep 1;
hint format ["Current Rank %1",rank _x];
Sleep 1;

   _x setRank _newRank;
 //  _x setRank (format ["%1",_newRank]);
 Sleep 1;
 hint format ["New Rank is %1",rank _x];
} foreach _unit;

Share this post


Link to post
Share on other sites

i tried something similar, but it errors received an array, but wanted an object.

I did end up fixing it. Thanks to you tip -showscripterror

but ultimately, i wanted to use 'if ' conditions in the menu script so i could enable or disable options based on the players rank.

Plus i found that with the current menu, if i select higher that 7 it errors, missing ]

so i need a line to prevent that.

here is what the promote.sqf currently looks like

//change.sqf
_o=1;
_unit_player =_this select 0;
_unit = _this select 1;
_newRank = _this select 2;
_rankI = _this select 3;
_p=rankId _unit_player;


{
if (_p > _rankI-1) 
then {

hint format ["Current Rank %1",rank _x];
Sleep 1; 
_x setRank _newRank;
hint format ["New Rank is %1",rank _x];
sleep 3;
};// else {exitWith {hint format ["can't promote %1 to %2",_unit,_newRank]};
}foreach _unit; 

if (count _unit <1) exitWith {titleText ["No unit is selected", "PLAIN DOWN"]};

also i don't understand why, if i add a line rankID=rankI-1 it returns as scalar.

thanks for the reply, and for your help

Edited by Linrox

Share this post


Link to post
Share on other sites

Try this and see if were a little closer.

You only see the ranks available and if no units selected they are greyed out.

The only option I couldn't do in the menu was if a unit of higher rank joins your group, that has to be checked in for in change.sqf.

// if using team switch you will need to set up onteamswitch.
// onteamswitch "null=[]execvm 'RankXmenu.sqf'"
//
// If you make any changes to the players rank you will need to rerun the script.
// That will allow updates to the new rank to take effect.
//
// use the following to run the ranking system.
// null=[] execvm "RankXmenu.sqf"
//

sleep 1;
[] call BIS_fnc_commsMenuCreate;

CUSTOM_menu = [
["Rank",false],
["Promote",[2],"#USER:Rank_menu",-5,[["expression",""]],"1","1"]
];

_rank_pl = rankID player;
_rank=[];

//Remove Promotions above the players rank.
for "_i" from  0 to 6 do {
 if (_rank_pl >= _i)  then {_rank = _rank+["1"]} else {_rank = _rank+["0"]} ;
}; 

// "NotEmpty" = greyed out if no unit selected.

Rank_menu = [
["Promote",false],
["1 Private",[],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'PRIVATE',0] execVM 'Rankx\Change.sqf'"]],_rank select 0,"NotEmpty"],
["2 Corporal",[],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'CORPORAL',1] execVM 'Rankx\Change.sqf'"]],_rank select 1,"NotEmpty"],
["3 Sergeant",[],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'SERGEANT',2] execVM 'Rankx\Change.sqf'"]],_rank select 2,"NotEmpty"],
["4 Lieutenant",[],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'LIEUTENANT',3] execVM 'Rankx\Change.sqf'"]],_rank select 3,"NotEmpty"],
["5 Captain",[],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'CAPTAIN',4] execVM 'Rankx\Change.sqf'"]],_rank select 4,"NotEmpty"],
["6 Major",[],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'MAJOR',5] execVM 'Rankx\Change.sqf'"]],_rank select 5,"NotEmpty"],
["7 Colonel",[],"",-5,[["expression","nul=[player,(groupSelectedUnits player),'COLONEL',6] execVM 'Rankx\Change.sqf'"]],_rank select 6,"NotEmpty"]
];


BIS_MENU_GroupCommunication = [
[localize "STR_SOM_COMMUNICATIONS", false],["Rank",[2],"#USER:Rank_menu",-5,[["expression",""]],"1","1"]
];

if (true) exitWith {hint "I'm out of here"};// remove hint (testing only).

//change.sqf

_unit_player =_this select 0;
_unit        = _this select 1;
_newRank     = _this select 2;
_rank_pl     = _this select 3;// may not be needed

{
  _pass = true;
    if (rankID _x  > rankid _unit_player) then  {hint format ["Can't demote a superior officer %1 to %2",_x,_newRank];_pass= false};
       If (_pass) then {
        sleep 1;
          hint format ["Current Rank %1",rank _x];
          Sleep 1;
          _x setRank _newRank;
      Sleep 1;
   hint format ["New Rank %1",rank _x];
};

} foreach _unit;  


Edited by F2k Sel

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
Sign in to follow this  

×