Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Plugin Cvars Manager

, Менеджер Кваров
Статус пользователя SISA
сообщение 25.5.2018, 16:17
Сообщение #1
Стаж: 13 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

Выкладываю свой вариант плагина, который позволяет легко получать данные с .ini файла (в данном случае, некий аналог работы с кварами).

1. Для кого он нужен ?

В первую очередь, он пригодится всем держателям толстых модов с кучей плагинов, в которых гора всяких кваров, макросов и прочей каши. Короче, как это обычно бывает в CS 1.6: "Кто на что горазд".

2. В чем особенности и отличия от тех же кваров "register_cvar" ?

а. Легкость подключения. Не нужно регистрировать квары, создавать переменные для получения указателей, выполнять всякие костыли в виде server_cmd и server_exec, чтобы получить значения с кваров где-нибудь в прекеше например.

б. Легкость извлечения данных. Поддерживаются данные в виде целых чисел, дробных, строк и многомерных массивов (или аргументов)

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

г. Плагин не оставляет в памяти сервера никаких данных, только кеширование в ассоциативные массивы - отдача - удаление ассоциативных массивов.

д. Поддержка загрузки данных для определенной карты.

Минимальные требования: Amx 1.8.3


Плагин должен быть установлен первым в списке (чтобы все последующие плагины могли получать данные уже на уровне "plugin_precache"

Как работать с плагином ?

По умолчанию, плагин читает данные из файла: addons\amxmodx\configs\config_plugins.ini

Какие символы в начале строки можно использовать для добавления комментариев ?

"[" - лучше всего обозначать название плагина, которому принадлежат квары.
";" - комментарий к квару.

Как добавлять данные ?

Все данные добавляются по простому шаблону:

название квара = значение квара

Если в значении квара указано дробное число, значит в конце названия квара добавляем префикс _f
Если в значении квара указана строка, значит в конце названия квара добавляем префикс _s

Если значение квара состоит из нескольких аргументов, значит мы используем те же префиксы + перечисляем аргументы через запятую:

Примеры:

; Целое число
vipmenu_acces_non_steam = 1

; Строка
vipmenu_vip_model_name_s = vip_gign9

; Дробное число
vipmenu_delay_chat_time_f = 2.0

; Аргмуенты (дробные)
vipmenu_color_f = 255.0, 150.0, 200.0

Принцип получения данных ?

Нужно понимать, что мы получаем данные только для кеширования внутри плагина. Т.е. на уровне plugin_precache, plugin_init или plugin_cfg, мы должны записать их в какой-то массив или переменную или отправить в какую-то функцию.

Для получения данных у нас есть 3 нативы:

Cкрытый текст

* Получаем Целое значение Квара
* @param cvarname[] Название Запрашиваемого квара
* @param argnum Номер аргумента для многомерного массива
* @return Возвращаем целое значение или -1 при отсутствии квара
native plugins_get_cvar_int(const cvarname[], const argnum = 0);

* Получаем Строковое значение Квара
* @param cvarname[] Название Запрашиваемого квара
* @param value[] Значение квара
* @param argnum Номер аргумента для многомерного массива
* @return Возвращаем -1 при отсутствии квара
native plugins_get_cvar_str(const cvarname[], value[], const argnum = 0);

* Получаем Дробное значение Квара
* @param cvarname[] Название Запрашиваемого квара
* @param argnum Номер аргумента для многомерного массива
* @return Возвращаем дробное значение -1.0 при отсутствии квара
native Float:plugins_get_cvar_float(const cvarname[], const argnum = 0);


Каждая натива поддерживает указание аргумента (начиная с 1), если у нас используется несколько ячеек в значении квара.

При необходимости, аргументы можно извлечь в цикле, дойдя до возврата значения -1 или -1.0

Как получить данные ?

Чтобы структурировать полученные данные внутри плагина и не превратить их в очередную кашу (как многие любят...), мы создадим enum, в котором сразу обозначим значения и размеры.

Предположим, у нас есть квары всех доступных значений (целый, дробные и строки):

Указываем инклуд
Код
#include <cvars_manager>


Создаем enum
Код
enum _:e_CvarsData
{
    CVARS_ACCES_NON_STEAM,
    CVARS_VIP_MODEL_NAME[32],
    Float:CVARS_DELAY_CHAT_TIME
};


Создаем глобальный массив для хранения данных
Код
new g_CvarsData[e_CvarsData];


Кешируем данные на уровне "plugin_cfg"

Код
public plugin_cfg()
{
    g_CvarsData[CVARS_ACCES_NON_STEAM] = plugins_get_cvar_int("vipmenu_acces_non_steam");
    plugins_get_cvar_str("vipmenu_vip_model_name_s", g_CvarsData[CVARS_VIP_MODEL_NAME]);
    g_CvarsData[CVARS_DELAY_CHAT_TIME] = plugins_get_cvar_float("vipmenu_delay_chat_time_f");
}


Как получить данные для определенной карты ?

Процесс идентичный, только нам нужно указать необходимые квары и их значения в файле:

addons\amxmodx\configs\maps\config_название_карты.ini

Пример: addons\amxmodx\configs\maps\config_de_dust.ini

По сути всё. Теперь мы можем работать с полученными данные внутри плагина.

P.S. Плагин можно легко адаптировать под разные задачи. Допустим, под работу с базой данных MySQL.

Прикрепленный файл  plugin_cvars_manager.zip ( 3,1 килобайт ) Кол-во скачиваний: 98
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 6 раз
   Цитировать сообщение
Статус пользователя wopox3
сообщение 25.5.2018, 18:57
Сообщение #2


Стаж: 11 лет

Сообщений: 333
Благодарностей: 222
Полезность: 902

Если я всё правильно понял, основная суть значения понятия CVar (Console Variable) - потеряна?
Если использовать наработку - где тут альтернатива get_pcvar ? (или хотя бы bind_pcvar_*) Он достаточно удобен в 1.8.3

Возможность указывать массивы - радует. good.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя SISA
сообщение 25.5.2018, 19:06
Сообщение #3
Стаж: 13 лет

Сообщений: 2774
Благодарностей: 2956
Полезность: 994

Цитата(wopox3 @ 25.5.2018, 20:57) *
Если я всё правильно понял, основная суть значения понятия CVar (Console Variable) - потеряна?
Если использовать наработку - где тут альтернатива get_pcvar ? (или хотя бы bind_pcvar_*) Он достаточно удобен в 1.8.3

Возможность указывать массивы - радует. good.gif


Само понятие кваров можно убрать. Назвать load_data_file.

Цитата
Если использовать наработку - где тут альтернатива get_pcvar ?


Если вы закешировали данные в массив, то по сути оно и будет get_pcvar, только с нулевой нагрузкой, ну и без возможности менять значения "на ходу".

Тут основная суть:

1. Один файл конфигурации и возможное масштабирование под базу данных например.
2. Простота добавления данных в конфиг и простота их извлечения/кеширования на уровне любого плагина.
3. Отсутствие нагрузки при работе с данными.
4. Поддержка аргументов в значениях данных.
5. Поддержка индивидуальных значений для любой карты (из коробки)

Отредактировал: SISA, - 25.5.2018, 19:27
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя GetA
сообщение 25.5.2018, 20:44
Сообщение #4
Стаж: 7 лет 7 месяцев

Сообщений: 812
Благодарностей: 189
Полезность: 123

bigdata.ckcorp.ru
Cкрытый текст
Код:
/*===============================================================================
================================================================
[Plugin Precache]
================================================================================
================================================================*/

https://lkml.org/lkml/2016/7/8/625

Код:
new Trie:g_TrieCvarsInt, Trie:g_TrieCvarsFloat, Trie:g_TrieCvarsString;

Вот у тебя прокомментирована каждая строка. А если комментировать каждую переменную? :)

Код:

new szConfigFile[128], szCfgDir[64]



Отредактировал: GetA, - 25.5.2018, 20:47
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: