SA-MP Forums Archive
SetPVarInt через SetTimerEx - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Русский/Russian (https://sampforum.blast.hk/forumdisplay.php?fid=32)
+---- Thread: SetPVarInt через SetTimerEx (/showthread.php?tid=335496)



SetPVarInt через SetTimerEx - iEnemY - 18.04.2012

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;
}
Например, нужно установить значение пивара по таймеру. В параметры таймера пишу айди игрока, сам массив, ну и значение пивара. В паблик доходит и значение, и сам массив, но вот пивар не устанавливается на нужное значение.
В чём проблема? Реально ли решить? Я что-то не так делаю?


Re: SetPVarInt через SetTimerEx - GameMan - 18.04.2012

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


Re: SetPVarInt через SetTimerEx - iEnemY - 18.04.2012

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


Re: SetPVarInt через SetTimerEx - GameMan - 18.04.2012

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


Re: SetPVarInt через SetTimerEx - iEnemY - 18.04.2012

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


Re: SetPVarInt через SetTimerEx - iEnemY - 19.04.2012

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


Re: SetPVarInt через SetTimerEx - eakwarp - 19.04.2012

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

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

И:

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


Re: SetPVarInt через SetTimerEx - iEnemY - 19.04.2012

Да, согласен, таймеры часто теряют строки, особенно если их две. Но:
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варами.


Re: SetPVarInt через SetTimerEx - iEnemY - 19.04.2012

План Б - 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;
}
Получаем:

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


Re: SetPVarInt через SetTimerEx - iEnemY - 21.04.2012

О да, проблема решена! Выход оказался совсем прост:
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;
    }
}
Так что, если кто с этим столкнулся - пользуйтесь. Ну, думаю тему можно закрывать.


Re: SetPVarInt через SetTimerEx - OKStyle - 21.04.2012

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


Re: SetPVarInt через SetTimerEx - iEnemY - 21.04.2012

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