Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 9
    Гостей: 6
    Пользователи: - отсутствуют
    Роботы: Yandex Bot, crawl Bot, Google Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 6-12-2011, 03:15 Просмотров: 13042

    Урок 4. Какие бывают функции. Типы функций.

    В первых трех уроках было разобрано что такое числа, символы и условные выражения.
    Это можно сказать основа для работы, так как сами функции в большинстве своем без этих данных просто ни чего не смогут сделать.
    Но и функции тоже делятся на 4 вида, и прежде чем написать первый плагин, необходимо четко понимать какая функция когда вызывается, как вызывается и кем она может быть вызвана. Чуть дальше я расскажу вам о пяти типах функций в pawn`не которые знаю.

    Какие бывают функции

    Я знаю пять типов функций в Pawn`e:
    1. public - (внешняя/публичная) Данный тип функций доступен движку Amx Mod X
    2. forward - Функции данного типа вызываются каждый раз когда происходит какое то событие
    3. native - (внутренняя) данные функции объявляются или в модулях или в ядре (посмотреть их всех можно в файлах *.inc) эти функции можно сказать кирпичики из которого строят дом), а public функции это фундамент и меж этажные перекрытия.
    4. stock - Данные функции ( очень грубо говоря) такие же как public, но с важным отличием, они включаются компилятором в плагин, только если они используются, то есть если вы сделали свой инклюд с функциями и вставили его в какой то из своих плагинов, а часть функций не используется, то они не будут скомпилированы так как они там не нужны.
    5. регулярная - Функции без аргументов.


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

    Если мы попытаемся взять пустой файл и скомпилировать его, то получим ошибку:
    Error: No entry point (no public functions) on line 1
    которая говорит нам о том что нет ни одной public функции, из чего напрашивается вывод что основным элементом фундамента являются public функции.
    Если попробовать написать регулярную функцию, то ни чего не выйдет все равно. Так как это тупенькая железяка и ей надо все разжевывать.

    Но для начала я в двух словах расскажу о синтаксисе функций.
    Если вы будите смотреть синтаксис конкретной функции, то не найдете синтаксис для public функций, так как этими функциями являются foraward функции, или вызываются из других функций.

    Необходимо запомнить что фундамент каждой функции это вот такая конструкция:
    public nazvanie_funkcii (parametri esli esti){

    }
    Что все это значит:
    public мы говорим что эта функция доступна движку
    nazvanie_funkcii это название функции например plugin_init
    plugin_init - это forawrd функция которая вызывается каждый раз когда запускается сервер и загружаются плагины, или смена карты.
    Далее идут 2 кавычки { }.
    Все это и есть фундамент, а вот внутри этих кавычек уже вызываются native функци, кирпичики.

    Вот как можно это себе представить:

    //Это фундамент плагина, внутри этой функции 
    //регистрируются все команды,квары и многое другое
    public plugin_init(){

        //Тут происходит регистрация команд и т.п.

        //Эта функция native, она кирпичик в плагине,
        //в данном варианте она регистрирует плагин автора и версию
        register_plugin(PLUGIN, VERSION, AUTHOR)

    }
    //образно говоря это первый этаж дома ( у нас плагина )
    // функция клиент коннект тоже форвард, то есть вызывается всегда
    //когда какой то игрок конектится к серверу
    //у данной функции уже есть 1 аргумент, это id (index) игрока,
    // он и указывается в круглых скобках,
    //о этих данных написано в синтаксисе к функциям
    public client_connect(id){

        //Тут мы можем получить его ip
        //с помощью native функции
        //но предварительно, согласно синтаксису функции,
        //нужно зарегистрировать массив для получаемых данных
        
        new ip[17]
        get_user_ip(id,ip,16,1)
        
    }

    Но данный пример работать все равно не будет, так как плагину не рассказали про то что значат эти функции,
    для этого необходимо вставить инклюд, где хранится информация о них:
    #include <amxmodx>

    в этом же инклюде вы найдете все функции модуля и краткие описания к ним.

    Ну как, разобрались что такое натив , форвард и паблик?
    Теперь посмотрим что такое stock.
    stock test(id){
    //какой то код
    }


    Синтаксис такой же как и у паблик функций, только если вы вставите данный код в любой свой плагин,то ни чего не будет, так как данную функцию не вызывает ни одна другая функция и компилятор просто проигнорирует ее.

    Вызвать одну функцию можно из другой и очень просто, необходимо просто написать ее название и в скобках указать необходимые параметры которые хотите передать:

    //Сообщаем плагину о функциях
    #include <amxmodx>

    //Объявление констант для функци
    #define PLUGIN "[amxmodx.inc] yPoK 4"
    #define VERSION "1.0"
    #define AUTHOR "Admin"

    //Вызывается всегда при старте плагина
    public plugin_init() {
        register_plugin(PLUGIN, VERSION, AUTHOR)
    }
    // Вызывается всегда при отключении игрока
    public client_disconnect(id){
        
        //Вызывается нами придуманная функция
        // передается id игрока
        my_function(id)
    }
    //Вызвалась наша функция и получила id игрока
    public my_function(id){
        
        //Вызывается функция вывода сообщения в чат
        //Где сообщается что игрок вышел и его id такой то
        client_print(0,print_chat,"Client disconected %d",id)
        
    }

    Вот в принципе и первый работающий плагин.
    Для окончательного закрепления материала попробуйте написать плагин в котором будет выводиться имя игрока который коннектится к серверу.
    Только не копируйте код, а пишите все сами с нуля, поверьте так вы быстрее научитесь.
    Можете воспользоваться программой AMXX-Studio,в ней и удобная подсветка кода и при написании функции, выводится список возможных, ну как в в гугле когда начинаете набирать фразу для поиска вываливаются подсказки....

    И так, очень грубо но наглядно выглядит это все так:
    public forwar(){

        native

    }

    Это не рабочий пример, я тут хотел показать где какие типы функций располагаются в конструкции функций.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Урок 4. Какие бывают функции. Типы функций.
    LORDofLINEAGE

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Читаю каждый урок, очень нравиться,хороший раздел вы создали, Автор молодец, Буду ждать следующих уроков...
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  56  +

    Спасибо )
    Следующий урок через пару дней.
    --------------------
    LORDofLINEAGE

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Цитата: Admin
    Спасибо )Следующий урок через пару дней.

    Буду ждать ппц как)
    bestnamebest

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Получилось самому написать код с первой попытки =) Благодарю за уроки!
    uNkez

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Спасибо огромное , много информации для себя извлек :)
    Andrey007

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Так получается можно все делать stock, только память экономить будем, верно ведь?
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  56  +

    Andrey007, экономить ресурсы сервера надо оптимизированными функциями, без излишних массивов, циклов, дублирующихся функций и т.д.

    А если ты сделаешь кучу неиспользуемых функций нафиг они нужны вообще?
    Стоки удобно делать в свой инклюд, что бы каждый раз не делать какие то одни и те же функции, но при этом что бы не включались все, а только нужные.

    ( Каждый раз - имеется в виду в каждом новом плагине )
    --------------------
    TitanDay

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Хорошие уроки,всё понятно и ясно ,после прочтения 4 уроков начал понимать что к чему))
    Defoulse Profill

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    client_print(0,print_chat,"Client disconected %d",id)
    Тут все понятно, кроме 0. Что это значит 0?

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама