Писать плагины на языке Small достаточно легко, и после нескольких
уроков, вероятно, вы сможете написать свой собственный плагин к AMX.
Поэтому, думаю, я не должен писать излишне многое до тех пор пока вы
сами не начнёте самостоятельно думать как же написать плагин (код).
Конечно, если вы писали раньше программы, это сильно поможет. Но я думаю
язык Small – хорошее начало для новичка. Я надеюсь, вы имеете некоторые
ключевые понятия в языках программирования. Если не понимаете что такое
переменные и функции, то вы должны пойти и найти информацию по этим
вопросам. Я не буду вам этого объяснять. Однако не пугайтесь. Я думаю,
из моих уроков вы сможете понять, что к чему. Я писал этот
плагин под мод HL - Counter- Strike. Так что примите это к сведению. Но,
думаю, всё сказанное здесь будет полезным для написания скриптов к
другим модам HL. 030613 Урок 1 Ваш первый плагин *****************
Давайте начнем с простого: вывод сообщений на экран. Придумаем команду,
которая это будет делать: amx_ helloworld, amx_ hello или даже hello.
Надо что бы админ смог, когда захочет, вписать соответствующую команду и
на экран выводилось соответствующая надпись: hello world, hello или
даже " Privet, 4 itaki"( ). Прежде чем начать я хочу сказать несколько слов о том, что нужно для написания скриптов:
Вам нужен редактор текста. Блокнот ( notepad) – это хорошо, но worldpad
лучше. Когда вы освоитесь можно переходить на более удобные редакторы.
Мы доберёмся до них в более поздних уроках. У вас должен быть
установлен AMXMod и соответственно должен быть сервер на котором он
стоит. Я не буду объяснять вам как устанавливать и настраивать AMXMod на
сервере, так как это очень хорошо описано в документации к AMXMod'у. Проверьте наличие файла sc.exe и sc. bat, они идут вместе с AMXMod. Всё проверили? Поехали!
Создайте новый файл и назовите его helloworld. sma. Начинаем с секции
"комментарий", в самом начале файла helloworld. sma. Секция комментарий –
часть кода, не являясь кодом. �*то всего на всего комментарий. Обычно
здесь указывают название плагина, его версию. Позже можно более детально
описать работу вашего плагина, его установку и т.д. Но пока начнём с
малого:/* Hello world, v0.1 By JGHG */ Я всегда
начинаю нумерацию версии плагина с 0.1. На самом деле не имеет значения с
какой версии начать, но не начинайте с версии 1.0. Всегда нано начинать
с меньшей версии. А когда вы пойметё, что ваш плагин уже готов к
финалу, тогда вам и карты в руки. Так или иначе это всего на всего
комментарий. Тут вы можете расписать весь ваш день, по минутам, как
дневник. �*то не будет критично, т.к. компилятор не будет читать эти
строки. Но наличие названия плагина, версии и автора логично поместить
здесь. Любой плагин должен иметь функцию plugin_ init(). Всё то,
что вставлено в эту данную функцию будет регистрироваться в AMX, что бы
он мог использовать ваш плагин:public plugin_init() { register_plugin("Hello world","0.1","jghg") }
�*то сделает ваш плагин зарегистрированным. plugin_ init() берёт три
параметра из плагина: это его название ( Hello world), его версию (0.1) и
автора ( jghg). Старайтесь не терять кавычек, иначе работать не будет.
Но этого не достаточно, для нашей цели. Должна быть команда которую
админ сможет использовать и для этого мы должны её зарегистрировать в
plugin_ init() функции. Команды, которые вводятся в консоле сервера или
от клиента должны быть в нутрии plugin_ init() для того, что бы ею могли
пользоваться. plugin_ init() важен по многим другим причинам, о которых
вы узнаете из более поздних уроках. Функция plugin_ init() это как
сообщение для AMXMod, что существкет ваш плагин, и в случае чего
(введение команды) юзать его.register_clcmd("amx_helloworld","myfunction
",A DMIN_VOTE," : prints Hello world!!! to everyone") Допишите
данную строку в секцию функции plugin_ init(). С помощью этой строки мы
регистрируем команду, которую будем в последствии использовать. Первый
параметр в кавычках - это команда, которую мы будет вбивать в консоле.
Следующий параметр в кавычках – это функция в нашем плагине, когда
команда будет введена будет выполнена данная функция. �*ту функцию мы
напишем позже. На самом деле назвать можно как угодно. Название не
должно быть очень большим, тогда данное название не подходит ( ). Назвал
её так для простоты и непринужденности прочтения текста. Следующий
параметр – уровень доступа. Т.е. кто на сервере имеет права для
выполнения данной команды. В данном случае админ ( ADMIN _ VOTE ). Зачем
простым игрокам разводить флуд ( ). Но можно сделать доступ всем: надо
указать 0 вместо ADMIN _ VOTE. Замете кавычек нет! Таким образом
командой могут пользоваться админы с уровнем доступа к голосованию (
vote). И последний параметр – это комментарий. Он будет отображен когда
вы введёте amx_ help. НЕ ТЕ�*ЯЙТЕ КАВЫЧЕК!!! Таким образом функция plugin_ init() выглядит так:public plugin_init() { register_plugin("Hello world","0.1","jghg") register_clcmd("amx_helloworld","myfunction",ADMIN _VOTE," : says Hello world!!! to game screen") }
Держите отступы, т.е. используйте " tab" или, к примеру, пробелы в
написании функций. Откройте любой . sma файл, поставляемый вместе с AMX,
и вы поймёте, о чем я говорю. �*то упростит компиляцию и плагин будет
откомпилирован более качественно. Так же это упростит изучение вашего
плагина других разработчиков. Куда проще разбираться в структурированном
коде, чем в бардаке . Есть ещё серьёзные основания, но сейчас я не буду
в них вдаваться. Добавьте данные строки. Они должны обязательно присутствовать в плагине:#include #include
Данные строки помещаются сразу после комментариев и перед plugin_
init() функцией. Некоторый (это не про меня) помещают plugin_ init() как
последняя функция плагина. Но, по крайней мере, я всегда могу быстро
найти свою функцию и думаю так удобнее делать. Мы уже довольно много написали. Должно быть, похоже вот на это:/* Hello world, v0.1 By JGHG */ #include #include public plugin_init() { register_plugin("Hello world","0.1","jghg") register_clcmd("amx_helloworld","myfunction",ADMIN _VOTE," : says Hello world!!! to game screen") }
Всегда сохраняйте написанное. Кто знает когда отключат электричество .
Попробуйте откомпилировать данный плагин. Если есть ошибки, то их проще
найти сейчас, чем потом ковырять груду кода. �*то значительно упрощает
поиск ошибок. Сохраните плагин и запустите sc. bat. sc. bat –
это командный файл, который осуществляет поиск всех sma-файлов в
директории source. Компилирует и складывает в директории compiled с
расширением . amx. Если вы хотите откомпилировать только свой плагин, то
нужно запустить sc. exe с параметром равный названию файла в котором
сохранён плагин ( sc. exe helloworld. sma). Файл с расширением .amx
будет сохранен в текущем каталоге. Если что-то не так при компиляции проверьте правильность написания плагина.
Нам осталось написать последнюю функцию – вывод сообщения на экран. Мы
зарегистрировали команду которая будет выполнятся в консоли, сообщение
выводимое на экран тоже зарегистрировали. Теперь осталось создать
функцию которая будет всё это делать:public myfunction(id,level,cid) { if (!cmd_access(id,level,cid,1)) { return PLUGIN_HANDLED } }
Я не буду расписывать как работает функция cmd_ access(). Скажу только,
что она проверяет может ли клиент использовать данную команду.
Хочу прокомментировать следующее – id. Id – это уникальный номер каждого
присутствующего на сервере. Оно будет ему присвоено при входе и
отобрано при выходе. �*то уникальный номер каждого играющего, одинаковых
быть не может. Если сервер рассчитан на 32 игрока, то id будет от 1 до
32. Движок Half- Life более 32 игроков не держит. Если сервер рассчитан
на 16, то от 1 до 16. Id используется по разному. В cmd_
access() через id проверяется уровень доступа этого текучего
пользователя, и никого другого. Надеюсь это понятно. Следующая линия кода: client_print(0,print_center,"Hello world!!!")
�*то та строчка кода, которая отвечает за печатание сообщения у
клиента. с lient_ print является названием функции, которая берёт три
параметра (может требоваться больше, но об этом в других уроках). Первый
параметр (0) отвечает за то кому будет выведена данная команда. Если
поставить id номер игрока, то сообщение будет выведено ему и вам. В
данном случае выведено будет для всех присутствующих на сервере (живым
или мертвым). Т.е. когда вам надо сделать со всеми что-то или сообщить
всем что-то надо использовать 0. Второй параметр указывает где следует
выводить сообщение. Можно поместить сообщение в районе чата - print_
chat или print_ notify – отображает только в консоле. И третий параметр –
само сообщение. То, что в пределах кавычек то и есть сообщение, которое
будет печататься на экран. Не теряйте кавычек. Мы почти написали наш первый плагин. Осталось только дописать следующую строчку в функцию myfunction():return PLUGIN_HANDLED
�*то важная строчка. Её терять нельзя. Помните, это последнее что вы
должны добавить во всех ваших функциях, которые вызываются командами,
напечатанные в консоле сервера или в консоле клиента. Если вы этого не
сделаете, то AMX не будет знать, что команда выполнена, выведет
сообщение на экран, а в консоле появится следующая ошибка: Unknown
command: amx_helloworld Поэтому всегда заканчивайте функцию return PLUGIN_HANDLED. Полностью наш плагин выглядит так:/* Hello world, v0.1 By JGHG */ #include #include public myfunction(id,level,cid) { if (!cmd_access(id,level,cid,1)) { return PLUGIN_HANDLED } client_print(0,print_center,"Hello world!!!") return PLUGIN_HANDLED } public plugin_init() { register_plugin("Hello world","0.1","jghg") register_clcmd("amx_helloworld","myfunction",ADMIN _VOTE," : prints Hello world!!! to everyone") }
Всё, плагин готов. Откомпилируйте его и убедитесь, что нет ошибок во
время компиляции. Если при компиляции вы получаете сообщение warning
217: loose indentation, перейдите на указанную строчку и проследите что
бы углубление (" tab" – помните…) было одинаково везде в вашем плагине.
Тперь можете поместить файл helloworld. amx в папку amx\ plugins и
прописать плагин в amx\ config\ plugins. ini. Добавьте строчку
helloworld. amx в самый конец списка плагинов. Теперь запускайте сервер.
Если сервер запущен можно в консоле сервера использовать команду
restart. Вместе с рестартом карты произойдет пересчитывание плагинов и
новый добавленный плагин будет использован AMX. Теперь заходите в
игру и пропишите amx_ helloworld и убедитесь что всё отображается как
надо. Удостоверьтесь, что при вводе команды amx_ help описание
соответствует тому, что использовали мы. Если плагин не работает, в
консоле сервера введите amx plugins и убедитесь, что плагин загружен.
Возможно вы забыли прописать себя админом.
|