Иконка ресурса

Nick Name Changer 1.1

Synd1qate

Участник
Сообщения
744
Реакции
259
  • Автор ресурса
  • #1
Synd1qate добавил(а) новый ресурс:

Nick Name Changer - Позволяет администрации принудительно ставить ники игрокам.

Плагин позволяет администраторам принудительно указывать ники для игроков на сервере, без возможности смены ника игроками которым администратор установил ник.
Менять ники можно либо через команду, либо через админ меню.
Имеется возможность удалять в админ меню установленные ники игрокам и просматривать установленные ники.

Узнать больше об этом ресурсе...
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
Ники сохраняются в configs/nicknames.txt
можно было и через clientprefs сохранять
разве что нужен будет редактор БД, вместо блокнота
Сообщения автоматически склеены:

C-подобный:
#define MAX_NICKNAME_LENGTH    64

...

    char arg1[64], arg2[MAX_NICKNAME_LENGTH];
    GetCmdArg(2, arg2, sizeof(arg2));
    StripQuotes(arg2);
    if (strlen(arg2) >= MAX_NAME_LENGTH)
MAX_NAME_LENGTH равен 128:
т.е. проверка никогда не будет срабатывать =)

Ну а длину строки аргумента возвращает сам GetCmdArg():
Return Value
Length of string written to buffer.
Но она всё равно не будет больше 3-го параметра этой функции(не проверял, но в буфер больше его ёмкости не впендюрить).
Сообщения автоматически склеены:

C-подобный:
    int target = FindTarget(client, arg1, true, false);
...
    if(IsFakeClient(target))
У тебя же FindTarget() третьим параметром указано, чтобы ботов игнорил, потому и проверка на бота не имеет смысла.
Сообщения автоматически склеены:

Ну ещё и после получения SteamID надо бы валидность этого самого айди проверить потому что:
C-подобный:
/**
 * Auth string types.
 *
 * Note that for the Steam2 and Steam3 types, the following ids are
 * also valid values:
 * "STEAM_ID_PENDING" - Authentication is pending.
 * "STEAM_ID_LAN" - Authentication is disabled because of being on a LAN server.
 * "BOT" - The client is a bot.
 */
Сообщения автоматически склеены:

И ещё: в public Action Command_Say(int client, const char[] command, int args) везде возвращай Plugin_Handled, а то в чате будет видно набранный админом текст, если он не вбивал команду в консоль, емнип
Сообщения автоматически склеены:

ты бы после else if(action == MenuAction_Cancel) ещё проверил причину этого Cancel, а то там несколько их бывает:
C-подобный:
/**
 * Reasons a menu can be cancelled (MenuAction_Cancel).
 */
enum
{
    MenuCancel_Disconnected = -1,   /**< Client dropped from the server */
    MenuCancel_Interrupted = -2,    /**< Client was interrupted with another menu */
    MenuCancel_Exit = -3,           /**< Client exited via "exit" */
    MenuCancel_NoDisplay = -4,      /**< Menu could not be displayed to the client */
    MenuCancel_Timeout = -5,        /**< Menu timed out */
    MenuCancel_ExitBack = -6        /**< Client selected "exit back" on a paginated menu */
};
 
Последнее редактирование:

Synd1qate

Участник
Сообщения
744
Реакции
259
  • Автор ресурса
  • #3
можно было и через clientprefs сохранять
разве что нужен будет редактор БД, вместо блокнота
Сообщения автоматически склеены:

C-подобный:
#define MAX_NICKNAME_LENGTH    64

...

    char arg1[64], arg2[MAX_NICKNAME_LENGTH];
    GetCmdArg(2, arg2, sizeof(arg2));
    StripQuotes(arg2);
    if (strlen(arg2) >= MAX_NAME_LENGTH)
MAX_NAME_LENGTH равен 128:
т.е. проверка никогда не будет срабатывать =)

Ну а длину строки аргумента возвращает сам GetCmdArg():

Но она всё равно не будет больше 3-го параметра этой функции(не проверял, но в буфер больше его ёмкости не впендюрить).
Сообщения автоматически склеены:

C-подобный:
    int target = FindTarget(client, arg1, true, false);
...
    if(IsFakeClient(target))
У тебя же FindTarget() третьим параметром указано, чтобы ботов игнорил, потому и проверка на бота не имеет смысла.
Сообщения автоматически склеены:

Ну ещё и после получения SteamID надо бы валидность этого самого айди проверить потому что:
C-подобный:
/**
 * Auth string types.
 *
 * Note that for the Steam2 and Steam3 types, the following ids are
 * also valid values:
 * "STEAM_ID_PENDING" - Authentication is pending.
 * "STEAM_ID_LAN" - Authentication is disabled because of being on a LAN server.
 * "BOT" - The client is a bot.
 */
Сообщения автоматически склеены:

И ещё: в public Action Command_Say(int client, const char[] command, int args) везде возвращай Plugin_Handled, а то в чате будет видно набранный админом текст, если он не вбивал команду в консоль, емнип
Сообщения автоматически склеены:

ты бы после else if(action == MenuAction_Cancel) ещё проверил причину этого Cancel, а то там несколько их бывает:
C-подобный:
/**
 * Reasons a menu can be cancelled (MenuAction_Cancel).
 */
enum
{
    MenuCancel_Disconnected = -1,   /**< Client dropped from the server */
    MenuCancel_Interrupted = -2,    /**< Client was interrupted with another menu */
    MenuCancel_Exit = -3,           /**< Client exited via "exit" */
    MenuCancel_NoDisplay = -4,      /**< Menu could not be displayed to the client */
    MenuCancel_Timeout = -5,        /**< Menu timed out */
    MenuCancel_ExitBack = -6        /**< Client selected "exit back" on a paginated menu */
};
Спасибо, учту
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,517
Реакции
4,979
Ещё косяк: в ShowPlayerSelectionMenu() ты создаёшь три строковых массива внутри цикла. Будь нормальным человеком и вынеси их создание перед циклом.

И вместо hasPlayers достаточно использовать метод menu.ItemCount:

В MenuHandler_SelectPlayer() проверка IsClientInGame() не имеет смысла, т.к. дождаться момента, когда этот же UserId займёт бот потребуется ну очень уж много времени. Обычно карта меняется гораздо раньше и меню в любом случае к тому моменту будет закрыто.

И проверка IsClientInGame(client) там тоже ни к чему: если админ нажал кнопочку в меню, то он точно ещё в игре.
Также ReplyToCommand(client, "%t", "PlayerInvalid"); замени на PrintToChat(): это меню можно видеть только при закрытой консоли.
И здесь снова if(action == MenuAction_Cancel) без проверки причины.

В ShowNicknamesMenu() проверка IsClientInGame() тоже излишня: не может работать с меню игрок не зашедший на сервер (ты же не пытаешься открыть меню такому игроку?).

В MenuHandler_ViewNicknames() опять таки if(action == MenuAction_Cancel) без проверки причины.

C-подобный:
    char title[128];
    Format(title, sizeof(title), "%t", "DeleteNicknameTitle", steamid);
    SetMenuTitle(menu, title);
э, почему такое удаление гланд через анус? Выше же нормально писал: SetMenuTitle(menu, "%t", "ViewNicknames");

В MenuHandler_DeleteNickname() снова проверка IsClientInGame(). Нафига?
Может вместо if(strcmp(info, "cancel") == 0) стоит сделать if(param2 == 1)? У тебя же меню не динамичное и количество пунктов с их содержимым и порядком всегда будет одно и то же.
Ну и ещё раз там ReplyToCommand(); вместо PrintToChat(). А так же нет проверки причины Cancel после if(action == MenuAction_End).

В Command_Say() добавь в начале проверку индекса игрока: эту команду можно в консоль сервера вбить и плагин попытаетсся открыть меню серверу.

Вроде на этом с косяками пока всё.

В OnPluginEnd() можно хэндлы не закрывать, т.к. смысла в этом нет никакого: они закрываются самим соурсмодом автоматически при выгрузке плагина.
 
Последнее редактирование:
Сверху Снизу