PDA

Просмотр полной версии : [Вопрос] GameTextForPlayer останавливает таймер



punkochel
28.06.2019, 12:10
При вызове команды, функция GameTextForPlayer(playerid, "text", 3000, 3) через 3 секунды останавливает глобальный таймер, если изменить 3000 на 1000, то таймер после вызова функции проработает 1 секунду.


CMD:buyhouse(playerid)
{
for(new h = 1; h <= TotalHouses; h++)
{
if(IsPlayerInDynamicArea(playerid, HouseInfo[h][hZone_Exit]))
{
GameTextForPlayer(playerid, "~w~welcome home", 3000, 3);
return 1;
}
}
return 1;
}



UPD: Только что проверил, вообще любой вызов функции GameTextForPlayer останавливает глобальный таймер. А точнее по завершению работы функции GameTextForPlayer останавливается глобальный таймер

UPD: Заметил что при отключении игрока от сервера, останавливается глобальный таймер. Функции KillTimer для глобального таймера в OnPlayerDisconnect не используется.

UPD: При создании таймера функцией SetTimer в OnGameModeInit, ID таймера = 1. При создании уже второго таймера в OnPlayerConnect функцией SetTimerEx, ID таймера так-же = 1. Следовательно при отключении игрока, уничтожается таймер с ID 1.
Далее я смоделирую ситуацию:



OnPlayerStateChange(playerid, newstate)
{
if(newstate == PLAYER_STATE_DRIVER)
{
TimerSpeedometer[playerid] = SetTimerEx("UpdateSpeedometer", 150, 1, "i", playerid);
}
else if(newstate == PLAYER_STATE_ONFOOT)
{
if(TimerSpeedometer[playerid] != 0) {
KillTimer(TimerSpeedometer[playerid]);
}
}
return 1;
}

Когда игрок - водитель, то таймер запускается. Когда игрок НЕ водитель - таймер продолжает работать.
Не могу понять в чем может быть проблема, куда копать. Понятно что проблема в таймерах, но что конкретно, не ясно.

Проверил все на new.pwn. Все работает как нужно.
https://i.imgur.com/IQOJmed.png

Daniel_Cortez
01.07.2019, 15:17
Если верить тому, что вы описываете, то дело наверняка в криво реализованных перехватах. Вы пытались перехватывать SetTimerEx или GameTextForPlayer? Если нет, смотрите, какие инклуды у вас подключены и где могут эти функции перехватываться (fixes.inc, к примеру; может быть, ещё какие-нибудь другие инклуды).

punkochel
02.07.2019, 11:45
Да, дело в инклуде fixes. Все заработало снова. Спасибо за помощь!
Но остался еще 1 вопрос, проверил на new pawn, там id таймера не обнуляется и при повторном коннекте инкрементируется +1.
У меня он инкрементируется на +2. С чем это может быть связано? И должен ли он ID обнуляться?
https://i.imgur.com/ukQq9tM.png

Daniel_Cortez
03.07.2019, 15:29
Ну если к этому "причастен" fixes.inc, то сами собой напрашиваются два вопроса:
1. Эта проблема воспроизводится в new.pwn, если в нём тоже подключить fixes.inc?
2. Вы используете последнюю версию инклуда? (Если не уверены, последнюю версию можно взять отсюда: https://raw.githubusercontent.com/Open-GTO/sa-mp-fixes/master/fixes.inc.)

punkochel
03.07.2019, 22:34
Нет, версия fixes.inc была предыдущей. С проблемой подразобрался, причина в не правильной последовательности подключений. Что касается MySQL, то тут все нормально. А вот в fix.inc используется просто создание таймера SetTimerEx без каких либо перехватов, не знаю зачем я его подключил, видимо тогда это выглядело для меня правильным. При такой последовательности подключений, на new.pwn появилась так-же проблема, что поспособствовала созданию этой темы. Daniel, если у тебя есть какие-то замечания по последовательности, подскажи как будет лучше. Заранее спасибо!

Последовательность подключений:

#include <crashdetect>
#include <a_samp>
#include <fix>
#include <a_mysql>
#define FIXES_Single 1
#define FIXES_ServerVarMsg 0
#include <fixes>
#include <timerfix>
#include <streamer>
#include <fixobject>
#include <Pawn.CMD>
#include <sscanf2>
#include <foreach>
//#include <nex-ac>
#include <pawn.regex>
#include <TOTP>
#include <mdialog>

Daniel_Cortez
04.07.2019, 14:06
По-хорошему первым делом следует подключать a_samp, сразу после него - всяческие костыли-фиксы, вроде того же fixes.inc. Остальные инклуды по идее не должны влиять на пользовательский код, поэтому и их порядок подключения не должен иметь значения.