ACMD:admin[1](playerid, params[])
{
if(GetPlayerAdminLevel(playerid) < 2)
return Msg(playerid, RED, "[ > ] Vocк nгo tem permissгo para usar este comando.");
new name[MAX_PLAYER_NAME];
new Text3D:label = Create3DTextLabel("Admin", 0x33CCFFFF, 30.0, 40.0, 50.0, 10.0, 0);
GetPlayerName(playerid, name, sizeof(name));
if(GetPlayerState(playerid) == PLAYER_STATE_SPECTATING)
{
Msg(playerid, RED, "[ > ] Vocк nгo pode fazer isso enquanto estб espiando!");
return 1;
}
if(!IsPlayerOnAdminDuty(playerid))
{
TogglePlayerAdminDuty(playerid, true);
MsgAdminsF(1, NovoA, "[ > ] O(a) Administrador(a){FFFFFF} %s {00c0ff}saiu do modo jogador!", name);
Attach3DTextLabelToPlayer(label, playerid, 0.0, 0.0, 0.2);
}
else
{
TogglePlayerAdminDuty(playerid, false);
MsgAdminsF(1, NovoA, "[ > ] O(a) Administrador(a){FFFFFF} %s {00c0ff}entrou no modo jogador!", name);
Delete3DTextLabel(label);
}
return 1;
}
Understanding scope is important here. When you create a variable in a function, that variable only exists until the function exits or "returns" (hence, the `return` keyword).
In this case, you have a command - which is just a function - which allocates a new local variable `label`. This variable holds the numeric identifier for the text label created by `Create3DTextLabel`. These numeric identifiers are unique to each label, hence "identifier" or "ID". The problem you're facing is, that numeric identifier is lost when the function ends. Then when you call the function (via command) again, it starts from scratch and allocates a whole new variable and creates a whole new label. What you need to do is store the numeric identifier that identifies the label associated with the player globally. You also need to map (or "associate") label IDs to player IDs using an array. That array may have one element for each player and each element stores a label's ID. You can then use the player's ID as the index into the array. |