1. msmrbtsk Пользователь

    Регистрация:
    29.03.15
    Сообщения:
    342
    Симпатии:
    89
    Пол:
    Мужской
    Автор: BloodMoon
    Версия: 1.0.0
    Источник: goldsrc.ru

    Описание: Это статистика игроков с расширенным API, которая даст большие возможности для осуществления ваших идей, если у вас есть хотя бы начальный уровень скриптинга в AMXX. Все уровни прописываются в INI файле, следующим образом:

    Код:
    enum StatActions {
       get_points, //Возвращает эксперт поинты игрока
        get_level, //Возвращает уровень игрока
       
        set_points, //Устанавливает указанное число эксперт поинт игроку
        set_level, //Устанавливает указанный уровень игроку
       
        get_alive, //Возвращает состояние игрока (жив, мертв) true/false
        get_level_title, //Возвращает название (ранг) уровня игрока
        get_left_points //Возвращает число эксперт поинт, которое нужно достичь
       
        /*
         * Example: new iPoints = GetPlayerData(get_points, index);
         * Example two: new iPoints; GetPlayerData(get_points, index, iPoints);
         * Example three: new szLevelTitle[32]; GetPlayerData(get_level_title, index, szLevelTitle, charsmax(szLevelTitle));
        */
    };
    
    enum StatEvents {
        /* Вызывается, когда игрок получает максимальный уровень
         *
         * forward params: func(StatEvents: event, player)
        */
        Pl_TakeMaxLevel,
       
        /* Вызывается, когда игрок получает эксперт поинт
         *
         * forward params: func(StatEvents: event, player)
        */
        Pl_TakePoints,
       
        /* Вызывается, когда игрок получает новый уровень
         *
         * forward params: func(StatEvents: event, player)
        */
        Pl_TakeLevel,
       
        /* Вызывается, когда игрок успешно проходит проверку и
         * получает либо стартовые эксперт поинты и уровень, либо
         * ранее сохраненные (удобно для запуска информера)
         *
         * forward params: func(StatEvents: event, player)
        */
        Pl_Passed,
       
        /* Вызывается, когда меняется состояние игрока (умер, ожил)
         *
         * forward params: func(StatEvents: event, player)
        */
        Pl_State
    };
    
    enum {
        PLSTAT_CONTINUE,
        PLSTAT_SUPERCEDE
    };
    
    enum _:StatHandle {
        INVALID_STAT_HANDLE = -2
    };
    
    native GetMaxLevels();
    native GetPlayerData(StatActions: action, const index, any:...);
    native StatHandle: RegisterStatEvent(StatEvents: event, const function[], Post = 1);
    native StatHandle: DestroyStatEvent(StatHandle: handle);
    

    Код:
    playerstat_hostname        "127.0.0.1"          // SQL Hostname
    playerstat_basename        "mysql"              // SQL Database
    playerstat_username        "root"               // SQL Username
    playerstat_password        ""                   // SQL Password
    playerstat_tablename            "playerstat"         // SQL Tablename
    playerstat_startexp        "0"                  // Стартовое кол-во expert point
    playerstat_startlvl        "1"                  // Стартовый уровень

    Код:
    #include <amxmodx>
    #include <playerstats>
    
    #define PLUGIN "Player Stats: Informer"
    #define AUTHOR "BloodMoon"
    
    const MAX_CLIENTS = 32;
    
    new gl_pSyncHudMessage;
    new gl_szPlayerRang[MAX_CLIENTS + 1][32];
    
    public plugin_init() {
        register_plugin(PLUGIN, PLAYER_STATS_VERSION_STR, AUTHOR);
        
        RegisterStatEvent(Pl_Passed, "playerPassed_Handle", .Post = true);
        RegisterStatEvent(Pl_TakeLevel, "playerTakeLevel_Handle", .Post = true);
        
        gl_pSyncHudMessage = CreateHudSyncObj();
    }
    
    public playerPassed_Handle(StatEvents: pEvent, pPlayer) {
        GetPlayerData(get_level_title, pPlayer, gl_szPlayerRang[pPlayer], charsmax(gl_szPlayerRang[]));
        
        set_task(1.0, "ShowHudMessage_Handle", pPlayer, .flags = "b");
    }
    
    public client_disconnect(pPlayer) remove_task(pPlayer);
    
    public playerTakeLevel_Handle(StatEvents: pEvent, pPlayer) {
        GetPlayerData(get_level_title, pPlayer, gl_szPlayerRang[pPlayer], charsmax(gl_szPlayerRang[]));
    }
    
    public ShowHudMessage_Handle(pPlayer) {
        set_hudmessage(.red = 0, .green = 100, .blue = 200, .holdtime = 1.1);
        ShowSyncHudMsg(pPlayer, gl_pSyncHudMessage, "[LEVEL: %i/%i] [POINTS: %i/%i]^n[RANG: %s]", GetPlayerData(get_level, pPlayer), GetMaxLevels(), GetPlayerData(get_points, pPlayer), GetPlayerData(get_left_points, pPlayer), gl_szPlayerRang[pPlayer]);
    }

    Примечания автора:
    • В описании события Pl_Passed было упомянуто о прохождении проверки игроком. Это проверка на валидность SteamID, то есть, игроки с 47 протоколом фильтруются. Если будет нужда, то для таких игроков могу сделать сохранение по никнейму.
    • У события Pl_State нет возможности зарегистрировать Pre функцию. То есть, это событие не блокируется возвращением PLSTAT_SUPERCEDE.
    • Пропускать уровни в файле уровней нельзя. То есть, указав в файле уровней только, например, 1, 10 и 50 уровни, ничего хорошего из этого не выйдет.
    • У get функций, из перечисления StatActions, получить значение можно не только с помощью возвращаемого значения, но и с записью в указанную переменную, что указано во втором примере из заголовочного файла:
    Код:
    new iPoints;
    GetPlayerData(get_points, index, iPoints);
     

    Вложения:

    AmDmKo и ThePhoenix нравится это.
  2. xopoIIIuu Пользователь

    Регистрация:
    22.04.15
    Сообщения:
    234
    Симпатии:
    51
    Пол:
    Мужской
    GetPlayerData(set_points, index, iPoints);
    index - индекс игрока
    iPoints - количество выдаваемых поинтов?

    Делал так:
    GetPlayerData(set_points, index, 4)
    4 - количество поинтов.
    В итоге выдает мне 6-ти значное число.

    Буду благодарен за пример..., с выдачей поинтов возникли проблемы...
     
  3. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.596
    Симпатии:
    4.169
    Пол:
    Мужской
    @xopoIIIuu, это GET, то есть получить, а не установить
    --
    бля, еблокод
     
  4. xopoIIIuu Пользователь

    Регистрация:
    22.04.15
    Сообщения:
    234
    Симпатии:
    51
    Пол:
    Мужской
    @neygomon, я по началу тоже так думал, потом взглянул в код и понял что через GetPlayerData можно выдать поинты, только оно выдает их в 6-ти значном числе.
     
  5. neygomon Его Темнейшество :j Команда форума

    Регистрация:
    26.02.15
    Сообщения:
    7.596
    Симпатии:
    4.169
    Пол:
    Мужской
    case set_points: {
    return gl_pPlayersData[pPlayer][pl_points] = get_param(3);
    }

    кек.
    попробуй посмотреть че оно выводит:
    client_print(id, print_chat, "[#1] Set %i points", GetPlayerData(set_points, id, 10));
    new points; GetPlayerData(get_points, id, points);
    client_print(id, print_chat, "[#2] Your %i points", points);
     
  6. xopoIIIuu Пользователь

    Регистрация:
    22.04.15
    Сообщения:
    234
    Симпатии:
    51
    Пол:
    Мужской
    @neygomon, уже ближе к выходным, в общаге сейчас. get_points верно выводит информацию о количестве поинтов, по крайней мере через информер, а вот set_points потом проверю с выводом инфы в чат