Объяснение проблемы Когда вы меняете карту, сервер перезагружает плагины, и вызывается plugin_init. В этот момент вы обновляете квар через
set_pcvar_num. Однако система кваров не всегда обновляет значение мгновенно для всех частей движка. Может возникнуть задержка,
особенно при быстрой смене карт.
В результате, когда игрок подключается и для него вызывается функция get_limit_key, get_pcvar_num может вернуть старое значение из
предыдущей сессии (карты), потому что новое значение еще не "дошло" до нее.
Решение Самый надежный способ решить эту проблему — отказаться от использования квара для хранения ID сессии и вместо этого использовать
глобальную переменную. Глобальные переменные сбрасываются при каждой перезагрузке плагина (то есть при каждой смене карты), и их
значения доступны мгновенно внутри плагина.
Вот как можно изменить ваш код:
1. Объявите глобальную переменную в начале вашего скрипта:
Код
new g_map_session;
2. В `plugin_init` инициализируйте эту переменную. Вы можете оставить квар для отладки, чтобы можно было проверить значение через
консоль, но не используйте его в основной логике.
Код
public plugin_init()
{
// ... ваш остальной код ...
// Устанавливаем ID сессии в глобальную переменную
g_map_session = get_systime();
// Можно по-прежнему регистрировать и устанавливать квар для отладки,
// но основная логика больше не будет от него зависеть.
cvar_map_session = register_cvar("zp_map_session_id", "0");
set_pcvar_num(cvar_map_session, g_map_session);
// ...
}
3. Измените `
get_limit_key`, чтобы она использовала глобальную переменную:
Код
1 stock get_limit_key(id, key[], keylen)
{
new auth[64];
get_user_authid(id, auth, charsmax(auth));
// Используем глобальную переменную напрямую вместо чтения квара
// Старый код: new session = get_pcvar_num(cvar_map_session);
// 1700000000:STEAM_0:1:12345
formatex(key, keylen, "%d:%s", g_map_session, auth);
}
Почему это сработает? * Значение глобальной переменной g_map_session устанавливается в plugin_init и сразу же доступно для всех функций вашего плагина.
* Нет никакой задержки, связанной с системой кваров.
* При каждой смене карты плагин перезагружается, переменная обнуляется, а затем в plugin_init ей присваивается новое актуальное
значение get_systime().
Это простое изменение должно полностью устранить проблему с несбрасываемыми лимитами при быстрой смене карт.