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

Тема в разделе "Программирование / Скриптинг", создана пользователем Vit_ amin, 4 янв 2014.

  1. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.055
    Симпатии:
    345
    Введение в язык програмирования 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(useridserver_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_usernameserver_var(hostnameserver_var(eventscripts_currentmap)
            
    // Показываем меню игроку.
            
    es_menu 10 event_var(useridserver_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(useridkills 0 // Создаем консольную переменную на стороне игрока под названием kills и устанавливаем ей значение = 0.
     
    }
    }
    event player_death // Событие, когда игрок умирает.
    {
     if (
    event_var(es_attackerdead) == 1) do // Условие, что атакующий игрок мертв.
     
    {
      
    es playervar get player_kill event_var(attackerkills // Получаем консольную переменную 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(attackerkills
      
    // Добавляем к переменной player_kill + 1 убийство.
      
    es_xmath player_kill 1
      
    // Устанавливаем новое значение после данных операций к консольной переменной клиента kills.
      
    es playervar set event_var(attackerkills 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_useridprops/cs_office/vending_machine.mdl
      
    // Снова даем команду на получения меню (Так как, если вы нажмете на какой-то пункт в меню то меню исчезнет у клиента).
      
    es popup send prop_create server_var(_popup_userid)
     }
    }
    На данный момент я привел вам 5 примеров использования ESShell.


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

    FrozDark Команда сайта HLMod Модератор

    Сообщения:
    1.761
    Симпатии:
    1.915
    когда-то на нём писал себе на сервер, а теперь смотрю и не понимаю)
     
  3. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.055
    Симпатии:
    345
    Бывает, но я сейчас SourcePawn учу, а Shell отлично понимаю.
     
  4. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Vit_ amin, попробуй код в тег
    PHP:
     закинутьдумаюсмотреться лучше будет
     
    Vit_ amin нравится это.
  5. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.055
    Симпатии:
    345
     
  6. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.055
    Симпатии:
    345
    Администрация. Закрепите пожалуйста мою тему. Так как все статьи об скриптинге в шапке.
     
  7. zloykif

    zloykif

    Сообщения:
    137
    Симпатии:
    24
    Ооочень много грамматических ошибок, чуть мозг не сломал T_T а так норм)
     
  8. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.055
    Симпатии:
    345
    Если ты можешь лучше и у тебя есть время то пиши сам пожалуйста ... А все расписывать думаешь у меня голова не болит ?Исправил все возможные ошибки в статье.

    Добавлено через 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(useridweapon_get
     
    // Проверка, что игрок умирал или нет ?
     
    ifx false(check_spawn) do 
     {
      
    // Если нет устанавливем ему консольную переменную weapon_get на 1.
      
    es playervar set event_var(useridweapon_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(useridweapon_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(useridserver_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(useridserver_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(useridweapon_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(useridserver_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(useridserver_var(weapon_format)
       }
      }
     }
    }
    event player death
    {
     
    // Устанавливаем консольную переменную weapon_get клиенту на 0,
     // для того, чтобы он прошел проверку ifx false(check_spawn) do,
     // во время воскрешения и ему далось новое оружие.
     
    es playervar set event_var(useridweapon_get 0
    }
    На сегодня всё спасибо за внимание.
     
    Последнее редактирование: 11 янв 2014
    Серый™, hellgu и R1KO нравится это.
  9. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Где взять docs ES?
    События и прочее.

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

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Hejter нравится это.
  11. Vit_ amin

    Vit_ amin BotManager001

    Сообщения:
    1.055
    Симпатии:
    345
    Снова здравствуйте, я продолжаю свою статью. Я не буду многословен и сегодня будет расмотрен 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_useridplayer_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_skinNameSkin
     
    // Получаем значение имени ключа : ModelSkin
     
    es_keygetvalue model_path Admins_Skins server_var(key_skinModelSkin
     
    // С помощью цикла формируем меню
     // Добавляем туда название модели
     
    es popup addline skin_menu server_var(name_skin)
     
    // Устанавливаем переменную для каждого пункта меню
     // То есть при выборе какого-либо пункта в меню объявляется такая-то переменная
     // В данном случае это путь до .mdl файла
     
    es popup menuvalue skin_menu popup_select_path server_var(key_skinserver_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(useridplayer_model
      
    // Если да, то получаем значений переменной из блока skin_install и устанавливаем клиенту модель.
      
    ifx true(is_admin) do
      {
       
    es playervar get model_player event_var(useridplayer_model
       es playerset model event_var
    (useridserver_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(useridadmin_skin
      
    // Если авторизация пройдена успешно, пишем игроку (а теперь уже админу) сообщение
      
    ifx true(admin_func) do
      {
       
    es_tell event_var(userid#multi "#green[Skin Menu] #defaultВы являетесь админом, чтобы открыть меню выбора скина напишите !skin"
      
    }
     }
    }
    P.S. В данном коде не достает только функции загрузки контента игрокам.
     
    Последнее редактирование: 28 июн 2014
    Серый™ нравится это.
  12. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259


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

    Vit_ amin BotManager001

    Сообщения:
    1.055
    Симпатии:
    345
    Была ошибка в
    Код:
    block player_spawn
    изменено на
    Код:
    event player_spawn
    P.S.Пост с ошибочным кодом обновлен