Русское сообщество по скриптингу

Player Stats Extended

Утвержденные плагины для AMX Mod X администратором/модератором форума.

Модератор: Leonidddd

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только работоспособных плагинов для AMX Mod X. Новые плагины нужно выкладывать в разделе "Новые плагины".

Player Stats Extended

Сообщение BloodMoon » 02 июн 2016, 23:48

Автор: BloodMoon
Версия: 1.0.0

Описание: Это статистика игроков с расширенным API, которая даст большие возможности для осуществления ваших идей, если у вас есть хотя бы начальный уровень скриптинга в AMXX. Все уровни прописываются в INI файле, следующим образом:
Код: Выделить всё
;уровень                очков опыта для сл. уровня        название (необязательно)
"1"                        "50"                            "Start Level"
"2"
                        "150"                            "Two Level"
"3"
                        "300"                            "Three Level"


API: Не буду заниматься особым разглагольствованием, поэтому, думаю будет достаточно заглянуть в заголовочный файл
Код: Выделить всё
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]);


Утверждено. //Leonidddd
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
BloodMoon
 
Сообщения: 270
Зарегистрирован: 20 июл 2013, 19:34
Забанен
Благодарил (а): 98 раз.
Поблагодарили: 62 раз.
Опыт программирования: Больше трех лет

Re: Player Stats Extended

Сообщение BloodMoon » 04 июн 2016, 16:47

Благодарю за утверждение.

Добавлю также некоторые нюансы:

  • В описании события Pl_Passed было упомянуто о прохождении проверки игроком. Это проверка на валидность SteamID, то есть, игроки с 47 протоколом фильтруются. Если будет нужда, то для таких игроков могу сделать сохранение по никнейму.
  • У события Pl_State нет возможности зарегистрировать Pre функцию. То есть, это событие не блокируется возвращением PLSTAT_SUPERCEDE.
  • У get функций, из перечисления StatActions, получить значение можно не только с помощью возвращаемого значения, но и с записью в указанную переменную, что указано во втором примере из заголовочного файла:
    Код: Выделить всё
    new iPoints;
    GetPlayerData(get_points, index, iPoints);
Аватара пользователя
BloodMoon
 
Сообщения: 270
Зарегистрирован: 20 июл 2013, 19:34
Забанен
Благодарил (а): 98 раз.
Поблагодарили: 62 раз.
Опыт программирования: Больше трех лет

Re: Player Stats Extended

Сообщение Mistrick » 04 июн 2016, 17:07

BloodMoon, Зачем нужна колонка "уровень" в ini файле?
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Player Stats Extended

Сообщение BloodMoon » 04 июн 2016, 17:44

Mistrick, вообще, изначально была задумка сделать автонумерацию этой колонки, исходя из номера строки (конечно же, не учитывая комментарии). Но потом сделал все же колонку с уровнем, чтобы иметь возможность устанавливать нужные параметры для уровней даже не по порядку (то есть, сначала идет для первого уровня, потом хоп, для пятого и т.д.). Значение из этой колонки - это ключ для ассоциативного массива, из которого в последствии берется либо кол-во опыта, которое нужно достичь для повышения, либо название уровня (значение из 3 колонки).
Аватара пользователя
BloodMoon
 
Сообщения: 270
Зарегистрирован: 20 июл 2013, 19:34
Забанен
Благодарил (а): 98 раз.
Поблагодарили: 62 раз.
Опыт программирования: Больше трех лет

Re: Player Stats Extended

Сообщение Mistrick » 04 июн 2016, 19:04

BloodMoon, Что будет если заполнить, например, только 1, 10, 100 уровни(3 строки в файле)?
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Player Stats Extended

Сообщение BloodMoon » 04 июн 2016, 21:19

Mistrick, хороший вопрос. Тоже думал об этом. И я все же склоняюсь к мнению, что у того, кто будет использовать, все же должна быть голова на плечах и понимание, что так делать и не стоит. :-)
Аватара пользователя
BloodMoon
 
Сообщения: 270
Зарегистрирован: 20 июл 2013, 19:34
Забанен
Благодарил (а): 98 раз.
Поблагодарили: 62 раз.
Опыт программирования: Больше трех лет

Re: Player Stats Extended

Сообщение Mistrick » 04 июн 2016, 22:01

BloodMoon, Это понятно для личного использования. В публичной работе либо обрабатывайте исключения, либо документируйте особенности чтения конфигов.
Аватара пользователя
Mistrick
Скриптер
 
Сообщения: 2940
Зарегистрирован: 04 ноя 2012, 18:15
Благодарил (а): 43 раз.
Поблагодарили: 1247 раз.
Языки программирования: PAWN
С/С++(few above zero)

Re: Player Stats Extended

Сообщение BloodMoon » 04 июн 2016, 22:40

Mistrick, указывать что? Что пропустив уровень в конфиге, начать сразу со ста, пропустив остальные 99, начнутся проблемы? Ну, по-моему тут нужно быть на голову отшибленным, чтобы такое не понять, вряд ли таковые имеются, среди тех, кто вообще управится с API данной системы уровней. Но, все же спасибо, в будущем учту обязательно.
Аватара пользователя
BloodMoon
 
Сообщения: 270
Зарегистрирован: 20 июл 2013, 19:34
Забанен
Благодарил (а): 98 раз.
Поблагодарили: 62 раз.
Опыт программирования: Больше трех лет

Re: Player Stats Extended

Сообщение Subb98 » 04 июн 2016, 22:57

BloodMoon, Mistrick имел ввиду, что для паблика необходимо прорабатывать все возможные варианты. И не имеет значения, кто будет пользоваться вашей работой: продвинутый скриптер или совсем новичок.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Player Stats Extended

Сообщение BloodMoon » 04 июн 2016, 23:14

Subb98, я это уже прекрасно понял без лишних объяснений.)
Аватара пользователя
BloodMoon
 
Сообщения: 270
Зарегистрирован: 20 июл 2013, 19:34
Забанен
Благодарил (а): 98 раз.
Поблагодарили: 62 раз.
Опыт программирования: Больше трех лет

След.

Вернуться в Утвержденные плагины

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11