Предисловие.
Раз уж подняли такую тему, не могу не присоедениться.
Информация в этом посте полезна для тех, кто хочет написать что-то стоящее и серьёзное. Это долгий и трудный путь. Не стоит надееться даже на малейший успех без знания английского и хотя бы поверхностного знания пары языков программирования высокого уровня.
Здесь я опишу самый минимум, который нужно знать о AMXX.
Что такое AMXX?
Это система для написания скриптов на стороне сервера, изменяющих игру. Разработана для GoldSrc - движка таких культовых игр, как Half-Life и Counter-Strike.
Как это работает?
Сначала движок игры (GoldSrc) загружает аддон -
Pawn
Pawn - простой 32-битный язык для написания расширений. Единственный тип данных занимает 4 байта (из-за чего числа с плавающей точкой сильно урезаны и работа со строками идёт очень медленно). Программы на Pawn компилируются в псевдо-код, который выполняется на абстрактной машине. Таким образом Pawn легко портировать между разными системами.Програмное обеспечение распространяется под
Взаимодействиями с модулями.
В момент подключения модуля он обьявляет через AMXX функции, к которым можно обращаться. Скрипт, если ему нужно вызвать функцию модуля, обращается к AMXX и ищет функцию по имени. AMXX принимает параметры скрипта и передаёт ей. И наоборот, если модуль генерирует какое-то событие, он запрашивает через AMXX список всех функций во всех загруженных плагинах (скомпилированных скриптах для AMXX, не путайте с плагинами для MetaMod), и по-очереди вызывает их, передавая параметры так же через AMXX.Тут есть два важных ньюанса.
1. Иногда от порядка загрузки плагинов зависит их поведение. Помните этот факт, он поможет при отладке скриптов.
2. Разработчик плагина не может знать, какие фунции будут объявлены модулем. Для решения этой проблемы и нужны инклады.
Инклады.
В Pawn можно вызывать только те функции, которые обявлены в теле скрипта. Но, если функция объявлена, у неё должно быть тело - код, который принимает параметры и запускается при вызове этой функции. Для того, чтобы вызвать функцию модуля, она объявляется с модификатором native. В момент вызова такой функции управление передаётся модулю (или другому плагину), который её объявил. Если же она никем не объявлена, исполнение плагина в текущем месте останавливается и генерируется исключение (ошибка, сообщение о которой будет записано в лог).Если вы добавляете в свой скрипт инклад, в момент компиляции в тело скрипта встраивается содержимое инклада - в то место, где инклад был добавлен директивой #include.
Типы функций.
NativeНатив (привыкайте к сленгу) переадресовывает вызов функции куда-то в другое место. Вызов натива перехватывает модуль или другой плагин. Очень часто нативы возвращают какое-либо значение. Нативы объявляются в инкладах или в самом начале скрипта (обычно так поступают разработчики модулей, и то - редко), применять их в другом месте нет смысла.
Forward
Форварды предназначены для отлова событий, генерируемых где-то в другом месте (модуле или плагине). Если функция отмечена как форвард, её нельзя вызвать напрямую, но она показывает, какое имя должны носить функция, которая хочет отловить событие, и какие параметры она получит. Аналогично нативам, форварды помещаются в инклады и используются авторами модулей и плагинов-модов.
Public
К пабликам (публичным функциям) в вашем плагине может получить доступ другой плагин или модуль. Паблики используются для отлова событий - в них непосредственно располагается код, отвечающий за реацкцию на событие. Если паблик возвращает значение, то это значение используется для изменения обычного хода события. Например, событие можно отменить или заместить.
Stock
Стоковые функции не включаются в тело плагина до тех пор, пока плагин их не использует. Обычно стоки в большом количестве помещают в инклады. Таким образом стоки не занимают лишней памяти, но предоставляют большой инструментарий. Яркий пример оного - инклад fakemeta_stocks.
Требования к автору плагинов.
Теперь вы знаете, как устроен AMXX. Эти знания минимальны, но их вполне достаточно, чтобы писать осмысленный код, а не тупить в пучине копипасты и не оставаться всю жизнь скрипт-кидди.
Далее, для успешного скриптинга вам понадобятся:
1. Умение читать и понимать чужой код.
2. Знание устройства самого движка GoldSrc. Исходники Half-Life вы можете получить в свободном доступе.
3. Понимание принципа работы клиент-сервер: тайминг, обмен пакетами, педсказание поведения и т.д..
4. Активное изучение документации.
5. [опционально] Умение работать в редакторах карт - QuArK, VHE.
Этика AMXX.
Если вы используете чей-то чужой код в своём плагин, нужно отметить это в комментариях, обычно в самом начале скрипта.
Вместе с откомпилированным плагином следует распространять так же сам скрипт, либо не распространять плагин вовсе.
Плагины не должны содержать бэк-доров и вредоносный код, не должны нарушать законов страы, в которой они используются.
Справочная информация.
Документация AMXX:
Пользуйтесь полем быстрого поиска вверху страницы.
Документация только на английском, и очень бедная. Некоторые моменты бесполезны без изучения инкладов, чужих исходников и движка игры.
Общество модостроителей:
Тут огромное количество готовых плагинов. Обсуждается так же написание модулей.
З.Ы.
Не копипаста.
Возможны опечатки.
Найдёте грубые ошибки - сообщите в личку. Спасибо.