SetPlayerColor через SetTimer
#1

Здравствуйте.
Прошу помочь мне.
Суть заключается в следующем:

Code:
   if(newkeys == 8192 && (GetTickCount() - lol[playerid]) > 2100)
   {
	SetPlayerColor(playerid,0xFF0080AA);
	new string[STR], tmpcolour;
    switch(Player[playerid][pTeam])
    {
    case T_REF: tmpcolour = 0x000000;
    case T_DEF: tmpcolour = 0x000000;
    case T_ATT: tmpcolour = 0x000000;
    default:
    {
    SendClientMessage(playerid, 0x000000, " чёчё ");
    return 0;
    }
	}
    format(string,STR,"> %s: ыть", Playername(playerid));
    for(new i; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(Player[playerid][pTeam] == Player[i][pTeam])
    {
   	SendClientMessage(i, tmpcolour, string);
    }
    }
    }
    lol[playerid] = GetTickCount();
    }
Как сделать чтобы игроку после нажатия NUM'a выдавался цвет на (допустим) 5 секунд...
Потому что
Code:
	SetPlayerColor(playerid,0xFF0080AA);
Это бред . Он на всегда вешается.

--------
Я так предположил что потребуется использование таймера .... но боже мой я весь вечер сижу над этой функцией и ни чгео не выходит(((
Сжальтесь, потратьте пару минут своего драгоценного времени чтобы досконально помочь мне..
Заранее огромное спасибо!


P.S.
Прошу вас, не нужно кидать ссылки на вики и т.д. и т.п. .
Просто впишите в этот код то что будет работать и то что нужно мне.
Ещё раз спасибо за внимание и за будущую помощь. =)
Reply
#2

pawn Code:
#define RELEASED(%0) \
    (((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))
   
#define COLOR_TIME 5 //время на которое выдяется цвет, в секундах

new ChangeColor[MAX_PLAYERS],OldColor[MAX_PLAYERS];//массивы для хранения времени и старого цвета.

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if (RELEASED(KEY_ANALOG_UP))//при отпускании клавиши NUM_8
    {
        OldColor[playerid] = GetPlayerColor(playerid);//записываем цвет в массив, не забываем что не работает если не задать цвет при коннекте!
        SetPlayerColor(playerid,0xffffffff);//меняем цвет на нужный, в данном примере белый
        ChangeColor[playerid] = gettime()+COLOR_TIME;//устанавливаем метку времени
    }
    return 1;
}

public OnPlayerUpdate(playerid)
{
    if(0 < ChangeColor[playerid] <= gettime())//проверяем метку времени
    {
        SetPlayerColor(playerid,OldColor[playerid]);//меняем цвет на старый
        ChangeColor[playerid] = 0;//удаляем метку времени
    }
    return 1;
}
Reply
#3

PHP Code:
public OnPlayerUpdate(playerid)
{
    new 
Keys,ud,lr;
    
GetPlayerKeys(playerid,Keys,ud,lr);
    
    
#pragma unused ud
    #pragma unused lr
    
if(Keys == КАКАЯ ТАМ КНОПКА && GetPVarInt(playerid"player_color_change") != 1)
    {
        
SetPVarInt(playerid"player_color_change"1);
        
SetPVarInt(playerid"old_color"GetPlayerColor(playerid));
        
SetPVarInt(playerid"cur_timestamp"gettime());
        
SetPlayerColor(playeridЦВЕТ НА КОТОРЫЙ НУЖНО ИЗМЕНИТЬ);
    }
    if(
GetPVarInt(playerid"player_color_change") == && (gettime() - GetPVarInt(playerid"cur_timestamp") == 5// 5 кол-во секунд
    
{
        
SetPlayerColor(GetPVarInt(playerid"old_color");
        
SetPVarInt(playerid"player_color_change"0);
    }

Вроде так
Reply
#4

Quote:
Originally Posted by Romanius
View Post
Вроде так
неработоспособный код: PRESSED(%0) работает только в public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
Reply
#5

подправил))
Reply
#6

я бы не стал вызывать gettime в OnPlayerUpdate.
мб лучше с помощью SetTimerEx вызывать функцию меняющую цвет игрока обратно с интервалом в 5 секунд.
Reply
#7

пример предоставь! плз
Reply
#8

ах да, Степашк) =* спасибо помог))
-----
п.с.
у ттебя более раскрытый и понятный ответ -_-
но и у романиуса тож четко все...
Reply
#9

Quote:
Originally Posted by Maccer
View Post
я бы не стал вызывать gettime в OnPlayerUpdate.
это интерпретация стандартной функции С, чего вам в ней не понравилось?
Reply
#10

Quote:
Originally Posted by Stepashka
View Post
это интерпретация стандартной функции С, чего вам в ней не понравилось?
я видел тут есть тема на форуме по оптимизации кода. так вот, использовать OnPlayerUpdate, когда можно обойтись без него и для таких случаев как у топикстартера есть специальная функция, это плохой пример оптимизации кода )

как пишут в вики:
Quote:

This callback is called very frequently per second per player, only use it when you know what it's meant for.

То есть много раз в секунду на игрока, чем больше игроков тем еще больше раз в секунду мы будем смотреть сколько у нас времени.
Это наверное не очень критично, но если можно обойтись без этого, то зачем так делать?

ЗЫ: более того, если использовать SetTimerEx - не придется создавать массивы для старых/новых цветов.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)