[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 существуют для того, чтобы можно было взаимодействовать с сервером.
Покупать оружее и т.п
Пример обработки команд стандартным способом:
Данный код при вводе команд /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 который хотим дать игроку.
Разберем
по подробнее.
- 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 существуют для того, чтобы можно было взаимодействовать с сервером.
Покупать оружее и т.п
Пример обработки команд стандартным способом:
Данный код при вводе команд /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 который хотим дать игроку.
Разберем
по подробнее.
- 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, которая преобразует содержимое строки в число:
Но в данном способе есть много минусов:
* Если игрок ничего не ввёл, строка params будет пустой и функция strval вернёт 0, из-за чего можно нечаянно забанить игрока ID 0 (а если под ID 0 находитесь вы – забаните сами себя).
* Для обработки более чем 1 параметра, извлечения ID игроков и т.п. приходится вставлять в скрипт и много раз использовать пользовательские функции strtok, IsNumeric, ReturnUser и т.д.
Чтобы избежать этих ошибок, придётся сделать дополнительные проверки на пустоту и подсчёт количества параметров (сосчитать все пробелы в строке и прибавить 1). Такая задача может оказаться слишком трудной для начинающих скриптеров.
Однако, есть иное решение: плагин sscanf2.
Использование:
Урок используем новый командный процессор pawn.cmd
И так, я много слышал о разных командных процессорах, но самый лучший за несколько лет оказался только Pawn.CMD
Вот таблица, время действия командного процессора при использовании 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