Введение в ESShell программирование

Vit_ amin

Участник
Сообщения
1,316
Реакции
495
Введение в язык програмирования ESShell (EventScript Shell)

Всем привет. Сегодня я хочу вас познакомиться с таким языком програмирования как 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 // Событие, когда плагин выгружается, выгрузка можете быть : (С помощью администратора сервера, по ошибке плагина).
{
// Тут код
}
// - это комментарий, если вы используете в своем коде // то значит EventScripts не будет читать данный пункт. Советую вам (начинающим программистам) очень часто использовать комментарии, чтобы не забыть где, что, зачем, почему и для чего данный кусок кода отвечает в плагине. Лично из своего опыта мне это очень помогло.
Насчет событий вы можете найти их список в интернете там достаточно информации.
Также, если вы не уверены, что код правильный вы можете использовать данный сайт, для проверки своего исходного кода плагина.
Плагин №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* команды созданы для оптимизации, обратите на это очень важное внимание!
Плагин №3
Когда игрок воскреснет дадим ему меню (например с правилами).
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().
Плагин №4
Когда, игрок умирает покажем ему сколько людей он убил.
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)
 }
}
Плагин №5
Создадим 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)
 }
}
На данный момент я привел вам 5 примеров использования ESShell.


Конечно как и другой язык програмирования ESShell имеет свои минусы:
  • Отсутствие гибкости, по сравнению с тем же ESPython или SourcePawn.
  • Отсутствие компилирования и открытость исходного кода.
  • Мало используемость как языка программирования.
  • Мало популярность.
Это конечно не все минусы, все остальное это уже незначительные мелочи.
Всем спасибо за внимание !
 
Последнее редактирование:

FrozDark

Участник
Сообщения
1,774
Реакции
2,023
когда-то на нём писал себе на сервер, а теперь смотрю и не понимаю)
 

R1KO

fuck society
Команда форума
Сообщения
9,016
Реакции
6,897
Vit_ amin, попробуй код в тег
PHP:
 закинуть, думаю, смотреться лучше будет
 

Vit_ amin

Участник
Сообщения
1,316
Реакции
495
Администрация. Закрепите пожалуйста мою тему. Так как все статьи об скриптинге в шапке.
 

zloykif

Участник
Сообщения
130
Реакции
18
Ооочень много грамматических ошибок, чуть мозг не сломал T_T а так норм)
 

Vit_ amin

Участник
Сообщения
1,316
Реакции
495
Ооочень много грамматических ошибок, чуть мозг не сломал T_T а так норм)
Если ты можешь лучше и у тебя есть время то пиши сам пожалуйста ... А все расписывать думаешь у меня голова не болит ?Исправил все возможные ошибки в статье.

Добавлено через 1 час 37 минут




Итак здравствуйте я продолжаю статью посвященную языку программирования Event Script Shell или короче ESShell. В сегодняшней статье я опишу и расскажу:
  • Мы посмотрим новые события и как их можно использовать.
  • Напишим 3 плагина с новыми функциями и событиями.
  • А также расскажу некоторые нюансы языка.
Итак давайте же начнем.
Плагин №6.
Давайте в данном плагине сделаем какие либо действия над AI игроком (ботов).
Например давайте создадим консольную переменную к примеру с названием bot_quota_t, которая будет использовать функционал стандартной консольной переменной bot_quota, но только для команды Террористов.
PHP:
block load
{
 es_xset bot_quota_t 0 "How many Terrorists bots will in the game"
 es_xset bot_plugin 1.0 "Version Plugin (by Vitamin)"
 es_xsetinfo bot_count 0 // Переменная для подсчета количества AI игроков.
 // Делаем консольную переменную bot_plugin публичной для игроков.
 //(Иными словами даем консольной переменной консольный флаг FCVAR_PLUGIN).
 es_xmakepublic bot_plugin
 // Устанавливаем консольный флаг FCVAR_NOTIFY для консольной переменной bot_quota_t.
 es_xflags add notify bot_quota_t
 
}
block unload
{
 // Убираем консольный флаг FCVAR_NOTIFY для консольной переменной bot_quota_t.
 es_xflags remove notify bot_quota_t
}
// Делаем перехват события, когда изменяется консольная переменная.
// Примечание! Событие server_cvar действует только на те консольные переменные, которые имеют консольный флаг FCVAR_NOTIFY.
event server_cvar
{
 if (event_var(cvarname) == bot_quota_t) do // Условие, если изменяемая консольная переменная - bot_quota_t
 {
  // Создаем условие, что если количество ботов (переменная bot_count) меньше либо равно переменной события event_var(cvarvalue).
  // event_var - я называю переменной события.
  // cvarvalue - одна из переменной событий, которая отвечает за то, что запоминает строку введеную в консольной переменной.
  // Например: bot_quota_t 5. bot_quota_t - это cvarname, 5 - это cvarvalue.
  // Следующий шаг создаем с помощью цикла (консольная команда while) условие,
  // до тех пор пока переменная плагина (bot_count) не будет равна переменной события cvarvalue,
  // мы прибавляем к переменной bot_count + 1, и добавляем бота.
  // Иначе условие наоборот и цикл также действет наоборот.
  if (server_var(bot_count) <= event_var(cvarvalue)) then while (server_var(bot_count) == event_var(cvarvalue)) "es_xmath bot_count + 1; bot_add_t"
  else while (server_var(bot_count) == event_var(cvarvalue)) "es_xmath bot_count - 1; bot_kick t"
  // Внимание! Хочу обратить внимание, что мы не использовать здесь приставу в условии do здесь приставка then.
  // Обращаю внимание, если ваше условие вмещается в одну строку используйте приставу then вместо do,
  // это сделано с целью оптимизации плагинов и повышением их быстродействия.
 }
}
Плагин №7.
Давайте создадим переменную по которой будем определять, будет ли на игровой карте бомба или нет, и если бомба будет то будем удалять ей.
PHP:
block load
{
 es_xsetinfo bomb_check 0
 es_xset es_bomb_remove 1 "If 1 - then C4 will be removed in maps"
}
// Событие, когда загружается игровая карта.
event es_map_start
{
 // Условие проверки, что консольная переменная es_bomb_remove = 1.
 // Внимание! Для проверки bool значений, то есть Истина/Ложь используйте ifx,
 // Вместо if (server_var() == 1) then/do ....
 // Внимание! ifx поддерживает только приставку do
 ifx true(es_bomb_remove) do
 {
  // Используем консольную переменную es_xgetentityindex для того, чтобы найти на карте случайную Entity func_bomb_planted.
  // Если Entity не найдена - в bomb_check будет не Index Entity, а -1.
  es_xgetentityindex bomb_check func_bomb_planted
  // Условие, проверки, что хотя бы 1 Index для Entity func_bomb_planted найден
  // Внимание! ifx parse может сравнивать только целые числа.
  ifx parse("bomb_check != -1")
  {
   // Для удаления всех Entity func_bomb_planted используем консольную команду es_xforcevalue,
   // Смысл команды заключается в том, что она изменяет любую игровую, либо консольную переменную плагина,
   // без уведомления в чате, то есть :"Серверная переменная ... изменена на ...
   // Иными словами es_xforcevalue удаляет на время выполнения консольный флаг FCVAR_NOTIFY,
   // а после изменения консольной переменной возвращает консольный флаг FCVAR_NOTIFY.
   es_xforcevalue sv_cheats 1
   // Стандартная консольная команда Valve удаления всех Entity с игровой карты.
   // Для ей использования требуется включения игровых читов (sv_cheats).
   ent_remove_all func_bomb_planted
   // Ставим переменной sv_cheats значений 0, все также без уведомления игроков.
   es_xforcevaue sv_cheats 0
  }
 }
}
Внимание! Уверяю вас, что во время изменения консольной переменной sv_cheats с значения 1 на значения 0.





Игровыми читами игроки не смогут воспользоваться по 2 причинам.
  1. Значений переменной с 1 на 0 измениться настолько быстро, что игроки не успеют даже, что-то ввести в консоль, даже если у они используют горячие клавиши на запуск каких то скриптов или команд.
  2. В событии es_map_start никаких игроков не может быть.
Плагин №8.
Обезоружим игрока в начале раунд, дав ему оружие, которое мы хотим.
PHP:
block load
{
 es_xsetinfo weapon_index 0
 es_xsetinfo weapon_format 0
 es_xserinfo check_spawn 0
 es_xset es_primary_weapon deagle "Player Get Primary weapon when you spawn"
 es_xset es_secondary_weapon xm1014 "Player Get Secondary weapon when you spawn"
}
event player_spawn
{
 // Ищем консольную переменную weapon_get на стороне клиента.
 // Мы делаем это, для того, чтобы знать, что игрок умер или нет.
 es playervar exists check_spawn event_var(userid) weapon_get
 // Проверка, что игрок умирал или нет ?
 ifx false(check_spawn) do 
 {
  // Если нет устанавливем ему консольную переменную weapon_get на 1.
  es playervar set event_var(userid) weapon_get 1
  // Условие, что игрок в команде Террористов.
  if (event_var(es_userteam) == 2) do
  {
   // Проверяем, что консольная переменная es_primary_weapon не пустая.
   ifx true(es_primary_weapon) do
   {
    // Получаем Index оружия у игрока под названием weapon_glock.
    es playerget weaponindex weapon_index event_var(userid) weapon_glock
    // Получив Index, удаляем у клиента оружие, для того, чтобы дать новое.
    es_remove weapon_index
    // Если консольная переменная не равна glock,
    // Так как смысл нам давать игроку Glock, если он ему по умолчанию дается.
    if (server_var(es_primary_weapon) != glock)
    {
     es_xformatv weapon_format "weapon_%1" es_primary_weapon
     // Выдаем игроку первичное оружие.
     es_give event_var(userid) server_var(weapon_format)
    }
   }
   // Проверяем, что консольная переменная es_secondary_weapon не пустая.
   ifx true(es_secondary_weapon) do
   {
    es_xformatv weapon_format "weapon_%1" es_secondary_weapon
    // Выдаем игроку вторичное оружие.
    es_give event_var(userid) server_var(weapon_format)
   }
  }
  // Условие, что игрок в команде Контр-Террористов
  if (event_var(es_userteam) == 3) do
  {
   // Проверяем, что консольная переменная es_primary_weapon не пустая.
   ifx true(es_primary_weapon) do
   {
    // Получаем Index оружия у игрока под названием weapon_glock.
    es playerget weaponindex weapon_index event_var(userid) weapon_glock
    // Получив Index, удаляем у клиента оружие, для того, чтобы дать новое.
    es_remove weapon_index
    // Если консольная переменная не равна glock,
    // Так как смысл нам давать игроку Glock, если он ему по умолчанию дается.
    if (server_var(es_primary_weapon) != glock)
    {
     es_xformatv weapon_format "weapon_%1" es_primary_weapon
     // Выдаем игроку первичное оружие.
     es_give event_var(userid) server_var(weapon_format)
    }
   }
   // Проверяем, что консольная переменная es_secondary_weapon не пустая.
   ifx true(es_secondary_weapon) do
   {
    es_xformatv weapon_format "weapon_%1" es_secondary_weapon
    // Выдаем игроку вторичное оружие.
    es_give event_var(userid) server_var(weapon_format)
   }
  }
 }
}
event player death
{
 // Устанавливаем консольную переменную weapon_get клиенту на 0,
 // для того, чтобы он прошел проверку ifx false(check_spawn) do,
 // во время воскрешения и ему далось новое оружие.
 es playervar set event_var(userid) weapon_get 0
}
На сегодня всё спасибо за внимание.
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
269
Где взять docs ES?
События и прочее.

Похожее что-то на это.
 

Vit_ amin

Участник
Сообщения
1,316
Реакции
495
Снова здравствуйте, я продолжаю свою статью. Я не буду многословен и сегодня будет расмотрен 1 только плагин, но в котором вы увидите очень много функций:
Плагин №9.
Создадим скин меню с админ системой.
PHP:
// Событие, когда плагин загружается
block load
{
 // Объявляем переменные
 es_xsetinfo find_function 0
 es_xsetinfo name_skin 0
 es_xsetinfo model_path 0
 es_xsetinfo model_menu 0
 es_xsetinfo key_skin 0
 es_xsetinfo keyvalue_skin 0
 es_xsetinfo popup_select_path 0
 // Подключаем дополнительные модули (Модуль авторизации и модуль создания меню 'Popup')
 es_xload examples/auth/basic_auth
 es_xload popup
 // Создаем клиентскую чат-команду !skin, с флагом доступа admin_skin
 clientcmd create say !skin es_skin/skin_function admin_skin #admin
 // Проверяем, что существует ли Группа ключей по имени : Admins_Skins ?
 es_exists find_function keygroup Admins_Skins
 // Если нет, создаем первоначальную группу и сохраняем ей на диске
 ifx false(find_function) do
 {
  es_xkeygroupcreate Admins_Skins
  es_xkeycreate Admins_Skins 1
  es_xkeysetvalue Admins_Skins 1 NameSkin "Bank Robber"
  es_xkeysetvalue Admins_Skins 1 ModelSkin "models\Robber\t_arctic.mdl"
  es_xkeysetvalue Admins_Skins 1 TeamName Terrorist
  es_keygroupsave Admins_Skins |skin
 }
 // Если она имеется, загружаем информацию из файла в память сервера.
 else do
 {
  es_xkeygroupupload Admins_Skins |skin
 }
 // Создаем пустое меню под именем : skin_menu
 popup create skin_menu
 // Добавим туда строчку : Выберите себе скин:
 popup addline skin_menu "Выберите себе скин:"
 // Создаем цикл, который проходит по именам ключей и выполним Блок keyvalue_function
 es_xforeachkey key_skin in Admins_Skins "es_xdoblock skin/keyvalue_function"
 // Создадим Функцию выбора в меню и при нажатии чего-либо в меню выполним блок skin_install
 popup menuselect skin_menu skin/skin_install
}
 // Блок, когда игрок выбрал скин в меню : skin_menu
block skin_install
{
 // Устаналиваем клиентскую консольную переменную админу, выбровшему скин (в переменной содержится путь до .mdl файла)
 es playervar set server_var(_popup_userid) player_model server_var(model_path)
}
 // Блок, когда формируется меню : skin_menu
block keyvalue_function
{
 // Создаем цикл, который проходит по Именам Значений и выполним Блок popup_function (Создали двухмерный цикл)
 es_foreachval keyvalue_skin in Admins_Skins server_var(key_skin) "es_xdoblock skin/popup_function"
}
 // Блок, когда создается двухмерный цикл (матрица)
block popup_function
{
 // Получаем значение имени ключа : NameSkin
 es_keygetvalue name_skin Admins_Skins server_var(key_skin) NameSkin
 // Получаем значение имени ключа : ModelSkin
 es_keygetvalue model_path Admins_Skins server_var(key_skin) ModelSkin
 // С помощью цикла формируем меню
 // Добавляем туда название модели
 es popup addline skin_menu server_var(name_skin)
 // Устанавливаем переменную для каждого пункта меню
 // То есть при выборе какого-либо пункта в меню объявляется такая-то переменная
 // В данном случае это путь до .mdl файла
 es popup menuvalue skin_menu popup_select_path server_var(key_skin) server_var(model_path)
}
 // Событие, когда плагин выгружается
block unload
{
 // Принудительно закрываем у всех игроков (не AI игроков) меню : Admins_Skins
 popup unsendname Admins_Skins #human
 // Отключаем модуль авторизации
 es_xunload examples/auth/basic_auth
 // Отключаем Popup модуль
 es_xunload popup
 // Удаляем клиентскую-чат команду !skin
 clientcmd delete say !skin
 // Выгружаем из памяти группу : Admins_Skins
 es_xkeygrouodelete Admins_Skins
}
 // Блок, который выполняется при написании в чат !skin
block skin_function
{
 // Объявлем переменные
 es_xsetinfo userid 0
 es_xsetinfo check_alive 0
 // Получаем UserID написавшего в чате игрока
 es_xgetcmduserid userid
 // Проверяем игрок мертв или нет ?
 es playerget isdead check_alive server_var(userid)
 // Если да (игрок мертв)
 ifx true(check_alive) do
 {
  // Объявлем переменную
  es_xsetinfo check_popup 0
  // Проверяем, открыто ли меню : skin_menu у игрока, написавшего в чате
  es popup isqueued skin_menu check_popup server_var(userid)
  // Если нет, то открываем ему меню
  ifx false(check_popup) do
  {
   es popup send skin_menu server_var(userid)
  }
  // Если да, то пишем ему сообщение
  else do
  {
   es_tell event_var(userid) #multi "#green[Skin Menu] #defaultВы не можете использовать эту команду - у вас уже открыто меню"
  }
 }
 // Игрок жив
 else do
 {
  es_tell event_var(userid) #multi "#green[Skin Menu] #defaultВы не можете использовать эту команду - вы живой игрок"
 }
}
 // СОбытие, когда игрок возрождается
event player_spawn
{
 // Проверка на AI игрока
 if (event_var(es_steamid) != BOT) do
 {
  // Объявляем переменные
  es_xsetinfo is_admin 0
  es_xsetinfo model_player 0
  // Проверяем, существует ли у игрока переменная is_admin
  playervar exists is_admin event_var(userid) player_model
  // Если да, то получаем значений переменной из блока skin_install и устанавливаем клиенту модель.
  ifx true(is_admin) do
  {
   es playervar get model_player event_var(userid) player_model
   es playerset model event_var(userid) server_var(model_player)
  }
 }
}
 // СОбытие, когда игрок присоединяется к команде
event player_team
{
 // Объявляем переменные
 es_xsetinfo check_func 0
 // Проверяем, это AI игрок или человек ?
 es_isbot check_func event_var(userid)
 // Если это игрок то ...
 ifx false(check_func) do
 {
  // Объявляем переменную
  es_xsetinfo admin_func 0
  // Функция Авторизации клиента, с флагом admin_skin, установленного через clientcmd
  es :auth isUseridAuthorized admin_func event_var(userid) admin_skin
  // Если авторизация пройдена успешно, пишем игроку (а теперь уже админу) сообщение
  ifx true(admin_func) do
  {
   es_tell event_var(userid) #multi "#green[Skin Menu] #defaultВы являетесь админом, чтобы открыть меню выбора скина напишите !skin"
  }
 }
}
P.S. В данном коде не достает только функции загрузки контента игрокам.
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
269
Введение в язык програмирования ESShell (EventScript Shell)
Плагин №3
Когда игрок воскреснет дадим ему меню (например с правилами).
PHP:
block load // плагин запустился.
{
 es_xsetinfo menu_format 0 // Создаем переменную для хранения строки.
}
block player_spawn // событие, когда игрок воскрес.
{
 if (event_var(es_steamid) != BOT) do // Условие, что воскресший игрок не AI игрок.
 {
  // Формируем строку для занесения ей в переменную.
  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().



Вообщем не открывается меню у игроков.
 
Сверху