u specifier and mask id
#1

Hi, I made a whisper command, but I want it to work like that a player can type other player's part of name, id or mask id to whisper him. Here's the GetMaskPlayerID function and the command:
Код:
GetMaskPlayerID(maskid)
{
	for (new i, j = GetPlayerPoolSize(); i <= j; i++) if (IsPlayerConnected(i) && PlayerInfo[i][pMaskID] == maskid) return i;
	return INVALID_PLAYER_ID;
}

CMD:whisper(playerid, params[])
{
	new targetid, text[128];
	
	if (PlayerInfo[playerid][pDeathState] == DEATH_STATE_DEAD)
		return SendClientMessage(playerid, COLOR_LIGHTRED, "You can't whisper anyone while being dead.");
		
	if (sscanf(params, "us[128]", targetid, text))
		return SendClientMessage(playerid, COLOR_GREY, "USAGE: /whisper [playerid/name/maskid] [text]");

	if (targetid == INVALID_PLAYER_ID)
		return SendClientMessage(playerid, COLOR_LIGHTRED, "You have specified an invalid player.");
		
	if (!IsPlayerNearPlayer(playerid, targetid, 2.5))
		return SendClientMessage(playerid, COLOR_LIGHTRED, "You are near the specified player.");
		
	if (strlen(params) > 64) 
	{
	    SendClientMessageEx(playerid, COLOR_YELLOW, "* You whisper to %s: %.64s", GetName(targetid, 0), text);
	    SendClientMessageEx(playerid, COLOR_YELLOW, "...%s", text[64]);
		
	    SendClientMessageEx(targetid, COLOR_YELLOW, "* %s whispers you: %.64s", GetName(playerid, 0), text);
	    SendClientMessageEx(targetid, COLOR_YELLOW, "...%s", text[64]);
	}
	else
	{
	    SendClientMessageEx(playerid, COLOR_YELLOW, "* You whisper to %s: %s", GetName(targetid, 0), text);	
	    SendClientMessageEx(targetid, COLOR_YELLOW, "* %s whispers you: %s", GetName(playerid, 0), text);
	}
	return 1;
}
What I tried to do is
Код:
	if (targetid == INVALID_PLAYER_ID && GetMaskPlayerID(targetid) == INVALID_PLAYER_ID)
		return SendClientMessage(playerid, COLOR_LIGHTRED, "You have specified an invalid player.");
but then I realized that if I try to type in a mask id then sscanf will return 65535 because the mask id is an invalid player id so I can't use GetMaskPlayerID. So how would it be possible to use both u specifier and GetMaskPlayerID?

Also I have another question: shall I use normal variables or static variables (e.g for "targetid") in commands?
Reply
#2

2. Normal variables

maskid must be greater than MAX_PLAYERS if you want use [playerid / nick / maskid]
Reply
#3

Quote:
Originally Posted by Jefff
Посмотреть сообщение
maskid must be greater than MAX_PLAYERS if you want use [playerid / nick / maskid]
It is.
Reply
#4

Something like this will do I suppose:
pawn Код:
new targetid, text[128];
   
if (sscanf(params, "us[128]", targetid, text))
    return SendClientMessage(playerid, COLOR_GREY, "USAGE: /whisper [playerid/name/maskid] [text]");
       
if (targetid == INVALID_PLAYER_ID)
{
    if ((!sscanf(params, "is[128]", targetid, text) && targetid > MAX_PLAYERS && GetMaskPlayerID(targetid) == INVALID_PLAYER_ID)
        || targetid < MAX_PLAYERS)
        return SendClientMessage(playerid, COLOR_LIGHTRED, "You have specified an invalid player.");
}
Reply
#5

There are several other methods to do what you're trying to. I'm up late and this is what I've got in my quick drowsy thinking -

pawn Код:
CMD:whisper(playerid, params[]) {

    new
        target[MAX_PLAYER_NAME], //You're gonna take in ID/name as a string.
        text[128],
        ID //To either be used as player ID or mask ID.
    ;
   
    if(sscanf(params, "s["#MAX_PLAYER_NAME"]s[128]", target, text))
        return SendClientMessage(playerid, COLOR_GREY, "USAGE : /whisper [playerid/name/maskid] [text]");
       
    if(!IsNumeric(target)) //If the second argument given is not numeric, it's probably a player name?
        ID = GetPlayerNameByID(target); //Build a custom function that gets player ID from player name.
    else
        ID = strval(ID); //If it's an integer, it could either be player ID or mask ID.
       
    if(ID > MAX_PLAYERS) //Like you mentioned earlier, if it's greater than MAX_PLAYERS..
        //It's a mask ID.
    else
        //It's a player ID.
       
    return 1;
}
Another idea to do it within sscanf itself is to create a custom sscanf specifier.
Reply
#6

Quote:
Originally Posted by Konstantinos
Посмотреть сообщение
Something like this will do I suppose:
pawn Код:
new targetid, text[128];
   
if (sscanf(params, "us[128]", targetid, text))
    return SendClientMessage(playerid, COLOR_GREY, "USAGE: /whisper [playerid/name/maskid] [text]");
       
if (targetid == INVALID_PLAYER_ID)
{
    if ((!sscanf(params, "is[128]", targetid, text) && targetid > MAX_PLAYERS && GetMaskPlayerID(targetid) == INVALID_PLAYER_ID)
        || targetid < MAX_PLAYERS)
        return SendClientMessage(playerid, COLOR_LIGHTRED, "You have specified an invalid player.");
}
Thank you, it works.

Quote:
Originally Posted by Lordzy
Посмотреть сообщение
There are several other methods to do what you're trying to. I'm up late and this is what I've got in my quick drowsy thinking -

pawn Код:
CMD:whisper(playerid, params[]) {

    new
        target[MAX_PLAYER_NAME], //You're gonna take in ID/name as a string.
        text[128],
        ID //To either be used as player ID or mask ID.
    ;
   
    if(sscanf(params, "s["#MAX_PLAYER_NAME"]s[128]", target, text))
        return SendClientMessage(playerid, COLOR_GREY, "USAGE : /whisper [playerid/name/maskid] [text]");
       
    if(!IsNumeric(target)) //If the second argument given is not numeric, it's probably a player name?
        ID = GetPlayerNameByID(target); //Build a custom function that gets player ID from player name.
    else
        ID = strval(ID); //If it's an integer, it could either be player ID or mask ID.
       
    if(ID > MAX_PLAYERS) //Like you mentioned earlier, if it's greater than MAX_PLAYERS..
        //It's a mask ID.
    else
        //It's a player ID.
       
    return 1;
}
Another idea to do it within sscanf itself is to create a custom sscanf specifier.
Thanks, but Konstantinos' one seems to be easier. :P
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)