SetPVarInt через SetTimerEx
#1

pawn Код:
forward TPV(playerid, m[], v);
public TPV(playerid, m[], v)
{
    SetPVarInt(playerid, m, v);
    printf("recive: %s; get: %d", m, GetPVarInt(_p, m));
    return 1; // recive: blablalba; get: 0
    // т.е. паблик массив получает правильно, а вот пивар... в пивар ничего не записывается
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmdtext,"/testcmd1",true) == 0)
    {
        SetTimerEx("TPV", 100, 0, "isi", playerid, "blablabla", 666);
        return 1;
    }
    return 1;
}
Например, нужно установить значение пивара по таймеру. В параметры таймера пишу айди игрока, сам массив, ну и значение пивара. В паблик доходит и значение, и сам массив, но вот пивар не устанавливается на нужное значение.
В чём проблема? Реально ли решить? Я что-то не так делаю?
Reply
#2

pawn Код:
SetTimerEx("TPV", 100, 0, "is", _p, "blablabla");
Замени _p на playerid
Reply
#3

Quote:
Originally Posted by GameMan
Посмотреть сообщение
Замени _p на playerid
Да при чём тут это... в шапке OnPlayerCommandText, в оригинале стоит new _p = playerid;
Просто по привычке вместо playerid вписал _p
Reply
#4

pawn Код:
SetTimerEx("TPV", 100, 0, "is", playerid, "blablabla");
И снова я. Количество значений в таймере не совпадает с количеством значений в паблике.
Должно быть так
pawn Код:
SetTimerEx("TPV", 100, 0, "isi", playerid, "blablabla", 123);
----------
Все увидел...
Reply
#5

И снова я опечатался. В оригинале, в public'e TPV не было третьего параметра. Т.е. пивар всегда ставился на 100.
Reply
#6

Вопрос всё еще актуален, может ли кто помочь выяснить в чём проблема?
Reply
#7

SetTimerEx - Arrays and strings do not work correctly - they will always pass only one string.

Рекомендую перенести стринг в конец.

И:

printf("recive: %s; get: %d", m, GetPVarInt(_p, m));
Reply
#8

Да, согласен, таймеры часто теряют строки, особенно если их две. Но:
pawn Код:
forward TPV(_p, b, a[]);
public TPV(_p, b, a[])
{
    SetPVarInt(_p, a, b);
    printf("TPV: _p = %d, a = %s, b = %d, pvar = %d", _p, a, b, GetPVarInt(_p, a));
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmdtext, "/testpvar", true) == 0)
    {
        SetTimerEx("TPV", 1000, 0, "dds", _p, 666, "some");
        return 1;
    }
    return 1;
}
Запускал около 20-30 раз. Имеем жуткий результат:

Т.е. таймер запускается, паблик получает все значение (о да, он зараза иногда их теряет), но даже получив - он не ставит пивар! Чертовщина какая то... пойду попробую это с Gварами.
Reply
#9

План Б - GVar'ы
pawn Код:
forward TPV(_p, b, a[]);
public TPV(_p, b, a[])
{
    SetPVarInt(_p, a, b);
    printf("TPV: _p = %d, a = %s, b = %d, pvar = %d", _p, a, b, GetPVarInt(_p, a));
    SetGVarInt(a, b, _p);
    printf("TPV: GVAR: _p = %d, a = %s, b = %d, Gvar = %d", _p, a, b, GetGVarInt(a, _p));
    return 1;
}


public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmd, "/testpvar", true) == 0)
    {
        SetTimerEx("TPV", 1000, 0, "dds", _p, 666, "some");
        return 1;
    }
    return 1;
}
Получаем:

Вывод: при тех же условиях, кастомный плагин на гвары работает нормально, а вшитые пвары - не работают. Я уж даже не знаю, баг это, или так задумано...
Reply
#10

О да, проблема решена! Выход оказался совсем прост:
pawn Код:
forward TPV(_p, b, a[]);
public TPV(_p, b, a[])
{
    format(ts, 16, "%s", a); // ts = global temp string
    SetPVarInt(_p, ts, b);
    printf("TPV: _p = %d, a = %s, ts = %s, b = %d, pvar = %d", _p, a, ts, b,  GetPVarInt(_p, ts));
    return 1; // и это работает!
}


public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmd, "/testpvar", true) == 0)
    {
        SetTimerEx("TPV", 1000, 0, "dds", _p, 666, "some");
        return 1;
    }
}
Так что, если кто с этим столкнулся - пользуйтесь. Ну, думаю тему можно закрывать.
Reply
#11

Т.е. просто заформатировать стринг надо было перед установкой ПВара?
Reply
#12

Да. Возможно проблема в следующем: SetPVarInt проверял размер массива, в котором содержится имя пивара. Наверное, когда он получал динамический массив (TPV(_v,b, a[]), то считал что он слишком длинный, и это ошибка. Ну и не записывал в пивар значение. А когда мы переформатируем один стринг в другой - пивар будет знать точный размер, и операция будет проведена успешно.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)