Открыть меню при нажатии кнопки на клавиатуре.

Тема в разделе "Программирование / Скриптинг", создана пользователем pokypka20, 1 авг 2014.

  1. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Подскажите как можно открыть игроку меню, или выполнять команду при нажатии кнопки на клавиатуре? тоесть: чтобы открыть меню сервера нажмите F2 допустим.
     
  2. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Оффтоп
     
  3. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Я смотрел полностью всю тему сриптинг и брал всё что мне казалось интерестным, а то чего я не нашол спрашиваю.
     
  4. Sokret

    Sokret

    Сообщения:
    34
    Симпатии:
    3
    вот
    public OnPluginStart()
    {
    RegConsoleCmd("rebuy", test);
    }

    public Action:test(client, args)
    {
    FakeClientCommand(client, "say ку")
    }
     
    pokypka20 нравится это.
  5. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
  6. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Подскажите в чём проблема?

    PHP:
    #include <sourcemod>
    new Handle:FastProm[MAXPLAYERS+1];
    public 
    OnPluginStart() HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);

    public 
    OnClientDisconnect(client
     { 
         if (
    FastProm[client] != INVALID_HANDLE
         { 
             
    KillTimer(FastProm[client]); 
             
    FastProm[client] = INVALID_HANDLE
         } 
     }

    public 
    Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    client=GetClientOfUserId(GetEventInt(event"userid"));
        
    FakeClientCommand(client"say wcs_play");
        
    FastProm[client] = CreateTimer(60.0FastProm_Openclient);
    }

    public 
    Action:FastProm_Open(Handle:timerany:client

        
    FakeClientCommand(client"say wcs_stop");
        
    FastProm[client] = INVALID_HANDLE
    }
    Мне кажется ошибка с таймером, но всё же ничего не работает))
     
  7. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    В событии начала раунда нельзя получить клиента. Используй цикл.
    Здесь так делать плохо. Ставь циклом после таймера.
     
    pokypka20 нравится это.
  8. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    с первым я разобрался, а что значит это?

    PHP:
    #include <sourcemod>
    new Handle:FastProm[MAXPLAYERS+1];
    public 
    OnPluginStart() HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);

    public 
    OnClientDisconnect(i
     { 
         if (
    FastProm[i] != INVALID_HANDLE
         { 
             
    KillTimer(FastProm[i]); 
             
    FastProm[i] = INVALID_HANDLE
         } 
     }

    public 
    Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
        for(new 
    i=1<= MaxClientsi++)
        {
        
    FakeClientCommand(i"say wcs_play");
        
    FastProm[i] = CreateTimer(60.0FastProm_Openi);
        }
    }

    public 
    Action:FastProm_Open(Handle:timerany:i
    {
        
    FakeClientCommand(i"say wcs_stop");
        
    FastProm[i] = INVALID_HANDLE
    }
     
  9. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    Зачем получать клиента заранее, если действие для него выполнятся через минуту? За это время он может выйти. И вообще, создавать таймер для каждого (по факту), когда действие всегда выполняется у всех одновременно и в начале, и в конце?
    Дальше таймер отдельный от i. Лучше ещё раз циклом. А вообще, если игрок зайдёт чуть позже начала раунда, то игра его отспавнит, а твоя команда не сработает. Получается баг.
    В итоге, начинай команду от спавна.
     
    Последнее редактирование: 3 авг 2014
  10. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Если игрок возродиться второй раз или зайдёт позже команда и не должна сработать, можеш подсказать как правильно сделать, мне немного не понятно в чем ошибка и где я получал клиента заранее, и как выполнить команду игроку чтобы сильно не нагружало сервер.

    Смысл в начале раунда нужно включить команду, через минуту выключить. (минута это образно, задержка будет секунд 10.)
     
  11. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    Не обязательно второй. Только присоединился к серверу, а раунд начат. Если он зайдёт за команду, КТ например, через несколько секунд после этого, то его сама игра возродит, а твоя фишка не сработает. Тебе такое нужно?
    А, если, как у тебя, то предлагаю так:
    PHP:
    new Handle:FastProm;

    public 
    OnPluginStart() HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);

    public 
    Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
        if (
    FastProm != INVALID_HANDLEKillTimer(FastProm);
        else
        {
            for (new 
    1<= MaxClientsi++)
            {
                if (
    IsClientInGame(i)) FakeClientCommand(i"say wcs_play");
            }
        }
        
    FastProm CreateTimer(60.0FastProm_Open);
    }

    public 
    Action:FastProm_Open(Handle:timer)
    {
        
    FastProm INVALID_HANDLE;
        for (new 
    1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i)) FakeClientCommand(i"say wcs_stop");
        }  
    Это стоит делать в случае, если wcs сам не отключается командой wcs_stop при смерти игрока, конце раунда и т.д.
    PHP:
    new Handle:FastProm;

    public 
    OnPluginStart() HookEvent("round_start"Event_RoundStartEventHookMode_PostNoCopy);

    public 
    Event_RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
    {
        if (
    FastProm != INVALID_HANDLEKillTimer(FastProm);
        for (new 
    1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i)) FakeClientCommand(i"say wcs_play");
        }
        
    FastProm CreateTimer(60.0FastProm_Open);
    }

    public 
    Action:FastProm_Open(Handle:timer)
    {
        
    FastProm INVALID_HANDLE;
        for (new 
    1<= MaxClientsi++)
        {
            if (
    IsClientInGame(i)) FakeClientCommand(i"say wcs_stop");
        }  
     
    Последнее редактирование: 3 авг 2014
    pokypka20 нравится это.
  12. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Вопрос, если у меня есть таймер:
    PHP:
    CreateTimer(5.0Timer_Votevictim);
    PrintHintText(client"Вы возродитесь через: %d", ???);
    Как можно получить значение таймера чтобы вывести его вместо %d ?
    Можно ли отлавливать сколько осталось на таймере? Тоесть не просто вывести 5 сек, а выводить каждую секунду до остановки таймера (обновлять).
     
  13. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    Насколько я знаю - никак. Если бы на это был натив, то этим давно пользовались и не создавали повторяющихся таймеров показа остатка времени.
     
  14. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Можеш пожалуйста показать пример как сделать повторяющимся таймером, главное чтобы показывало значение до того пока игрок возродиться.
     
  15. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    Не известно, чего ты хочешь конкретно сделать, относительно чего? Что выставляет значение времени? Другой плагин воскрешения или же ты сам воскрешаешь игра?
    А так, начать таймер со смерти игрока (хукнуть событие).
     
  16. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Это чисто пример как должно получиться, просто чтобы показать.

    PHP:
    new Handle:FastProm[MAXPLAYERS+1];

    public 
    OnPluginStart() 
    {
        
    HookEvent("player_death"Event_PlayerDeathEventHookMode_PostNoCopy); 
    }

    public 
    Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast

        
    FastProm CreateTimer(5.0FastProm_Open); 
        
    PrintHintText(client"Вы возродитесь через: %d", ???); 


    public 
    Action:FastProm_Open(Handle:timer

        
    FastProm INVALID_HANDLE
        
    CS_RespawnPlayer(client);

     
  17. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.515
    Симпатии:
    1.969
    pokypka20, чисто пример и даю:
    PHP:
    new sec[MAXPLAYERS+1];

    public 
    OnPluginStart() 
    {
        
    HookEvent("player_death"Event_PlayerDeathEventHookMode_Post); 
    }

    public 
    Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        
    sec[client] = 5;
        
    CreateTimer(1.0FastProm_OpenclientTIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);


    public 
    Action:FastProm_Open(Handle:timerany:client
    {
        if (--
    sec[client] > 0)
        {
            
    PrintHintText(client"Вы возродитесь через: %d"sec[client]);
            return 
    Plugin_Continue;
        }
        else if (
    client && IsClientInGame(client)) CS_RespawnPlayer(client);
        return 
    Plugin_Stop;
    }
     
    pokypka20 нравится это.
  18. pokypka20

    pokypka20

    Сообщения:
    250
    Симпатии:
    30
    Спс, то что нужно.