Внимание!На сайте работают специалисты, некоторые участки шаблона могут некорректно отображаться,Администрация сайта приносит свои извинения за неудобства!
Pawno – скриптовый язык сервера SA-MP. Кроме того, словом «Pawno» часто называют редактор этого языка, который поставляется вместе с SA-MP сервером. Это очень простой редактор, который можно предложить большинству людей. Такие возможности, как подсветка синтаксиса, базовые опции запуска и панель, показывающая встроенные функции, делает pawno замечательным редактором для людей, которые создают небольшие режимы игры или дополнительные скрипты, и для тех, кто хочет отредактировать несколько мелких мест в существующем режиме игры. Создатель Pawno известен под ником Spookie.
Имея под рукой Pawno можно при желании создать практически любой скрипт для SA-MP. Все зависит лишь от Вашего желания, навыков и наличия свободного времени. Необходимость последнего, в свою очередь, обратно пропорциональна величине навыков. Если вы ни разу не занимались созданием pawn-скрипта, эта статья как раз для вас. Кончено, хорошо бы иметь какие-нибудь познания в программировании.
С чего начать?
Итак, запускаем Pawno, который находится в samp03bsvr_R2_win32\pawno (зависит от версии сервера), и выбираем пункт File->New. В рабочем окне редактора отобразиться некий код. Это шаблон пустого фильтр-скрипта или гейм-мода. Посмотрим на него.
Code
// This is a comment // uncomment the line below if you want to write a filterscript //#define FILTERSCRIPT
#include <a_samp>
#if defined FILTERSCRIPT
public OnFilterScriptInit() { print("\n--------------------------------------"); print(" Blank Filterscript by your name here"); print("--------------------------------------\n"); return 1; }
public OnFilterScriptExit() { return 1; }
#else
main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); }
#endif
public OnGameModeInit() { // Don't use these lines if it's a filterscript SetGameModeText("Blank Script"); AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0); return 1; }
Первые две строки являются комментариями. Комментарии начинаются с символов // и служат для подсказки программисту. Они игнорируются компилятором. Кроме того, комментарии используются для того, чтобы временно отключить какую-либо строчку кода (можно ее просто удалить, но тогда, при необходимости, придется писать заново). Так сделано в 3ей строке кода, чуть позднее разберем для чего. В следующей строке директивой #include выполняется подключение к проекту файла a_samp.inc (из папки samp03bsvr_R2_win32\pawno\include), содержащего основные функции, используемые в Pawno. Если интересно, можно посмотреть его содержимое, но менять ничего нельзя.
Ниже идет блок кода:
Code
#if defined FILTERSCRIPT
public OnFilterScriptInit() { print("\n--------------------------------------"); print(" Blank Filterscript by your name here"); print("--------------------------------------\n"); return 1; }
public OnFilterScriptExit() { return 1; }
#else
main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); print("----------------------------------\n"); }
#endif
Он реализует условное добавление в проект некого кода. Первая его строка означает, что если определена переменная FILTERSCRIPT, то в скрипт будут добавлены строки ниже до строки #else, а в противном случае – строки ниже #else и выше #endif. Переменная FILTERSCRIPT определяется строкой #define FILTERSCRIPT, которая была взята в комментарий (то есть по умолчанию она не определена, так как скрыта от компилятора символами //). Теперь о том, для чего это все делается. Если вы пишете гейм-мод, то вам нужны только строки от #else до #endif, переменную FILTERSCRIPT вы не определяете и эти строки добавляются в проект. Если же вы пишите фильтр-скрипт, то Вам нужны строки ниже #if и до #else, то есть необходимо объявить переменную FILTERSCRIPT, убрав знаки //. Можно поступить проще, просто убрав всю эту #if #esle #endif конструкцию и вручную вставив нужные строки, а можно и вовсе их не вставлять, если они вам не нужны. Теперь разберем, что именно мы вставляем. Функции public OnFilterScriptInit() и main() делают почти одно и то же, но первая выполняется при загрузке скрипта, а вторая – при загрузке мода. Команда print("мой текст");
Печатает текст в кавычках в консоль сервера (“\n” означает перевод курсора на следующую строку консоли).
Функция OnFilterScriptExit() выполняется при выгрузке скрипта из памяти.
Ниже идут все обработчики событий Pawno, называемые также пабликами (public). Когда в игре что-то происходит, например, игрок пишет сообщение в чат, вызывается соответствующий обработчик, в который через параметры передается нужная информация, например, ид игрока, написавшего в чат. При написании скрипта, даже большого, обычно не используются все обработчики, а лишь некоторые из них. В принципе, все написания скрипта сводится к написанию кода нужных обработчиков, ну и некоторых вспомогательных функций.
Первый скрипт
Чтобы не быть голословными, разберем пример. Напишем скрипт, который при вводе команды «!03 текст» печатает «ник: текст» красным цветом. Для этого определим код обработчика public OnPlayerText(playerid, text[]). Кроме того, определим функцию работы со строками strtok(const string[], &index), которая широко используется в pawno и ее код можно найти в сети, поэтому разбирать ее не будем. Отметим только, что она возвращает кусок строки string, который находится после символа с номером index и до ближайшего после index пробела. В нашем случае index равен 0, то есть функция вернет часть строки до первого пробела.
Полный код скрипта приведен ниже:
Code
#include <a_samp> #define COLOR_RED 0xFF0000FF
public OnPlayerText(playerid, text[]) { new txt[256]; new idx; txt = strtok(text, idx); if(!strcmp("!03", txt, true)) { new mess[256]; new name[MAX_PLAYER_NAME]; GetPlayerName(playerid, name, MAX_PLAYER_NAME); strmid(txt,text,4,strlen(text)); strcat(mess, name); strcat(mess, ": "); strcat(mess, txt); SendClientMessageToAll(COLOR_RED,mess); return 0; } return 1; }
В строке #define COLOR_RED 0xFF0000FF мы определяем константу COLOR_RED, равную коду красного цвета.
Итак, разберем функцию public OnPlayerText(playerid, text[]). Она вызывается, когда игрок пишет что-либо в чат. При этом число playerid содержит id игрока, написавшего в чат, а строка text – текст его сообщения. В самом начале строками new txt[256]; и new idx; объявляем переменные txt (строка длиной 256 символов) и число idx. В Pawno значение числа по умолчанию равно 0. Затем, строкой txt = strtok(text, idx); получаем часть строки text до первого пробела. Функция strcmp("!03", txt, true) вернет значение 0, если строка "!03" равна строке txt. Третий параметр означает, что сравнение производится без учета регистра, хотя в нашем случае можно воспользоваться и значением false по умолчанию (в строке нет букв – только цифры и восклицательный знак). Далее условным оператором if проверяем равенство этой функции 0. (Оператор «!» означает отрицание, т.е. если strcmp("!03", txt, true) = 0, то ! strcmp("!03", txt, true) = 1 и выполняется код в {} под условным оператором). Тогда объявляем 2 строки: mess длиной 256 и name длиной MAX_PLAYER_NAME (макс. длина имени игрока). Функцией GetPlayerName(playerid, name, MAX_PLAYER_NAME); записываем в переменную name ник игрока, id которого равен первому параметру (playerid). Функцией strmid(txt,text,4,strlen(text)-1); записываем в строку txt часть строки text начиная с символа 4 и до символа strlen(text), где strlen(text) возвращает длину строки text. Функция strcat(mess, name); дописывает в конец строки (изначально пустую) строку name (ник игрока). Аналогично дописываем в к строке mess двоеточие и пробел, а также текст сообщения пользователя. Функцией SendClientMessageToAll(COLOR_RED,mess); отправляем красным цветом строку mess в чат игрокам. Командой return 0; выходим из обработчика OnPlayerText с возвратом кода 0, что означает, что этот обработчик в других фильтр-скриптах не будет вызываться. Если strcmp("!03", txt, true) не равно 0, то код в {} под условным оператором не выполняется, и мы выходим из обработчик OnPlayerText с возвратом кода 1, командой return 1; Единица означает, что мы будем вызвать аналогичные обработчики в других фильтр скриптах. На этом обработчик OnPlayerText заканчивается. Далее идет описание функции strtok, описание которой можно найти в сети.