Pawn-скриптинг: Введение - Форум Cheat-Master.ru
Меню сайта
  • Страница 1 из 1
  • 1
Модератор форума: Phoenixxx_Czar, Getbackthere, [CM]OlegEhtler  
Форум » Pawno программирование SAMP » Уроки | FAQ » Pawn-скриптинг: Введение
Pawn-скриптинг: Введение
[CM]Bryansk Дата: Воскресенье, 31.07.2016, 01:28 | Сообщение # 1
Новичок
Сообщений: 13
Статус: Offline
Введение.

Для начала надо знать:
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, переводится как "функция, вызываемая автоматически".
Это процедуы, которые определяют, что будет
выполняться при данном действии, будь то игрока написал что то в чате,
или запустился мод. Каждый калбек имеет определённое название и определённые параметры.


Данный паблик паблик отвечает за то, что будет, когда игрок сдохнет.
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;

Cоздана переменная 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. Проверки.

Проверка - функция, проверящая, выполняется ли данная функция. Если выполняется функция,
то и выполняется определённый код.

Код
if(некая_функция)
{
// код, который должен выполняться, при выполнение некая_функция
}

В качестве проверки может использоваться:
1. сравнению переменных, либо значений функций,
2. выполняеться ли некая функция.


1. Сравнение переменных.
Код
if(GetPlayerMoney(playerid) >= money)
{
выполнение_кода;
}


В данной проверка произведено сравнение:
ЕСЛИ деньги_игрока >= (больше или равно) money
ТО выполнение_кода

Есть разных виды сравнений:

!= - не равно
>= - больше или равно
<= - меньше или равно
> - больше
< - меньше
== - равно

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

public OnPlayerDeath(playerid,killerid,reason)//Паблик
{
kills[killerid]++;//+1 к значению kills у игрока killerid
if(kills[killerid] == 10)//Если значение kills игрока killerid равно 10
{//Начало выполнения кода
SendClientMessage(playerid,0x000FFF,"Вы убили уже 10 раз, вы получили бонус $10000.");//Сообщение
GivePlayerMoney(playerid,10000);//Выдаются деньги
}//Конец выполнения кода
}
[/pnp]


2. Выполнение определённой фукнции.

Проверяет, выполняеться ли данная функция.

Код
if(IsPlayerConnected(playerid))
{

}

Выполняется проверка, подключён ли игрок к серверу.

Практика.
Код
public OnPlayerCommandText(playerid,cmdtext[])//Паблик
{
    if(strcmp(cmdtext,"/testmessage",true)==0)//Проверка, выполнена ли данная комманда.
    {//Начало выполнения кода
            SendClientMessage(playerid,0xAFF00000,"Команда выполнена.");
            return 1;//Здесь тоже нужен return.
    }//Конец выполнения кода
    return 1;
}

Конечно, есть функия, использующаяся при невыполнениии проверки.

Называется else. Используется так.

Код
public OnPlayerCommandText(playerid,cmdtext[])
{
    if(strcmp(cmdtext,"/testmessage",true)==0)
    {
            if(IsPlayerAdmin(playerid))//Являеться ли игрок ркон-админом.
            {
            SendClientMessage(playerid,0xAFF00000,"Команда выполнена.");//Если да, то выполняеться данная функция.
            }
            else SendClientMessage(playerid,0xAFF00000,"Вы не являетесь ркон админом.");//Если нет, то выполняется другая функция..
            return 1;
    }
    return 1;
}

Урок 6. Создание новых пабликов.

Новый паблик создаётся так:
Код
forward SetPlayerMoney(playerid,money);

Создаётся он для того, чтобы вызвать некоторые функции одновременно.

Например, функция установки денег.

Код
forward SetPlayerMoney(playerid,money);//Создан паблик

public SetPlayerMoney(playerid,money)
{
    ResetPlayerMoney(playerid);//Все деньги у игрока отбираются.
    GivePlayerMoney(playerid,money);//Игрок получат деньги.
}

Урок 7. Таймер.


Таймер - функция, вызвающая определённый паблик в определённое время.
Функция может вызваться единожды, либо повторяться через
заданные промежутки времени.

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

Код
SetTimer("NewPublic",1000,1);

В 1 секунде - 1000 миллисекунд.

1000 - заданный промежуток времени в миллисекундах, после которого паблик запускается заново.
1 - тип таймер. Если установлено 1, то таймер перезапускается бесконечное кол-во раз. Если 0, то таймер вызывает
паблик только первый раз.

Примечание: не стоит ставить значение таймера < 100, это может вызвать нагрузку на процессор.

Пример использования:
Код
public OnGameModeInit()
{
    SetTimer("AllMessage",120000,1);//Cоздан таймер, поставленный на паблик NewPublic.
    //Таймер запускается каждые 2 минуты
}

forward AllMessage();

public AllMessage()
{
    SendClientMessageToAll(0xAFDAFD00," >> Серверу требуются модераторы.");
    //Cообщение. Отправляется всем игрокам каждые 2 минуты.


Урок 8. Циклы.


Цикл - функция, которая перебирает все значения определённой
переменной, в указанных рамках.


Код цикла:
Код
for(new i=0;i<50;i++)//Цикл
{//Начало действия цикла

    GivePlayerMoney(i,1000);//Даются деньги
    GameTextForPlayer(i,"~r~bonus!",1000,1);//Сообщение
    //Перебираюся все значения i, выходит,  что функция выполняется для всех игроков с ID < 50

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


Примечание: не стоит ставить ограничение цикла на MAX_PLAYERS (500). Это вызывает большую
нагрузку на процессор.


Пример использования цикла.
Код
public OnGameModeInit()
{
    SetTimer("TTimer",120000,1);//Создаётся таймер.
}

forward TTimer();//Создаётся паблик.

public TTimer()
{
    for(new i=0;i<50;i++)//Цикл, просматриваются все значения i до 50.
    {
        SendClientMessage(i,0xAFAFAF," >> Серверу требуются модераторы.");//Всем игрокам с ID < 50 отправляется сообщение.
    }
}


Урок 9. #define.

Данная функция используется довольно редко. Позволяет на одно слово "поставить" другое.
Код
#define COLOR_ZEL 0x00FF00AA

Слово COLOR_ZEL теперь понимается компилятором как определённый код цвета.

Урок 10. enum


enum - это вещь, позволяющая создавать большее количество адресов одной переменной.

Пример:
Код
enum PVar
{
    PHealth,
    PArmour
}

Здесь у адреса PVar создаются подразделы PHealth, PArmour.

Код
new PlayerVar[MAX_PLAYERS][PVar];


Теперь игрок может на одну переменную игрока ставить несколько адресов.
Под PVar подразумевается PHealth, либо PArmour.

Разумеется, enum можно юзать и в общей (серверной) переменной.

Код
enum SVar//Создан адрес SVar с подразделами Players и AllPlayers
{
    Players,
    AllPlayers
}

new PlayerServer[SVar];

Пример использования.
Код
enum Var1//Создан адрес Var1 с подразделами PBank, PKills и PDeaths.
{
    PBank,
    PKills,
    PDeaths
}

new PlayerVar[MAX_PLAYERS][Var1];//Создана переменная с данными адресами

public OnPlayerDeath(playerid,killerid,reason)
{
    PlayerVar[playerid][PDeaths]+=1;//К адресу PDeaths переменной игрока ставиться +1
    PlayerVar[killerid][PKills]+=1;//К адресу PKills переменной игрока ставиться +1
}

Дополнение 1. Работа с dcmd.

dcmd - командный процессор, с помощью которого можно более просто (обходя strtok) создавать команды с переменными.

Вообще сама функция dcmd создаётся при помощи define. Код:

Код
#define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1

Перед созданием самой команды надо обозначить её в OnPlayerCommandText(playerid,cmdtext[])
Код
public OnPlayerCommandText(playerid,cmdtext[])
{
    dcmd(healplayer,10,cmdtext);
    return 1;
}

healplayer - название команды, 10 - кол-во символов в команде.

Сама команда создаётся так:

Код
dcmd_healplayer(playerid,params[])//Создана команда healplayer
{
    new player1;//создана переменная
    player1 = strval(params[0]);//к player1 присваивается числовое значение params[0]
    if(IsPlayerConnected(player1))//Проверка, подключён ли игрок к серверу
    {
        if(IsPlayerAdmin(playerid))//Проверка, является ли игрок, вводивший команду, rcon-админом
            {
                SetPlayerHealth(player1,100);//ХП того игрока становиться 100
            }
    }
}

Дополнение 2. Работа с strtok.
strtok - функция, аналогичная dcmd. Позволяет создать команды с переменными.

Сама функция 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;
}


Переходим к паблику OnPlayerCommandText. Сначала пишем там код:
Код
new cmd[256],idx;
cmd = strtok(cmdtext,idx);

Создаём саму команду:

Код
if(strcmp(cmd,"/healplayer",true)==0)//Проверка на введёную команду
{
    new tmp[256];//Создаём 1 переменную tmp[256]. Обязательна для strtok
    new splayer;//Создаём общую переменную

    //Далее код переменной в команде. splayer можно заменить любой другой подходящей переменной
    tmp = strtok(cmdtext,idx);
    if(!strlen(tmp))
    {
        SendClientMessage(playerid,0xFFFFF00,"Юзайте: /healplayer [playerid]");
    }
    splayer = strval(tmp);

    if(IsPlayerConnected(splayer))//На сервере ли игрок?
    {
        if(IsPlayerAdmin(playerid))//Являетесь ли вы rcon-админом?
        {
            SetPlayerHealth(splayer,100);//Игроку даётся 100 хп.
        }
        else SendClientMessage(playerid,0xFFFFF00,"Вы не являетесь RCON-админом!");//Иначе мисага
    }
    else SendClientMessage(playerid,0xFFFFF00,"Игрок не находится на сервере.");//Иначе мисага
    return 1;
}

Всё, команда создана.

Взято с: P-W
Автор неизвестен


Pawn-скриптинг: Введение - cheat-master.ru/forum/117-627188-1

Сообщение отредактировал [CM]Bryansk - Воскресенье, 31.07.2016, 01:36
[Izext] Дата: Воскресенье, 31.07.2016, 19:10 | Сообщение # 2
Боец
Сообщений: 227
Статус: Offline
Сам все писал? Мне очень понравилось оформление. И объяснение хорошие, спасибо, много не знал smile

Вы здесь: 666-й день
[CM]Bryansk Дата: Суббота, 21.01.2017, 06:47 | Сообщение # 3
Новичок
Сообщений: 13
Статус: Offline
Ну естественно сам.
Много времени ушло на оформление, коды и так далее.

Добавлено (07.08.2016, 03:26)
---------------------------------------------
Up

Добавлено (21.01.2017, 06:47)
---------------------------------------------
up


Pawn-скриптинг: Введение - cheat-master.ru/forum/117-627188-1
Rebus Дата: Суббота, 11.03.2017, 01:18 | Сообщение # 4
Реба)
Сообщений: 116
Статус: Offline
Не сам,ты скопировал с другого форума.

[CM]Bryansk Дата: Понедельник, 10.04.2017, 14:13 | Сообщение # 5
Новичок
Сообщений: 13
Статус: Offline
Цитата Rebus ()
Не сам,ты скопировал с другого форума.

А там разве не указанно от куда взял?
Оформление то не скопируешь!!
Или ты думаешь что все так быстро??
Попробуйка создай такую тему.
Интересно посмотреть как у тебя получится


Pawn-скриптинг: Введение - cheat-master.ru/forum/117-627188-1
Ksardas Дата: Понедельник, 12.06.2017, 17:56 | Сообщение # 6
麵包和共振
Сообщений: 1302
Статус: Offline
Полезно,всё не читал,так как тут много банального.Молодец,хорошая тема)
Frayz_Company Дата: Вторник, 13.06.2017, 12:31 | Сообщение # 7
Боец
Сообщений: 83
Статус: Offline
Хорошая статья,автор молодец
Raindery Дата: Понедельник, 31.07.2017, 04:24 | Сообщение # 8
Новичок
Сообщений: 3
Статус: Offline
Хорошая тема! Будет очень полезна новичкам
Спасибо!


Все мы лишь элементы двоичной системы
DECODE Дата: Понедельник, 31.07.2017, 04:54 | Сообщение # 9
Coder
Сообщений: 192
Статус: Offline
Ну, насчет того, что писал сам - я глубоко сомневаюсь, скажу честно, нет некоторых элементов, который определенно нужны в ведении, например, работа с PVar (временными переменными, а на секундочку, pVar в разы быстрее enum, который описан в данном мануале).

► Оптимизация SCM / SMTA (pawn): http://cheat-master.ru/forum/117-706531-1
► CM Smiles - Mini Chat (v1.0): http://cheat-master.ru/forum/2-706062-1
► [Evolve-RP] - Баг на деньги (история тестера): http://cheat-master.ru/forum/282-709301-1
► Накрутка сообщений в ВКонтакте (new): http://cheat-master.ru/forum/199-709369-1
=) Дата: Понедельник, 31.07.2017, 20:21 | Сообщение # 10
Боец
Сообщений: 271
Статус: Offline
Цитата DECODE ()
Ну, насчет того, что писал сам - я глубоко сомневаюсь, скажу честно, нет некоторых элементов, который определенно нужны в ведении, например, работа с PVar (временными переменными, а на секундочку, pVar в разы быстрее enum, который описан в данном мануале).


Терпеть не могу людей, который мало того, что сами ничего не знают, так еще и других делают идиотами.

Код

Всем привет. Дело было вечером, делать было нечего.
Написал простенький скрипт, для сравнения скорости.
Массив же быстрее PVar? На кой фиг его (PVar) тогда вообще использовать?
Не раз натыкался на рекомендации, использовать PVar вместо массива, якобы быстрее работает.
В давние времена, когда SAMP был еще "маленький", он был рассчитан на 100 игроков, но прошло время, и SAMP вырос, и уже 500 игроков могли играть одновременно, а потом и 1000.
Еще в SAMP'e была и есть константа MAX_PLAYERS, обозначающая - максимальное количество игроков, сначала она была равна 100, потом 500, и наконец 1000.
Многие "скриптеры", создавали и создают массивы с использованием MAX_PLAYERS, лишь для хранения одиночных флагов (1, 0 и т.п.), когда MAX_PLAYERS была равна 100, это еще было терпимо, но сейчас, подобное использование массивов слишком затратно в плане потребления памяти.

Как нам известно, 1 ячейка массива занимает 4 байта, рассчитаем потребление памяти на один массив:

MAX_PLAYERS при:
100 * 4 занимало памяти 400 байт;
500 * 4 занимало памяти 2000 байт;
1000 * 4 занимает памяти 4000 байт;

А если на сервере играют, к примеру 100 человек, то остальные 900 ячеек массива, возможно, никогда не будут использованы, а это, не задействованные 3600 байт.

В связи с этим, была создана Per-player variable system (сокращенно PVar), система персональных переменых, имеет ряд преимуществ, по сравнению со стандартными переменными:
Доступность из всех загруженных модов и фильтр скриптов, позволяет упростить модуляризацию кода.
Автоматическое удаление PVar'ов, когда игрок выходит с сервера, что позволяет не сбрасывать вручную переменные для следующего подключившегося игрока.
PVar'ы экономят память, не расходуя ее на элементы на не подключенных игроков.
Если даже PVar не был создан, при запросе он по-прежнему будет возвращать значение по умолчанию 0.
PVar'ы могут хранить очень большие строки используя динамически выделяемую память.

К недостаткам, возможно, можно отнести скорость работы, но я считаю, что это не очень критично.


П. С. взято с другого форума. Автор один из пользователей того форума.
DECODE Дата: Вторник, 01.08.2017, 00:44 | Сообщение # 11
Coder
Сообщений: 192
Статус: Offline
Цитата =) ()
Терпеть не могу людей, который мало того, что сами ничего не знают, так еще и других делают идиотами.


Я привожу пример из личного опыта, да, согласен, на ПП написана корректная инфа.
Касательно остального, по большей части был вопрос, почему есть отсутствие pVar в мануале и почему половина из них нагло украдена.


► Оптимизация SCM / SMTA (pawn): http://cheat-master.ru/forum/117-706531-1
► CM Smiles - Mini Chat (v1.0): http://cheat-master.ru/forum/2-706062-1
► [Evolve-RP] - Баг на деньги (история тестера): http://cheat-master.ru/forum/282-709301-1
► Накрутка сообщений в ВКонтакте (new): http://cheat-master.ru/forum/199-709369-1


Сообщение отредактировал DECODE - Вторник, 01.08.2017, 01:01
nathan_animeshnik Дата: Среда, 02.08.2017, 20:52 | Сообщение # 12
Боец
Сообщений: 92
Статус: Offline
Годный гайд.
Mussolliny Дата: Воскресенье, 29.10.2017, 15:39 | Сообщение # 13
♣ БАРЫГА ♣
Сообщений: 103
Статус: Offline
Спасибо огромное за тему, плюс заслужил



[CM]Bryansk Дата: Четверг, 02.11.2017, 19:24 | Сообщение # 14
Новичок
Сообщений: 13
Статус: Offline
Цитата Mussolliny ()
Спасибо огромное за тему, плюс заслужил

Благодарю

Добавлено (29.10.2019, 20:55)
---------------------------------------------
Давно не поднимал


Pawn-скриптинг: Введение - cheat-master.ru/forum/117-627188-1
ZiL-131 Дата: Пятница, 06.12.2019, 12:47 | Сообщение # 15
Боец
Сообщений: 102
Статус: Offline
Форум » Pawno программирование SAMP » Уроки | FAQ » Pawn-скриптинг: Введение
  • Страница 1 из 1
  • 1
Поиск:
Статистика Форума