Введение.

Для начала надо знать:

1. Pawn - язык программирования. Приспособлен для создание модов и скриптов в SA-MP.
2. Чтобы использовать данный язык, нужна программаPawno.

Неплохо знать английский язык, т.к. именно на нём записаны все функции и калбеки.

Оглавление:

Урок 1. Начало.
Урок 2. Паблики.
Урок 3. Функции.
Урок 4. Переменные.
Урок 5. Проверки.
Урок 6. Создание новых пабликов.
Урок 7. Таймер.
Урок 8. Циклы.
Урок 9. #define.
Урок 10. enum.
Дополнение 1. Работа с dcmd.
Дополнение 2. Работа с strtok.

Урок 1. Начало.

Если вы делаете мод, то сначала стоит записать данные строки:

Код:
#include <a_samp>//Включение в мод все функций и калбеков sa-mp.

main(){}

a_samp.inc - это файл, содержащий в себе все функции и паблики sa-mp.

Урок 2. Паблики.

Паблики (public), иногда их называют калбеки (callbacks).
Callback, переводится как "функция, вызываемая автоматически".
Это процедуы, которые определяют, что будет
выполняться при данном действии, будь то игрока написал что то в чате,
или запустился мод. Каждый калбек имеет определённое название и определённые параметры.
Пример паблика:

Код:
public OnPlayerDeath(playerid,killerid,reason)//Строка определяет, что это за паблик, его параметры.
{//Начало действия.

}//Конец действия

Данный паблик паблик отвечает за то, что будет, когда игрок сдохнет.
playerid - ИД того, кто погиб
killerid - ИД того, кто убил игрока
reason - причина (в смысле, каким оружием)

Код:
public OnPlayerDeath(playerid,killerid,reason) //Игрок умер.
{
    //здесь описывается то, что будет, если игрок умер
}

В конце каждого паблика должен стоять return.
Если паблик находится в моде, то вводим return 1;
Если паблик находится в скрипте, то вводим return 0;
Если установить return 1; в скрипте, то выйдет такая ситуация:
паблик в скрипте работать не будет!
Исключение: OnPlayerText.

Основные паблики.

OnGameModeInit() - события, когда загружается мод

OnGameModeExit() - события, когда выгружается мод

OnPlayerConnect(playerid) - события, когда игрок подключается к серверу

OnPlayerDisconnect(playerid,reason) - события, когда игроку отключается от сервера. reason - причина отключения.

OnPlayerDeath(playerid, killerid, reason) - события, когда игрок погибает. reason - причина гибели.

OnPlayerRequestClass(playerid, classid) - события, когда игрок выбирает скина. classid - какой скин выбран на данный
момент.

OnPlayerCommandText(playerid,cmdtext[]) - события, когда игрок ввёл команду. cmdtext - команда, используется в strcmp.

OnPlayerPickUpPickup(playerid, pickupid) - события, когда игрок поднял пикап. pickupid - ID пикапа

OnPlayerText(playerid,text[]) - события, когда игрок ввёл текст в чат.
Типы return-ов. Если return1; - текст игрока отображается в чате,
если return 0; - текст игрока не отображается в чате.

OnPlayerSpawn(playerid) - события, когда игрок отправился на спавн.

OnFilterScriptInit() - события, когда скрипт загружается на сервер

OnFilterScriptExit() - события, когда скрипт выгружается из памяти сервера

Практика.

Код:
public OnPlayerDeath(playerid,killerid,reason)//Игрок умер.
{
    //некий код
    return 1;//т.к. стоит в моде
}

Урок 3. Функции.

Функции - они и в Африке функции. Каждая функция, как и паблик,
имеет определённые параметры. Синтаксис нативной функции:

Код:
GivePlayerMoney(playerid,money);

Данная функция даёт игроку playerid деньги money.

Может быть функция с одним параметром, например:

Код:
GetPlayerMoney(playerid);

Данная функция определяет число денег у игрока playerid. Cама по себе бесполезна,
используется для других фукнций.

Основные функции.

SetPlayerHealth(playerid,health); - установить игроку playerid здоровье health

SetPlayerArmour(playerid,armour); - установить игроку playerid уровень брони armour

GivePlayerMoney(playerid,money); - дать игроку playerid деньги money

ResetPlayerMoney(playerid); - все деньги игроку обнуляются

ResetPlayerWeapons(playerid); - игрок лишается всего оружие

GivePlayerWeapon(playerid,weaponid,var1); - игроку playerid даётся оружие weaponid с патронами var1

CreatePickup(model,type,Float:X,Float:Y,Float:Z); - создаёт пикап (разбросанное оружие) с ид model, с типом пикапа type
и с координатами X,Y,Z
Если пикап будет перерождаться, то ставим type 2. Если создаётся только один раз - type 3.

AddStaticPickup(model,type,Float:X,Float:Y,Float:Z); - создаётся пикап model с типом type и координатами X,Y,Z

CreateVehicle(modelid, Float:x, Float:y,Float:z, Float:angle, color1, color2, respawn_delay); - создаётся автомобиль modelid,
x,y,z - координаты, angle - угол поворота, color1, color2 - цвета, respawn_delay - время в секундах, через которое
автомобиль будет респавниться после того, как оно было покинуто водителем.

AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y,Float:spawn_z, Float:angle, color1, color2); - создаётся автомобиль
modelid,
spawn_x, spawn_y, spawn_z - координаты, angle - угол поворота, color1, color2 - цвета авто. Используется только в
OnGameModeInit().

SendClientMessage(playerid, 0xDEEE20FF, "Hello."); - отправляет текст в чат игроку playerid с определённом цветом, и с
текстом
"Hello."

SendClientMessageToAll(0xDEEE20FF, "Hello."); - аналогично, только тот же текст отправляется всем игрокам в общий чат.

И теперь практика!

Код:
public OnPlayerDeath(playerid,killerid,reason)//Игрок умер.
{
//Начало действия паблика
GivePlayerMoney(killerid,GetPlayerMoney(playerid));//Игроку killerid (тот кто убил) даются все деньги playerid (тот, кто умер).
//Конец действия
}

Урок 4. Переменные.
Строго говоря это адреса памяти, имеющие определённое значение.
Говоря проще, это некое слово, имеющие числовое значение

Существуют несколько видов переменных:
1. серверные переменные,
2. переменные игроков,
3. текстовые переменные.

1. Серверные переменные.

Так будем называть общие переменные.

Код:
new server_players=0;

Создана перменная server_players со значением 0.

Присвоение значения:

Код:
server_players=5;

Переменной server_players присвоено значение 5.

Функция прибавление к значению опред. числа:

Код:
server_players+=5;

Функция отнятия из значения опред. числа:

Код:
server_players-=5;

+1 к значению:

Код:
server_players++;

-1 к значению:

Код:
server_players--;

К переменной можно присвоить значение функции.

Код:
server_players=GetPlayerMoney(playerid);//переменной server_players присвоено значение денег игрока playerid

Также к переменной можно присвоить ИД, например, транспорта.

Код:
new vehicle;//Создаётся переменная.

vehicle=CreateVehicle(522, 1683, 785,0, 0, 6, 9,-1);//Переменной 'vehicle' присвоено значение ИД транспорта.

DestroyVehicle(vehicle);//Транспорт уничтожается.

Практика.

Код:
public OnPlayerDeath(playerid,killerid,reason)//Паблик
{//Начало выполнения
server_players++;//+ 1 к значению server_players
}//Конец выполнения

2. Переменные игроков.

Переменная, которая приклепляется к каждому игроку на сервере.

Код:
new player[MAX_PLAYERS]=0;

Создана переменная player со значением 0.

На данном этапе каждый игрок имеет значение 0.

Код:
player[playerid]=5;

Переменной player одного игрока playerid присваивается значение 5.

Также с данной переменной совершаются все действия серверной переменной.

Практика.

Код:
new kills[MAX_PLAYERS]=0;//Создана переменная kills. Для всех игроков установлено значение 0.
new deaths[MAX_PLAYERS]=0;//Создана переменная deaths. Для всех игроков установлено значение 0.

public OnPlayerDeath(playerid,killerid,reason)//Паблик
{
kills[killerid]++;//+1 к значению kills у игрока killerid
deaths[playerid]++;//+1 к значению deaths у игрока playerid
}

3. Текстовые переменные.

Текстовые переменные - переменные, значением которых может быть только текст.

Код:
new string[256];//cоздана переменная string

Такая переменная в основном используется для создания форматированного текста.

Код:
format(string,256," Ваши деньги: %d",GetPlayerMoney(playerid));

%d - некое числовое значение
%s - некое текстовое значение

Переменной string присвоено текстовое значение, указанное в кавычках.

Есть ещё переменная, используемая для имени:

Код:
new name[MAX_PLAYER_NAME];

Cоздана переменная name.

Практика.

Код:
GetPlayerName(playerid,name,256);//Получено имя игрока
format(string,256," Ваше имя: %s",name);//Форматирование текста
SendClientMessage(playerid,0xAAFF00,string);//Отправлено сообщение

Все уроки будут позже 5,6,7,8,9,10 уроки ,1дополнение,2дополнение