• Пожалуйста, создайте название темы отражающее ее смысл
  • Для ускорения решения Вашего вопроса заполните обязательные поля и подробно опишите возникшую проблему

Помощь Не выводит одинички

ThePhoenix

Участник
Сообщения
29
Реакции
1
Баллы
3
Тук тук. Никто не сможет объяснить, почему в плагине не выводятся одинички? (1 день, месяц и т.д.)
т.е считывать, оно считывает, для работы, а в худ, когда дело доходит выводить, то пусто. Любые значения, кроме 1 нормально работают.
Код:
#include <amxmodx>

// - - - - - - - - - - - - - - - - - - - - - - - -

#define TIMER 1627480440 // date UNIX format // Время нового года в формате UNIX-Time

new const color_hud[3] = { 0, 255, 0 } // цвет информера

new const Float:the_x = -1.0 // позиция по X
new const Float:the_y = 0.05 // позиция по Y

new const Float:upd = 5.0 // частота обновлений худа
new const Float:upd2 = 5.1 // время показана худа, должно быть больше, чем частота обновлений, чтобы всегда было на экране и обновлялось только

// - - - - - - - - - - - - - - - - - - - - - - - -

#define ONEYEAR 31536000
#define ONEMONTH 2592000
#define ONEDAY 86400
#define ONEHOUR 3600
#define ONEMINUTE 60
#define ONESECOND 1
#define TASK_HUD 576

new sDateString[112];
new dateStrFormat[6][3][] = {
{ "год", "года", "лет" }, { "месяц", "месяца", "месяцев" }, { "день", "дня", "дней" }, { "час", "часа", "часов" }, { "минута", "минуты", "минут" }, { "секунда", "секунды", "секунд" }
}

public plugin_init() {
    if(TIMER+3600>get_systime())
        set_task(upd, "UpdateHudTask",TASK_HUD,_,_,"b");
    else
        log_amx("Таймер закончился -> Плагин отключен!");
}

public UpdateHudTask()
{
    date_to_string_format(sDateString, charsmax(sDateString));
    log_amx("%s", sDateString);
   
    if(get_systime() > TIMER)
    {
        set_hudmessage(random_num(0, 255), random_num(0, 255), random_num(0, 255), the_x, the_y, 0, 0.0, 5.1, 0.0, 0.4, -1);
        show_hudmessage(0, "Время до розыгрыша вышло!");
    }
    else
    {
        new Float:new_time = float(TIMER-get_systime());
        new Float:plusday = new_time / float(ONEDAY);
       
        if(plusday > 1.0 && plusday < 2.0)
        {
            set_hudmessage(color_hud[0], color_hud[1], color_hud[2], the_x, the_y, 0, 0.0, upd2, 0.0, 0.4, -1);
            show_hudmessage(0, "До розыгрыша остался^n1 день %s^n^nПоторопитесь!", sDateString);
        }
        else
        {
            set_hudmessage(color_hud[0], color_hud[1], color_hud[2], the_x, the_y, 0, 0.0, upd2, 0.0, 0.4, -1);
            show_hudmessage(0, "До розыгрыша осталось^n%s^n^nПоторопитесь!", sDateString);
        }
    }
}

public date_to_string_format(string[], len)
{
    new Float:time = float(TIMER-get_systime());
    new Float:wday = time / ONEDAY;
    new Float:whour = time / ONEHOUR;
   
    if(wday > 1)
    {
        new newString[256], safeString[112], dType[5];
   
        dType[0] = floatround(time/ONEYEAR, floatround_floor); time-= dType[0]*ONEYEAR            // years
        dType[1] = floatround(time/ONEMONTH, floatround_floor); time-= dType[1]*ONEMONTH        // mounths
        dType[2] = floatround(time/ONEDAY, floatround_floor); time-= dType[2]*ONEDAY            // days
        dType[3] = floatround(time/ONEHOUR, floatround_floor); time-= dType[3]*ONEHOUR            // hours
        dType[4] = floatround(time/ONEMINUTE, floatround_floor); time-= dType[4]*ONEMINUTE        // minutes
        for(new i=0;i<5;i++) {
            if(dType[i]==0) continue;
            if(date_type_counts(dType[i], dateStrFormat[i][0], dateStrFormat[i][1], dateStrFormat[i][2], safeString, charsmax(safeString))==0) safeString="";
            else format(newString,charsmax(newString), "%s%s",newString, safeString);
        }
        log_amx("wday > 1");
       
        return copy(string, len, newString);
    }
    else
    {
        if(whour > 1)
        {
            new newString3[256], safeString3[112], datatype2[5];
   
            datatype2[0] = floatround(time/ONEYEAR, floatround_floor); time-= datatype2[0]*ONEYEAR            // years
            datatype2[1] = floatround(time/ONEMONTH, floatround_floor); time-= datatype2[1]*ONEMONTH            // mounths
            datatype2[2] = floatround(time/ONEDAY, floatround_floor); time-= datatype2[2]*ONEDAY                // days
            datatype2[3] = floatround(time/ONEHOUR, floatround_floor); time-= datatype2[3]*ONEHOUR            // hours
            datatype2[4] = floatround(time/ONEMINUTE, floatround_floor); time-= datatype2[4]*ONEMINUTE        // minutes
            for(new i=0;i<5;i++) {
                if(datatype2[i]==0) continue;
                if(date_type_counts(datatype2[i], dateStrFormat[i][0], dateStrFormat[i][1], dateStrFormat[i][2], safeString3, charsmax(safeString3))==0) safeString3="";
                else format(newString3,charsmax(newString3), "%s%s",newString3, safeString3);
            }
            log_amx("whour > 1");
       
            return copy(string, len, newString3);
        }
        else
        {
            new newString2[256], safeString2[112], datatype[6];
   
            datatype[0] = floatround(time/ONEYEAR, floatround_floor); time-= datatype[0]*ONEYEAR            // years
            datatype[1] = floatround(time/ONEMONTH, floatround_floor); time-= datatype[1]*ONEMONTH            // mounths
            datatype[2] = floatround(time/ONEDAY, floatround_floor); time-= datatype[2]*ONEDAY                // days
            datatype[3] = floatround(time/ONEHOUR, floatround_floor); time-= datatype[3]*ONEHOUR            // hours
            datatype[4] = floatround(time/ONEMINUTE, floatround_floor); time-= datatype[4]*ONEMINUTE        // minutes
            datatype[5] = floatround(time/ONESECOND, floatround_floor); time-= datatype[5]*ONESECOND        // sec
            for(new i=0;i<6;i++) {
                if(datatype[i]==0) continue;
                if(date_type_counts(datatype[i], dateStrFormat[i][0], dateStrFormat[i][1], dateStrFormat[i][2], safeString2, charsmax(safeString2))==0) safeString2="";
                else format(newString2,charsmax(newString2), "%s%s",newString2, safeString2);
            }
            log_amx("whour < 1");
       
            return copy(string, len, newString2);
        }
    }
}

public date_type_counts(count, eds[], edno[], many[], str_output[], len) {
    new strcount[3][32]; copy(strcount[0], 31, eds); copy(strcount[1], 31, edno); copy(strcount[2], 31, many);
    new cases[] = {2, 0, 1, 1, 1, 2};
    new wType = (count%100>4 && count%100<20) ? 2 : cases[min(count%10, 5)];
    formatex(str_output, len, "%d %s ", count, strcount[wType]);  
    return wType;
}
 
Последнее редактирование:
Diff:
- if(wday > 1)
+ if(wday > 0)
.
.
- if(whour > 1)
+ if(whour > 0)
 
zhorzh78, не, это не причём. Я же говорю, оно засчитывает этот час, а выводить не выводит.
Вот я сделал, чтобы таймер был на 1 день, 1 час и 2 минуты:
Код:
#include <amxmodx>



// - - - - - - - - - - - - - - - - - - - - - - - -



#define TIMER 1591693320 // date UNIX format // Время в формате UNIX-Time



new const color_hud[3] = { 0, 255, 0 } // цвет информера



new const Float:the_x = -1.0 // позиция по X

new const Float:the_y = 0.05 // позиция по Y



new const Float:upd = 5.0 // частота обновлений худа

new const Float:upd2 = 5.1 // время показана худа, должно быть больше, чем частота обновлений, чтобы всегда было на экране и обновлялось только



// - - - - - - - - - - - - - - - - - - - - - - - -



#define ONEYEAR 31536000

#define ONEMONTH 2592000

#define ONEDAY 86400

#define ONEHOUR 3600

#define ONEMINUTE 60

#define ONESECOND 1

#define TASK_HUD 576



new sDateString[112];

new dateStrFormat[6][3][] = {

{ "год", "года", "лет" }, { "месяц", "месяца", "месяцев" }, { "день", "дня", "дней" }, { "час", "часа", "часов" }, { "минута", "минуты", "минут" }, { "секунда", "секунды", "секунд" }

}



public plugin_init() {

    if(TIMER+3600>get_systime())

        set_task(upd, "UpdateHudTask",TASK_HUD,_,_,"b");

    else

        log_amx("Таймер закончился -> Плагин отключен!");

}



public UpdateHudTask()

{

    date_to_string_format(sDateString, charsmax(sDateString));

    log_amx("%s", sDateString);

 

    if(get_systime() > TIMER)

    {

        set_hudmessage(random_num(0, 255), random_num(0, 255), random_num(0, 255), the_x, the_y, 0, 0.0, 5.1, 0.0, 0.4, -1);

        show_hudmessage(0, "Время до розыгрыша вышло!");

    }

    else

    {

        set_hudmessage(color_hud[0], color_hud[1], color_hud[2], the_x, the_y, 0, 0.0, upd2, 0.0, 0.4, -1);

        show_hudmessage(0, "До розыгрыша осталось^n%s^n^nПоторопитесь!", sDateString);

    }

}



public date_to_string_format(string[], len)

{

    new Float:time = float(TIMER-get_systime());

    new Float:wday = time / ONEDAY;

    new Float:whour = time / ONEHOUR;

 

    if(wday > 0)

    {

        new newString[256], safeString[112], dType[5];

 

        dType[0] = floatround(time/ONEYEAR, floatround_floor); time-= dType[0]*ONEYEAR            // years

        dType[1] = floatround(time/ONEMONTH, floatround_floor); time-= dType[1]*ONEMONTH        // mounths

        dType[2] = floatround(time/ONEDAY, floatround_floor); time-= dType[2]*ONEDAY            // days

        dType[3] = floatround(time/ONEHOUR, floatround_floor); time-= dType[3]*ONEHOUR            // hours

        dType[4] = floatround(time/ONEMINUTE, floatround_floor); time-= dType[4]*ONEMINUTE        // minutes

        for(new i=0;i<5;i++) {

            if(dType==0) continue;

            if(date_type_counts(dType, dateStrFormat[0], dateStrFormat[1], dateStrFormat[2], safeString, charsmax(safeString))==0) safeString="";

            else format(newString,charsmax(newString), "%s%s",newString, safeString);

        }

        log_amx("wday > 0");

        

        return copy(string, len, newString);

    }

    else

    {

        if(whour > 0)

        {

            new newString3[256], safeString3[112], datatype2[5];

    

            datatype2[0] = floatround(time/ONEYEAR, floatround_floor); time-= datatype2[0]*ONEYEAR            // years

            datatype2[1] = floatround(time/ONEMONTH, floatround_floor); time-= datatype2[1]*ONEMONTH            // mounths

            datatype2[2] = floatround(time/ONEDAY, floatround_floor); time-= datatype2[2]*ONEDAY                // days

            datatype2[3] = floatround(time/ONEHOUR, floatround_floor); time-= datatype2[3]*ONEHOUR            // hours

            datatype2[4] = floatround(time/ONEMINUTE, floatround_floor); time-= datatype2[4]*ONEMINUTE        // minutes

            for(new i=0;i<5;i++) {

                if(datatype2==0) continue;

                if(date_type_counts(datatype2, dateStrFormat[0], dateStrFormat[1], dateStrFormat[2], safeString3, charsmax(safeString3))==0) safeString3="";

                else format(newString3,charsmax(newString3), "%s%s",newString3, safeString3);

            }

            log_amx("whour > 0");

        

            return copy(string, len, newString3);

        }

        else

        {

            new newString2[256], safeString2[112], datatype[6];

    

            datatype[0] = floatround(time/ONEYEAR, floatround_floor); time-= datatype[0]*ONEYEAR            // years

            datatype[1] = floatround(time/ONEMONTH, floatround_floor); time-= datatype[1]*ONEMONTH            // mounths

            datatype[2] = floatround(time/ONEDAY, floatround_floor); time-= datatype[2]*ONEDAY                // days

            datatype[3] = floatround(time/ONEHOUR, floatround_floor); time-= datatype[3]*ONEHOUR            // hours

            datatype[4] = floatround(time/ONEMINUTE, floatround_floor); time-= datatype[4]*ONEMINUTE        // minutes

            datatype[5] = floatround(time/ONESECOND, floatround_floor); time-= datatype[5]*ONESECOND        // sec

            for(new i=0;i<6;i++) {

                if(datatype==0) continue;

                if(date_type_counts(datatype, dateStrFormat[0], dateStrFormat[1], dateStrFormat[2], safeString2, charsmax(safeString2))==0) safeString2="";

                else format(newString2,charsmax(newString2), "%s%s",newString2, safeString2);

            }

            log_amx("whour < 0");

        

            return copy(string, len, newString2);

        }

    }

}



public date_type_counts(count, eds[], edno[], many[], str_output[], len) {

    new strcount[3][32]; copy(strcount[0], 31, eds); copy(strcount[1], 31, edno); copy(strcount[2], 31, many);

    new cases[] = {2, 0, 1, 1, 1, 2};

    new wType = (count%100>4 && count%100<20) ? 2 : cases[min(count%10, 5)];

    formatex(str_output, len, "%d %s ", count, strcount[wType]);   

    return wType;

}

Когда дошло до 1 минуты, даже в логи таймер не выводит значение в 1 минуту, а тупо пусто.
Код:
L 06/08/2020 - 10:59:41: [timer.amxx] 2 минуты
L 06/08/2020 - 10:59:46: [timer.amxx] wday > 0
L 06/08/2020 - 10:59:46: [timer.amxx] 2 минуты
L 06/08/2020 - 10:59:51: [timer.amxx] wday > 0
L 06/08/2020 - 10:59:51: [timer.amxx] 2 минуты
L 06/08/2020 - 10:59:56: [timer.amxx] wday > 0
L 06/08/2020 - 10:59:56: [timer.amxx] 2 минуты
L 06/08/2020 - 11:00:01: [timer.amxx] wday > 0
L 06/08/2020 - 11:00:01: [timer.amxx]
L 06/08/2020 - 11:00:06: [timer.amxx] wday > 0
L 06/08/2020 - 11:00:06: [timer.amxx]
L 06/08/2020 - 11:00:11: [timer.amxx] wday > 0
L 06/08/2020 - 11:00:11: [timer.amxx]
L 06/08/2020 - 11:00:16: [timer.amxx] wday > 0

А скрин с локалки таков:
20200608110058_1.jpg
Добавлено:

zhorzh78, даже, если я уберу все проверки (wday, whour), то единицы дней, месяцев, не будут выводится в худ. Это я и хочу понять, что не так сделано, что они работают по таймеру, а не выводятся только.
Добавлено:

С одной стороны, я делю целое время на 1 месяц, день, час и т.д. чтобы получить целое в них, но я же не игнорирую эти одинички.
Добавлено:

Уже не актуально (если чё, я не разобрался, просто уже не надо))
 
Последнее редактирование:
Назад
Сверху