Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Nick Name Changer - Позволяет администрации принудительно ставить ники игрокам.
Плагин позволяет администраторам принудительно указывать ники для игроков на сервере, без возможности смены ника игроками которым администратор установил ник.
Менять ники можно либо через команду, либо через админ меню.
Имеется возможность удалять в админ меню установленные ники игрокам и просматривать установленные ники.
Но она всё равно не будет больше 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 */
};
Ну а длину строки аргумента возвращает сам 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 */
};
В MenuHandler_SelectPlayer() проверка IsClientInGame() не имеет смысла, т.к. дождаться момента, когда этот же UserId займёт бот потребуется ну очень уж много времени. Обычно карта меняется гораздо раньше и меню в любом случае к тому моменту будет закрыто.
И проверка IsClientInGame(client) там тоже ни к чему: если админ нажал кнопочку в меню, то он точно ещё в игре.
Также ReplyToCommand(client, "%t", "PlayerInvalid"); замени на PrintToChat(): это меню можно видеть только при закрытой консоли.
И здесь снова if(action == MenuAction_Cancel) без проверки причины.
В ShowNicknamesMenu() проверка IsClientInGame() тоже излишня: не может работать с меню игрок не зашедший на сервер (ты же не пытаешься открыть меню такому игроку?).
В MenuHandler_ViewNicknames() опять таки if(action == MenuAction_Cancel) без проверки причины.
э, почему такое удаление гланд через анус? Выше же нормально писал: 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() можно хэндлы не закрывать, т.к. смысла в этом нет никакого: они закрываются самим соурсмодом автоматически при выгрузке плагина.