Главная » Статьи » Статьи

Введение в pawno. Самп.
Введение в pawno.

Что такое pawno?

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;  
  }  

  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 (из папки 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;  
  }  

  //=========================[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, описание которой можно найти в сети.
Категория: Статьи | Добавил: RezON (23.09.2012)
Просмотров: 1971 | Теги: начинающих, в Pawno, Полезная, скриптеров, статься, для | Рейтинг: 1.0/3
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]