»
Привет Гость:)

Language: ENG / UA / RU / CN / AR |
Онлайн всего: 1
Гостей: 1
Пользователей: 0

Меню сайта
Опрос
Оцените сайт
Всего ответов: 27
RADIO ONLINE
Главная » Видео » Все для сервера SA-MP » Другое

Введение в Pawno
Дата: 03.03.2012, 23:50

Что такое 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, описание которой можно найти в сети.

Похожие материалы
[ Сообщить о битой ссылке ]
Добавил: BELIY | | Теги: pawno, Введение
Просмотров: 736 | загрузок: 0 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Смотреть Онлайн
Четкий удар в яблочко не пол...


Смотреть Видео Онлайн
new комментарии
Реклама


ISP.at.ua
SDW.at.ua
ck-vaz.at.ua

Copyright ISP.at.ua ©® 2012-2024™ V2-версия шаблона | Design by KF.AT.UA ©®™
| |
Myserver.do.am |
Sitemap | Sitemap-forum | Хостинг от uCoz