Таймер не срабатывает первый раз
#1

запускаю
PHP Code:
TogglePlayerControllable(playeridfalse); 
SetTimerEx("UnfreezeSpawn"2000false"i"playerid); 
PHP Code:
publicsUnfreezeSpawn(playerid

    
SCM(playeridCOLOR_WHITE"загрузка завершена."); 
    
TogglePlayerControllable(playeridtrue); 
    return 
true

с первого раза не работает.

К примеру на сервер заходит первый игрок и у него не работает именно первый таймер,а дальше когда конектятся другие у них то все как часы работают

Надеюсь на вашу помощь
Reply
#2

Вроде всё норм.
Покажи что идёт до
PHP Code:
TogglePlayerControllable(playeridfalse);  
SetTimerEx("UnfreezeSpawn"2000false"i"playerid); 
И кстати в паблике return true нафиг не надо.
Reply
#3

Quote:
Originally Posted by Diman777
View Post
Вроде всё норм.
Покажи что идёт до
PHP Code:
TogglePlayerControllable(playeridfalse);  
SetTimerEx("UnfreezeSpawn"2000false"i"playerid); 
И кстати в паблике return true нафиг не надо.
Спасибо за совет.

Вот весь код
PHP Code:
   else if(pickupid == starspawn[0])
    {
        
TogglePlayerControllable(playeridfalse);
        
SCM(playeridCOLOR_WHITE"Загрузка...");
        
SetTimerEx("UnfreezeSpawn"2000false"i"playerid);
        
SetPos(playerid2011.4722,-1279.5135,23.9951,355.699400);
    } 
Reply
#4

В сравнении скорей всего твоя проблема. Для 1-ого игрока (с твоих слов) - это условие ложно, т.е. внутри код уже не сработает.
PHP Code:
else if (pickupid == starspawn[0]) 
Чтобы удостовериться в этом - проведи дебаг, и посмотри чему равно pickupid и starspawn[0] в тот момент.
Reply
#5

Quote:
Originally Posted by Diman777
View Post
В сравнении скорей всего твоя проблема. Для 1-ого игрока (с твоих слов) - это условие ложно, т.е. внутри код уже не сработает.
PHP Code:
else if (pickupid == starspawn[0]) 
Чтобы удостовериться в этом - проведи дебаг, и посмотри чему равно pickupid и starspawn[0] в тот момент.
PHP Code:
else if(pickupid == starspawn[0]) 
    { 
        
TogglePlayerControllable(playeridfalse); 
        
SCM(playeridCOLOR_WHITE"Загрузка..."); 
        
SetTimerEx("UnfreezeSpawn"2000false"i"playerid); 
        
SetPos(playerid2011.4722,-1279.5135,23.9951,355.699400); 
    } 
данный код полностью срабатывает а дальше не вызывается для первого игрока паблик UnfreezeSpawn
Reply
#6

А сделай вот так, и потом напиши какие цифры напечатало:
PHP Code:
else if (pickupid == starspawn[0])
{
    
TogglePlayerControllable(playeridfalse);
    print(
"1");
    
SCM(playeridCOLOR_WHITE"Загрузка...");
    print(
"2");
    
SetTimerEx("UnfreezeSpawn"2000false"i"playerid);
    print(
"3");
    
SetPos(playerid2011.4722,-1279.5135,23.9951,355.699400);
    print(
"4");

Хотя может что-то с идом таймера не то.
Reply
#7

Все цифры,даже

PHP Code:
ApplyAnimation(playerid,"INT_SHOP""shop_loop"4.111100); 
не работает на первом игроке,включается анимация а потом сразу у персонажа начинает тупо руки дергатся, с кодом все нормально,боюсь таймер по-моему виноват.
Reply
#8

и плюс это не из-за заморозки,проверял
Reply
#9

Ладно,думаю данный баг тяжело исправить,оставлю его,первый зайдет - > перезайдет и все будет работать,все равно спасибо за помощь.
Reply
#10

Ахтунг! таймер запускает функцию через 15-20 минут ))
Reply
#11

Попробуй записать ид таймера, т.е.
PHP Code:
new freeze_timer_id[MAX_PLAYERS];
else if (
pickupid == starspawn[0])
{
    
TogglePlayerControllable(playeridfalse);
    
SCM(playeridCOLOR_WHITE"Загрузка...");
    
freeze_timer_id[playerid] = SetTimerEx("UnfreezeSpawn"2000false"i"playerid);
    
SetPos(playerid2011.4722,-1279.5135,23.9951,355.699400);
}
publics:UnfreezeSpawn(playerid)
{
    
SCM(playeridCOLOR_WHITE"загрузка завершена.");
    
TogglePlayerControllable(playeridtrue);
    
KillTimer(freeze_timer_id[playerid]);
}
public 
OnPlayerDisconnect(playeridreason)
{
    
KillTimer(freeze_timer_id[playerid]);
    return 
1;

Reply
#12

Quote:
Originally Posted by Diman777
View Post
И кстати в паблике return true нафиг не надо.
Надо, функция должна возвращать какое-либо значение.
Reply
#13

Quote:
Originally Posted by OKStyle
View Post
Надо, функция должна возвращать какое-либо значение.
В данном паблике оператор можно не использовать, ведь при компиляции инструкция retn будет автоматически генерироваться (return 0).

Code:
zero.pri ; Нуль
retn
Reply
#14

Ога, а потом будут вопросы на форуме про рассинхронизацию и неверные результаты выполнения функций.
Reply
#15

Quote:
Originally Posted by OKStyle
View Post
про рассинхронизацию и неверные результаты выполнения функций.
Это имеет значение в самповских колбеках (OnPlayerText, OnPlayerUpdate), никто не спорит, но в своих созданных колбеках это не нужно (если не предусмотренно конечно).
Вот вырезка из ассемблерного кода, действительно видно, что там 1.
PHP Code:
proc    OnPlayerUpdate
...
const.
pri 1
retn 
Приведи реальные примеры раз на то пошло, вообще это будет не по теме, но всё же)
Reply
#16

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

pawn Code:
public OnPlayerUpdate(playerid)
{
<...>
if(!....) return SetTimerEx("UnfreezeSpawn", 2000, false, "i", playerid);
return 1;
}
Reply
#17

Quote:
Originally Posted by OKStyle
View Post
Вся структура программирования построена на возвратах
Ну всё равно можно и без них обойтись (если нет надобности в этом). Даже в C++ есть спецификатор типа void, который предназначен для того, чтобы дать понять ф-ии, что она ничего не возвращает.
Пример на C++:
PHP Code:
void FuncPrintMsg()
{
    print(
"Hello world!");

Пример на Pawn:
PHP Code:
// return обязателен
bool:IsPlayerRcon(playerid)
{
    return 
rcon{playerid} ? true false;
}
// return явно не обязателен
SpecMsg(playeridbool:status)
{
    if (
status)
    {
        
SendClientMessage(playerid, -1"Вы вошли в спек");
    }
    else
    {
        
SendClientMessage(playerid, -1"Вы вышли из спека");
    }

Reply
#18

Только ты не забывай, что ретурн не только указывает на выход из функции, но и прерывает её в нужный момент. Я вообще-то не планировал разводить дискуссию на тему необходимости ретурнов, это должно было быть очевидным))
Reply
#19

Quote:
Originally Posted by OKStyle
View Post
но и прерывает её в нужный момент
да ладно, первый раз слышу
Reply
#20

Черт возьми,исправил данную ошибку,теперь все работает как часы,то-есть дырка была в том что когда игрок заходил в игру у него срабатывал таймер с анимкой,который перебивал всё. Можете закрыть тему,спасибо за советы.
Reply


Forum Jump:


Users browsing this thread: