Подключение файлов (include) в Pawn

Активный
Статус
Сообщения
516
Лайки
32

8

месяц на сайте

Include файлы позволяют организовать код и использовать готовые библиотеки. Разберем работу с ними.

Базовый синтаксис
Код:
#include <filename>
#include "filename"

Разница между < > и " ":
- < > - поиск в стандартных директориях компилятора
- " " - поиск в текущей директории, затем в стандартных

Стандартные include файлы
Код:
#include <a_samp> // основной файл SA-MP
#include <a_npc> // для NPC режимов
#include <core> // базовые функции
#include <float> // функции для Float
#include <string> // строковые функции
#include <file> // работа с файлами
#include <time> // работа со временем
#include <datagram> // UDP пакеты
#include <fixes> // исправления багов

Популярные сторонние библиотеки
Код:
#include <zcmd> // система команд
#include <sscanf2> // парсинг параметров
#include <YSI\y_ini> // работа с INI файлами
#include <YSI\y_timers> // улучшенные таймеры
#include <streamer> // стример объектов
#include <foreach> // циклы по игрокам

Создание собственного include файла
Код:
// myfunctions.inc
#if defined _myfunctions_included
    #endinput
#endif
#define _myfunctions_included

// Функции
stock GetPlayerDistance(playerid1, playerid2)
{
    new Float:x1, Float:y1, Float:z1;
    new Float:x2, Float:y2, Float:z2;
    
    GetPlayerPos(playerid1, x1, y1, z1);
    GetPlayerPos(playerid2, x2, y2, z2);
    
    return floatround(floatsqroot(
        floatpower(x1-x2, 2) + 
        floatpower(y1-y2, 2) + 
        floatpower(z1-z2, 2)
    ));
}

stock SendMessageToAdmins(color, const message[])
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i) && IsPlayerAdmin(i))
        {
            SendClientMessage(i, color, message);
        }
    }
}

// Использование:
// #include "myfunctions"
// GetPlayerDistance(playerid1, playerid2);

Условная компиляция
Код:
#if defined USE_MYSQL
    // код для MySQL
    #include <mysql>
#else
    // код для файлов
    #include <file>
#endif

// Определение констант
#define MAX_PLAYERS 100
#define SERVER_NAME "My Server"

// Проверка версии
#if !defined _samp_included
    #error "Требуется a_samp.inc"
#endif

Pragma директивы
Код:
#pragma tabsize 4 // размер табуляции
#pragma ctrlchar '$' // символ управления
#pragma dynamic 65536 // размер стека
#pragma compress 1 // сжатие AMX файла

Пример организации проекта
Код:
// gamemode.pwn
#include <a_samp>
#include <zcmd>
#include <sscanf2>

// Собственные файлы
#include "defines"
#include "enums"
#include "variables"
#include "functions"
#include "callbacks"
#include "commands"

main()
{
    print("Сервер загружен");
}

public OnGameModeInit()
{
    // инициализация
    return 1;
}

Структура файлов:
Код:
// defines.inc
#define MAX_PLAYERS 100
#define DIALOG_LOGIN 1
#define COLOR_WHITE 0xFFFFFFFF

// enums.inc
enum PlayerInfo
{
    pName[MAX_PLAYER_NAME],
    pLevel,
    pMoney
}

// variables.inc
new PlayerData[MAX_PLAYERS][PlayerInfo];

// functions.inc
stock LoadPlayerData(playerid) { }
stock SavePlayerData(playerid) { }

// callbacks.inc
public OnPlayerConnect(playerid) { return 1; }
public OnPlayerDisconnect(playerid, reason) { return 1; }

// commands.inc
CMD:help(playerid, params[]) { return 1; }

Важные моменты:
- Используйте защиту от повторного включения (#if defined)
- Организуйте код логически по файлам
- Проверяйте зависимости между файлами
- Используйте stock для функций в include файлах

Правильная организация кода упрощает разработку и поддержку!
 

1 человек читают эту тему (Всего: 1, Пользователей: 0, Гостей: 1)

Сверху