[CM]DanteMoretty[CM] |
Дата: Среда, 02.08.2017, 19:28 | Сообщение # 1
|
Авторитет
Сообщений: 1104
Статус: Offline
|
Введение в pawno .
Что такое pawno?
Pawno – скриптовый язык сервера SA-MP. Кроме того, словом «Pawno» часто называют редактор этого языка, который поставляется вместе с SA-MP сервером. Это очень простой редактор, который можно предложить большинству людей. Такие возможности, как подсветка синтаксиса, базовые опции запуска и панель, показывающая встроенные функции, делает pawno замечательным редактором для людей, которые создают небольшие режимы игры или дополнительные скрипты, и для тех, кто хочет отредактировать несколько мелких мест в существующем режиме игры. Создатель Pawno известен под ником Spookie.
Имея под рукой Pawno можно при желании создать практически любой скрипт для SA-MP. Все зависит лишь от Вашего желания, навыков и наличия свободного времени. Необходимость последнего, в свою очередь, обратно пропорциональна величине навыков. Если вы ни разу не занимались созданием pawn-скрипта, эта статья как раз для вас. Кончено, хорошо бы иметь какие-нибудь познания в программировании.
С чего начать?
Итак, запускаем Pawno, который находится в samp 0.3.7_R2_win32\pawno (зависит от версии сервера), и выбираем пункт File->New. В рабочем окне редактора отобразиться некий код. Это шаблон пустого фильтр-скрипта или гейм-мода. Посмотрим на него.
Код // 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; }
public OnGameModeExit() { return 1; }
public OnPlayerRequestClass(playerid, classid) { SetPlayerPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraPos(playerid, 1958.3783, 1343.1572, 15.3746); SetPlayerCameraLookAt(playerid, 1958.3783, 1343.1572, 15.3746); return 1; }
И так далее….
Первые две строки являются комментариями. Комментарии начинаются с символов // и служат для подсказки программисту. Они игнорируются компилятором. Кроме того, комментарии используются для того, чтобы временно отключить какую-либо строчку кода (можно ее просто удалить, но тогда, при необходимости, придется писать заново). Так сделано в 3ей строке кода, чуть позднее разберем для чего. В следующей строке директивой #include выполняется подключение к проекту файла a_samp.inc (из папки samp 0.3.7_R2_win32\pawno\include), содержащего основные функции, используемые в Pawno. Если интересно, можно посмотреть его содержимое, но менять ничего нельзя.
Ниже идет блок кода:
Код #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, то есть функция вернет часть строки до первого пробела.
Полный код скрипта приведен ниже:
Код #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; }
//=========================[Strtok]====================== strtok(const string[], &index) { new length = strlen(string); while ((index < length) && (string[index] <= ' ')) { index++; } new offset = index; new result[20]; while ((index < length) && (string[index] > ' ') && ((index - offset) < (sizeof(result) - 1))) { result[index - offset] = string[index]; index++; } result[index - offset] = EOS; return result; }
В строке #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, описание которой можно найти в сети.
Если я что-то забыл, вы меня дополните. Жду ваши мнения и пожелания
Помогаю новичкам! По всем вопросам пишите в лс.
Способ:Как подставить агента ФБР на Самп рп. http://cheat-master.ru/forum/73-691038-1 Трек про El_Capone! http://cheat-master.ru/forum/163-704803-1 Как поднять онлайн сервера и как его удержать. http://cheat-master.ru/forum/165-705613-1 Введение в pawno. http://cheat-master.ru/forum/117-705767-1 Как пользоваться Map Construction http://cheat-master.ru/forum/117-705826-1 Как зарабатывать на перепродажах бизнесов! http://cheat-master.ru/forum/192-705828-1 Как подставить военного в армии! http://cheat-master.ru/forum/73-706840-1 Что такое двухфакторная аутентификация? http://cheat-master.ru/forum/21-707015-1
Сообщение отредактировал [CM]DanteMoretty[CM] - Среда, 02.08.2017, 19:30 |
|
|
|
[CM]DanteMoretty[CM] |
Дата: Вторник, 15.08.2017, 09:20 | Сообщение # 3
|
Авторитет
Сообщений: 1104
Статус: Offline
|
Подниму!
Помогаю новичкам! По всем вопросам пишите в лс.
Способ:Как подставить агента ФБР на Самп рп. http://cheat-master.ru/forum/73-691038-1 Трек про El_Capone! http://cheat-master.ru/forum/163-704803-1 Как поднять онлайн сервера и как его удержать. http://cheat-master.ru/forum/165-705613-1 Введение в pawno. http://cheat-master.ru/forum/117-705767-1 Как пользоваться Map Construction http://cheat-master.ru/forum/117-705826-1 Как зарабатывать на перепродажах бизнесов! http://cheat-master.ru/forum/192-705828-1 Как подставить военного в армии! http://cheat-master.ru/forum/73-706840-1 Что такое двухфакторная аутентификация? http://cheat-master.ru/forum/21-707015-1
Сообщение отредактировал [CM]DanteMoretty[CM] - Вторник, 15.08.2017, 09:20 |
|
|
|
[CM]DanteMoretty[CM] |
Дата: Среда, 06.09.2017, 04:36 | Сообщение # 5
|
Авторитет
Сообщений: 1104
Статус: Offline
|
Подниму!
Помогаю новичкам! По всем вопросам пишите в лс.
Способ:Как подставить агента ФБР на Самп рп. http://cheat-master.ru/forum/73-691038-1 Трек про El_Capone! http://cheat-master.ru/forum/163-704803-1 Как поднять онлайн сервера и как его удержать. http://cheat-master.ru/forum/165-705613-1 Введение в pawno. http://cheat-master.ru/forum/117-705767-1 Как пользоваться Map Construction http://cheat-master.ru/forum/117-705826-1 Как зарабатывать на перепродажах бизнесов! http://cheat-master.ru/forum/192-705828-1 Как подставить военного в армии! http://cheat-master.ru/forum/73-706840-1 Что такое двухфакторная аутентификация? http://cheat-master.ru/forum/21-707015-1
Сообщение отредактировал [CM]DanteMoretty[CM] - Среда, 06.09.2017, 04:36 |
|
|
|