Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

2 страниц V   1 2

Как создать свой плагин

Статус пользователя Manjak
сообщение 12.3.2007, 14:59
Сообщение #1


Стаж: 19 лет

Сообщений: 64
Благодарностей: 40
Полезность: 422

Статья не моя но может надо кому-то...

------------------------------------------------------

От переводчика: старался перевести как есть, но тем не менее это довольно вольный перевод. Суть статьи, её смысл оставлен тем же. Так что думаю проблем с пониманием возникнуть не должно.

Окей, фактически никто никогда не писал обучающих пособий по написанию плагинов. У многих (в том числе и у меня) было много проблем из-за этого. Я "брошу первый камень" и посмотрю, выйдет ли что-либо полезное. Если что-то выйдет, можно будет продолжить.

Писать плагины на языке Small достаточно легко, и после нескольких уроков, вероятно, вы сможете написать свой собственный плагин к AMX. Поэтому, думаю, я не должен писать излишне многое до тех пор пока вы сами не начнёте самостоятельно думать как же написать плагин (код).

Конечно, если вы писали раньше программы, это сильно поможет. Но я думаю язык Small – хорошее начало для новичка. Я надеюсь, вы имеете некоторые ключевые понятия в языках программирования. Если не понимаете что такое переменные и функции, то вы должны пойти и найти информацию по этим вопросам. Я не буду вам этого объяснять. Однако не пугайтесь. Я думаю, из моих уроков вы сможете понять, что к чему.

Я писал этот плагин под мод HL - Counter- Strike. Так что примите это к сведению. Но, думаю, всё сказанное здесь будет полезным для написания скриптов к другим модам HL.

Урок 1. Ваш первый плагин
*****************

Давайте начнем с простого: вывод сообщений на экран. Придумаем команду, которая это будет делать: amx_ helloworld, amx_ hello или даже hello. Надо что бы админ смог, когда захочет, вписать соответствующую команду и на экран выводилось соответствующая надпись: "hello world, hello" или даже " Privet, 4itaki" ( ;) ).

Прежде чем начать я хочу сказать несколько слов о том, что нужно для написания скриптов:
Вам нужен редактор текста. Блокнот ( 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", ADMIN_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 и убедитесь, что плагин загружен. Возможно вы забыли прописать себя админом ;)

Пока всё. Экспериментируйте с плагином. Усваивайте материал, пока мы не пересечёмся в следующем уроке.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Mr.Dmitry
сообщение 13.3.2007, 22:17
Сообщение #2


Стаж: 19 лет

Сообщений: 3992
Благодарностей: 853
Полезность: 463

коол!
А я думал что там используеться язык C а оказываеться свой small )
Посмотрим освоем может ченит зделаю )
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Zeloras
сообщение 31.5.2007, 17:02
Сообщение #3


Стаж: 19 лет

Сообщений: 163
Благодарностей: 3
Полезность: < 0

:D +1 за работу :)) А можешь выложить все команды??ПЛз :D
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Romans124
сообщение 8.4.2008, 9:50
Сообщение #4


Стаж: 18 лет

Сообщений: 162
Благодарностей: 20
Полезность: 105

Чет невыходит с компиляцией, ошибка

//// helloworld.sma
// C:\Sh_CS_1.6_SERVER\cstrike\addons\amxmodx\scripting\helloworld.sma(6) : fata
l error 100: cannot read from file: ""
//
// Compilation aborted.
// 1 Error.
// Could not locate output file compiled\helloworld.amx (compile failed).
//
// Compilation Time: 0,05 sec
// ----------------------------------------
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя jas0n
сообщение 8.4.2008, 12:03
Сообщение #5


Стаж: 19 лет

Сообщений: 878
Благодарностей: 385
Полезность: 688

Еще этот язык pawn'ом называют...
Список всех стандартных функций AMXModX [тут].
p.s.: Это статья про AMX, хотя от AMXModX не сильно отличается...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Илья99
сообщение 14.9.2008, 20:15
Сообщение #6
Стаж: 17 лет

Сообщений: 48
Благодарностей: 5
Полезность: < 0

Цитата(Romans124 @ 8.4.2008, 9:50) *
Чет невыходит с компиляцией, ошибка

//// helloworld.sma
// C:\Sh_CS_1.6_SERVER\cstrike\addons\amxmodx\scripting\helloworld.sma(6) : fata
l error 100: cannot read from file: ""
//
// Compilation aborted.
// 1 Error.
// Could not locate output file compiled\helloworld.amx (compile failed).
//
// Compilation Time: 0,05 sec
// ----------------------------------------

тоже самое помогите
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя cilver
сообщение 14.9.2008, 23:37
Сообщение #7


Стаж: 18 лет

Сообщений: 123
Благодарностей: 25
Полезность: 314

Меценат Меценат

эти строчки
#include <...>
#include <...>

должны быть заполнены хотя бы так
#include <amxmodx>
#include <amxmisc>
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Илья99
сообщение 17.9.2008, 20:19
Сообщение #8
Стаж: 17 лет

Сообщений: 48
Благодарностей: 5
Полезность: < 0

спасибо все получилось, но как сделать что бы так писалось хотябы раз в два-три раунда? а не то чтобы я писал в консоле amx_helloword плиз
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя Fаllen
сообщение 4.10.2008, 13:47
Сообщение #9


Стаж: 17 лет

Сообщений: 13
Благодарностей: 2
Полезность: 0

Да статейка хорошая спасибо +1
У мну ошибка.. при компеляции :)
Прикрепленные файлы:
Прикрепленное изображение
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Fedcomp
сообщение 4.10.2008, 18:01
Сообщение #10
Стаж: 17 лет

Сообщений: 3899
Благодарностей: 701
Полезность: 0

Из твоего скрина выходит что ты что-то неправильно написал.
Посмотри на сами ошибки, там указывается строка выдающая ошибку, посмотри что ты в том месте сделал не так
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Makzz
сообщение 5.10.2008, 18:27
Сообщение #11


Стаж: 18 лет

Сообщений: 2198
Благодарностей: 1365
Полезность: 1080

Статья маленькая.....
Приведён самый наипростейший пример.
Можно было чёнить и по круче описать.... :biggrin:
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя ARLEKIN
сообщение 5.10.2008, 18:57
Сообщение #12


Стаж: 18 лет

Сообщений: 1409
Благодарностей: 425
Полезность: 716

Makzz
Ага)) Zombie mod - своими руками)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Empower
сообщение 18.2.2009, 0:40
Сообщение #13
Стаж: 17 лет

Сообщений: 298
Благодарностей: 945
Полезность: 0

класссный туториал могли бы и спасибок ему и накидать если помогло вам... а до крутости еще рано сначала такое научитса делать ...
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Fedcomp
сообщение 18.2.2009, 6:41
Сообщение #14
Стаж: 17 лет

Сообщений: 3899
Благодарностей: 701
Полезность: 0

народ а PLUGIN_CONTINUE куда тыкать надо?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Empower
сообщение 18.2.2009, 17:14
Сообщение #15
Стаж: 17 лет

Сообщений: 298
Благодарностей: 945
Полезность: 0

Цитата
народ а PLUGIN_CONTINUE куда тыкать надо?

PLUGIN_HANDLED - полностю завершает функцию
PLUGIN_CONTINUE - частично завершает оставляет механизми для продолжения с другого источника

ПРимер допустил редактируем дроп:
Код
#include <amxmodx>

public plugin_init()
{
register_plugin("Test","0.1", "Empower")
register_clcmd("drop", "clcmd_drop")
}

public clcmd_drop(id)
{
    return PLUGIN_HANDLED; // функция полностю прекратитса Дроп не будет выполнен
    
    return PLUGIN_CONTINUE; // просто не будет ввыполнен текст далее а сам дроп выполнитса

            // ТЕКСТ ДАЛЕЕ
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Fedcomp
сообщение 18.2.2009, 17:48
Сообщение #16
Стаж: 17 лет

Сообщений: 3899
Благодарностей: 701
Полезность: 0

т.е отменить функцию ...
Empower, thx ;)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Sfera...
сообщение 22.2.2009, 13:06
Сообщение #17
Стаж: 17 лет

Сообщений: 6
Благодарностей: 2
Полезность: 0

чёт я не понел как .sma переделать в .amxx cray.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя aqua
сообщение 22.2.2009, 13:20
Сообщение #18


Стаж: 17 лет

Сообщений: 487
Благодарностей: 121
Полезность: 141

компилировать! в папке .addons/amxmodx/scripting есть compile.exe

На него перетаскиваешь .sma

он тебе компилирует


!
Запрет на ответ в темах: навсегда
Аккаунт пользователя заблокирован до: 6.4.2739916, 20:40
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Sfera...
сообщение 26.2.2009, 14:57
Сообщение #19
Стаж: 17 лет

Сообщений: 6
Благодарностей: 2
Полезность: 0

Ну перетащил нажал Enter а куда он сахраняет??
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя aqua
сообщение 26.2.2009, 15:53
Сообщение #20


Стаж: 17 лет

Сообщений: 487
Благодарностей: 121
Полезность: 141

В ./cstrike/addons/amxmodx/scripting/compiled


!
Запрет на ответ в темах: навсегда
Аккаунт пользователя заблокирован до: 6.4.2739916, 20:40
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
2 страниц V   1 2
 
Тема закрытаНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: