Архитектура Pawn(SA-MP) проекта

В этой статье я хочу посоветовать Pawn скриптерам то, как нужно устраивать внутреннюю часть вашего SA-MP проекта. Далеко не секрет, что большая часть скриптеров хранят свои режимы всего в одном .pwn файле. Эта мода пошла от режимов Pen и The Godfather. В действительности, это решение является довольно непрактичным, ибо при увеличении количества кода, его сложность значительно увеличивается.

Чтобы избежать усложнения проекта при его расширении, вам достаточно правильно спроектировать архитектуру вашего проекта до его реализации, или провести рефакторинг уже существующего проекта.

Подготовка

У нас есть каталог projects/, в котором будут храниться все наши Pawn проекты. Конечно, вам потребуется компилятор, лучше всего компилятор не хранить в каждом проекте, а вынести в отдельный каталог compiler/. Проекты будут храниться в каталогах projects/project_1, projects/project_2, где project_1 и project_2 — названия ваших проектов.

В итоге, площадка для разработки должна выглядеть следующим образом:

compiler
    includes
        a_actor.inc
        a_http.inc
        a_npc.inc
        a_objects.inc
        a_players.inc
        a_sampdb.inc
        a_samp.inc
        a_vehicles.inc
        core.inc
        datagram.inc
        file.inc
        float.inc
        string.inc
        time.inc
    libpawnc.so
    pawncc
    pawncc.exe
    pawncc.pdb
    pawnc.dll
    pawnc.pdb
project_1
project_2

Я рекомендую использовать версию Pawn компилятора от Zeex. Эта версия отличается исправлением некоторых ошибок, введением небольшого количества новых возможностей и версией для Linux.

Проектирование проекта

Для тестирования удобно будет расположить сервер в каталоге с проектом, поэтому файлы samp-npc.exe, samp-server.exe, server.cfg и каталоги gamemodes/ scriptfiles/, plugins/ будут расположены в каталоге проекта.

Исходные коды проекта будут размещаться в отдельном каталоге sources/.

Для компиляции проекта нам понадобится исполняемый файл make.bat для Windows и make.sh для Linux, создайте файл make.bat и make.sh в каталоге проекта и поместите туда, изменив в нём имя проекта project_1 на своё, следующее содержимое:

make.bat:

set name=project_1
..\compiler\pawncc.exe -;+ -(+ -i../compiler/includes sources\%name%.pwn
if exist %name%.amx ^
move %name%.amx gamemodes\
pause

make.sh:

#/bin/bash
 
export LD_LIBRARY_PATH=$(pwd)"/../compiler/:$LD_LIBRARY_PATH"
 
NAME=project_1
 
./../compiler/pawncc "-;+" "-(+" "-i../compiler/includes" sources/$NAME.pwn
 
if [ $(stat -c%s "$NAME.amx") -gt 0 ];
then
    mv $NAME.amx gamemodes/
else
    rm $NAME.amx
fi

В итоге, мы получили такую структуру проекта:

project_1
    gamemodes
    plugins
    scriptfiles
    sources
    make.bat
    make.sh
    samp-npc.exe
    samp-server.exe
    server.cfg

Далее необходимо создать шаблон структуры файлов проекта. Я порекомендую наиболее полный, по моему мнению, вариант.

  • Каталог admin/, в котором будут расположены все функции администратора. Файлы: admin/commands.inc, admin/menu.inc, admin/kick.inc, admin/ban.inc, admin/jail.inc, admin/mute.inc. В принципе, по их названию понятно, что в них должно находиться. Ещё нужен файл admin/admin.inc, который будет объединять всё из admin/. И в котором будут находиться небольшие функции, которые не заслужили отдельного файла.
  • Каталог core/, в котором будут храниться функции, связанные с ядром системы. Например, там может находится файл core/log.inc, в котором будет реализована система логирования. Файл core/lang.inc, в котором будет реализована система многоязычности.
  • Каталог gang/, в котором расположены все функции, связанные с бандой. Файлы: gang/commands.inc, gang/menu.inc, gang/level.inc. Ещё нужен файл gang/gang, который будет объединять всё из gang/. И в котором будут находиться небольшие системки, которые не заслужили отдельного файла.
  • Каталог lang/, в котором будут храниться различные локали, нужные при компиляции.
  • Каталог lib/, в котором расположены библиотеки с функциями, такие как mxINI.inc, a_mysql.inc, foreach.inc и другие.
  • Каталог player/, в котором расположены все функции игрока. Файлы: player/commands.inc, player/menu.inc, player/level.inc, player/vip.inc. Ещё нужен файл player/player.inc, который будет объединять всё из player/. И в котором будут находиться небольшие системки, которые не заслужили отдельного файла. А системы, которые можно (и нужно) разделить следует поместить в подкаталог, например player/weapon/, в котором будут находиться файлы, с реализацией системы оружия игрока (например: drop.inc, skill.inc, weapon.inc).
  • Каталог protect/, в котором будут расположены различные античиты и защиты. Вот примерный список: protect/armour.inc, protect/chat.inc, protect/health.inc, protect/idle.inc, protect/jetpack.inc, protect/ping.inc, protect/rconlogin.inc, protect/speed.inc, protect/weapon.inc.
  • Каталог quest/, в котором расположены скрипты всех заданий режима(например: quest/trucker.inc, quest/cashbox.inc). И файл quest/quest.inc, в котором расположена сама система заданий и которая объединяет все задания из каталога quest/.
  • Каталог services/, в котором расположены услуги режима, которые доступны игроку. Например: services/bank.inc, services/business.inc, services/housing.inc, services/skinshop.inc, services/weaponshop.inc, services/bar.inc, services/fastfood.inc, services/lottery.inc, services/vehshop.inc
  • Каталог system/, в котором расположены системы режима, не вошедшие в другие категории. Например: system/deathmath.inc, system/race.inc, system/weather.inc.
  • Каталог vehicle/, в котором расположены функции, для работы с транспортом. Например: vehicle/damage.inc, vehicle/menu.inc, vehicle/radio.inc. Ещё нужен файл vehicle/vehicle.inc, который будет объединять всё из vehicle/.
  • Нам обязательно понадобится файл config.inc, в котором будут храниться все настройки режима.
  • Ну и конечно файл project_1.pwn — это главный файл проекта, который объединяет все системы в единое целое.

Получается такое дерево структуры файлов проекта:

gamemodes
plugins
scriptfiles
sources
    admin
        admin.inc
        ban.inc
        commands.inc
        jail.inc
        kick.inc
        mute.inc
        menu.inc
    core
        db.inc
        lang.inc
        log.inc
        world.inc
    gang
        level.inc
        commands.inc
        menu.inc
        gang.inc
    lang
        en.inc
        ru.inc
    lib
        a_mysql.inc
        foreach.inc
        mxINI.inc
    player
        weapon
            drop.inc
            skill.inc
            weapon.inc
        commands.inc
        menu.inc
        level.inc
        vip.inc
        player.inc
    protect
        armour.inc
        chat.inc
        health.inc
        idle.inc
        jetpack.inc
        ping.inc
        rconlogin.inc
        speed.inc
        weapon.inc
    quest
        cashbox.inc
        trucker.inc
        quest.inc
    services
        bank.inc
        bar.inc
        business.inc
        fastfood.inc
        housing.inc
        lottery.inc
        skinshop.inc
        vehshop.inc
        weaponshop.inc
    system
        deathmath.inc
        race.inc
        weather.inc
    vehicle
        damage.inc
        menu.inc
        radio.inc
        vehicle.inc
    config.inc
    project_1.pwn
announce.exe
make.bat
make.sh
samp-npc.exe
samp-server.exe
server.cfg

Послесловие

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

Перейти к верхней панели