[ГАЙД] Операция над клиентами через команды

Young <

Now, finally free
Сообщения
1,263
Реакции
505
В процессе исправительных работ:)
 
Последнее редактирование:

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Ну вообще гайд рассказывает как писать не нужно. Почему не юзать функцию FindTarget?
 

iLoco

Пишу плагины за печеньки 🍪🍪🍪
Сообщения
2,265
Реакции
1,323
Сам не нашёл, пришлось самому додумывать. Попытаюсь всё объяснить.
Данная часть плагина поможет вводом через консоль 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;
}
Теперь объясню что к чему.

if(iArgs < 1)
{
PrintToServer("Использование: wcs_clientlvl <#userid> ");
return Plugin_Handled;
}
У нас в вводе есть всего один аргумент. Поэтому если будет меньше, то этот код даст ошибку, что аргументов меньше чем 1 и остановит плагин.

char sBuffer[64];
GetCmdArg(1, sBuffer, 64);
Создаём строку и получаем аргумент(1 - позиция аргумента (#userid), sBuffer - имя строки, 64 - кол-во бит(брать со строки char sBuffer[64]))

if(StrContains(sBuffer, "#", false) < 0)
{
PrintToServer("Использование: wcs_clientlvl <#userid> ");
return Plugin_Handled;
}
Проверяем, имеет ли аргумент в строчке c "#". Если нет, то даём ошибку ввода(StrContains(sBuffer, "#", false) принимает отрицательное значение) и откатываем плагин.

int userid = StringToInt(sBuffer);
int iClient = GetClientOfUserId(userid);
Вводим userid и вписываем в него аргумент из строки sBuffer. Потом вводим сами данные клиента (iClient) и вписываем в него данные игрока через GetClientOfUserId()

if(!iClient)
{
PrintToServer("Игрок не найден")
return Plugin_Handled;
}
И напоследок чтоб было красиво и не выскакивала огромная ошибка в консоль проверяем, ставим соответствие, если игрок не найден то напишет в консоль: игрок не найден.

Далее, вам нужно будет работать только с iClient. В нем записаны данные о выбранном игроке.
Это типо так и надо, что команда = sm_clientlvl, но если неправильно ввести, то напишет:
Использование: wcs_clientlvl <#userid>

Оффтоп
 

Kailo

Участник
Сообщения
194
Реакции
896
Вот как надо:
Существующие фильтры целей команды
Функция поиска целей по фильтру
Примеры её использования, от разработчиков:
Пример её использования на примере стандартной команды "sm_slay <#userid|name>"
Вспомогательная функций, которая ищет только одиночную цель
Которая на деле, являешь лишь оберткой той же ProcessTargetString
Функция для добавления своих собственных фильтров в систему, для пользовательских модов, и т.п.
Пример добавления собственных фильтров, простой тестовый плагин и сложный плагин с кучей разных фильтров.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #5
выше верно написали: FindTarget или ProcessTargetString (что и есть под капотом у FindTarget)
Но раз уже на то пошло:
Проверяем, имеет ли аргумент в строчке c "#". Если нет, то даём ошибку ввода(StrContains(sBuffer, "#", false) принимает отрицательное значение) и откатываем плагин.
Что значит "откатываем плагин" ? Я думал return Plugin_Handled; выходит из ф-и и отдает ядру см значение, но в даном случае неважно какое.
а если я решетку поставлю в конце строки? работу кода это не нарушит но всё же..
Не проще ли проверить что 1-й символ решетка, а потом просто откинуть его ? чем делать StrContains + ReplaceString. Это же куча лишних циклов.

PrintToServer("Игрок не найден")
ну а если я с консоли игрока пишу?
 

Young <

Now, finally free
Сообщения
1,263
Реакции
505
выше верно написали: FindTarget или ProcessTargetString (что и есть под капотом у FindTarget)
Но раз уже на то пошло:

Что значит "откатываем плагин" ? Я думал return Plugin_Handled; выходит из ф-и и отдает ядру см значение, но в даном случае неважно какое.
а если я решетку поставлю в конце строки? работу кода это не нарушит но всё же..
Не проще ли проверить что 1-й символ решетка, а потом просто откинуть его ? чем делать StrContains + ReplaceString. Это же куча лишних циклов.
напиши что и я поправлю. Можно конечно и FindTarget но я использовал именно такой способ и он работает.

ну а если я с консоли игрока пишу?
То я думаю человек догадается сам что нужно использовать PrintToConsole. Данный вариант для серверной. Ничего не поменяется почти.
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,982
если не хочешь юзать FindTarget или ProcessTargetString, то вот как должен был выглядеть код здорового человека:
PHP:
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;
}
 

DeeperSpy

Гений, миллиардер, плейбой, филантроп, майнкрафтер
Сообщения
588
Реакции
362
напиши что и я поправлю. Можно конечно и FindTarget но я использовал именно такой способ и он работает.


То я думаю человек догадается сам что нужно использовать PrintToConsole. Данный вариант для серверной. Ничего не поменяется почти.
Если это гайд, то лучше напиши его с FindTarget
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,982
как-то я сильно сомневаюсь, что userid может достичь значения больше 6-значного числа (это какой нужен онлайн и аптайм у сервера для такого?)
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #12
Последнее редактирование:

Young <

Now, finally free
Сообщения
1,263
Реакции
505
Если что я вытягивал часть кода из плагина. Вот и пишите тому автору какой он хороший.
 

Young <

Now, finally free
Сообщения
1,263
Реакции
505
enderG, ну это же ты гайд пишешь, а не автор кода :cool:
Я ориентировался на новичков, которые только начинают, поделился рабочим кодом. А тут вы заполнили тему))) Можно конечно и сделать код короче и более функциональным, но на мой взгляд, это самый простой вариант кода.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #16
это какой нужен онлайн и аптайм у сервера для такого?
Достигал без проблем в 2014 году за две недели без рестартов. Онлайн 26/24 (резервные слоты).
Но тогда SourceTV в TF2 глючил, и каждый раунд переподключался. Так-то бы дольше достигал.
 

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #19
Вот как надо:
Существующие фильтры целей команды
Функция поиска целей по фильтру
Примеры её использования, от разработчиков:
Пример её использования на примере стандартной команды "sm_slay <#userid|name>"
Вспомогательная функций, которая ищет только одиночную цель
Которая на деле, являешь лишь оберткой той же ProcessTargetString
Функция для добавления своих собственных фильтров в систему, для пользовательских модов, и т.п.
Пример добавления собственных фильтров, простой тестовый плагин и сложный плагин с кучей разных фильтров.
 
Сверху Снизу