Vit_ amin
Добрая душа
- Сообщения
- 1,504
- Реакции
- 660
Введение в язык програмирования ESShell (EventScript Shell)
Всем привет. Сегодня я хочу вас познакомиться с таким языком програмирования как ESShell. начну с того, что требование для написание плагинов на данном языке программирования - EventScripts Plugin. То есть вам необходимо с официального сайта EventScript скачать саму EventScripts библиотеку.
Немножко расскажу об особенностях данного языка:
Итак давайте же начнем.
О структуре плагинов и остальной предисловии информации вы можете почитать в данной теме.
Итак давайте рассмотри конструкцию плагина:
Например : мы создали плагин es_test.txt
// - это комментарий, если вы используете в своем коде // то значит EventScripts не будет читать данный пункт. Советую вам (начинающим программистам) очень часто использовать комментарии, чтобы не забыть где, что, зачем, почему и для чего данный кусок кода отвечает в плагине. Лично из своего опыта мне это очень помогло.
Насчет событий вы можете найти их список в интернете там достаточно информации.
Также, если вы не уверены, что код правильный вы можете использовать данный сайт, для проверки своего исходного кода плагина.
Плагин №1
Итак давайте напишем небольшой плагин, к примеру при заходе человека на сервер через N секунд ему будет выдано сообщение о подключении.N секунд мы будет брать под консольную переменную, то есть создадим консольную переменную в плагине.
Надеюсь я очень тщательно рассказал, где, что и за что отвечает.
В следующих плагинах я буду приводить примеры, но уже с очень маленькими комментариями.
Плагин №2
Когда игрок воскреснет, дадим ему N количество Health Point.
Плагин №3
Когда игрок воскреснет дадим ему меню (например с правилами).
Плагин №4
Когда, игрок умирает покажем ему сколько людей он убил.
Плагин №5
Создадим Prop Menu.
На данный момент я привел вам 5 примеров использования ESShell.
Конечно как и другой язык програмирования ESShell имеет свои минусы:
Всем спасибо за внимание !
Всем привет. Сегодня я хочу вас познакомиться с таким языком програмирования как ESShell. начну с того, что требование для написание плагинов на данном языке программирования - EventScripts Plugin. То есть вам необходимо с официального сайта EventScript скачать саму EventScripts библиотеку.
Немножко расскажу об особенностях данного языка:
- Язык програмирования не имеет локальных переменных (имеются только глобальные).
- Подключение модулей для получения различных функций (меню, цикл, таймер и прочее) подгружаются как обычные игровые плагины. es_xload/es_load (разница будет рассказана позже между es_x* и es_* й код командами).
- Функции отделяются фигурными скобками {} (так же как и SourcePawn, C++).
- Объявление переменных происходит так, будто вы создаёте северную переменную.
- ESShell это язык, который не собирает мусор в памяти.
- Язык програмирования не компилируется (то есть EventScript читает плагин по исходному коду плагина).
- Объявляя переменную в ESShell не требуется указывать ей тип (int, float, string, handle).
- В отличай от SourcePawn ESShell как и ESPython использует UserID вместо ClientID
- Один из самых легких языков программирования.
Итак давайте же начнем.
О структуре плагинов и остальной предисловии информации вы можете почитать в данной теме.
Итак давайте рассмотри конструкцию плагина:
Например : мы создали плагин es_test.txt
PHP:
block load // Событие, когда плагин загружается.
{
// Тут код
}
event round_start // Событие начала раунда.
{
// Тут код
}
block unload // Событие, когда плагин выгружается, выгрузка можете быть : (С помощью администратора сервера, по ошибке плагина).
{
// Тут код
}
Насчет событий вы можете найти их список в интернете там достаточно информации.
Также, если вы не уверены, что код правильный вы можете использовать данный сайт, для проверки своего исходного кода плагина.
Плагин №1
Итак давайте напишем небольшой плагин, к примеру при заходе человека на сервер через N секунд ему будет выдано сообщение о подключении.N секунд мы будет брать под консольную переменную, то есть создадим консольную переменную в плагине.
PHP:
block load // Инициализируем событии, когда плагин загрузился (также можно использовать 'event load', но как показала моя практика лучше 'block load').
{
es_xset es_advert_time 5 "Time when advert will be display"
// Консольная команда es_xset - ей параметры es_xset "name_variable" "default value" "text ConVar".
// При написании данной команды в своем плагине вы: создаете консольную перменную с названием 'name_variable',и начальным значением 'deafult value'.
// и текстом (для чего данная консольная переменная) 'text ConVar'.
es_xsetinfo player_name 0
// Консольная команда es_xsetinfo - ей параметры es_xsetinfo "name variable" "default value".
// Отличая консольной команды es_xset от es_xsetinfo в том, что es_xsetinfo не содержит описания переменной.
// Совет! Используйте es_xsetinfo для описания переменных в плагине (а не консольных переменных в игре) то есть используйте es_xsetinfo для того,
// чтобы объявить переменную в плагине.
// а es_xset для объявления консольной переменной, хотя es_xset можно использовать для объявления переменной и наоборот, но все же
// советую использовать вам такой метод, то есть мы объявили консольную переменную для получения имени игрока.
// Также, если у вас в плагине есть русский текст (кроме комментариев) сохраняйте файл в кодировке UTF-8 (без BOM).
}
event player_activate // // Инициализируем событие, когда игрок подключился к серверу.
{
// Данная строчка говорит нам, если STEAM ID игрока при подключении не равен BOT, то есть мы исключаем из функции AI игроков.
// Функция это код который расположен в фигурных скобках {}.
if (event_var(es_steamid) != BOT) do
{
// У EventScripts есть свои собственные события и их расширения, для их просмотра используйте данную страницу.
// Внимание! EventScripts не поддерживает все события из файлов modevents.res/gameevents.res/ и прочих файлов с описанием событий, на сайте вы найдете все
// возможные и поддерживаемые события.
es_getplayername player_name event_var(userid)
// Консольная команда es_getplayername - ей параметры es_getplayername "name variable" "UserID Player".
// При написании данной команды в своем плагине вы получаете: имя игрока в переменной 'name_variable', и UserID игрока 'userid player'.
// То есть UserID это индефикатор, который имеется в определенных событиях.
// В данном случае в событии player_activate, мы получили UserID игрока, который вошел на сервер.
es_xformatv advert_text "Добро пожаловать %1 на сервер" player_name
// Консольная команда es_xformatv - ей параметры es_xformatv "name_variable" "String Format" "Variable For String Format".
// При написании данной команды в своем плагине вы получаете: строку в переменной 'name_variable', составление строки для помещение ей в переменную.
// 'String Format', переменные, которые использовались для составления строки 'Variable For String Format'.
// В данном случае %1 говорит нам о том, что мы будем использовать переменную.
// Замечание №1! Если вы используете 2,3,4 переменные то используйте %2 %3 %4.
// Замечание №2! Лимит 9 переменных.
es_tell event_var(userid) "server_var(advert_text)"
// Консольная команда es_tell - ей параметры es_tell "UserID Player" "String Text"
// При написании данной команды в своем плагине вы получаете: UserID игрока, к которому пишется сообщение 'UserID Player',
// текст, который будет написан игроку 'String Text'
}
}
В следующих плагинах я буду приводить примеры, но уже с очень маленькими комментариями.
Плагин №2
Когда игрок воскреснет, дадим ему N количество Health Point.
PHP:
block load // Плагин запустился.
{
es_xset es_player_health 300 "Set Player Health" // Создаем консольную переменную.
}
event player_spawn // Событие, когда игрок возрождается.
{
if (server_var(es_player_health) != 100) do // Условие, что консольная переменная не равна значению по умолчанию.
{
es playerset health event_var(userid) server_var(es_player_health) // Устанавливаем здоровье игрокам.
}
}
// Хочу обратить внимание вас на данную строчку.
// es playerset health event_var(userid) server_var(es_player_health)
// es - Используйте данную консольную команду в случаях, если вы не увидели перед консольной командой, или переменной префикса es_ и используете значение из плагина.
// Например es sv_cheats server_var() в данном случае вы видите, что server_var() используйте в плагине , а консольная переменная sv_cheats не имеет префикса
// es_, а sv_ поэтому используйте es sv_cheats server_var(), а не sv_cheats server_var()
// Также как отмечалось выше я объсняю разницу между es_* и es_x* командами.
// Используйте es_x* команды,когда в переменную вы не вбиваете какое то динамическое значение.
// То есть es_xsetinfo fg 0; es_xsetinfo fg -1;es_xsetinfo fg 100000 и так далее
// Используйте es_* команду, когда в переменную вы вбиваете какое то динамическое значение
// es_setinfo fg server_var() es_setinfo event_var()
// es_* команды и es_x* команды созданы для оптимизации, обратите на это очень важное внимание!
Когда игрок воскреснет дадим ему меню (например с правилами).
PHP:
// плагин запустился.
block load
{
// Создаем переменную для хранения строки.
es_xsetinfo menu_format 0
}
// событие, когда игрок воскрес.
event player_spawn
{
// Условие, что воскресший игрок не AI игрок.
if (event_var(es_steamid) != BOT) do
{
// Формируем строку для занесения ей в переменную.
es_format menu_format "Привет: %1\nДобро пожаловать на сервер: %2\nТекущая карта: %3\nПриятной игры." event_var(es_username) server_var(hostname) server_var(eventscripts_currentmap)
// Показываем меню игроку.
es_menu 10 event_var(userid) server_var(menu_format)
}
}
// В данном случае в es_menu 10 - какое количество секунд меню будет показано игроку.
// 0 - меню исчезнет только после того, как игрок нажмет на какую-либо цифровую клавишу. (1,2,3,4,...).
// es_format мы используем вместо es_formatv, потому что мы используем event_var().
// Внимание! es_formatv не поддерживает event_var().
Когда, игрок умирает покажем ему сколько людей он убил.
PHP:
block load
{
es_xsetinfo player_kill 0
es_xsetinfo player_menu 0
}
event player_spawn
{
if (event_var(es_steamid) != BOT) do
{
es playervar set event_var(userid) kills 0 // Создаем консольную переменную на стороне игрока под названием kills и устанавливаем ей значение = 0.
}
}
event player_death // Событие, когда игрок умирает.
{
if (event_var(es_attackerdead) == 1) do // Условие, что атакующий игрок мертв.
{
es playervar get player_kill event_var(attacker) kills // Получаем консольную переменную kills на стороне игрока.
ifx true(player_kill) do // Если консольная перменная kills не равна 0.
{
es_xformatv player_menu "Вы убили %1 в этом раунде." player_kill // Формируем строку.
es_menu 0 event_var(attacker) "server_var(player_menu)" // Выводим текст в меню о том сколько игрок убил людей в данном раунде.
}
else do // Если консольная перменная kills равна 0.
{
es_menu 0 event_var(attacker) "Вы не убили никого в этом раунде" // Выводим текст в меню о том что игрок не убил никого.
}
}
else do // Условие, что атакующий игрок не мертв.
{
// Получаем значение коснольной переменной kills на строне клиента в консольную переменную player_kill на стороне сервера.
es playervar get player_kill event_var(attacker) kills
// Добавляем к переменной player_kill + 1 убийство.
es_xmath player_kill + 1
// Устанавливаем новое значение после данных операций к консольной переменной клиента kills.
es playervar set event_var(attacker) kills server_var(player_kill)
}
}
Создадим Prop Menu.
PHP:
block load
{
es_xset sv_prop_create 1.0 "Version of Plugin (by Vitamin)" // Создал консольную пеерменную для описания своего плагина.
es_xmakepublic sv_prop_create // Означает, что консольная переменная sv_prop_create будет публичной (Добавляятся консолный флаг FCVAR_PLUGIN).
es_xsetinfo _find_function 0
es_xsetinfo _userid_admin 0
es_xexists _find_function script popup // Создаем поиск того, что подключен ли уже до нас модуль Popup.
ifx false(_find_function) do // Если нет то подключаем Popup модуль.
{
es_xload popup // Загружаем Popup модуль.
}
es_xexists _find_function script examples/auth/basic_auth // Создаем поиск того, что подключен ли уже до нас модуль Basic Auth.
ifx false(_find_function) do // Если нет то подключаем Basic Auth модуль.
{
es_xload examples/auth/basic_auth // Загружаем Basic Auth модуль.
}
popup create prop_create // Создаем пустое меню.
popup addline prop_create "Меню Администратора" // Название Меню.
popup addline prop_create "->1. Создать автоматом с Coca-Cola" // Создаем в меню пункт №1 с названием 'Создать автомат с Coca-Cola'.
popup menuselect prop_create prop_create/create_function // Вызываем функцию, если нажмем что-либо в меню. Иными слоами, на языке скриптера CallBack.
// Создаем чат-команду под названием !propsend, которая при написании в чат вызывает функцию prop_admin_function
// #admin - указывает то, что чат-команду может использовать только администратор сервера.
clientcmd create say !propsend "prop_create/prop_admin_function" "prop_function" #admin
}
block unload // Событие, когда плагин выгружается.
{
// Создаем цикл, по которому делаем только у нормальных (не AI) игроков команду закрыть меню.
foreach player popup_userid_close #human "es popup close prop_create server_var(popup_userid_close)"
popup delete prop_create // Удаляем меню.
es_xunload popup // Выгружаем модуль popup.
es_xunload examples/auth/basic_auth // Выгружаем модуль Basic Auth.
clientcmd delete say !propsend // Удаляем чат-команду !propsend.
}
block prop_admin_function // Функция вызванная при написании администратора в чат !propsend.
{
es_xgetcmduserid _userid_admin // Получаем UserID администратора.
es popup send prop_create server_var(_userid_admin) // Даем команду на получение меню администратору.
}
block create_function
{
ifx parse("_popup_choice == 1") do // Если администратор нажал в меню пункт №1.
{
// Создаем Prop Объект в месте прицела с моделью props/cs_office/vending_machine.mdl
es_prop_dynamic_create server_var(_popup_userid) props/cs_office/vending_machine.mdl
// Снова даем команду на получения меню (Так как, если вы нажмете на какой-то пункт в меню то меню исчезнет у клиента).
es popup send prop_create server_var(_popup_userid)
}
}
Конечно как и другой язык програмирования ESShell имеет свои минусы:
- Отсутствие гибкости, по сравнению с тем же ESPython или SourcePawn.
- Отсутствие компилирования и открытость исходного кода.
- Мало используемость как языка программирования.
- Мало популярность.
Всем спасибо за внимание !
Последнее редактирование: