PDA

Просмотр полной версии : [Вопрос] sscanf id/playername



whybladez
12.03.2021, 00:45
здравствуйте, пытаюсь со сканфом разобраться
делаю кмд чтоб сажать в тюрьму игроков online/offline
с оффлайном вроде работает, а если вводить id - то он считает этот id за строку

new pId, pName[24], minutes, reason[64];

if(isNumeric(params[0])) { // Input ID

print("Num");
if(sscanf(params, "ids[64]", pId, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
if(!IsPlayerConnected(pId)) return SendClientMessage(playerid, -1, "{bfc0c2}Игрок не в сети");
format(pName, sizeof(pName), "%s", getName(pId));

playerInfo[pId][jailTime] = minutes * 60;
SetPlayerInterior(pId, 1);
SetPlayerPos(pId, 1302.519897,-1.787510,1001.028259);
} else { // Input Name
if(strlen(params[0]) > 0) {
if(sscanf(params, "s[24]ds[64]", pName, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
}
}

new selectQuery[128];
mysql_format(dbHandle, selectQuery, sizeof(selectQuery), "SELECT `Username` FROM `players` WHERE `Username` = '%s'", pName);
mysql_query(dbHandle, selectQuery);

new rows = cache_num_rows();

if(rows)
{
new updateQuery[128];
mysql_format(dbHandle, updateQuery, sizeof(updateQuery), "UPDATE `players` SET `Jail` = '%d' WHERE `Username` = '%s'", minutes, pName);
mysql_query(dbHandle, updateQuery);
}

oukibt
12.03.2021, 03:39
new pId, pName[24], minutes, reason[64];

if(!sscanf(params, "dds[64]", pId, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
{ // Если ввёл ID

}
else if(!sscanf(params, "s[25]ds[64]", pName, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
{ // Если ввёл имя

}
else return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");

/// Other code

DeimoS
12.03.2021, 11:02
+- так
new input_name[MAX_PLAYER_NAME];
new minute;
if(sscanf(params, "s[20]is[128]", input_name, minute, params))
{
SendClientMessage(playerid, 0xbfc0c2FF, "Используйте: /prison [playerid / username] [minutes] [reason]");
return 1;
}
new target_id = -1;
if(sscanf(input_name, "i", target_id))
{
foreach(new i: Player)
{
if(!strcmp(getName(i), input_name))
{
target_id = i;
break;
}
}
}

if(target_id >= 0)
{
if(!IsPlayerConnected(target_id))
{
SendClientMessage(playerid, 0xbfc0c2FF, "Игрок с указанным ID не найден на сервере.");
return 1;
}
input_name[0] = '\0';
strcat(input_name, getName(target_id));
}


if(target_id != -1)
{
playerInfo[target_id][jailTime] = minute * 60;
SetPlayerInterior(target_id, 1);
SetPlayerPos(target_id, 1302.519897,-1.787510,1001.028259);

SendClientMessage(playerid, -1, "Игрок посажен онлайн");
SendClientMessage(playerid, -1, "Причина:");
SendClientMessage(playerid, -1, params);
}
else
{
new query_string[47+MAX_PLAYER_NAME+1];
mysql_format(dbHandle, query_string, sizeof(query_string), "SELECT id FROM players WHERE Username='%e' LIMIT 1", input_name);
new Cache:r = mysql_query(dbHandle, query_string);

if(cache_num_rows())
{
new id;
cache_get_value_name_int(0, "id");
cache_delete(r);
mysql_format(dbHandle, query_string, sizeof(query_string),
"UPDATE players SET Jail=%d WHERE id=%i", minute, id);
mysql_query(dbHandle, query_string);

SendClientMessage(playerid, -1, "Игрок посажен оффлайн");
SendClientMessage(playerid, -1, "Причина:");
SendClientMessage(playerid, -1, params);
}
else
{
SendClientMessage(playerid, 0xbfc0c2FF, "Указанный игрок не найден.");
return 1;
}
}

"id" в запросе замени на имя столбца, в котором у тебя хранится ID аккаунта



new pId, pName[24], minutes, reason[64];

if(!sscanf(params, "dds[64]", pId, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
{ // Если ввёл ID

}
else if(!sscanf(params, "s[25]ds[64]", pName, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");
{ // Если ввёл имя

}
else return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");

/// Other code


По какой логике твой код должен работать? Ты прерываешь выполнение кода в случае, если условие не сработало (при том, в случае, если sscanf успешно обработал строку), и, при этом, добавляешь следующие условия в else?

oukibt
12.03.2021, 18:42
По какой логике твой код должен работать?

Примерно по такой


new pId, pName[24], minutes, reason[64];

if(!sscanf(params, "dds[64]", pId, minutes, reason))
{ // Если ввёл ID

if(!IsPlayerConnected(pId)) return SendClientMessage(playerid, -1, "{bfc0c2}Игрок не в сети");

format(pName, sizeof(pName), "%s", getName(pId));

playerInfo[pId][jailTime] = minutes * 60;
SetPlayerInterior(pId, 1);
SetPlayerPos(pId, 1302.519897, -1.787510, 1001.028259);

new selectQuery[128];
mysql_format(dbHandle, selectQuery, sizeof(selectQuery), "SELECT `Username` FROM `players` WHERE `Username` = '%s'", pName);
mysql_query(dbHandle, selectQuery);
}
else if(!sscanf(params, "s[25]ds[64]", pName, minutes, reason))
{ // Если ввёл имя

new selectQuery[128];
mysql_format(dbHandle, selectQuery, sizeof(selectQuery), "SELECT `Username` FROM `players` WHERE `Username` = '%s'", pName);
mysql_query(dbHandle, selectQuery);
}
else return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");

new rows = cache_num_rows();

if(rows)
{
new updateQuery[128];
mysql_format(dbHandle, updateQuery, sizeof(updateQuery), "UPDATE `players` SET `Jail` = '%d' WHERE `Username` = '%s'", minutes, pName);
mysql_query(dbHandle, updateQuery);
}


Да, с виду вариант далеко не идеальный, так как один и тот же код есть в обеих условиях. Можно, конечно, этого избежать, сделав вот такой вариант


new pId, pName[24], minutes, reason[64];

if(!sscanf(params, "dds[64]", pId, minutes, reason))
{ // Если ввёл ID

if(!IsPlayerConnected(pId)) return SendClientMessage(playerid, -1, "{bfc0c2}Игрок не в сети");

format(pName, sizeof(pName), "%s", getName(pId));

playerInfo[pId][jailTime] = minutes * 60;
SetPlayerInterior(pId, 1);
SetPlayerPos(pId, 1302.519897, -1.787510, 1001.028259);
}
else if(!sscanf(params, "s[25]ds[64]", pName, minutes, reason))
{ // Если ввёл имя

}
else return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");

new selectQuery[128];
mysql_format(dbHandle, selectQuery, sizeof(selectQuery), "SELECT `Username` FROM `players` WHERE `Username` = '%s'", pName);
mysql_query(dbHandle, selectQuery);

new rows = cache_num_rows();

if(rows)
{
new updateQuery[128];
mysql_format(dbHandle, updateQuery, sizeof(updateQuery), "UPDATE `players` SET `Jail` = '%d' WHERE `Username` = '%s'", minutes, pName);
mysql_query(dbHandle, updateQuery);
}


Но кода во втором условии не будет вообще.

Что насчет вот этого:


if(!sscanf(params, "dds[64]", pId, minutes, reason)) return SendClientMessage(playerid, -1, "{bfc0c2}Используйте: /prison [playerid / username] [minutes] [reason]");


Не увидел