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

Лвл система и выдача опыта  [Решено]

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

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

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

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Лвл система и выдача опыта

Сообщение MrBest » 28 сен 2019, 18:54

Ку рееебяяят
Наглость второе счастье )
Так что прошу еще раз помочь

Добавил выдачу опыта в вип меню
При выдаче появляется ошибка то есть
У вас 21 level [155/160] exp. И вы из вип меню взяли 10 exp
22 level[165/200] - должно получится как то так

А получается вот так
21 level [155/160] exp. Берем 10 exp
21 level [165/160] - и вот получается вот это
Помогите пж исправить
Еще если не сложна помогите вывести уровень и exp в худ жизни/класс/аммо



Исходник левел системы
Код: Выделить всё
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <nvault>
#include <sqlx>

#define is_user_valid(%1) (1 <= %1 <= g_iMaxPlayers)

#define linux_diff_player 5
#define m_LastHitGroup 75
#define MsgId_SayText 76

#define PLAYERS_PER_PAGE 8

#define TASK_GIVEEXP 601000
#define TASK_INFORMER 602000

#define CVAR_SAVE_TYPE 0
#define CVAR_MODE_TYPE 1
#define CVAR_INFO_COLOR_R 2
#define CVAR_INFO_COLOR_G 3
#define CVAR_INFO_COLOR_B 4
#define CVAR_MODE_DAMAGE 5
#define CVAR_TIME_EXP 6
#define CVAR_DAMAGE_EXP 7
#define CVAR_KILLED_HEAD_EXP 8
#define CVAR_KILLED_KNIFE_EXP 9
#define CVAR_KILLED_EXP 10
#define CVAR_ADMIN_TIME_EXP 11
#define CVAR_ADMIN_DAMAGE_EXP 12
#define CVAR_ADMIN_KILLED_HEAD_EXP 13
#define CVAR_ADMIN_KILLED_KNIFE_EXP 14
#define CVAR_ADMIN_KILLED_EXP 15
#define CVAR_PLAYER_TYPE 16
#define CVAR_INFORMER 17
#define CVAR_INFORMER_TARGET 18
#define CVAR_INFO_TARGET_COLOR_R 19
#define CVAR_INFO_TARGET_COLOR_G 20
#define CVAR_INFO_TARGET_COLOR_B 21

#define CVAR_INFO_COORD_X 0
#define CVAR_INFO_COORD_Y 1
#define CVAR_MODE_TIME 2
#define CVAR_INFO_TARGET_COORD_X 3
#define CVAR_INFO_TARGET_COORD_Y 4

#define CVAR_MYSQL_HOST 0
#define CVAR_MYSQL_BD 1
#define CVAR_MYSQL_USER 2
#define CVAR_MYSQL_PASS 3
#define CVAR_MENU_FLAGS 4
#define CVAR_ADMIN_FLAGS 5
#define CVAR_INFO_COLOR 6
#define CVAR_INFO_TRAGET_COLOR 7

new Float:g_szFactor[7] = { 0.0, 0.1, 0.3, 0.5, 0.7, 0.9, 1.0 };

new g_iMaxPlayers, g_iSyncStatusText, g_iSyncInformer, g_iUserLoadingLevel[33], g_iUserLevel[33], g_iUserExp[33], g_iUserDamage[33], g_iNumCvar[22], 
g_iStringCvar
[8][32], Float:g_iFloatCvar[5], g_iUserAdminMenu[33], g_iUserNum[33], g_iMenuTarget[33];

new g_iMenuPlayers[33][32], g_iMenuPosition[33];

new g_PlayerSumLine, g_iMaxLevels, Handle:g_SQL_Connection, 
Handle
:g_SQL_Tuple, g_Vault;

new const g_iMenuStatus[5][64] = 
{
    "",
    "ILS_MENU_STATUS_1",
    "ILS_MENU_STATUS_2",
    "ILS_MENU_STATUS_3",
    "ILS_MENU_STATUS_4"
}

new const g_iGiveStatus[5][64] = 
{
    "",
    "ILS_MENU_GIVE_STATUS_1",
    "ILS_MENU_GIVE_STATUS_2",
    "ILS_MENU_GIVE_STATUS_3",
    "ILS_MENU_GIVE_STATUS_4"
}

new Array:g_aDataInfoPlayer, Array:g_aDataMaxLevels, g_iMaxExp;

enum _:DATA_PLAYER_INFO
{
    LANG_PLAYERAUTCH[32],
    MODE_PLAYEREXP
};

public plugin_precache()
{
    new szCfgDir[64], szCfgFile[128];
    get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
    formatex(szCfgFile, charsmax(szCfgFile), "%s/IdealLevelSystem.ini", szCfgDir);
    switch(file_exists(szCfgFile))
    {
        case 0: log_to_file("%s/log_error.log", "File ^"%s^" not found!", szCfgDir, szCfgFile);
        case 1: ils_levels_read_file(szCfgFile);
    }
    formatex(szCfgFile, charsmax(szCfgFile), "%s/ILS_MaxLevels.ini", szCfgDir);
    switch(file_exists(szCfgFile))
    {
        case 0: log_to_file("%s/log_error.log", "File ^"%s^" not found!", szCfgDir, szCfgFile);
        case 1: ils_maxlevels_read_file(szCfgFile);
    }
}

public plugin_init()
{
    register_plugin ("Ideal Level System FINAL", "1.3", "Freeman4iK");
    register_dictionary("ideal_level_system.txt");
    RegisterHam(Ham_Killed, "player", "Ham_PlayerKilled_Post", true);
    RegisterHam(Ham_TraceAttack, "player", "Ham_TraceAttack_Player", false);
    register_event("StatusValue", "Event_StatusValueHide", "be", "1=1", "2=0");
    register_event("StatusValue", "Event_StatusValueShow", "be", "1=2", "2!0");
    register_clcmd("ils_give", "ClCmd_GiveNum");
    register_clcmd("ils_admin_give", "Show_GiveAdminMenu");
    register_menucmd(register_menuid("Show_GiveAdminMenu"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9), "Handle_GiveAdminMenu");
    register_menucmd(register_menuid("Show_NumGiveAdminMenu"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9), "Handle_NumGiveAdminMenu");
    register_menucmd(register_menuid("Show_PlayerGive"), (1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7|1<<8|1<<9), "Handle_PlayerGive");
    cvars_init();
    g_iMaxPlayers = get_maxplayers();
    g_iSyncInformer = CreateHudSyncObj();
    g_iSyncStatusText = CreateHudSyncObj();
}

public plugin_natives()
{
    register_native("ils_get_user_level", "native_get_user_level", 1);
    register_native("ils_set_user_level", "native_set_user_level", 1);
    register_native("ils_get_user_exp", "native_get_user_exp", 1);
    register_native("ils_set_user_exp", "native_set_user_exp", 1);
    register_native("ils_get_user_maxexp", "naive_get_user_maxexp", 1);
}

public plugin_cfg()
{
    new szCfgDir[64];
    get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
    server_cmd("exec %s/IdealLevelSystem.cfg", szCfgDir);
    set_task(0.1, "get_cvars");
    set_task(1.0, "loading_bd");
}

public plugin_end()
{
    if(g_iNumCvar[CVAR_SAVE_TYPE] == 2)
    {
        if(g_SQL_Tuple) SQL_FreeHandle(g_SQL_Tuple);
        if(g_SQL_Connection) SQL_FreeHandle(g_SQL_Connection);
    }
    else if(g_iNumCvar[CVAR_SAVE_TYPE] == 3) nvault_close(g_Vault);
}

public client_disconnect(id)
{
    if(task_exists(id + TASK_INFORMER)) remove_task(id + TASK_INFORMER);
    if(task_exists(id + TASK_GIVEEXP)) remove_task(id + TASK_GIVEEXP);
    g_iUserAdminMenu[id] = 0;
    g_iUserNum[id] = 0;
    g_iUserDamage[id] = 0;
    Save_Levels(id);
}

public client_putinserver(id)
{
    if(g_iNumCvar[CVAR_INFORMER]) set_task(1.0, "Task_Informer", id + TASK_INFORMER, _, _, "b");
    if(g_iNumCvar[CVAR_MODE_TYPE] == 2) set_task(g_iFloatCvar[CVAR_MODE_TIME], "Task_GiveExp", id + TASK_GIVEEXP, _, _, "b");
    Loading_Level(id);
}

public ils_levels_read_file(szCfgFile[])
{
    new aDataPlayerInfo[DATA_PLAYER_INFO];
    g_aDataInfoPlayer = ArrayCreate(DATA_PLAYER_INFO);
    new szBuffer[128], iLine, iLen, szParse[2][32];
    while(read_file(szCfgFile, iLine++, szBuffer, charsmax(szBuffer), iLen))
    {
        if(!iLen || szBuffer[0] == ';') continue;
        parse(szBuffer, szParse[0], charsmax(szParse[]), szParse[1], charsmax(szParse[]));
        copy(aDataPlayerInfo[LANG_PLAYERAUTCH], charsmax(aDataPlayerInfo[LANG_PLAYERAUTCH]), szParse[0]);
        aDataPlayerInfo[MODE_PLAYEREXP] = str_to_num(szParse[1]);
        ArrayPushArray(g_aDataInfoPlayer, aDataPlayerInfo);
        g_PlayerSumLine++;
    }
}

public ils_maxlevels_read_file(szCfgFile[])
{
    g_aDataMaxLevels = ArrayCreate(32);
    ArrayPushCell(g_aDataMaxLevels, 0);
    new szBuffer[128], szMaxExp[8], iLine, iLen, aDataExp;
    while(read_file(szCfgFile, iLine++, szBuffer, charsmax(szBuffer), iLen))
    {
        if(!iLen || szBuffer[0] == ';') continue;
        parse(szBuffer, szMaxExp, charsmax(szMaxExp));
        if(is_str_num(szMaxExp))
        {
            g_iMaxLevels++;
            aDataExp = str_to_num(szMaxExp);
            ArrayPushCell(g_aDataMaxLevels, aDataExp);
        }
    }
    g_iMaxExp = ArrayGetCell(g_aDataMaxLevels, g_iMaxLevels);
}

public cvars_init()
{
    register_cvar("ils_save_type", "1"); // Тип сохранения данных (0 - не сохранять |1 - в файле IdealLevelSystem.ini | 2 - Через MySql | 3 - Через nVault)
    register_cvar("ils_mode_type", "1"); // Тип выдачи Опыта (1 - за убийство игрока | 2 - за время игры | 3 - за нанесенный урон)
    register_cvar("ils_player_type", "1"); // Тип данных игрока (1 - Сохранять по нику игрока | 2 - Сохранять по SteamId игрока)
    register_cvar("ils_informer", "1"); // Показывать ли информер уровня и опыта игрока? (0 - не показывать | 1 - показывать)
    register_cvar("ils_info_color", "0, 255, 0"); // Цвет информера в формате RGB
    register_cvar("ils_info_coord_x", "0.02"); // Координаты X информера (уровня и опыта)
    register_cvar("ils_info_coord_y", "0.9"); // Координаты Y информера (уровня и опыта)
    register_cvar("ils_informer_target", "1"); // Показывать ли информер уровня и опыта при наводке прицела на игрока? (0 - не показывать | 1 - показывать)
    register_cvar("ils_info_target_color", "0, 0, 255"); // Цвет информера в формате RGB (при наводке прицела на игрока)
    register_cvar("ils_info_target_coord_x", "-1.0"); // Координаты X информера (при наводке прицела на игрока)
    register_cvar("ils_info_target_coord_y", "0.8"); // Координаты Y информера (при наводке прицела на игрока)
    register_cvar("ils_give_time", "60.0"); // Через какое время выдавать очко опыта(в секундах) при ils_mode_type = 2
    register_cvar("ils_give_damage", "150"); // За какой нанесенный урон выдавать очко опыта при ils_mode_type = 3
    register_cvar("ils_mysql_host", "localhost"); // Хост базы данных
    register_cvar("ils_mysql_bd", "bd"); // Имя базы данных
    register_cvar("ils_mysql_user", "User"); // Имя пользователя
    register_cvar("ils_mysql_password", "Password"); // Пароль пользователя
    register_cvar("ils_menu_flags", "l"); // Флаг доступа для открытия меню выдачи опыта и уровня
    register_cvar("ils_admin_flags", "d"); // Флаг админа для множетеля получения опыта
    register_cvar("ils_time_exp", "1"); // Сколько давать Exp за время игры которое указано в кваре ils_give_time(работает при ils_mode_type = 2)
    register_cvar("ils_damage_exp", "1"); // Сколько давать Exp за нанисение урона который указан в кваре ils_give_damage (работает при ils_mode_type = 3)
    register_cvar("ils_killed_exp", "1"); // Сколько давать Exp за убийство игрока (работает при ils_mode_type = 1)
    register_cvar("ils_killed_head_exp", "2"); // Сколько давать Exp за убийство в голову (работает при ils_mode_type = 1)
    register_cvar("ils_killed_knife_exp", "3"); // Сколько давать Exp за убийство игрока с ножа (работает при ils_mode_type = 1)
    register_cvar("ils_admin_time_exp", "1"); // Сколько давать админу Exp за время игры которое указано в кваре ils_give_time(работает при ils_mode_type = 2)
    register_cvar("ils_admin_damage_exp", "1"); // Сколько давать админу Exp за нанисение урона который указан в кваре ils_give_damage (работает при ils_mode_type = 3)
    register_cvar("ils_admin_killed_head_exp", "2"); // Сколько давать админу Exp за убийство в голову (работает при ils_mode_type = 1)
    register_cvar("ils_admin_killed_knife_exp", "3"); // Сколько давать админу Exp за убийство игрока с ножа (работает при ils_mode_type = 1)
    register_cvar("ils_admin_killed_exp", "1"); // Сколько давать админу Exp за убийство игрока (работает при ils_mode_type = 1)
}

public get_cvars()
{
    g_iNumCvar[CVAR_SAVE_TYPE] = get_cvar_num("ils_save_type");
    g_iNumCvar[CVAR_MODE_TYPE] = get_cvar_num("ils_mode_type");
    g_iNumCvar[CVAR_PLAYER_TYPE] = get_cvar_num("ils_player_type");
    g_iNumCvar[CVAR_INFORMER] = get_cvar_num("ils_informer");
    g_iNumCvar[CVAR_MODE_DAMAGE] = get_cvar_num("ils_give_damage");
    g_iNumCvar[CVAR_INFORMER_TARGET] = get_cvar_num("ils_informer_target");
    g_iNumCvar[CVAR_TIME_EXP] = get_cvar_num("ils_time_exp");
    g_iNumCvar[CVAR_DAMAGE_EXP] = get_cvar_num("ils_damage_exp");
    g_iNumCvar[CVAR_KILLED_HEAD_EXP] = get_cvar_num("ils_killed_head_exp");
    g_iNumCvar[CVAR_KILLED_KNIFE_EXP] = get_cvar_num("ils_killed_knife_exp");
    g_iNumCvar[CVAR_KILLED_EXP] = get_cvar_num("ils_killed_exp");
    g_iNumCvar[CVAR_ADMIN_TIME_EXP] = get_cvar_num("ils_admin_time_exp");
    g_iNumCvar[CVAR_ADMIN_DAMAGE_EXP] = get_cvar_num("ils_admin_damage_exp");
    g_iNumCvar[CVAR_ADMIN_KILLED_HEAD_EXP] = get_cvar_num("ils_admin_killed_head_exp");
    g_iNumCvar[CVAR_ADMIN_KILLED_KNIFE_EXP] = get_cvar_num("ils_admin_killed_knife_exp");
    g_iNumCvar[CVAR_ADMIN_KILLED_EXP] = get_cvar_num("ils_admin_killed_exp");
    g_iFloatCvar[CVAR_INFO_COORD_X] = get_cvar_float("ils_info_coord_x");
    g_iFloatCvar[CVAR_INFO_COORD_Y] = get_cvar_float("ils_info_coord_y");
    g_iFloatCvar[CVAR_INFO_TARGET_COORD_X] = get_cvar_float("ils_info_target_coord_x");
    g_iFloatCvar[CVAR_INFO_TARGET_COORD_Y] = get_cvar_float("ils_info_target_coord_y");
    g_iFloatCvar[CVAR_MODE_TIME] = get_cvar_float("ils_give_time");
    get_cvar_string("ils_mysql_host", g_iStringCvar[CVAR_MYSQL_HOST], charsmax(g_iStringCvar[]));
    get_cvar_string("ils_mysql_bd", g_iStringCvar[CVAR_MYSQL_BD], charsmax(g_iStringCvar[]));
    get_cvar_string("ils_mysql_user", g_iStringCvar[CVAR_MYSQL_USER], charsmax(g_iStringCvar[]));
    get_cvar_string("ils_mysql_password", g_iStringCvar[CVAR_MYSQL_PASS], charsmax(g_iStringCvar[]));
    get_cvar_string("ils_menu_flags", g_iStringCvar[CVAR_MENU_FLAGS], charsmax(g_iStringCvar[]));
    get_cvar_string("ils_admin_flags", g_iStringCvar[CVAR_ADMIN_FLAGS], charsmax(g_iStringCvar[]));
    get_cvar_string("ils_info_color", g_iStringCvar[CVAR_INFO_COLOR], charsmax(g_iStringCvar[]));
    get_cvar_string("ils_info_target_color", g_iStringCvar[CVAR_INFO_TRAGET_COLOR], charsmax(g_iStringCvar[]));
    GetColorInformer(g_iNumCvar[CVAR_INFO_COLOR_R], g_iNumCvar[CVAR_INFO_COLOR_G], g_iNumCvar[CVAR_INFO_COLOR_B], true);
    GetColorInformer(g_iNumCvar[CVAR_INFO_TARGET_COLOR_R], g_iNumCvar[CVAR_INFO_TARGET_COLOR_G], g_iNumCvar[CVAR_INFO_TARGET_COLOR_B], false);
}

public loading_bd()
{
    if(g_iNumCvar[CVAR_SAVE_TYPE] == 2)
    {
        new iErr, szEror[256];
        g_SQL_Tuple = SQL_MakeDbTuple(g_iStringCvar[CVAR_MYSQL_HOST], g_iStringCvar[CVAR_MYSQL_USER], g_iStringCvar[CVAR_MYSQL_PASS], g_iStringCvar[CVAR_MYSQL_BD]);
        g_SQL_Connection = SQL_Connect(g_SQL_Tuple, iErr, szEror, charsmax(szEror));
        if(g_SQL_Connection)
        {
            log_amx("[Ideal Level System] Conected to DataBase: OK");
            SQL_QueryAndIgnore(g_SQL_Connection, "CREATE TABLE IF NOT EXISTS `ils_levels` (`id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL DEFAULT '0',`exp` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`)) DEFAULT CHARSET=utf8");
        }
        else log_amx("[Ideal Level System] Conected to DataBase: ERROR %d (%s)", iErr, szEror);
    }
    else if(g_iNumCvar[CVAR_SAVE_TYPE] == 3) g_Vault = nvault_open("ils_levels");
}

public GetColorInformer(&iRed, &iGreen, &iBlue, bool:iMode)
{
    new szRed[5], szGreen[5], szBlue[5];
    if(iMode) parse(g_iStringCvar[CVAR_INFO_COLOR], szRed, charsmax(szRed), szGreen, charsmax(szGreen), szBlue, charsmax(szBlue));
    else parse(g_iStringCvar[CVAR_INFO_TRAGET_COLOR], szRed, charsmax(szRed), szGreen, charsmax(szGreen), szBlue, charsmax(szBlue));

    iRed = str_to_num(szRed);
    iGreen = str_to_num(szGreen);
    iBlue = str_to_num(szBlue);
}

public Ham_PlayerKilled_Post(iVictim, iKiller)
{
    if(!is_user_valid(iKiller) || !is_user_connected(iKiller) || !is_user_connected(iVictim) || iKiller == iVictim || 
    g_iUserExp
[iKiller] >= g_iMaxExp || g_iNumCvar[CVAR_MODE_TYPE] != 1) return HAM_IGNORED;
    {
        if(get_user_weapon(iKiller) == CSW_KNIFE)
        {
            if(CheckFlag(iKiller, CVAR_ADMIN_FLAGS)) g_iUserExp[iKiller] += g_iNumCvar[CVAR_ADMIN_KILLED_KNIFE_EXP];
            else g_iUserExp[iKiller] += g_iNumCvar[CVAR_KILLED_KNIFE_EXP];
        }
        else if(get_pdata_int(iVictim, m_LastHitGroup, linux_diff_player) == HIT_HEAD)
        {
            if(CheckFlag(iKiller, CVAR_ADMIN_FLAGS)) g_iUserExp[iKiller] += g_iNumCvar[CVAR_ADMIN_KILLED_HEAD_EXP];
            else g_iUserExp[iKiller] += g_iNumCvar[CVAR_KILLED_HEAD_EXP];
        }
        else
        
{
            if(CheckFlag(iKiller, CVAR_ADMIN_FLAGS)) g_iUserExp[iKiller] += g_iNumCvar[CVAR_ADMIN_KILLED_EXP];
            else g_iUserExp[iKiller] += g_iNumCvar[CVAR_KILLED_EXP];
        }
        if(g_iUserExp[iKiller] > g_iMaxExp) g_iUserExp[iKiller] = g_iMaxExp;
        while(g_iUserExp[iKiller] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[iKiller]) && g_iUserLevel[iKiller] < g_iMaxLevels) g_iUserLevel[iKiller] += 1;
    }
    return HAM_IGNORED;
}

public Ham_TraceAttack_Player(iVictim, iAttacker, Float:fDamage, Float:fDeriction[3], iTraceHandle, iBitDamage)
{
    if(!is_user_connected(iAttacker) || iAttacker == iVictim || g_iNumCvar[CVAR_MODE_TYPE] != 3 || g_iUserExp[iAttacker] >= g_iMaxExp) return HAM_IGNORED;
    g_iUserDamage[iAttacker] += floatround(fDamage);
    while(g_iUserDamage[iAttacker] >= g_iNumCvar[CVAR_MODE_DAMAGE])
    {
        if(CheckFlag(iAttacker, CVAR_ADMIN_FLAGS)) g_iUserExp[iAttacker] += g_iNumCvar[CVAR_ADMIN_DAMAGE_EXP];
        else g_iUserExp[iAttacker] += g_iNumCvar[CVAR_DAMAGE_EXP];
        g_iUserDamage[iAttacker] -= g_iNumCvar[CVAR_MODE_DAMAGE];
    }
    if(g_iUserExp[iAttacker] > g_iMaxExp) g_iUserExp[iAttacker] = g_iMaxExp;
    while(g_iUserExp[iAttacker] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[iAttacker]) && g_iUserLevel[iAttacker] <= g_iMaxLevels) g_iUserLevel[iAttacker] += 1;
    return HAM_IGNORED;
}

public Task_Informer(id)
{
    id -= TASK_INFORMER;
    set_hudmessage(g_iNumCvar[CVAR_INFO_COLOR_R], g_iNumCvar[CVAR_INFO_COLOR_G], g_iNumCvar[CVAR_INFO_COLOR_B], g_iFloatCvar[CVAR_INFO_COORD_X], 
    g_iFloatCvar
[CVAR_INFO_COORD_Y], 0, 0.1, 1.0, 0.02, 0.02, -1);
    ShowSyncHudMsg(id, g_iSyncInformer, "%L", id, "ILS_INFORMER", g_iUserLevel[id], g_iUserExp[id], ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[id]));
}

public Event_StatusValueHide(id) ClearSyncHud(id, g_iSyncStatusText);
public Event_StatusValueShow(id)
{
    if(g_iNumCvar[CVAR_INFORMER_TARGET])
    {
        new iTarget = read_data(2), szName[32];
        get_user_name(iTarget, szName, charsmax(szName));
        set_hudmessage(g_iNumCvar[CVAR_INFO_TARGET_COLOR_R], g_iNumCvar[CVAR_INFO_TARGET_COLOR_G], g_iNumCvar[CVAR_INFO_TARGET_COLOR_B], 
        g_iFloatCvar
[CVAR_INFO_TARGET_COORD_X], g_iFloatCvar[CVAR_INFO_TARGET_COORD_Y], 0, 0.0, 10.0, 0.0, 0.0, -1);
        ShowSyncHudMsg(id, g_iSyncStatusText, "%L", id, "ILS_HUD_STATUS_TEXT", szName, g_iUserLevel[iTarget], g_iUserExp[iTarget], 
        ArrayGetCell
(g_aDataMaxLevels, g_iUserLevel[iTarget]));
    }
}

public Task_GiveExp(id)
{
    id -= TASK_GIVEEXP;
    if(is_user_connected(id))
    {
        if(g_iUserExp[id] < g_iMaxExp)
        {
            if(CheckFlag(id, CVAR_ADMIN_FLAGS)) g_iUserExp[id] += g_iNumCvar[CVAR_ADMIN_TIME_EXP];
            else g_iUserExp[id] += g_iNumCvar[CVAR_TIME_EXP];
            if(g_iUserExp[id] > g_iMaxExp) g_iUserExp[id] = g_iMaxExp;
            while(g_iUserExp[id] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[id]) && g_iUserLevel[id] < g_iMaxLevels) g_iUserLevel[id] += 1;
        }
    }
}

public ClCmd_GiveNum(id, iTarget, iNum)
{
    if(!CheckFlag(id, CVAR_MENU_FLAGS)) return PLUGIN_HANDLED;
    if(!iTarget)
    {
        new szArg1[5], szArg2[5];
        read_argv(1, szArg1, charsmax(szArg1));
        read_argv(2, szArg2, charsmax(szArg2));
        if(!is_str_num(szArg1) || !is_str_num(szArg2))
        {
            UTIL_SayText(id, "%L", id, "ILS_CHAT_ADMIN_EROR");
            return PLUGIN_HANDLED;
        }
        iTarget = str_to_num(szArg1);
        iNum = str_to_num(szArg2);
    }
    if(iNum <= 0 || !is_user_connected(iTarget))
    {
        UTIL_SayText(id, "%L", id, "ILS_CHAT_ADMIN_EROR");
        return PLUGIN_HANDLED;
    }
    new szName[32], szTargetName[32];
    get_user_name(id, szName, charsmax(szName));
    get_user_name(iTarget, szTargetName, charsmax(szTargetName));
    switch(g_iUserAdminMenu[id])
    {
        case 1:
        {
            if(g_iUserExp[iTarget] + iNum > g_iMaxExp)
            {
                UTIL_SayText(id, "%L", id, "ILS_CHAT_ADMIN_EROR");
                return Show_PlayerGive(id, g_iMenuPosition[id]);
            }
            else
            
{
                UTIL_SayText(0, "%L", LANG_PLAYER, "ILS_CHAT_GIVE_EXP", szName, szTargetName, iNum);
                g_iUserExp[iTarget] += iNum;
                while(g_iUserExp[iTarget] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[iTarget]) && g_iUserLevel[iTarget] < g_iMaxLevels) g_iUserLevel[iTarget] += 1;
            }
        }
        case 2:
        {
            if(g_iUserExp[iTarget] - iNum < 0)
            {
                UTIL_SayText(id, "%L", id, "ILS_CHAT_ADMIN_EROR");
                return Show_PlayerGive(id, g_iMenuPosition[id]);
            }
            else
            
{
                UTIL_SayText(0, "%L", LANG_PLAYER, "ILS_CHAT_SELECT_EXP", szName, szTargetName, iNum);
                g_iUserExp[iTarget] -= iNum;
                while(g_iUserExp[iTarget] < ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[iTarget] - 1) && g_iUserLevel[iTarget] != 0) g_iUserLevel[iTarget] -= 1;
            }
        }
        case 3:
        {
            if(g_iUserLevel[iTarget] + iNum > g_iMaxLevels)
            {
                UTIL_SayText(id, "%L", id, "ILS_CHAT_ADMIN_EROR");
                return Show_PlayerGive(id, g_iMenuPosition[id]);
            }
            else
            
{
                UTIL_SayText(0, "%L", LANG_PLAYER, "ILS_CHAT_GIVE_LEVEL", szName, szTargetName, iNum);
                g_iUserLevel[iTarget] += iNum;
                while(g_iUserExp[iTarget] < ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[iTarget] - 1)) g_iUserExp[iTarget] += 1;
                while(g_iUserExp[iTarget] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[iTarget]) && g_iUserLevel[iTarget] < g_iMaxLevels) g_iUserLevel[iTarget] += 1;
            }
        }
        case 4:
        {
            new iSum = g_iUserLevel[iTarget] - iNum;
            if(iSum < 0)
            {
                UTIL_SayText(id, "%L", id, "ILS_CHAT_ADMIN_EROR");
                return Show_PlayerGive(id, g_iMenuPosition[id]);
            }
            else
            
{
                if(!iSum) iNum -= 1;
                UTIL_SayText(0, "%L", LANG_PLAYER, "ILS_CHAT_SELECT_LEVEL", szName, szTargetName, iNum);
                g_iUserLevel[iTarget] -= iNum;
                while(g_iUserExp[iTarget] > ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[iTarget] - 1)) g_iUserExp[iTarget] -= 1;
                while(g_iUserExp[iTarget] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[iTarget]) && g_iUserLevel[iTarget] < g_iMaxLevels) g_iUserLevel[iTarget] += 1;
            }
        }
    }
    return PLUGIN_HANDLED;
}

public Show_GiveAdminMenu(id)
{
    if(!CheckFlag(id, CVAR_MENU_FLAGS)) return PLUGIN_HANDLED;
    new szMenu[512], iLen = formatex(szMenu, charsmax(szMenu), "\y%L^n^n", id, "ILS_MENU_TITLE");
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w%L^n", id, "ILS_MENU_SLOT_1", id, "ILS_MENU_GIVE_EXP");
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w%L^n", id, "ILS_MENU_SLOT_2", id, "ILS_MENU_SELECT_EXP");
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w%L^n", id, "ILS_MENU_SLOT_3", id, "ILS_MENU_GIVE_LEVEL");
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w%L^n", id, "ILS_MENU_SLOT_4",  id, "ILS_MENU_SELECT_LEVEL");
    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\y[\r0\y] \w%L", id, "ILS_MENU_EXIT");
    return show_menu(id, ((1<<0|1<<1|1<<2|1<<3|1<<9)), szMenu, -1, "Show_GiveAdminMenu");
}

public Handle_GiveAdminMenu(id, iKey)
{
    if(!CheckFlag(id, CVAR_MENU_FLAGS)) return PLUGIN_HANDLED;
    if(iKey != 9)
    {
        g_iUserAdminMenu[id] = iKey + 1;
        Show_PlayerGive(id, g_iMenuPosition[id] = 0);
    }
    return PLUGIN_HANDLED;
}

public Show_PlayerGive(id, iPos)
{
    if(iPos < 0 || !CheckFlag(id, CVAR_MENU_FLAGS)) return PLUGIN_HANDLED;
    new iPlayersNum;
    for(new i = 1; i <= g_iMaxPlayers; i++)
    {
        if(!is_user_connected(i)) continue;
        g_iMenuPlayers[id][iPlayersNum++] = i;
    }
    new iStart = iPos * PLAYERS_PER_PAGE;
    if(iStart > iPlayersNum) iStart = iPlayersNum;
    iStart = iStart - (iStart % 8);
    g_iMenuPosition[id] = iStart / PLAYERS_PER_PAGE;
    new iEnd = iStart + PLAYERS_PER_PAGE;
    if(iEnd > iPlayersNum) iEnd = iPlayersNum;
    new szMenu[512], iLen, iPagesNum = (iPlayersNum / PLAYERS_PER_PAGE + ((iPlayersNum % PLAYERS_PER_PAGE) ? 1 : 0));
    switch(iPagesNum)
    {
        case 0:
        {
            UTIL_SayText(id, "%L", id, "ILS_CHAT_ID_PLAYERS_NOT_VALID");
            return Show_GiveAdminMenu(id);
        }
        default: iLen = formatex(szMenu, charsmax(szMenu), "\y%L \w[%d|%d]^n^n", id, g_iMenuStatus[g_iUserAdminMenu[id]], iPos + 1, iPagesNum);
    }
    new szName[32], i, iKeys = (1<<9), b;
    for(new a = iStart; a < iEnd; a++)
    {
        i = g_iMenuPlayers[id][a];
        get_user_name(i, szName, charsmax(szName));
        iKeys |= (1<<b);
        iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%L \w%s \r[%d]^n", id, "ILS_MENU_SLOT_D", ++b, szName, g_iUserAdminMenu[id] <= 2 ? g_iUserExp[i] : g_iUserLevel[i]);
    }
    for(new i = b; i < PLAYERS_PER_PAGE; i++) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n");
    if(iEnd < iPlayersNum)
    {
        iKeys |= (1<<8);
        formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n%L \w%L^n%L \w%L", id, "ILS_MENU_SLOT_0", id, "ILS_MENU_NEXT", id, "ILS_MENU_SLOT_9",
        id, iPos ? "ILS_MENU_BACK" : "ILS_MENU_EXIT");
    }
    else formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n^n%L \w%L", id, "ILS_MENU_SLOT_0", id, iPos ? "ILS_MENU_BACK" : "ILS_MENU_EXIT");
    return show_menu(id, iKeys, szMenu, -1, "Show_PlayerGive");
}

public Handle_PlayerGive(id, iKey)
{
    if(!CheckFlag(id, CVAR_MENU_FLAGS)) return PLUGIN_HANDLED;
    switch(iKey)
    {
        case 8: return Show_PlayerGive(id, ++g_iMenuPosition[id]);
        case 9: return Show_PlayerGive(id, --g_iMenuPosition[id]);
        default:
        {
            new iTarget = g_iMenuPlayers[id][g_iMenuPosition[id] * PLAYERS_PER_PAGE + iKey];
            if(!is_user_connected(iTarget)) return Show_PlayerGive(id, g_iMenuPosition[id]);
            g_iMenuTarget[id] = iTarget;
            return Show_NumGiveAdminMenu(id);
        }
    }
    return Show_PlayerGive(id, g_iMenuPosition[id]);
}

public Show_NumGiveAdminMenu(id)
{
    if(!CheckFlag(id, CVAR_MENU_FLAGS)) return PLUGIN_HANDLED;
    if(!g_iMenuTarget[id]) return Show_PlayerGive(id, g_iMenuPosition[id]);
    new szMenu[512], szBuffer[32], iKeys = (1<<6|1<<9), iKey,
    iLen = formatex(szMenu, charsmax(szMenu), "\y%L^n^n", id, g_iGiveStatus[g_iUserAdminMenu[id]]), iCheck;
    for(new i = 1; i < 7; i++)
    {
        iKey = i - 1;
        formatex(szBuffer, charsmax(szBuffer), "ILS_MENU_SLOT_%d", i);
        switch(g_iUserAdminMenu[id])
        {
            case 1:
            {
                iCheck = floatround((g_iMaxExp - g_iUserExp[g_iMenuTarget[id]]) * g_szFactor[i]);
                if(iCheck < i) iCheck = i;
                if(iCheck + g_iUserExp[g_iMenuTarget[id]] <= g_iMaxExp)
                {
                    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w%d^n", id, szBuffer, iCheck);
                    iKeys |= (1<<iKey);
                }
                else if(== 1) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w0^n", id, szBuffer);
                else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n");
            }
            case 2:
            {
                iCheck = floatround(g_iUserExp[g_iMenuTarget[id]] * g_szFactor[i]);
                if(iCheck < i) iCheck = i;
                if(g_iUserExp[g_iMenuTarget[id]] - iCheck >= 0)
                {
                    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w%d^n", id, szBuffer, iCheck);
                    iKeys |= (1<<iKey);
                }
                else if(== 1) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w0^n", id, szBuffer);
                else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n");
            }
            case 3:
            {
                iCheck = floatround((g_iMaxLevels - g_iUserLevel[g_iMenuTarget[id]]) * g_szFactor[i]);
                if(iCheck < i) iCheck = i;
                if(g_iUserLevel[g_iMenuTarget[id]] + iCheck <= g_iMaxLevels)
                {
                    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w%d^n", id, szBuffer, iCheck);
                    iKeys |= (1<<iKey);
                }
                else if(== 1) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w0^n", id, szBuffer);
                else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n");
            }
            case 4:
            {
                iCheck = floatround((g_iUserLevel[g_iMenuTarget[id]] - 1) * g_szFactor[i]);
                if(iCheck < i) iCheck = i;
                if(g_iUserLevel[g_iMenuTarget[id]] - iCheck > 0)
                {
                    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w%d^n", id, szBuffer, iCheck);
                    iKeys |= (1<<iKey);
                }
                else if(== 1) iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \w0^n", id, szBuffer);
                else iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n");
            }
        }
    }
    iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "%L \y%L^n^n^n", id, "ILS_MENU_SLOT_7", id, "ILS_MENU_OTHER");
    formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n%L \w%L", id, "ILS_MENU_SLOT_0", id, "ILS_MENU_EXIT");
    return show_menu(id, iKeys, szMenu, -1, "Show_NumGiveAdminMenu");
}

public Handle_NumGiveAdminMenu(id, iKey)
{
    if(!CheckFlag(id, CVAR_MENU_FLAGS)) return PLUGIN_HANDLED;
    if(!g_iMenuTarget[id]) return Show_PlayerGive(id, g_iMenuPosition[id] = 0);
    new iCheck;
    switch(iKey)
    {
        case 5:
        {
            switch(g_iUserAdminMenu[id])
            {
                case 1: iCheck = g_iMaxExp - g_iUserExp[g_iMenuTarget[id]];
                case 2: iCheck = g_iUserExp[g_iMenuTarget[id]];
                case 3: iCheck = g_iMaxLevels - g_iUserLevel[g_iMenuTarget[id]];
                case 4: iCheck = g_iUserLevel[g_iMenuTarget[id]] - 1;
            }
        }
        case 6:
        {
            client_cmd(id, "messagemode ^"ils_give %d^"", g_iMenuTarget[id]);
            return PLUGIN_HANDLED;
        }
        case 9: return PLUGIN_HANDLED;
    }
    if(iKey != 5)
    {
        switch(g_iUserAdminMenu[id])
        {
            case 1:
            {
                iCheck = floatround((g_iMaxExp - g_iUserExp[g_iMenuTarget[id]]) * g_szFactor[iKey+1]);
                if(iCheck < iKey+1) iCheck = iKey+1;
                if(iCheck + g_iUserExp[g_iMenuTarget[id]] > g_iMaxExp) return PLUGIN_HANDLED;
            }
            case 2:
            {
                iCheck = floatround(g_iUserExp[g_iMenuTarget[id]] * g_szFactor[iKey+1]);
                if(iCheck < iKey+1) iCheck = iKey+1;
                if(g_iUserExp[g_iMenuTarget[id]] - iCheck < 0) return PLUGIN_HANDLED;
            }
            case 3:
            {
                iCheck = floatround((g_iMaxLevels - g_iUserLevel[g_iMenuTarget[id]]) * g_szFactor[iKey+1]);
                if(iCheck < iKey+1) iCheck = iKey+1;
                if(g_iUserLevel[g_iMenuTarget[id]] + iCheck > g_iMaxLevels) return PLUGIN_HANDLED;
            }
            case 4:
            {
                iCheck = floatround((g_iUserLevel[g_iMenuTarget[id]] - 1) * g_szFactor[iKey+1]);
                if(iCheck < iKey+1) iCheck = iKey+1;
                if(g_iUserLevel[g_iMenuTarget[id]] - iCheck <= 0) return PLUGIN_HANDLED;
            }
        }
    }
    return ClCmd_GiveNum(id, g_iMenuTarget[id], iCheck);
}

public Loading_Level(id)
{
    new szAuthid[35];
    switch(g_iNumCvar[CVAR_SAVE_TYPE])
    {
        case 1:
        {
            if(g_iNumCvar[CVAR_PLAYER_TYPE] == 1) get_user_name(id, szAuthid, charsmax(szAuthid));
            else get_user_authid(id, szAuthid, charsmax(szAuthid));
            for(new i = 0; i < g_PlayerSumLine; i++)
            {
                new aDataPlayerInfo[DATA_PLAYER_INFO];
                ArrayGetArray(g_aDataInfoPlayer, i, aDataPlayerInfo);
                if(equali(szAuthid, aDataPlayerInfo[LANG_PLAYERAUTCH]))
                {
                    g_iUserExp[id] = aDataPlayerInfo[MODE_PLAYEREXP];
                    g_iUserLoadingLevel[id] = i;
                    break;
                }
            }
            if(g_iUserExp[id] > g_iMaxExp) g_iUserExp[id] = g_iMaxExp;
            while(g_iUserExp[id] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[id]) && g_iUserLevel[id] < g_iMaxLevels) g_iUserLevel[id] += 1;
        }
        case 2:
        {
            new szData[2], szQuery[512], szQuoted[64];
            szData[0] = id;
            szData[1] = get_user_userid(id);
            if(g_iNumCvar[CVAR_PLAYER_TYPE] == 1) get_user_name(id, szAuthid, charsmax(szAuthid));
            else get_user_authid(id, szAuthid, charsmax(szAuthid));
            SQL_QuoteString(g_SQL_Connection, szQuoted, 63, szAuthid);
            formatex(szQuery, charsmax(szQuery), "SELECT `exp` FROM `ils_levels` WHERE `name` = '%s'", szQuoted);
            SQL_ThreadQuery(g_SQL_Tuple, "LoginHandler", szQuery, szData, 2);
        }
        case 3:
        {
            new szData[256], iTimeStamp, szExp[5];
            if(g_iNumCvar[CVAR_PLAYER_TYPE] == 1) get_user_name(id, szAuthid, charsmax(szAuthid));
            else get_user_authid(id, szAuthid, charsmax(szAuthid));
            if(nvault_lookup(g_Vault, szAuthid, szData, charsmax(szData), iTimeStamp) )
            {
                replace_all(szData, charsmax(szData), "|"," ");
                parse(szData, szExp, charsmax(szExp));
                g_iUserExp[id] = str_to_num(szExp);
                if(g_iUserExp[id] > g_iMaxExp) g_iUserExp[id] = g_iMaxExp;
                while(g_iUserExp[id] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[id]) && g_iUserLevel[id] < g_iMaxLevels) g_iUserLevel[id] += 1;
            }
        }
    }
}

public LoginHandler(failState, Handle:szQuery, szError[], iErr, szData[], size, Float:queryTime)
{
    if(failState != TQUERY_SUCCESS)
    {
        log_amx("[LEVEL_System] Query error %d, %s", iErr, szError)
        return
    
}
    new id = szData[0];
    if(get_user_userid(id) != szData[1]) return;
    if(SQL_NumResults(szQuery)) g_iUserExp[id] = SQL_ReadResult(szQuery, SQL_FieldNameToNum(szQuery, "exp"));
    if(g_iUserExp[id] > g_iMaxExp) g_iUserExp[id] = g_iMaxExp;
    while(g_iUserExp[id] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[id]) && g_iUserLevel[id] < g_iMaxLevels) g_iUserLevel[id] += 1;
}

public Save_Levels(id)
{
    if(g_iUserExp[id] > 0)
    {
        new szAuthid[35];
        switch(g_iNumCvar[CVAR_SAVE_TYPE])
        {
            case 1:
            {
                new szCfgDir[64], szCfgFile[128], szBuffer[128], aDataPlayerInfo[DATA_PLAYER_INFO];
                if(g_iNumCvar[CVAR_PLAYER_TYPE] == 1) get_user_name(id, szAuthid, charsmax(szAuthid));
                else get_user_authid(id, szAuthid, charsmax(szAuthid));
                get_localinfo("amxx_configsdir", szCfgDir, charsmax(szCfgDir));
                formatex(szCfgFile, charsmax(szCfgFile), "%s/IdealLevelSystem.ini", szCfgDir);
                formatex(szBuffer, charsmax(szBuffer), "^"%s^" ^"%d^"", szAuthid, g_iUserExp[id]);
                if(g_iUserLoadingLevel[id])
                {
                    ArrayGetArray(g_aDataInfoPlayer, g_iUserLoadingLevel[id], aDataPlayerInfo);
                    if(equali(szAuthid, aDataPlayerInfo[LANG_PLAYERAUTCH]))
                    {
                        aDataPlayerInfo[MODE_PLAYEREXP] = g_iUserExp[id];
                        ArraySetArray(g_aDataInfoPlayer, g_iUserLoadingLevel[id], aDataPlayerInfo);
                        write_file(szCfgFile, szBuffer, g_iUserLoadingLevel[id]);
                        g_iUserLoadingLevel[id] = 0;
                    }
                }
                else
                
{
                    formatex(aDataPlayerInfo[LANG_PLAYERAUTCH], aDataPlayerInfo[LANG_PLAYERAUTCH], szAuthid);
                    aDataPlayerInfo[MODE_PLAYEREXP] = g_iUserExp[id];
                    ArrayPushArray(g_aDataInfoPlayer, aDataPlayerInfo);
                    write_file(szCfgFile, szBuffer, -1);
                    g_PlayerSumLine++;
                }
            }
            case 2:
            {
                new szQuery[512], szQuoted[64];
                if(g_iNumCvar[CVAR_PLAYER_TYPE] == 1) get_user_name(id, szAuthid, charsmax(szAuthid));
                else get_user_authid(id, szAuthid, charsmax(szAuthid));
                SQL_QuoteString(g_SQL_Connection, szQuoted, charsmax(szQuoted), szAuthid);
                formatex(szQuery, charsmax(szQuery), "INSERT INTO `ils_levels` (`name`, `exp`) VALUES('%s', %i) ON DUPLICATE KEY UPDATE `exp` = VALUES(`exp`)", 
                szQuoted
, g_iUserExp[id]);
                SQL_QueryAndIgnore(g_SQL_Connection, szQuery);
            }
            case 3:
            {
                new szData[256];
                if(g_iNumCvar[CVAR_PLAYER_TYPE] == 1) get_user_name(id, szAuthid, charsmax(szAuthid));
                else get_user_authid(id, szAuthid, charsmax(szAuthid));
                formatex(szData, charsmax(szData), "|%i|", g_iUserExp[id]);
                nvault_set(g_Vault, szAuthid, szData);
            }
        }
    }
    g_iUserExp[id] = 0;
    g_iUserLevel[id] = 0;
}

public native_get_user_exp(id) return g_iUserExp[id];
public native_set_user_exp(id, amount) g_iUserExp[id] = amount;
public native_get_user_level(id) return g_iUserLevel[id];
public native_set_user_level(id, amount) g_iUserLevel[id] = amount;
public naive_get_user_maxexp(id) return ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[id]);

stock CheckFlag(id, iType)
{
    new szFlags[32], iFlags = get_user_flags(id);
    get_flags(iFlags, szFlags, charsmax(szFlags));
    if(containi(szFlags, g_iStringCvar[iType]) != -1) return true;
    return false;
}

stock UTIL_SayText(pPlayer, const szMessage[], any:...)
{
    new szBuffer[190];
    if(numargs() > 2) vformat(szBuffer, charsmax(szBuffer), szMessage, 3);
    else copy(szBuffer, charsmax(szBuffer), szMessage);
    while(replace(szBuffer, charsmax(szBuffer), "!y", "^1")) {}
    while(replace(szBuffer, charsmax(szBuffer), "!t", "^3")) {}
    while(replace(szBuffer, charsmax(szBuffer), "!g", "^4")) {}
    switch(pPlayer)
    {
        case 0:
        {
            for(new iPlayer = 1; iPlayer <= g_iMaxPlayers; iPlayer++)
            {
                if(!is_user_connected(iPlayer)) continue;
                engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, MsgId_SayText, {0.0, 0.0, 0.0}, iPlayer);
                write_byte(iPlayer);
                write_string(szBuffer);
                message_end();
            }
        }
        default:
        {
            engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, MsgId_SayText, {0.0, 0.0, 0.0}, pPlayer);
            write_byte(pPlayer);
            write_string(szBuffer);
            message_end();
        }
    }
}



Исходник вип меню
Код: Выделить всё
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
#include <fun>
#include <zombieplague>

new g_item1[33], g_item2[33], g_item3[33], g_item4[33], g_item5[33], g_item6[33], g_item7[33], g_exp_count[33]

native balrog_ak47(id)
native balrog7(id)

native ils_get_user_exp(id)
native ils_set_user_exp(id, set)

const KEYSMENU = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9|MENU_KEY_0

public plugin_init
()
{
    register_plugin    ("[ZP] Boss menu", "1.1" , "BuB9neC" )
    register_menu("X Menu", KEYSMENU, "menu_main")    
    register_clcmd
("/vip_menu", "vip_menu")
    
    register_logevent
("fw_new_round", 2, "1=Round_Start")
}

public vip_menu(id)
{
    static menu[512], userflags
    new len
    userflags 
= get_user_flags(id)
    
    if
(userflags & ADMIN_RESERVATION) 
    
{
        len += formatex( menu[ len ] , charsmax( menu ) - len , "\r[ZP] \wМеню \r[\yВип\r]^n^n" )
        
        if
(g_item1[id] == 0)
            len += formatex(menu[len] , charsmax(menu) - len , "\r[\w1\r] \wВзять \y[+75 Брони]^n" )
        else len += formatex(menu[len] , charsmax(menu) - len , "\d[1] Взять [+75 Брони]^n" )
        
        if
(g_item2[id] == 0)
            len += formatex(menu[len] , charsmax(menu) - len , "\r[\w2\r] \wВзять \y[+75 ХП]^n" )
        else len += formatex(menu[len] , charsmax(menu) - len , "\d[2] Взять [+75 ХП]^n" )
        
        if
(g_item3[id] == 0)
            len += formatex(menu[len] , charsmax(menu) - len , "\r[\w3\r] \wВзять \y[+25 Аммо]^n^n" )
        else len += formatex(menu[len] , charsmax(menu) - len , "\d[3] Взять [+25 Аммо]^n^n" )
        
        if
(g_item4[id] == 0)
            len += formatex(menu[len] , charsmax(menu) - len , "\r[\w4\r] \wВзять \y[A] \rAK-47 Balrog^n" )
        else len += formatex(menu[len] , charsmax(menu) - len , "\d[4] Взять [A] AK-47 Balrog^n" )
        
        if
(g_item5[id] == 0)
            len += formatex(menu[len] , charsmax(menu) - len , "\r[\w5\r] \wВзять \y[A] \rBalrog-7^n" )
        else len += formatex(menu[len] , charsmax(menu) - len , "\d[5] Взять [A] Balrog-7^n" )            
        
        if
(g_exp_count[id]>=60)
            len += formatex(menu[len], charsmax(menu) - len, "\d[6] Взять [+15 Опыт]^n")
        else len += formatex(menu[len], charsmax(menu) - len, "\r[\w6\r] \wВзять \y[+15 Опыт]^n", g_exp_count[id])

        len += formatex(menu[len] , charsmax(menu) - len , "^n\r[\w0\r] Выход" )
    }
    
    else 
    
{
        len += formatex( menu[ len ] , charsmax( menu ) - len , "\r[ZP] \wМеню \r[\yВип\r]^n^n" )
        
        len 
+= formatex(menu[len] , charsmax(menu) - len , "\d[1] Взять [+75 Брони]^n" )
        
        len 
+= formatex(menu[len] , charsmax(menu) - len , "\d[2] Взять [+75 ХП]^n" )
        
        len 
+= formatex(menu[len] , charsmax(menu) - len , "\d[3] Взять [+50 Аммо]^n" )
        
        len 
+= formatex(menu[len] , charsmax(menu) - len , "\d[4] Взять [A] AK-47 Balrog^n" )
        
        len 
+= formatex(menu[len] , charsmax(menu) - len , "\d[5] Взять [A] Balrog-7^n" )    
        
        len 
+= formatex(menu[len] , charsmax(menu) - len , "\d[6] Взять [+15 Опыт]^n" )
        
        len 
+= formatex(menu[len] , charsmax(menu) - len , "^n\r[0]\w Выход" )
        
        len 
+= formatex(menu[len] , charsmax(menu) - len,"^n\yВы не \rВип\y игрок!")
    }
        
    set_pdata_int
(id , 205 , 0 )
    show_menu(id, KEYSMENU , menu , -, "X Menu" )
}

public menu_main(id,key)
{
    if (!is_user_connected(id))
    return PLUGIN_HANDLED;    
    
    static userflags
    userflags 
= get_user_flags(id)
    
    if
(!(userflags & ADMIN_RESERVATION))
    {
        ChatColor(id, "!g«Зомби-Подростки®» !yУ Вас \rнет прав \teamВип! \wПокупка !g[В]к: vk.com/zm_podrostki")
        return 1
    
}
    else if(!is_user_alive(id))
    {
        ChatColor(id, "!g«Зомби-Подростки®»!y Недоступно для мертвых.")
        return 1
    
}
    
    switch 
(key)
    {
        case 0:
        {
            if(!is_user_connected(id))
                return PLUGIN_HANDLED;
            else if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
            {
                ChatColor(id, "!g«Зомби-Подростки®»!y Доступно только !tЛюдям!y.")
                return PLUGIN_HANDLED;
            }
            else if(g_item1[id] == 0)
            {
                g_item1[id] = 1;
                set_pev(id, pev_armorvalue, pev(id, pev_armorvalue) + 75.0);
                vip_menu(id)
            }
            else
            
{
                ChatColor(id, "!g«Зомби-Подростки®»!y Можно брать только раз за раунд.");
                return PLUGIN_HANDLED;
            }
        }
        case 1:
        {
            if(!is_user_connected(id))
                return PLUGIN_HANDLED;
            else if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
            {
                ChatColor(id, "!g«Зомби-Подростки®»!y Доступно только !tЛюдям!y.")
                return PLUGIN_HANDLED;
            }    
            else if
(g_item2[id] == 0)
            {
                g_item2[id] = 1;
                set_pev(id, pev_health, pev(id, pev_health) + 75.0);
                vip_menu(id)
            }
            else
            
{
                ChatColor(id, "!g«Зомби-Подростки®»!y Можно брать только раз за раунд.");
                return PLUGIN_HANDLED;
            }
        }
        case 2:
        {
            if(!is_user_connected(id))
                return PLUGIN_HANDLED;
            else if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
            {
                ChatColor(id, "!g«Зомби-Подростки®»!y Доступно только !tЛюдям!y.")
                return PLUGIN_HANDLED;
            }    
            else if
(g_item3[id] == 0)
            {
                g_item3[id]
                zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + 50);
                vip_menu(id)
            }
            else
            
{
                ChatColor(id, "!g«Зомби-Подростки®»!y Можно брать только раз за раунд.");
                return PLUGIN_HANDLED;
            }
        }
        case 3:
        {
            if(!is_user_connected(id))
                return PLUGIN_HANDLED;
            else if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
            {
                ChatColor(id, "!g«Зомби-Подростки®»!y Доступно только !tЛюдям!y.")
                return PLUGIN_HANDLED;
            }    
            else if
(g_item4[id] == 0)
            {
                g_item4[id] = 1;
                balrog_ak47(id);
            }
            else
            
{
                ChatColor(id, "!g«Зомби-Подростки®»!y Можно брать только раз за раунд.");
                return PLUGIN_HANDLED;
            }
        }
        case 4:
        {
            if(!is_user_connected(id))
                return PLUGIN_HANDLED;
            else if(zp_get_user_zombie(id) || zp_get_user_survivor(id))
            {
                ChatColor(id, "!g«Зомби-Подростки®»!y Доступно только !tЛюдям!y.")
                return PLUGIN_HANDLED;
            }    
            else if
(g_item5[id] == 0)
            {
                g_item5[id] = 1;
                balrog7(id);
            }
            else
            
{
                ChatColor(id, "!g«Зомби-Подростки®»!y Можно брать только раз за раунд.");
                return PLUGIN_HANDLED;
            }
        }
        case 5:
        {        
            if
(g_exp_count[id]) {
                ChatColor(id, "!g«Зомби-Подростки®» !yМожно брать только раз за карту.")
                vip_menu(id)
                return PLUGIN_HANDLED;
            }
            ils_set_user_exp(id, ils_get_user_exp(id)+15)
            ChatColor(id, "!g«Зомби-Подростки®» !yВы взяли опыт")
            g_exp_count[id]    += 60
            vip_menu
(id)
            
        
}    
    
}
    
    return PLUGIN_HANDLED
;
}

public fw_new_round(id)
{
    for(new id = 0; id < 33; id++)
    {
        if(g_item1[id] > 0)
        {
            g_item1[id] -= 1
        
}
        if(g_item2[id] > 0)
        {
            g_item2[id] -= 1
        
}
        if(g_item3[id] > 0)
        {
            g_item3[id] -= 1
        
}
        if(g_item4[id] > 0)
        {
            g_item4[id] -= 1
        
}
        if(g_item5[id] > 0)
        {
            g_item5[id] -= 1
        
}
        if(g_item6[id] > 0)
        {
            g_item6[id] -= 1
        
}
        if(g_item7[id] > 0)
        {
            g_item7[id] -= 1
        
}
    }
}

stock ChatColor(const id, const input[], any:...)
{
    new count = 1, players[32]
    static msg[191]
    vformat(msg, 190, input, 3)

    replace_all(msg, 190, "!g", "^4")
    replace_all(msg, 190, "!y", "^1")
    replace_all(msg, 190, "!t", "^3")

    if (id) players[0] = id; else get_players(players, count, "ch")
    {
        for (new i = 0; i < count; i++)
        {
            if (is_user_connected(players[i]))
            {
                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i]);
                write_byte(players[i]);
                write_string(msg);
                message_end();
            }
        }
    }
}
Аватара пользователя
MrBest
 
Сообщения: 29
Зарегистрирован: 25 сен 2019, 16:17
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Pawn , плагины zombie mod

Re: Лвл система и выдача опыта  [Решено]

Сообщение Leonidddd » 29 сен 2019, 17:17

MrBest,
Код: Выделить всё
public native_set_user_exp(id, amount) g_iUserExp[id] = amount;


Здесь просто выставляет кол-во экспы и не хватает проверки на лвл и выдачу нового лвла, если новое кол-во экспы достаточно для след лвла.

Судя по коду в плагине, над слегка пожестить(хотя можно куда проще сделать все, сделай автор доп. переменные для проверок подобных):

Код: Выделить всё
public native_set_user_exp(id, amount){

    g_iUserExp[id] = amount;

    while(g_iUserExp[id] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[id]) && g_iUserLevel[id] < g_iMaxLevels) 
        g_iUserLevel
[id] += 1;
}
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2257
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 182 раз.
Поблагодарили: 630 раз.

Re: Лвл система и выдача опыта

Сообщение MrBest » 29 сен 2019, 21:56

Leonidddd писал(а):MrBest,
Код: Выделить всё
public native_set_user_exp(id, amount) g_iUserExp[id] = amount;


Здесь просто выставляет кол-во экспы и не хватает проверки на лвл и выдачу нового лвла, если новое кол-во экспы достаточно для след лвла.

Судя по коду в плагине, над слегка пожестить(хотя можно куда проще сделать все, сделай автор доп. переменные для проверок подобных):

Код: Выделить всё
public native_set_user_exp(id, amount){

    g_iUserExp[id] = amount;

    while(g_iUserExp[id] >= ArrayGetCell(g_aDataMaxLevels, g_iUserLevel[id]) && g_iUserLevel[id] < g_iMaxLevels) 
        g_iUserLevel
[id] += 1;
}


Так много вопросов .....
Леонид (теска кст, как минимум по нику:D) Спасииииибо самое огромное человеческое СПАСИБО!

Когда откроется проект обязательно позову , поиграть , оценить все такое))))
С первых донов на qiwi закину , обязательно )))
Аватара пользователя
MrBest
 
Сообщения: 29
Зарегистрирован: 25 сен 2019, 16:17
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Pawn , плагины zombie mod


Вернуться в Скриптинг

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

Сейчас этот форум просматривают: MSN [Bot], Yandex [Bot] и гости: 1