PDA

Просмотр полной версии : [CMD] /setname [стандартный движок + sscanf] [MySQL R39-2]



BadPawn
18.01.2016, 16:27
Всем привет. Перед началом написания этой команды, искал на форумах, похожего найти не смог, поэтому выкладываю. Проверенное, рабочее. Пользуйтесь.


#define clightred 0xFF6347AA
#define cgrey 0xAFAFAFAA
#define cwhite 0xFFFFFFAA

CMD:

if(Command("/setname"))
{
if(GetPVarInt(playerid, "Admin") < 3) return 1;
if(sscanf(params, "us[32]", params[0], params[1])) return SendClientMessage(playerid, cwhite, "***Используйте: /setname [ID/Имя_Фамилия] [New_Name]");
if(!IsPlayerConnected(params[0])) return SendClientMessage(playerid, cgrey, "**Персонаж отсутствует на сервере.");
if(GetPVarInt(params[0], "Login") == 0) return SendClientMessage(playerid, cgrey, "**Не авторизирован.");
new query_string[128];
f(query_string,"SELECT * FROM `players` WHERE `NAME` = '%s'", params[1]);
mysql_function_query(mysql_connect_ID, query_string, false, "OnPlayerSetName", "ds", params[0], params[1]);
return 1;
}

Public:

forward OnPlayerSetName(playerid, text[]);
public OnPlayerSetName(playerid, text[])
{
static rows, fields;
cache_get_data(rows, fields);
switch(rows)
{
case 0:
{
new query_string[128];
f(query_string, "UPDATE `players` SET `NAME` = '%s' WHERE `ID` = '%d'", text, GetPVarInt(playerid, "Mysql_ID"));
mysql_function_query(mysql_connect_ID, query_string, false, "", "");
SetPlayerName(playerid, text);
GetPlayerName(playerid, Name(playerid), MAX_PLAYER_NAME);
new setnamemess[MAX_PLAYER_NAME+MAX_PLAYER_NAME+40];
f(setnamemess, "%s известен, как %s", Name(playerid), text); SendClientMessageToAll(clightred, setnamemess);
SendClientMessage(playerid, cyellow, "* Не забудьте ввести свой новый ник в SA:MP Client.");
}
case 1:
{
SendMes(playerid, cgrey, "**Ник %s используется!", text);
}
}
}

DeimoS
23.01.2016, 18:06
И да начнётся битва:
1) Для чего нам нужны твои макросы с HEX-кодами цветов? Может у меня свои имеются или я их вообще не использую. Нельзя было заменить макросы на HEX-Код, прежде чем выкладывать работу?
2) Опять же, зачем проверка на админку? Да ещё и в pVar (да и не только на админку проверка тут, как я вижу...). Какой-нибудь желторотик скопирует твой код в мод и у него даже не высветится ошибки о том, что он не использует подобный pVar для админки. И, при использовании команды, ничего у него работать не будет, ибо условие никогда не выполнится. Да и хранить данные об игроке в pVar... :no:
3) Функции, типа "f", "Name" или "SendMes", стали распространяться вместе с SA-MP? Зачем ты нам пытаешься какие-то свои функции пропихнуть, да ещё и не лучшего качества, если это то, о чём я думаю?
4) Массивы... Убил бы за подобное объявление массивов.
Дальше даже вникать не хочется. Ужасно. Совсем не подготовил код, прежде чем его публиковать. Неудачное начало

Роуди.
23.01.2016, 18:20
И да начнётся битва:
1) Для чего нам нужны твои макросы с HEX-кодами цветов? Может у меня свои имеются или я их вообще не использую. Нельзя было заменить макросы на HEX-Код, прежде чем выкладывать работу?
2) Опять же, зачем проверка на админку? Да ещё и в pVar (да и не только на админку проверка тут, как я вижу...). Какой-нибудь желторотик скопирует твой код в мод и у него даже не высветится ошибки о том, что он не использует подобный pVar для админки. И, при использовании команды, ничего у него работать не будет, ибо условие никогда не выполнится. Да и хранить данные об игроке в pVar... :no:
3) Функции, типа "f", "Name" или "SendMes", стали распространяться вместе с SA-MP? Зачем ты нам пытаешься какие-то свои функции пропихнуть, да ещё и не лучшего качества, если это то, о чём я думаю?
4) Массивы... Убил бы за подобное объявление массивов.
Дальше даже вникать не хочется. Ужасно. Совсем не подготовил код, прежде чем его публиковать. Неудачное начало

Начало конца?

VVWVV
23.01.2016, 18:51
Дополню список замечаний к вашему коду:
Во-первых, прочтите описании к функции SetPlayerName, а также немаловажные примечания, которые помогут вам.
Во-вторых, имя не может быть больше 24 (MAX_PLAYER_NAME) символов.

BadPawn
23.01.2016, 19:03
И да начнётся битва:
1) Для чего нам нужны твои макросы с HEX-кодами цветов? Может у меня свои имеются или я их вообще не использую. Нельзя было заменить макросы на HEX-Код, прежде чем выкладывать работу?
2) Опять же, зачем проверка на админку? Да ещё и в pVar (да и не только на админку проверка тут, как я вижу...). Какой-нибудь желторотик скопирует твой код в мод и у него даже не высветится ошибки о том, что он не использует подобный pVar для админки. И, при использовании команды, ничего у него работать не будет, ибо условие никогда не выполнится. Да и хранить данные об игроке в pVar... :no:
3) Функции, типа "f", "Name" или "SendMes", стали распространяться вместе с SA-MP? Зачем ты нам пытаешься какие-то свои функции пропихнуть, да ещё и не лучшего качества, если это то, о чём я думаю?
4) Массивы... Убил бы за подобное объявление массивов.
Дальше даже вникать не хочется. Ужасно. Совсем не подготовил код, прежде чем его публиковать. Неудачное начало

Учту. Критика всегда полезна. НО:
Я в павно не старый, учусь, поэтому можно было и подтолкнуть в нужное русло.

- - - Добавлено - - -


Дополню список замечаний к вашему коду:
Во-первых, прочтите описании к функции SetPlayerName, а также немаловажные примечания, которые помогут вам.
Во-вторых, имя не может быть больше 24 (MAX_PLAYER_NAME) символов.

Если правильно тебя понял, то речь об этом:


if(strcmp(cmdtext, "/superman", true) == 0)
{
switch(SetPlayerName(playerid, "Superman"))
{
case -1: SendClientMessage(playerid, 0xFF0000FF, "Unable to change your name, someone else is known as 'Superman' already.");
case 0: SendClientMessage(playerid, 0xFF0000FF, "You are already known as 'Superman'");
case 1: SendClientMessage(playerid, 0x00FF00FF, "You are now known as 'Superman'");
}
return 1;
}

DeimoS
23.01.2016, 19:23
Учту. Критика всегда полезна. НО:
Я в павно не старый, учусь, поэтому можно было и подтолкнуть в нужное русло.

Так своими замечаниями я именно это и пытался сделать... Осталось лишь прислушаться к ним и исправить все недочёты.
Ну, как я понимаю, ты хочешь увидеть готовый вариант. Я сделал бы что-то типа этого:

if(!strcmp(cmdtext, "/setname", true))
{
//Тут можете вставить ваш код проверки на администратора
new giveplayerid,
new_name[MAX_PLAYER_NAME];
if(sscanf(params, "us[24]", giveplayerid, new_name)) return SendClientMessage(playerid, 0xFFFFFFAA, "***Используйте: /setname [ID/Имя_Фамилия] [New_Name]");
if(!IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid, 0xAFAFAFAA, "**Персонаж отсутствует на сервере.");
//Так же можно вставить свои проверки, типа проверки на авторизацию и т.п.

static const fmt_query[] = "SELECT * FROM `имя_таблицы_аккаунтов` WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)];
format(query_string, sizeof(query_string), fmt_query, new_name);
mysql_function_query(mysql_connect_ID, query_string, false, "OnPlayerSetName", "dds", playerid, giveplayerid, new_name);
return 1;
}


forward OnPlayerSetName(admin_id, playerid, const text[]);
public OnPlayerSetName(admin_id, playerid, const text[])
{
new rows, fields;
cache_get_data(rows, fields);
if(rows) return SendClientMessage(admin_id, 0xAFAFAFAA, "**Ник %s используется!", text);
static const fmt_query[] = "UPDATE `имя_таблицы_аккаунтов` SET `имя_игрока` = '%s' WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)+(MAX_PLAYER_NAME-2)],
old_name[MAX_PLAYER_NAME];
GetPlayerName(playerid, old_name, MAX_PLAYER_NAME);
format(query_string, sizeof(query_string), fmt_query, new_name, old_name);
mysql_function_query(mysql_connect_ID, query_string, false, "", "");
SetPlayerName(playerid, text);
format(query_string, sizeof(query_string), "Теперь %s известен, как %s", old_name, text);
SendClientMessageToAll(0xFF6347AA, query_string);
SendClientMessage(playerid, 0xFF6347AA, "* Не забудьте ввести свой новый ник в SA:MP Client.");
return 1;
}
Но работоспособность не проверял, писал прямо в браузере. Тут и оптимизация кода в целом, и отсутствие лишних самописанных функций/макросов, которых у других может не быть.

VVWVV
23.01.2016, 19:28
stock OnPlayerSetName(admin_id, playerid, const text[])
{
new rows, fields;
cache_get_data(rows, fields);
if(rows) return SendClientMessage(admin_id, 0xAFAFAFAA, "**Ник %s используется!", text);
static const fmt_query[] = "UPDATE `имя_таблицы_аккаунтов` SET `имя_игрока` = '%s' WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)+(MAX_PLAYER_NAME-2)],
old_name[MAX_PLAYER_NAME];
GetPlayerName(playerid, old_name, MAX_PLAYER_NAME);
format(query_string, sizeof(query_string), query_string, new_name, old_name);
mysql_function_query(mysql_connect_ID, query_string, false, "", "");
SetPlayerName(playerid, text);
format(query_string, sizeof(query_string), "Теперь %s известен, как %s", old_name, text);
SendClientMessageToAll(0xFF6347AA, query_string);
SendClientMessage(playerid, 0xFF6347AA, "* Не забудьте ввести свой новый ник в SA:MP Client.");
return 1;
}
Но работоспособность не проверял, писал прямо в браузере. Тут и оптимизация кода в целом, и отсутствие лишних самописанных функций/макросов, которых у других может не быть.

Только не сток, а public.

DeimoS
23.01.2016, 19:43
Только не сток, а public.

Лол, спасибо. До самого момента отправления сообщения там был "public" и тут мне что-то в голову взбрело, что там идёт обычный вызов функции, а не MySQL запрос, и можно обойтись stock O_o

iWors
25.03.2016, 13:20
Так своими замечаниями я именно это и пытался сделать... Осталось лишь прислушаться к ним и исправить все недочёты.
Ну, как я понимаю, ты хочешь увидеть готовый вариант. Я сделал бы что-то типа этого:

if(!strcmp(cmdtext, "/setname", true))
{
//Тут можете вставить ваш код проверки на администратора
new giveplayerid,
new_name[MAX_PLAYER_NAME];
if(sscanf(params, "us[24]", giveplayerid, new_name)) return SendClientMessage(playerid, 0xFFFFFFAA, "***Используйте: /setname [ID/Имя_Фамилия] [New_Name]");
if(!IsPlayerConnected(giveplayerid)) return SendClientMessage(playerid, 0xAFAFAFAA, "**Персонаж отсутствует на сервере.");
//Так же можно вставить свои проверки, типа проверки на авторизацию и т.п.

static const fmt_query[] = "SELECT * FROM `имя_таблицы_аккаунтов` WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)];
format(query_string, sizeof(query_string), query_string, new_name);
mysql_function_query(mysql_connect_ID, query_string, false, "OnPlayerSetName", "dds", playerid, giveplayerid, new_name);
return 1;
}


forward OnPlayerSetName(admin_id, playerid, const text[]);
public OnPlayerSetName(admin_id, playerid, const text[])
{
new rows, fields;
cache_get_data(rows, fields);
if(rows) return SendClientMessage(admin_id, 0xAFAFAFAA, "**Ник %s используется!", text);
static const fmt_query[] = "UPDATE `имя_таблицы_аккаунтов` SET `имя_игрока` = '%s' WHERE `имя_игрока` = '%s'";// ИМЕНА ТАБЛИЦЫ И СТОЛБЦА С НИКОМ ЗАМЕНИТЬ НА СВОИ
new query_string[sizeof(fmt_query)+(MAX_PLAYER_NAME-2)+(MAX_PLAYER_NAME-2)],
old_name[MAX_PLAYER_NAME];
GetPlayerName(playerid, old_name, MAX_PLAYER_NAME);
format(query_string, sizeof(query_string), query_string, new_name, old_name);
mysql_function_query(mysql_connect_ID, query_string, false, "", "");
SetPlayerName(playerid, text);
format(query_string, sizeof(query_string), "Теперь %s известен, как %s", old_name, text);
SendClientMessageToAll(0xFF6347AA, query_string);
SendClientMessage(playerid, 0xFF6347AA, "* Не забудьте ввести свой новый ник в SA:MP Client.");
return 1;
}
Но работоспособность не проверял, писал прямо в браузере. Тут и оптимизация кода в целом, и отсутствие лишних самописанных функций/макросов, которых у других может не быть.

В public OnPlayerSetName(admin_id, playerid, const text[])

new new_name[MAX_PLAYER_NAME];
Далее

if(rows) return SendClientMessage(admin_id, 0xAFAFAFAA, "**Ник %s используется!", text);


format(query_string, sizeof(query_string), query_string, new_name); // получается ты трижды используешь query_string, а про fmt_query забыл

Seregamil
25.03.2016, 19:27
В public OnPlayerSetName(admin_id, playerid, const text[])

new new_name[MAX_PLAYER_NAME];
Далее

if(rows) return SendClientMessage(admin_id, 0xAFAFAFAA, "**Ник %s используется!", text);


format(query_string, sizeof(query_string), query_string, new_name); // получается ты трижды используешь query_string, а про fmt_query забыл

1) new new_name[ MAX_PLAYER_NAME + 1 ] ;
2) без форматирования компилятор пошлет в далекие края.

iWors
25.03.2016, 20:59
1) new new_name[ MAX_PLAYER_NAME + 1 ] ;
2) без форматирования компилятор пошлет в далекие края.

точн, забыл)