Урок – Команды (DC_CMD sscanf2) | Pawno-Info.Ru – Портал о программировании №1

[cmd]команды /me, /ame, /do, /todo, /s, /n, /try для процессора dc_cmd

Доброго времени суток! Прошу помощи, проблема такая:

У меня клиент 0.3DL

– Я загрузил модельки скинов в папку models сервера.
– Прописал значений штуки 2 AddCharModel в artconfig
– В server.cfg добавил useartwork 1
– Заходил на сервер играл и т.д всё работало.

(Всё прописано как надо в artconfig: AddCharModel(1, 20001, “anime.dff”, “anime.txd”);

Но когда я добавил ещё 5 моделей скинов у меня мод не стал работать.
А именно в том что я захожу на сервер, загружаю модельки без ошибок, и мне пишется ОСТАВАЙСЯ В ГРАНИЦАХ МИРА, и сервер сразу лагает и останавливается!

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

Т.е я загружаю больше 2-х моделек и сервер останавливается после авторизации.
Подскажите в чём причина. Буду благодарен.

Урок – для новичков №1: dc_cmd | sscanf2

Команды DC_CMD Sscanf2​

[HR][/HR]

Команды в SA:MP существуют для того, чтобы можно было взаимодействовать с сервером.
Покупать оружее и т.п

[HR][/HR]

Пример обработки команд стандартным способом:​

Данный код при вводе команд /command и /command1 выводит соответствующие сообщения. При этом, если нужно будет сделать обработку параметров команд (например, получить число 4 из строки “/cmd1 4”), такой код придётся усложнить, в 2-3 раза.

Но есть другой способ обработки команд: командный процессор DC_CMD

[HR][/HR]

Пример создания команд для DC_CMD:​

[HR][/HR]

Преимущества DC_CMD:​

  • Более простой синтаксис команд.
  • Команды можно расположить в любом участке скрипта (не только в OnPlayerCommandText).
  • Не требуется вручную отделять параметры команд (уже отделённые параметры передаются в команду в строке params).
  • Проще в освоении.
  • Работает в разы быстрее других обработчиков, создавая меньшую нагрузку на сервер.

Теперь перейдём к обработке параметров.

Допустим, у нас есть команда “/ban”, которая банит на сервере игрока с указанным ID (пример: “/ban 65”).

Однако, кроме самой команды, потребуется ещё и обработать ID указанного игрока, а именно – извлечь этот ID из строки params (именно в ней обработчик DC_CMD передаёт параметры).

Стандартным способом это делается с помощью функции strval, которая преобразует содержимое строки в число:


new target = strval(params);

Но в данном способе есть много минусов

Чтобы избежать этих ошибок, придётся сделать дополнительные проверки на пустоту и подсчёт количества параметров (сосчитать все пробелы в строке и прибавить 1). Такая задача может оказаться слишком трудной для начинающих скриптеров.

Однако, есть иное решение: плагин sscanf2.

Использование:

– строка, из которой считываются нужные значения

– строка, в которой указывается, какого типа данные должны быть считаны из исходной строки (пример: “ds[40]”)

  • d, i – целое число
  • f – вещественное число (Float)
  • u – игрок (ID или часть имени)
  • s[размер] – строка с указанной макс. длиной

– переменные, в которые будут записаны значения, полученные из исходной строки

[HR][/HR]

Для получения ID игрока в команде /ban плагин sscanf2 можно использовать следующим образом​

В результате в переменной target будет получен ID игрока, которого нужно забанить.

[HR][/HR]

Но что делать, если ID всё же не был введён игроком?
Здесь всё тоже предусмотрено: функция sscanf возвращает 1 в случае ошибки и 0 в случае успеха. Таким образом, проверку на неправильный ввод можно записать в виде ветвления if

Если функция sscanf не сможет правильно считать параметры, она вернёт 1 (при этом в условиях всем ненулевым числам соответствует значение true), условие выполнится, игроку будет выведена подсказка о правильном использовании и команда прервёт свою работу.

[HR][/HR]

Теперь, когда ID игрока получен и все случаи неправильного ввода обработаны, можно доделать оставшуюся часть команды:​

[HR][/HR]

Сделаем тестовую команду выдачу уровня:​

Это команда отвечает за выдачу уровня определенного игрока.

И как вы успели заметить, тут мы используем 2 параметра это

  • target – Сюда записываем id игрока.
  • level – Записываем LVL который хотим дать игроку.
:/>  EDIT – текстовый редактор MS DOS / Windows.

Разберем

по подробнее.

  • SetPlayerScore – Функция отвечающая за число находящийся в TAB листе.
  • targetid – переменная в которую мы записали ID игрока.
  • GetPlayerScore(target) – Функция отвечающая за получения текущего числа в TAB листе.
  • level – Так как мы уже получили текущее число которое уже есть и приплюсовываем к этому числу которое уже есть, ту переменную в которую записали число(Уровень).

[HR][/HR]

Давайте создадим еще одну тестовую команду, но уже будем записывать не число а текст вывода определенному игроку:​

PHP:

CMD:sms(playerid, params[])
{
     new target, text, sendername[MAX_PLAYER_NAME], str_[28-4 MAX_PLAYER_NAME 120];
     if(sscanf(params, "us[145]", target, text))
                 return SendClientMessage(playerid, 0xFFFFFFFF, "Используйте: /sms [ID игрока/часть имени] [Text]");

     GetPlayerName(playerid, sendername, sizeof(sendername));
     format(str_ , sizeof(str_), "Игрок %s отправил вам текст: %s", sendername, text);
     SendClientMessage(target, 0xFFFFFFFF, str_);
     return 1;
}

Тут вы уже видите серьезную команду с записью имя игрока, текста, форматирования, много переменных, и уже наверное напугались

Но на самом деле не чего тут страшного нет, и самые обычные функции.

Разберем первую строку

по подробнее.

  • target – записываем id игрока.
  • text – записываем текст.
  • sendername[MAX_PLAYER_NAME] – в нее будет записываться имя игрока.
  • MAX_PLAYER_NAME – это макрос который определяет размер ячеек директивой #define по дефолту в a_samp.inc она имеет значение 24.
  • А 24 это максимальное длина имени, можно написать за место MAX_PLAYER_NAME просто 24 разницы не будет.
  • str_[28-4 MAX_PLAYER_NAME 120] – сюда как раз и будет записываться отформатированный текст.

  • 28-4 MAX_PLAYER_NAME 120 – Это размер ячеек сколько можно будет поместить в эту переменную символов.
  • Я сделал точный подсчет всего символов 28 не считая %s два раза. Именно поэтому я отнимаю 4 ибо % – 1 s – 2. и еще раз % – 1 s – 2.
  • MAX_PLAYER_NAME – Ну думаю понятно максимальное длина имени.
  • 120 – это и есть текст который будет передаваться в функцию SendClientMessage по дефолту в чат максимальная длина 144 нуль символ 145.

Теперь расскажу подробнее про эту

  • u – ид игрока
  • s[145] – сам текст и 145 ячеек.Так как всего максимальная длина 144 в чате нуль символ 1 получается 145.

Получения имени игрока:

[HR][/HR]

Теперь про форматирования, это будет отдельный урок, расскажу кратко.

Ну и здесь мы уже выводим отформатированный текст игроку.

Всем спасибо это был урок для новичков #1.​

Урок #2 – Временно не доступен​

§

Команды DC_CMD Sscanf2​

[HR][/HR]

Команды в SA:MP существуют для того, чтобы можно было взаимодействовать с сервером.
Покупать оружее и т.п

[HR][/HR]

Пример обработки команд стандартным способом:​

Данный код при вводе команд /command и /command1 выводит соответствующие сообщения. При этом, если нужно будет сделать обработку параметров команд (например, получить число 4 из строки “/cmd1 4”), такой код придётся усложнить, в 2-3 раза.

Но есть другой способ обработки команд: командный процессор DC_CMD

[HR][/HR]

Пример создания команд для DC_CMD:​

[HR][/HR]

Преимущества DC_CMD:​

  • Более простой синтаксис команд.
  • Команды можно расположить в любом участке скрипта (не только в OnPlayerCommandText).
  • Не требуется вручную отделять параметры команд (уже отделённые параметры передаются в команду в строке params).
  • Проще в освоении.
  • Работает в разы быстрее других обработчиков, создавая меньшую нагрузку на сервер.

Теперь перейдём к обработке параметров.

Допустим, у нас есть команда “/ban”, которая банит на сервере игрока с указанным ID (пример: “/ban 65”).

Однако, кроме самой команды, потребуется ещё и обработать ID указанного игрока, а именно – извлечь этот ID из строки params (именно в ней обработчик DC_CMD передаёт параметры).

Стандартным способом это делается с помощью функции strval, которая преобразует содержимое строки в число:


new target = strval(params);

Но в данном способе есть много минусов

Чтобы избежать этих ошибок, придётся сделать дополнительные проверки на пустоту и подсчёт количества параметров (сосчитать все пробелы в строке и прибавить 1). Такая задача может оказаться слишком трудной для начинающих скриптеров.

:/>  Команда ROUTE

Однако, есть иное решение: плагин sscanf2.

Использование:

– строка, из которой считываются нужные значения

– строка, в которой указывается, какого типа данные должны быть считаны из исходной строки (пример: “ds[40]”)

  • d, i – целое число
  • f – вещественное число (Float)
  • u – игрок (ID или часть имени)
  • s[размер] – строка с указанной макс. длиной

– переменные, в которые будут записаны значения, полученные из исходной строки

[HR][/HR]

Для получения ID игрока в команде /ban плагин sscanf2 можно использовать следующим образом​

В результате в переменной target будет получен ID игрока, которого нужно забанить.

[HR][/HR]

Но что делать, если ID всё же не был введён игроком?
Здесь всё тоже предусмотрено: функция sscanf возвращает 1 в случае ошибки и 0 в случае успеха. Таким образом, проверку на неправильный ввод можно записать в виде ветвления if

Если функция sscanf не сможет правильно считать параметры, она вернёт 1 (при этом в условиях всем ненулевым числам соответствует значение true), условие выполнится, игроку будет выведена подсказка о правильном использовании и команда прервёт свою работу.

[HR][/HR]

Теперь, когда ID игрока получен и все случаи неправильного ввода обработаны, можно доделать оставшуюся часть команды:​

[HR][/HR]

Сделаем тестовую команду выдачу уровня:​

Это команда отвечает за выдачу уровня определенного игрока.

И как вы успели заметить, тут мы используем 2 параметра это

  • target – Сюда записываем id игрока.
  • level – Записываем LVL который хотим дать игроку.

Разберем

по подробнее.

  • SetPlayerScore – Функция отвечающая за число находящийся в TAB листе.
  • targetid – переменная в которую мы записали ID игрока.
  • GetPlayerScore(target) – Функция отвечающая за получения текущего числа в TAB листе.
  • level – Так как мы уже получили текущее число которое уже есть и приплюсовываем к этому числу которое уже есть, ту переменную в которую записали число(Уровень).

[HR][/HR]

Давайте создадим еще одну тестовую команду, но уже будем записывать не число а текст вывода определенному игроку:​

PHP:

CMD:sms(playerid, params[])
{
     new target, text, sendername[MAX_PLAYER_NAME], str_[28-4 MAX_PLAYER_NAME 120];
     if(sscanf(params, "us[145]", target, text))
                 return SendClientMessage(playerid, 0xFFFFFFFF, "Используйте: /sms [ID игрока/часть имени] [Text]");

     GetPlayerName(playerid, sendername, sizeof(sendername));
     format(str_ , sizeof(str_), "Игрок %s отправил вам текст: %s", sendername, text);
     SendClientMessage(target, 0xFFFFFFFF, str_);
     return 1;
}

Тут вы уже видите серьезную команду с записью имя игрока, текста, форматирования, много переменных, и уже наверное напугались

Но на самом деле не чего тут страшного нет, и самые обычные функции.

Разберем первую строку

по подробнее.

  • target – записываем id игрока.
  • text – записываем текст.
  • sendername[MAX_PLAYER_NAME] – в нее будет записываться имя игрока.
  • MAX_PLAYER_NAME – это макрос который определяет размер ячеек директивой #define по дефолту в a_samp.inc она имеет значение 24.
  • А 24 это максимальное длина имени, можно написать за место MAX_PLAYER_NAME просто 24 разницы не будет.
  • str_[28-4 MAX_PLAYER_NAME 120] – сюда как раз и будет записываться отформатированный текст.

  • 28-4 MAX_PLAYER_NAME 120 – Это размер ячеек сколько можно будет поместить в эту переменную символов.
  • Я сделал точный подсчет всего символов 28 не считая %s два раза. Именно поэтому я отнимаю 4 ибо % – 1 s – 2. и еще раз % – 1 s – 2.
  • MAX_PLAYER_NAME – Ну думаю понятно максимальное длина имени.
  • 120 – это и есть текст который будет передаваться в функцию SendClientMessage по дефолту в чат максимальная длина 144 нуль символ 145.

Теперь расскажу подробнее про эту

  • u – ид игрока
  • s[145] – сам текст и 145 ячеек.Так как всего максимальная длина 144 в чате нуль символ 1 получается 145.

Получения имени игрока:

[HR][/HR]

Теперь про форматирования, это будет отдельный урок, расскажу кратко.

Ну и здесь мы уже выводим отформатированный текст игроку.

Всем спасибо это был урок для новичков #1.​

Урок #2 – Временно не доступен​

Урок – команды (dc_cmd sscanf2)

Однако, кроме самой команды, потребуется ещё и обработать ID указанного игрока, а именно – извлечь этот ID из строки params (именно в ней обработчик DC_CMD передаёт параметры).
Стандартным способом это делается с помощью функции strval, которая преобразует содержимое строки в число:

:/>  Команды cmd Windows | Блог любителя экспериментов

Но в данном способе есть много минусов:
* Если игрок ничего не ввёл, строка params будет пустой и функция strval вернёт 0, из-за чего можно нечаянно забанить игрока ID 0 (а если под ID 0 находитесь вы – забаните сами себя).
* Для обработки более чем 1 параметра, извлечения ID игроков и т.п. приходится вставлять в скрипт и много раз использовать пользовательские функции strtok, IsNumeric, ReturnUser и т.д.
Чтобы избежать этих ошибок, придётся сделать дополнительные проверки на пустоту и подсчёт количества параметров (сосчитать все пробелы в строке и прибавить 1). Такая задача может оказаться слишком трудной для начинающих скриптеров.
Однако, есть иное решение: плагин sscanf2.
Использование:​

Урок используем новый командный процессор pawn.cmd

И так, я много слышал о разных командных процессорах, но самый лучший за несколько лет оказался только Pawn.CMD
Вот таблица, время действия командного процессора при использовании 1 команды (это среднее время, бывает, что еще быстрее срабатывает)

Урок - Команды (DC_CMD   sscanf2) | Pawno-Info.Ru - Портал о программировании №1 

Как установить?
– Качаем Include, плагины, и думаю вы знаете что дальше.

Как его использовать?
Использовать можно его в любом месте вашего мода (не в любом паблике, а именно В ЛЮБОМ МЕСТЕ!)
И перейдем к самому началу:
В начале, где все инклуды пишем

#include <Pawn.CMD>

Как я сделал – просто в самом низу после всех пабликов написал:

//команды сервера
и ниже расположены мои команды..
//конец команд сервера

Первая наша команда будет выглядить именно так:

cmd:help(playerid, params[]) // кстати, вместо cmd можно использовать command (но удобнее cmd)
{ 
    // тут наш код
    return 1; 
}  

Разберёмся со значениями:
cmd(или command) – вызов нашей команды
help – наименование команды
(playerid, params[]) – playerid-ид игрока, params[]-параметры
то что в пределах двух фигурных скобок – это код нашей команды

Для примера, напишем команду по выдаче скина любому игроку:

cmd:setskin(playerid, params[])
{
	if(Player[playerid][Admin] < 2) return SendClientMessage(playerid, -1, "Вы не админ."); //тут моя проверка на Админа
	if(sscanf(params, "ui", params[0], params[1])) //params[0] и params[1] наши параметры по команде, а там где UI - U ид игрока или его ник, а I - целое число, вместо I можно также использовать D. Об этом гуглите "как использовать sscanf"
	return SendClientMessage(playerid, -1, "Используйте: /setskin [id игрока] [id скина]");
	if(params[1]> 299 || params[1]< 1) //проверка для того чтобы дать правильный ид скина
	return SendClientMessage(playerid, 0x99999FF, "Неверный ID скина");
	if(!IsPlayerConnected(params[0])) return 1; //если указанный ID игрока подключен к серверу
	new stringer[256]; //выделаем память для команды
	format(stringer, sizeof(stringer), "Администратор %s[%d] выдал вам временный скин", PlayerName(playerid), playerid);
	SendClientMessage(params[0], -1, stringer);
	format(stringer, sizeof(stringer), "Вы выдали временный скин игроку %s[%d]", PlayerName(params[0]), params[0]);
	SendClientMessage(playerid, -1, stringer);
	SetPlayerSkin(params[0], params[1]);
        return 1;
}

И прикольная фича, как можно использовать русские команды?
Вот так:

cmd:help(playerid, params[])
{ 
    // тут наш код
    return 1; 
}
alias:help("помощь");

Да, после команды мы добавляем строчку и всё, там где я написал “помощь” вы можете что угодно написать.
Таким образом, команда “/help” будет работать точно также если написать “/помощь”.
Но, если нужно несколько доп. команд, то можно так

cmd:help(playerid, params[])
{ 
    // тут наш код
    return 1; 
}
alias:help("помощь", "хелп", "нужнапомощь", "хелпуйте");

И последнее!!!!!
Всё что находится в public OnPlayerCommandText(playerid, cmdtext[])
Работать уже НЕ БУДЕТ!
Этот паблик должен выглядить теперь так:

public OnPlayerCommandText(playerid, cmdtext[])
{
	return 0;
}

А еще добавьте куда нибудь паблики:

public OnPlayerCommandReceived(playerid, cmd[], params[], flags) //вызывается до выполнения команды
{ 
    return 1; 
} 
public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags) //после
{ 
    if(result == -1) 
    { 
        SendClientMessage(playerid, 0xFFFFFFFF, "SERVER: Unknown command."); 
        return 0; 
    } 
    return 1; 
}  

Если что-то нужно то тема вот: https://forum.sa-mp.com/showthread.php?t=608474

скачать dle 12.0

Автор: еее бойй a.k.a Kronka

Оставьте комментарий