В этой статье я хочу посоветовать 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
Послесловие
Предложенный метод расположения файлов проекта не является истинно правильным, все, предложенные здесь, решения можно оспорить и, возможно, улучшить. Но построение архитектуры проекта на основе предложенной модели будет много лучше чем то, что наблюдается в настоящее время в большинстве проектов.