PDA

Просмотр полной версии : [Вопрос] Помогите с командой!



Sash.
12.07.2018, 19:16
Всем привет. Изучаю язык pawn в целом, около месяца, дается тяжело.
При создании команды /setskin я представлял ее отображение в следующем виде: "Администратор Denis_Ivanov изменил Ваш скин" - это сообщение для игрока, которому был изменен скин.
Для админа, сменившего скин следующий текст: "Вы изменили скин игроку Ivan_Denisov".
Но в игре, ни одно имя не отображается.
Прошу помощи.
По поводу быдлокода не ругайте, я ж новичек.
Сам код:

CMD:setskin(playerid,params[])
{
new string[128], aName[MAX_PLAYER_NAME],str[128];
GetPlayerName(playerid,aName,sizeof(aName));
if(!IsPlayerAdmin(playerid)) return SCM(playerid,0x696969AA,"Неизвестная команда");
if(sscanf(params,"dd",params[0],params[1])) return SCM(playerid,-1,"Используйте: /setskin [ID игрока] [ID скина]");
if(!IsPlayerConnected(params[0])) return SCM(playerid,-1,"Игрока нет на сервере");
if((params[1] < 0) || (params[1] > 311)) return SCM(playerid,-1,"ID cкина не менее 0 и не более 311!");
format(string,sizeof(string),"Администратор %s изменил Ваш скин", aName);
format(str,sizeof(str),"Вы изменили скин игроку %s", params[0]);
SetPlayerSkin(params[0],params[1]);
if(IsPlayerAdmin(playerid)) return SCM(playerid,0x00C0FFAA,str);
SCM(params[0],0x00C0FFAA,string);
return 1;
}

DeimoS
12.07.2018, 20:39
Ты ник не получил второго игрока. Ну и есть другие проблемы. Вот так, в общем
CMD:setskin_id(playerid,params[])
{
if(!IsPlayerAdmin(playerid))
return SendClientMessage(playerid,0x696969AA,"Неизвестная команда");

new giveplayerid,
skin_id;
if(sscanf(params,"ud", giveplayerid, skin_id))
return SendClientMessage(playerid,-1,"Используйте: /setskin_id [ID игрока] [ID скина]");

if(giveplayerid == INVALID_PLAYER_ID)
return SendClientMessage(playerid,-1,"Игрока нет на сервере");

if((skin_id < 0) || (skin_id > 311))
return SendClientMessage(playerid,-1,"ID cкина не менее 0 и не более 311!");

new string[33+MAX_PLAYER_NAME+1];

GetPlayerName(giveplayerid, string, MAX_PLAYER_NAME);
format(string, sizeof(string), "Вы изменили скин игроку %s", string);
SendClientMessage(playerid, 0x00C0FFAA, string);

GetPlayerName(playerid, string, MAX_PLAYER_NAME);
format(string,sizeof(string),"Администратор %s изменил Ваш скин", string);
SendClientMessage(giveplayerid, 0x00C0FFAA, string);

SetPlayerSkin(giveplayerid, skin_id);
return 1;
}

Sash.
12.07.2018, 20:48
- - - Добавлено - - -

Спасибо! А какие другие проблемы? Укажите, приму во внимание

Skyline
12.07.2018, 20:53
1. К примеру ты юзаешь массив, вместо переменных, которые работают быстрее.
2. Указываешь индификатор, который получает только число а не ник/ID.
3. Сделать лучше в enum pInfo:

pName
в OnPlayerConnect

GetPlayerName(playerid, pInfo[playerid][pName], MAX_PLAYER_NAME);
Чтобы постоянно не узнавать имя игрока, а юзать pInfo[playerid][pName].
Размер массива, для этого 128 - слишком большой, выделяешь много лишнего и даешь нагрузку ненужную.

DeimoS
12.07.2018, 21:47
Ну, как видишь, я, например, перенёс вот этот код

new string[128], aName[MAX_PLAYER_NAME],str[128];
GetPlayerName(playerid,aName,sizeof(aName));
после всех условий, дабы он не срабатывал впустую тогда, когда игрок, например, не админ.

Так же, в твоём случае, можно было обойтись одним массивом, а не тремя, что тоже видно в моём примере.

Ну и лучше сразу привыкать писать нормальные имена функций/переменных, а не использовать SCM/params[0]. Это на производительность не влияет (ну не во всех случаях), но читаемость кода ухудшается, что тоже немаловажно.