Помогите с командой /ban

Zeox

Известный
Автор темы
9
0
[c]Банит на непонятное кол-во дней и не пишет первую букву причины.

olllud1.png
[/c]
Код:
CMD:ban(playerid, params[])
{
    if(player_data[playerid][ADMIN] < 3) return 1;
    if(sscanf(params, "uds[36]", params[0], params[1], params[2])) return SendClientMessage(playerid,CGRAY,"Используйте: /ban [id игрока] [К-во дней] [причина]");
    if(!IsPlayerConnected(params[0]) || IsKicked(params[0])) return SendClientMessage(playerid,CGRAY,"Неверный ID");
    if(!player_data[params[0]][MYSQLID])
    {
        NewKick(params[0]);
        return SendClientMessage(playerid,CGRAY,"Этот игрок не зарегистрирован, поэтому был кикнут");
    }
    if(params[1] < 1 || params[1] > 30 && player_data[playerid][ADMIN] < 5) return SendClientMessage(playerid,CGRAY,"Неверное к-во дней");
    if(params[1] < 0 || params[1] > 30 && player_data[playerid][ADMIN] >= 5) return SendClientMessage(playerid,CGRAY,"Неверное к-во дней");
    new mes[128];
    new nick[24];
    ServerBan(playerid,params[0],params[1],params[2]);
    GetPlayerName(params[0],nick,24);
    format(mes,sizeof(mes),"Администратор %s забанил игрока %s на %d дней. Причина:%s",player_data[playerid][NICKNAME],nick,params[2],params[3]);
    SCMTOALL(COLOR_LIGHTRED,mes);
    SendRconCommand("ban");
    NewKick(params[0]);
    return 1;
}
 
Решение
*знаю, что поздно, но на заметку мб кто-то и возьмёт себе.

C:
CMD:ban(playerid, params[])
{
    if(player_data[playerid][ADMIN] < 3) return 1;
    if(sscanf(params, "uds[36]", params[0], params[1], params[2])) return SendClientMessage(playerid, CGRAY, "Используйте: /ban [id игрока] [кол-во дней] [причина]");
    if(!IsPlayerConnected(params[0]) || IsKicked(params[0])) return SendClientMessage(playerid, CGRAY, "Неверный ID");
    if(!player_data[params[0]][MYSQLID])
    {
        NewKick(params[0]);
        return SendClientMessage(playerid, CGRAY, "Этот игрок не зарегистрирован, поэтому был кикнут");
    }
    if(params[1] < 1 || params[1] > 30 && player_data[playerid][ADMIN] < 5) return SendClientMessage(playerid,CGRAY,"Неверное кол-во дней")...

Pakulichev

Software Developer & System Administrator
Друг
1,789
2,130
C:
if(sscanf(params, "uds[36]", params[0], params[1], params[2])) return SendClientMessage(playerid,CGRAY,"Используйте: /ban [id игрока] [К-во дней] [причина]");
Если мне не изменяет память, такую хрень с params мутить не нужно - лучше создать дополнительные переменные с нужной размерностью.
 

haman samp

Новичок
7
0
Если появятся ошибки, напиши в личные сообщения форума
Код:
CMD:ban(playerid,params[])
{
    if(player_data[playerid][ADMIN] < 3)
        return true;
    
    new
        target_id,
        num_ban,
        result[30];
    
    if(sscanf(params,"dds[30]",target_id, num_ban, result)
        return SendClientMessage(playerid,CGRAY,!"Используйте: /ban [id игрока] [К-во дней] [причина]");
        
    else if(target_id == INVALID_PLAYER_ID)
        return SendClientMessage(playerid,CGRAY,!"Игрок находиться в OFFLINE");
    
    else if(!(0 <= num_ban <= 31) && player_data[playerid][ADMIN] < 5)
        return SendClientMessage(playerid,CGRAY,!"Неверное кол-ва дней");
    else if(!(-1 <= num_ban <= 31) && player_data[playerid][ADMIN] >= 5)
        return SendClientMessage(playerid,CGRAY,!"Неверно кол-ва дней");
    else if(strlen(result) >= 30)
        return SendClientMessage(playerid,CGRAY,!"Превышено макс. кол-ва символов в причине");
    
    ServerBan(playerid,target_id, num_ban, result);
    new
        string[128+1];
    format(string,sizeof string, "Администратор %s забанил игрока %s на %d дней. Причина: %s",
        player_data[playerid][NICKNAME],player_data[target_id][NICKNAME],
        num_ban, result);
    SCMTOALL(COLOR_LIGHTRED, string);
    SendRconCommand("ban");
    NewKick(target_id);
    
    return true;
}
 

shao^=^

Новичок
3
0
PHP:
CMD:ban(playerid, params[])
{
    if(player_data[playerid][ADMIN] < 3)
        return 1;
   
    extract params -> new id, day, string: reason[36]; else
        return SendClientMessage(playerid, CGRAY, "Используйте: /ban [id игрока] [К-во дней] [причина]");

    if(!IsPlayerConnected(id) || IsKicked(id))
        return SendClientMessage(playerid, CGRAY, "Неверный ID");
   
    if(id == playerid)
        return SendClientMessage(playerid, -1, "Себя нельзя, долбаёб");
   
    if(!player_data[id][MYSQLID])//лучше сделай макросом
    {
        NewKick(id);
       
        return SendClientMessage(playerid, CGRAY,"Этот игрок не зарегистрирован, поэтому был кикнут");
    }
   
    if(!(1 <= day <= 30))
        return SendClientMessage(playerid, CGRAY,"Неверное к-во дней");
   
    new nick[MAX_PLAYER_NAME + 1];
   
    ServerBan(playerid, id, day, reason);
   
    GetPlayerName(id, nick, sizeof nick);//замени на макрос, а то не оч
   
    STRING_GLOBAL[0] = EOS;
   
    format
    (
        STRING_GLOBAL, sizeof STRING_GLOBAL,
        "Администратор %s забанил игрока %s на %d дней. Причина:%s",
        player_data[playerid][NICKNAME],
        nick,
        day,
        reason
    );
   
    SCMTOALL(COLOR_LIGHTRED, STRING_GLOBAL);
   
    SendRconCommand("ban");//чтобы унбанить, удали свой ник в samp.ban
   
    NewKick(id);
   
    return 1;
}
ко всем переменным new STRING_GLOBAL[2248], прислушайся кста к советам.
 

Woody Allen

Новичок
1
0
if(sscanf(params, "uds[36]", params[0], params[1], params[2])) return SendClientMessage(playerid,CGRAY,"Используйте: /ban [id игрока] [К-во дней] [причина]");


format(mes,sizeof(mes),"Администратор %s забанил игрока %s на %d дней. Причина:%s",player_data[playerid][NICKNAME],nick,params[2],params[3]);
 

S-Sirius

Известный
353
21
[c]Банит на непонятное кол-во дней и не пишет первую букву причины.

olllud1.png
[/c]
Код:
CMD:ban(playerid, params[])
{
    if(player_data[playerid][ADMIN] < 3) return 1;
    if(sscanf(params, "uds[36]", params[0], params[1], params[2])) return SendClientMessage(playerid,CGRAY,"Используйте: /ban [id игрока] [К-во дней] [причина]");
    if(!IsPlayerConnected(params[0]) || IsKicked(params[0])) return SendClientMessage(playerid,CGRAY,"Неверный ID");
    if(!player_data[params[0]][MYSQLID])
    {
        NewKick(params[0]);
        return SendClientMessage(playerid,CGRAY,"Этот игрок не зарегистрирован, поэтому был кикнут");
    }
    if(params[1] < 1 || params[1] > 30 && player_data[playerid][ADMIN] < 5) return SendClientMessage(playerid,CGRAY,"Неверное к-во дней");
    if(params[1] < 0 || params[1] > 30 && player_data[playerid][ADMIN] >= 5) return SendClientMessage(playerid,CGRAY,"Неверное к-во дней");
    new mes[128];
    new nick[24];
    ServerBan(playerid,params[0],params[1],params[2]);
    GetPlayerName(params[0],nick,24);
    format(mes,sizeof(mes),"Администратор %s забанил игрока %s на %d дней. Причина:%s",player_data[playerid][NICKNAME],nick,params[2],params[3]);
    SCMTOALL(COLOR_LIGHTRED,mes);
    SendRconCommand("ban");
    NewKick(params[0]);
    return 1;
}
dds[36] попробуй
 

repugnantbytheway

Известный
140
38
*знаю, что поздно, но на заметку мб кто-то и возьмёт себе.

C:
CMD:ban(playerid, params[])
{
    if(player_data[playerid][ADMIN] < 3) return 1;
    if(sscanf(params, "uds[36]", params[0], params[1], params[2])) return SendClientMessage(playerid, CGRAY, "Используйте: /ban [id игрока] [кол-во дней] [причина]");
    if(!IsPlayerConnected(params[0]) || IsKicked(params[0])) return SendClientMessage(playerid, CGRAY, "Неверный ID");
    if(!player_data[params[0]][MYSQLID])
    {
        NewKick(params[0]);
        return SendClientMessage(playerid, CGRAY, "Этот игрок не зарегистрирован, поэтому был кикнут");
    }
    if(params[1] < 1 || params[1] > 30 && player_data[playerid][ADMIN] < 5) return SendClientMessage(playerid,CGRAY,"Неверное кол-во дней");
    if(params[1] < 1 || params[1] > 365 && player_data[playerid][ADMIN] >= 5) return SendClientMessage(playerid,CGRAY,"Неверное кол-во дней");
    ServerBan(playerid, params[0], params[1], params[2]);
    new mes[128];
    format(mes, sizeof(mes), "Администратор %s забанил игрока %s на %d дней. Причина: %s", player_data[playerid][NICKNAME], player_data[params[0]][NICKNAME], params[1], params[2]);
    SCMTOALL(COLOR_LIGHTRED, mes);
    SendRconCommand("ban");
    NewKick(params[0]);
    return 1;
}

Ошибка была в форматирования сообщения бана.

Парочка замечаний, от которых хотелось взять миксер и засунуть себе в глаза:
1. При выполнении RCON-команды "ban" игрок в любом случае будет отсоединён от сервера. Вызов NewKick после неё бесполезен, думаю.
2. Зачем ты вызываешь функцию GetPlayerName и записываешь туда никнейм игрока, которого будешь банить, если ты это сделал в паблике OnPlayerConnect, судя по коду? Вместо nick достаточно использовать player_data[params[0]][NICKNAME].
3. Строки 11 и 12 в твоём коде полностью бесполезны, за исключением того, что 5 и выше уровни администратора могут банить на 0 дней. Какой из этого профит? К тому же, проверка у тебя имеется только для 1-4 уровня администратора. Это означает то, что 5 уровень администратора сможет обойти данную проверку и выдать хоть 999999 дней бана, что может пагубно повлиять на твой сервер (на самом деле нет, но незачем такие косяки за собой оставлять)


C:
if(sscanf(params, "uds[36]", params[0], params[1], params[2])) return SendClientMessage(playerid,CGRAY,"Используйте: /ban [id игрока] [К-во дней] [причина]");
Если мне не изменяет память, такую хрень с params мутить не нужно - лучше создать дополнительные переменные с нужной размерностью.

Не обязательно, но да, стоит придерживаться таких махинаций в своём коде для лучшей читабельности. На остальное не влияет.


Вместо uds[36], пробуй iis[128]. Если не поможет, обнови sscanf
Гениальное умозаключение 😎
 
Последнее редактирование: