Проверка.

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
855
Реакции
144
Помог
25 раз(а)
Избыточное форматирование/капслок
Добрый вечер пользователи, скриптеры.
Столкнулся с такой проблемой, что когда я делаю проверку, она работает не совсем корректно.
Суть такова:
Сперва я объявляю переменные для кваров:
Код:
enum Cvar {
    g_iSqlHost[32],
    g_iSqlUser[32],
    g_iSqlPass[32],
    g_iSqlNameDb[32],
    g_iSqlTable[32],
    g_iNeedHour,
    g_iNeedMin,
    g_iNeedSec,
};

new g_iCvar[Cvar];
Затем, через bind_pcvar_num, bind_pcvar_string создаю их и автоматически генерирую конфиг:
Код:
bind_pcvar_string(create_cvar(
        "amxx_upgrade_sql_host",
        "127.0.0.1",
        FCVAR_NONE,
        "IP/Хост от Базы данных."
    ), g_iCvar[g_iSqlHost], charsmax(g_iCvar[g_iSqlHost]));

    bind_pcvar_string(create_cvar(
        "amxx_upgrade_sql_user",
        "root",
        FCVAR_NONE,
        "Логин (Имя пользователя) от Базы данных."
    ), g_iCvar[g_iSqlUser], charsmax(g_iCvar[g_iSqlUser]));

    bind_pcvar_string(create_cvar(
        "amxx_upgrade_sql_password",
        "",
        FCVAR_NONE,
        "Пароль от Базы данных."
    ), g_iCvar[g_iSqlPass], charsmax(g_iCvar[g_iSqlPass]));
  
    bind_pcvar_string(create_cvar(
        "amxx_upgrade_sql_dbname",
        "sborka",
        FCVAR_NONE,
        "Название Базы данных."
    ), g_iCvar[g_iSqlNameDb], charsmax(g_iCvar[g_iSqlNameDb]));

    bind_pcvar_string(create_cvar(
        "amxx_upgrade_sql_table",
        "AmxxUpgradeSystem",
        FCVAR_NONE,
        "Название Базы данных."
    ), g_iCvar[g_iSqlTable], charsmax(g_iCvar[g_iSqlTable]));   

    bind_pcvar_num(create_cvar(
        "amxx_upgrade_need_hour",
        "0",
        FCVAR_NONE,
        "Сколько нужно отыграть часов для получения одного поинта."
    ), g_iCvar[g_iNeedHour]);

    bind_pcvar_num(create_cvar(
        "amxx_upgrade_need_min",
        "1",
        FCVAR_NONE,
        "Сколько нужно отыграть минут для получения одного поинта."
    ), g_iCvar[g_iNeedMin]);

    bind_pcvar_num(create_cvar(
        "amxx_upgrade_need_sec",
        "0",
        FCVAR_NONE,
        "Сколько нужно отыграть секунд для получения одного поинта."
    ), g_iCvar[g_iNeedSec]);

    AutoExecConfig(true, "AmxxUpgradeSystem");
И вот ключевой код, в котором та самая проверка:
Код:
public Task_CheckTime(iPlayer) {
    iPlayer -= TASKID_CHECK;

    if(!is_user_connected(iPlayer))
        return;

    g_iUserTime[iPlayer] ++;

    g_iUserTimeHour[iPlayer] = g_iUserTime[iPlayer] / 3600 % 3600;
    g_iUserTimeMin[iPlayer] = g_iUserTime[iPlayer] / 60 % 60;

    client_print(iPlayer, print_chat, "%d minutes %d second", g_iUserTimeMin[iPlayer], g_iUserTime[iPlayer] % 60);

    if( g_iUserTimeMin[iPlayer] >= g_iCvar[g_iNeedMin]
        && g_iUserTime[iPlayer] >= g_iCvar[g_iNeedSec]
    ) {
        g_iUserPoints[iPlayer] ++;
        client_print(iPlayer, print_chat, "Вы получили + %d поинт!", g_iUserPoints[iPlayer]);
        g_iUserTime[iPlayer] = 0;
    }
}
Получается так: Я проверяю, если g_iUserTimeMin[iPlayer] >= g_iCvar[g_iNeedMin] и g_iUserTime[iPlayer] >= g_iCvar[g_iNeedSec], тогда я прибавляю значение массива g_iUserPoints[iPlayer]. Но проверка срабатывает тогда, когда g_iUserTimeMin[iPlayer] >= g_iCvar[g_iNeedMin] и всё, то-есть, оно не берёт в учёт g_iUserTime[iPlayer] >= g_iCvar[g_iNeedSec]. Например: Нужна 1 минута и 10 секунд, тогда код срабатывает. Но когда у меня наступает 1 минута, код срабатывает, и не важно, сколько секунд. Как это поправить?
 
Сообщения
1,176
Реакции
2,144
Помог
57 раз(а)
Но проверка срабатывает тогда, когда g_iUserTimeMin[iPlayer] == g_iCvar[g_iNeedMin] и всё, то-есть, оно не берёт в учёт g_iUserTime[iPlayer] == g_iCvar[g_iNeedSec].
Хм. Исходя из чего сделан такой вывод?

Добавляем и смотрим лог. Мне кажется проблема в расчёте g_iUserTimeMin и/или сравнении g_iUserTime, а не в условии. Как условие-то может "не брать в учёт". Т.е., другими словами, логика тут неправильная.
Код:
   if( g_iUserTimeMin[iPlayer] >= g_iCvar[g_iNeedMin]
        && g_iUserTime[iPlayer] >= g_iCvar[g_iNeedSec]
    ) {
+       log_amx("%n -> %i %i / %i %i", iPlayer, g_iUserTimeMin[iPlayer],  g_iCvar[g_iNeedMin], g_iUserTime[iPlayer], g_iCvar[g_iNeedSec])
        g_iUserPoints[iPlayer] ++;
        client_print(iPlayer, print_chat, "Вы получили + %d поинт!", g_iUserPoints[iPlayer]);
        g_iUserTime[iPlayer] = 0;
    }
 
Последнее редактирование:
Сообщения
855
Реакции
144
Помог
25 раз(а)
Хм. Исходя из чего сделан такой вывод?

Добавляем и смотрим лог. Мне кажется проблема в расчёте g_iUserTimeHour и/или сравнении g_iUserTime, а не в условии. Как условие-то может "не брать в учёт". Т.е., другими словами, логика тут неправильная.
Код:
   if( g_iUserTimeMin[iPlayer] >= g_iCvar[g_iNeedMin]
        && g_iUserTime[iPlayer] >= g_iCvar[g_iNeedSec]
    ) {
+       log_amx("%n -> %i %i / %i %i", iPlayer, g_iUserTimeMin[iPlayer],  g_iCvar[g_iNeedMin], g_iUserTime[iPlayer], g_iCvar[g_iNeedSec])
        g_iUserPoints[iPlayer] ++;
        client_print(iPlayer, print_chat, "Вы получили + %d поинт!", g_iUserPoints[iPlayer]);
        g_iUserTime[iPlayer] = 0;
    }
Спасибо большое, скоро проверю.
 
Сообщения
855
Реакции
144
Помог
25 раз(а)
@BlackSignature,я понял в чём проблема, у меня идёт 1 минута и 60 секунд, а не 1 минута и 0 секунд. Спасибо, логи помогли. Можете закрывать тему.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу