[SourcePawn] Урок 2 - Установка и компиляция плагинов

Тема в разделе "Программирование / Скриптинг", создана пользователем R1KO, 5 сен 2016.

  1. R1KO

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

    Сообщения:
    5.982
    Симпатии:
    2.983
    [SourcePawn] Урок 2 - Установка и компиляция плагинов

    <- К содержанию

    • Установка плагинов:

      Типы файлов:
      • .smx— Сам плагин после компилирования (нужен для работы).
        Расположение: addons/sourcemod/plugins/
      • .sp — Файл с исходным кодом (исходник, не нужен для работы ).
        Расположение: addons/sourcemod/scripting/
      • .phrases.txt — Файл перевода (нужен для работы).
        Расположение: addons/sourcemod/translations/
      • .inc — Файл, в котором храняться функции плагина (нужен для работы и компиляции).
        Расположение: addons/sourcemod/scripting/include/
      • .cfg — Файл конфигурации плагина (нужен для работы).
        Расположение зависит от плагина. Часто генерируется по пути cfg/sourcemod/
      • .txt — Может быть использован как конфиг или как языковой файл (нужен для работы).
        Расположение зависит от плагина.
      • .ini — Конфигурационный файл (нужен для работы).
        Расположение зависит от плагина.

      Для установки плагина нужно разложить все файлы плагина по папкам указанным выше.

      Чтобы проверить работу плагина:

      Запускаем сервер, заходим в его консоль и пишем sm plugins list . В консоли появиться список работающих плагинов:
      upload_2016-9-5_17-40-35.png
      Проверяем есть ли в списке установленный Вами плагин, если он там есть, значит Вы сделали все правильно.
      • Команды SourceMod для работы с плагинами:
        sm plugins команда
        Команды:
        • info - Information about a plugin/Показывает информацию о плагине
        • list - Show loaded plugins/Выводит список установленных плагинов
        • load - Load a plugin/Загружает указанный плагин
        • load_lock - Prevents any more plugins from being loaded/Блокирует загрузку плагинов
        • load_unlock - Re-enables plugin loading/Снимает блокировку загрузки плагинов
        • refresh - Reloads/refreshes all plugins in the plugins folder/Обновляет/перезагружает загруженные плагины
        • reload - Reloads a plugin/Перезагружает указанный плагин
        • unload - Unload a plugin/Выгружает указанный плагин
        • unload_all - Unloads all plugins/Выгружает все плагины
    • Компиляция плагинов:

      Для редактирования исходников плагинов рекомендую использовать редактор Notepad++ (кликабельно)
      • Если у вас код не в файле .sp, а например, с форума то:
        • Создайте новый файл с расширением .sp
        • Откройте его с помощь notepad++ (см. выше)
        • Установите для него кодировку UTF-8 без BOM
          upload_2016-9-5_20-1-13.png
        • Скопируйте в него нужный код
        • Сохраните изменения
        • Произведите компиляцию (см. ниже)
      • Компиляция на Windows

        Скачайте SourceMod и распакуйте файлы из архива (в частности папку addons/sourcemod/scripting/ со всем её содержимым) в любое место, например, на рабочий стол. Будем называть её "папкой компилятора". Из всего её содержимого необходимы только 2 файла: compile.exe, spcomp.exe и папка include.
        Затем положите в папку компилятора исходники вашего плагина (файлы с расширением *.sp и если есть файлы *.inc в папку include/).
        Отредактируйте исходник как вам нужно и затем перетащите главный файл .sp на сompile.exe - вы увидите черное окно с отчетом о компиляции.
        Если все в порядке и ошибок нет закройте это окно и можете забирать *.smx файл из папки compiled/.
        upload_2016-9-5_17-47-18.png

        Если у вас возникли ошибки при компиляции - необходимо их исправить.

      • Компиляция на Linux

        Чтобы скомпилировать плагин в unix системах:
        1. Откройте терминал (консоль)
        2. Перейдите в директорию /addons/sourcemod/scripting/ с помощью команды cd
        3. Скопируйте файл содержащий исходный код плагина (имеет расширение *.sp) в эту директорию командой cp
        4. Для компиляции некоторых плагинов нужны *.inc файлы которые нужно копировать в папку addons/sourcemod/scripting/include и затем компилировать плагин
        5. Выполните команду:
          Код:
          ./compile.sh имя_плагина.sp
          Плагин должен скомпилироваться.
      Внимание! Нет разницы на какой OC компилировать плагины. Если ваш сервер работает на Linux, то плагины скомпилированные на Windows там так же будут работать.

      Если при компиляции возникли ошибки вам сюда -> Ошибки и предупреждения при компиляции

      Часть информации взята здесь.
     
    Последнее редактирование: 4 ноя 2016
    максимка27 и Someone нравится это.
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.521
    Симпатии:
    1.971
    Ещё добавь, как компилировать плагины онлайн и что делать с кодом-текстом на форумах. Оффтоп
     
  3. Someone

    Someone

    Сообщения:
    136
    Симпатии:
    44
    Еще можно про sm plugins refresh написать
     
  4. R1KO

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

    Сообщения:
    5.982
    Симпатии:
    2.983
    Возможные ошибки при компиляции
    Для начала разберём разницу между ошибкой (error) и предупреждением (warning).

    • Предупреждение - то, что может выдать Вам компилятор в случае "некритичной ошибки" (По мнению компилятора) допущенной в исходном коде плагина. Такая ошибка не будет влиять на работу плагина (Под сомнением), но лучше писать так, чтобы компилятор не ругался.
    • Ошибка - ситуация, в которой компилятор "откажет" Вам в компилировании плагина, т.е. он не будет компилировать Ваш плагин, пока Вы не устраните ошибку в исходном коде.

    Обычно, когда компилятор предупреждает или выдаёт ошибку, он указывает строку в которой допущена ошибка (или в которой компилятор "сомневается")

    Коды ошибок
    • error 001: expected token: "%s", but found "%s" - ожидался символ: "%s", но был найден "%s";
    • error 002: only a single statement (or expression) can follow each "case" - только одно заявление (или выражение) могут следовать за "case";
    • error 003: declaration of a local variable must appear in a compound block - объявленная локальная переменная должна использоваться в этом же блоке;
    • error 004: function "%s" is not implemented - функция %s не реализована;
    • error 005: function may not have arguments - функция не имеет аргументов;
    • error 006: must be assigned to an array - должен быть присвоен массив;
    • error 007: operator cannot be redefined - оператор не может быть установлен еще раз;
    • error 008: must be a constant expression; assumed zero - должно быть постоянным выражением; равным нулю;
    • error 009: invalid array size (negative or zero) - неверный размер массива (отрицательный или 0);
    • error 010: invalid function or declaration - неизвестная функция или декларация;
    • error 011: invalid outside functions - неверно вне функции;
    • error 012: invalid function call, not a valid address - неверный вызов функции, неверный адрес;
    • error 013: no entry point (no public functions) - нет точки входа (не public функция);
    • error 014: invalid statement; not in switch - неверный оператор; не в switch;
    • error 015: "default" case must be the last case in switch statement - "default" должен быть последним условием в switch;
    • error 016: multiple defaults in "switch" - несколько "default" в switch;
    • error 017: undefined symbol "%s" - неизвестный символ "%s";
    • error 018: initialization data exceeds declared size - данные массива превышают его размер;
    • error 019: not a label: %s" - не метка "%s";
    • error 020: invalid symbol name "%s" - неверное имя символа "%s";
    • error 021: symbol already defined: %s" - символ уже объявлен: "%s";
    • error 022: must be lvalue (non-constant) - должно быть левосторонним (нет постоянной);
    • error 023: array assignment must be simple assignment - назначение массива должно быть простым;
    • error 024: "break" or "continue" is out of context - "break" или "continue" вне контекста;
    • error 025: function heading differs from prototype - функция заголовка отличается от прототипа;
    • error 026: no matching "#if..." - не найдено "#if...";
    • error 027: invalid character constant - недопустимый символ в постоянной;
    • error 028: invalid subscript (not an array or too many subscripts): "%s" - неверный индекс (это не массив или слишком много индексов): "%s";
    • error 029: invalid expression, assumed zero - неверное выражение, нет результата;
    • error 030: compound statement not closed at the end of file - составной оператор не закрыт в конце файла;
    • error 031: unknown directive - неизвестная директива;
    • error 032: array index out of bounds (variable "%s") - индекс массива превышен;
    • error 033: array must be indexed (variable "%s") - массив должен быть проиндексирован;
    • error 034: argument does not have a default value (argument %d) - аргумент не имеет начального значения (аргумент %d);
    • error 035: argument type mismatch (argument %d) - несоответствие типа аргумента (аргумент %d);
    • error 036: empty statement - пустой оператор;
    • error 037: invalid string (possibly non-terminated string) - неправильная строка;
    • error 038: extra characters on line - лишние символы в строке;
    • error 039: constant symbol has no size - символьная константа не имеет размера;
    • error 040: duplicate "case" label (value %d) - несколько раз объявлен "case" с одним тем же параметром;
    • error 041: invalid ellipsis, array size is not known - размер массива неизвестен;
    • error 042: invalid combination of class specifiers - недопустимое сочетание класса;
    • error 043: character constant exceeds range for packed string - символьная константа превышает размер строки;
    • error 044: positional parameters must precede all named parameters - позиционные параметры должны предшествовать всем именованные параметры;
    • error 045: too many function arguments - слишком много аргументов у функции;
    • error 046: unknown array size (variable "%s") - неизвестный размер массива;
    • error 047: array sizes do not match, or destination array is too small - размеры массива конфликтуют, либо целевой массив слишком маленький;
    • error 048: array dimensions do not match - размеры массива не совпадают;
    • error 049: invalid line continuation - неправильное продолжение строки;
    • error 050: invalid range - неверный диапазон;
    • error 051: invalid subscript, use "[ ]" operators on major dimensions - неправильный индекс, используйте "[]";
    • error 052: multi-dimensional arrays must be fully initialized - много-размерные массивы должны быть полностью определены;
    • error 053: exceeding maximum number of dimensions - превышение максимального числа измерений;
    • error 054: unmatched closing brace - не найдена закрывающаяся скобка;
    • error 055: start of function body without function header - начало функции без заголовка;
    • error 056: arrays, local variables and function arguments cannot be public (variable "%s") - ?????;
    • error 057: unfinished expression before compiler directive - незавершенное выражение для компилятора;
    • error 058: duplicate argument; same argument is passed twice - дублирование аргумента; Аргумент передается несколько раз;
    • error 059: function argument may not have a default value (variable "%s") - аргумент не может иметь значение по-умолчанию;
    • error 060: multiple "#else" directives between "#if ... #endif" - Несколько "#else" между "#if ... #endif" - несколько "#else" между "#if и #endif";
    • error 061: "#elseif" directive follows an "#else" directive - "#else" перед "#elseif";
    • error 062: number of operands does not fit the operator - число операндов не соответствует оператору;
    • error 063: function result tag of operator "%s" must be "%s" - Результат функции %s должен быть %s;
    • error 064: cannot change predefined operators - невозможно изменить уже определенные операторы;
    • error 065: function argument may only have a single tag (argument %d) - в этой функции может быть только один аргумент;
    • error 066: function argument may not be a reference argument or an array (argument "%s") - аргумент функции не может быть ссылкой или массивом;
    • error 067: variable cannot be both a reference and an array (variable "%s") - Переменная не может быть как массив или ссылка;
    • error 068: invalid rational number precision in #pragma - неверное число в #pragma;
    • error 069: rational number format already defined - формат рационального числа уже определен;
    • error 070: rational number support was not enabled - рациональное число не поддерживается;
    • error 071: user-defined operator must be declared before use (function "%s") - объявленный оператор должен быть перед использованием;
    • error 072: "sizeof" operator is invalid on "function" symbols - оператор "sizeof" не может быть использован для символов функции;
    • error 073: function argument must be an array (argument "%s") - аргумент %s должен быть массивом;
    • error 074: #define %s must start with an alphabetic character - #define должен начинаться с буквы;
    • error 075: input line too long (after substitutions - введенная строка слишком длинная;
    • error 076: syntax *error in the expression, or invalid function call - неправильный синтаксис или неправильный вызов функции;
    • error 077: malformed UTF-8 encoding, or corrupted file: %s - плохая кодировка UTF-8 или плохой файл: %s;
    • error 078: function uses both "return" and "return <value>" - функция использует "return" и "return <значение>";
    • error 079: inconsistent return types (array & non-array) - несовместимость типов возвращенных результатов;
    • error 080: unknown symbol, or not a constant symbol (symbol "%s") - неизвестный или непостоянный символ: %s;
    • error 081: cannot take a tag as a default value for an indexed array parameter (symbol "%s") - не могу принять тег в качестве значения по умолчанию для индексированного параметра-массива (символ "% S");
    • error 082: user-defined operators and native functions may not have states - созданные функции или операторы не имеют состояния;
    • error 083: a function may only belong to a single automaton (symbol "%s") - функция может принадлежать только к одной автоматизации;
    • error 084: state conflict: one of the states is already assigned to another implementation (symbol "%s") - Кофликт state(функция созданий структур):одна из state уже создана в другом месте(символ %s);
    • error 085: no states are defined for function "%s" - нет состояний, определенных для функции "%s";
    • error 086: unknown automaton "%s" - неизвестная автоматизация "%s";
    • error 087: unknown state "%s" for automaton "%s" - неизвестное состояние "%s" в автоматизации "%s";
    • error 088: number of arguments does not match definition - количество аргументов не совпадает с объявленными в функции;

    Коды "Фатальных ошибок"
    • fatal error 100: cannot read from file: "%s" - невозможно прочитать из файла "%s";
    • fatal error 107: too many error messages on one line - слишком много сообщений об ошибке в одной строке;

    Коды предупреждений
    • warning 200: symbol "%s" is truncated to 31 characters - название переменной "%s" обрезано до 31 символа;
    • warning 201: redefinition of constant/macro (symbol "%s") - повторно установлена постоянная/макро (переменная "%s");
    • warning 202: number of arguments does not match definition - несовпадение количества аргументов;
    • warning 203: symbol is never used: "%s" - переменная никогда не использовалась: "%s";
    • warning 204: symbol is assigned a value that is never used: "%s" - переменной установлено значение которое никогда не использовалось: "%s";
    • warning 209: function "%s" should return a value - функция "%s" ничего не возвращает;
    • warning 211: possibly unintended assignment - в условии использовано не сравнение, а присвоение;
    • warning 213: tag mismatch - несоответствие аргументов;
    • warning 215: expression has no effect - выражение не имеет смысла;
    • warning 216: nested comment - вложенный комментарий (вынесите его за функцию);
    • warning 217: loose indentation - не выровненная строка;
    • warning 219: local variable "%s" shadows a variable at a preceding level - локальная переменная "%s" встречается на предыдущем уровне;
    • warning 224: indeterminate array size in "sizeof" expression (symbol "%s") - неопределенный размер массива в "sizeof" выражении (переменная "%s");
    • warning 225: unreachable code - невыполнимый код;
    • warning 234: symbol "%s" is marked as deprecated: Do not use this function - Функция не рекомендуется к использованию;;
    • warning 235: public function lacks forward declaration (symbol "%s") - у public функции отсутствует forward (символ "%s");
     
    Последнее редактирование: 6 сен 2016
    Drumanid, 666FoX666, san911 и ещё 1-му нравится это.
  5. SHAREN

    SHAREN Servers-Info.Ru

    Сообщения:
    203
    Симпатии:
    13
    Я бы пример добавил:
    Например если ошибка на 37 строке:
    /home/home/GIT/addons/sourcemod/scripting/my_plugin.sp(37) : error 017: undefined symbol "EventHookM"


    + ещё стоит написать что если даже при компиляции не возникло ошибок и предупреждений, то нужно проверить /addons/sourcemod/logs/errors<сегодняшнее число>.log после того как плагин немного поработает.
     
  6. 666FoX666

    666FoX666

    Сообщения:
    628
    Симпатии:
    60
    Мой пост :D
     
  7. R1KO

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

    Сообщения:
    5.982
    Симпатии:
    2.983
    Я нашел в базе своего старого форума, решил что будет полезно
     
  8. 666FoX666

    666FoX666

    Сообщения:
    628
    Симпатии:
    60
    Я знаю, поэтому и улыбнуло)
     
  9. SHAREN

    SHAREN Servers-Info.Ru

    Сообщения:
    203
    Симпатии:
    13
    Не кликабельно. Лучше оставь эту ссылку SourceMod: Half-Life 2 Scripting сразу на скачивание
    пишет вот что
    This site can’t be reached
    http’s server DNS address could not be found.

    DNS_PROBE_FINISHED_NXDOMAIN
     
  10. Rabb1t

    Rabb1t "Почетный раздолбай"

    Сообщения:
    986
    Симпатии:
    129
    @SHAREN, там 2 раза http:// написано.