Это типо так и надо, что команда = sm_clientlvl, но если неправильно ввести, то напишет:Сам не нашёл, пришлось самому додумывать. Попытаюсь всё объяснить.
Данная часть плагина поможет вводом через консоль userid игрока найти его. Все ошибки по типу игрок не найден зашью, чтоб всё было красиво:)
Допустим, нам нужно создать команду с помощью которой, через ввод в консоль будет определяться лвл игрока. Вот сама команда. sm_clientlvl <#userid>
Вот сам код.
Теперь объясню что к чему.//public Action Command_Clientlvl(int iArgs)
if(iArgs < 1)
{
PrintToServer("Использование: wcs_clientlvl <#userid> ");
return Plugin_Handled;
}
char sBuffer[64];
GetCmdArg(1, sBuffer, 64);
if(StrContains(sBuffer, "#", false) < 0)
{
PrintToServer("Использование: wcs_clientlvl <#userid> ");
return Plugin_Handled;
}
ReplaceString(sBuffer, 64, "#", "", false);
int userid = StringToInt(sBuffer);
int iClient = GetClientOfUserId(userid);
if(!iClient)
{
PrintToServer("Игрок не найден")
return Plugin_Handled;
}
У нас в вводе есть всего один аргумент. Поэтому если будет меньше, то этот код даст ошибку, что аргументов меньше чем 1 и остановит плагин.if(iArgs < 1)
{
PrintToServer("Использование: wcs_clientlvl <#userid> ");
return Plugin_Handled;
}
Создаём строку и получаем аргумент(1 - позиция аргумента (#userid), sBuffer - имя строки, 64 - кол-во бит(брать со строки char sBuffer[64]))char sBuffer[64];
GetCmdArg(1, sBuffer, 64);
Проверяем, имеет ли аргумент в строчке c "#". Если нет, то даём ошибку ввода(StrContains(sBuffer, "#", false) принимает отрицательное значение) и откатываем плагин.if(StrContains(sBuffer, "#", false) < 0)
{
PrintToServer("Использование: wcs_clientlvl <#userid> ");
return Plugin_Handled;
}
Вводим userid и вписываем в него аргумент из строки sBuffer. Потом вводим сами данные клиента (iClient) и вписываем в него данные игрока через GetClientOfUserId()int userid = StringToInt(sBuffer);
int iClient = GetClientOfUserId(userid);
И напоследок чтоб было красиво и не выскакивала огромная ошибка в консоль проверяем, ставим соответствие, если игрок не найден то напишет в консоль: игрок не найден.if(!iClient)
{
PrintToServer("Игрок не найден")
return Plugin_Handled;
}
Далее, вам нужно будет работать только с iClient. В нем записаны данные о выбранном игроке.
Что значит "откатываем плагин" ? Я думал return Plugin_Handled; выходит из ф-и и отдает ядру см значение, но в даном случае неважно какое.Проверяем, имеет ли аргумент в строчке c "#". Если нет, то даём ошибку ввода(StrContains(sBuffer, "#", false) принимает отрицательное значение) и откатываем плагин.
ну а если я с консоли игрока пишу?PrintToServer("Игрок не найден")
напиши что и я поправлю. Можно конечно и FindTarget но я использовал именно такой способ и он работает.выше верно написали: FindTarget или ProcessTargetString (что и есть под капотом у FindTarget)
Но раз уже на то пошло:
Что значит "откатываем плагин" ? Я думал return Plugin_Handled; выходит из ф-и и отдает ядру см значение, но в даном случае неважно какое.
а если я решетку поставлю в конце строки? работу кода это не нарушит но всё же..
Не проще ли проверить что 1-й символ решетка, а потом просто откинуть его ? чем делать StrContains + ReplaceString. Это же куча лишних циклов.
То я думаю человек догадается сам что нужно использовать PrintToConsole. Данный вариант для серверной. Ничего не поменяется почти.ну а если я с консоли игрока пишу?
public Action Cmd_SomeCmd(int client, int args)
{
if(args < 1)
{
PrintToConsole(client, "Использование: sm_cmd <#userid>");
return Plugin_Handled;
}
char sBuffer[8];
GetCmdArg(1, sBuffer, 8);
if(sBuffer[0] != '#')
{
PrintToServer(client, "Использование: sm_cmd <#userid>");
return Plugin_Handled;
}
int target = GetClientOfUserId(StringToInt(sBuffer[1]));
if(!target)
{
PrintToConsole(client, "Игрок не найден")
return Plugin_Handled;
}
// здесь должен быть какой-то код, делающий что-то с target
return Plugin_Handled;
}
Если это гайд, то лучше напиши его с FindTargetнапиши что и я поправлю. Можно конечно и FindTarget но я использовал именно такой способ и он работает.
То я думаю человек догадается сам что нужно использовать PrintToConsole. Данный вариант для серверной. Ничего не поменяется почти.
сначала подумал о ней, а потом подумал откуда чувак пишущий команды в чат будет знать что такое useridСмотрю я на этот спор, PrintToServer, или PrintToConsole, или PrintToChat.
Хочет напомнить о существовании ReplyToCommand.
Я ориентировался на новичков, которые только начинают, поделился рабочим кодом. А тут вы заполнили тему))) Можно конечно и сделать код короче и более функциональным, но на мой взгляд, это самый простой вариант кода.enderG, ну это же ты гайд пишешь, а не автор кода :cool:
Достигал без проблем в 2014 году за две недели без рестартов. Онлайн 26/24 (резервные слоты).это какой нужен онлайн и аптайм у сервера для такого?
Напиши как, буду знатьиспользование 2-х сложных ф-й это простой?
По-моему работа с индексом массива выглядит куда проще чем чем вызов каких-то ф-й
Напиши как
Вот как надо:
Существующие фильтры целей команды
Функция поиска целей по фильтруAdmin commands (sourcemod) - AlliedModders Wiki
wiki.alliedmods.net
Примеры её использования, от разработчиков:
Пример её использования на примере стандартной команды "sm_slay <#userid|name>"Introduction to sourcemod plugins - AlliedModders Wiki
wiki.alliedmods.net
Вспомогательная функций, которая ищет только одиночную цель![]()
sourcemod/plugins/playercommands/slay.sp at master · alliedmodders/sourcemod
SourceMod - Source Engine Scripting and Administration - alliedmodders/sourcemodgithub.com
Которая на деле, являешь лишь оберткой той же ProcessTargetString
Функция для добавления своих собственных фильтров в систему, для пользовательских модов, и т.п.![]()
sourcemod/plugins/include/helpers.inc at master · alliedmodders/sourcemod
SourceMod - Source Engine Scripting and Administration - alliedmodders/sourcemodgithub.com
Пример добавления собственных фильтров, простой тестовый плагин и сложный плагин с кучей разных фильтров.
![]()
sourcemod/plugins/testsuite/ptstest.sp at master · alliedmodders/sourcemod
SourceMod - Source Engine Scripting and Administration - alliedmodders/sourcemodgithub.com![]()
SatansFunPack/sfp_targeting.sp at master · sirdigbot/SatansFunPack
A collection of plugins for TF2. Contribute to sirdigbot/SatansFunPack development by creating an account on GitHub.github.com
Очень интересновот как должен был выглядеть код здорового человека:
PHP:PrintToServer(client, "Использование: sm_cmd <#userid>");