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