PbSetColor перекрывает hud

oleg_nelasy

Участник
Сообщения
664
Реакции
46
На сервере использую мод prophunt. Проблема следующая игроку за кт на время отведённое для того чтобы спрятались т выключаю экран, при этом у игрока на это время также закрывается hud которым я вывожу для игрока при нажатии на таб сколько времени осталось до смены карты. Можно каким-нибудь образом отрисовывать худ поверх закрашенного экрана?

Плагин с помощью которого вывожу время до конца карты при нажатии на таб.

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include sdktools
#undef REQUIRE_PLUGIN
#include mapchooser
#define REQUIRE_PLUGIN

#define channel 5

bool g_bMapChooser;

public void OnPluginStart()
{
    g_bMapChooser = LibraryExists("mapchooser");
    LoadTranslations("plugin.PanoramaTimeLeft");
}

stock void ShowGameText(int iClient, int iChannel, int color[4], float x, float y, float time, char[] sText)
{
    SetHudTextParamsEx(x, y, time, color, _, 0, 0.0, 0.0, 0.0);
    ShowHudText(iClient,iChannel, sText);
}

public void OnLibraryRemoved(const char[] sName)
{
    if (strcmp(sName, "mapchooser") == 0)
    {
        g_bMapChooser = false;
    }
}

public void OnLibraryAdded(const char[] sName)
{
    if (strcmp(sName, "mapchooser") == 0)
    {
        g_bMapChooser = true;
    }
}

public void OnPlayerRunCmdPost(int iClient, int buttons, int impulse, const float vel[3], const float angles[3], int weapon, int subtype, int cmdnum, int tickcount, int seed, const int mouse[2])
{
    static int _buttons[MAXPLAYERS+1];
    static int _iTime[MAXPLAYERS+1];
    
    if(buttons & IN_SCORE)
    {
        int iTime = GetTime();
        if(_buttons[iClient] & IN_SCORE)
        {
            if(_iTime[iClient] < iTime)
            {
                ShowInfo(iClient); //Обновляем инфу
            }
        }
        else ShowInfo(iClient); //Отображаем сразу после нажатия
        
        _iTime[iClient] = iTime;
    }
    else
    {
        if(_buttons[iClient] & IN_SCORE)
        {
            ShowGameText(iClient, channel, { 0, 0, 0, 0 }, 0.0, 0.0, 0.0, "");
        }
    }
    
    _buttons[iClient] = buttons;
}

void ShowInfo(int iClient)
{
    int timeleft;
    char sBuf[256];
    GetMapTimeLeft(timeleft);
    SetGlobalTransTarget(iClient);
    if(timeleft > 0) FormatEx(sBuf, sizeof sBuf, "%t", "Until the end of the map", timeleft / 60, timeleft % 60);
    else FormatEx(sBuf, sizeof sBuf, "%t", "Last round");
    
    if(g_bMapChooser && !(EndOfMapVoteEnabled() && !HasEndOfMapVoteFinished()))
    {
        char sMap[PLATFORM_MAX_PATH];
        GetNextMap(sMap, sizeof sMap);
        GetMapDisplayName(sMap, sMap, sizeof sMap);
        Format(sBuf, sizeof sBuf, "%t", "The next map", sBuf, sMap);
    }
    ShowGameText(iClient, channel, { 232, 232, 232, 255 }, 0.01, 0.45, 1.1, sBuf);
}

Таким образом выключаю игроку экран

C-подобный:
stock void Client_Blind(int iClient, bool blind = false)
{
    Handle hFadeClient = StartMessageOne("Fade", iClient);
    PbSetInt(hFadeClient, "duration", 1);
    PbSetInt(hFadeClient, "hold_time", 3);
    
    if (blind)
        PbSetInt(hFadeClient, "flags", FFADE_STAYOUT);
    else PbSetInt(hFadeClient, "flags", FFADE_PURGE);
    
    int color[] = {0, 0, 0, 255}; //TODO change color based on countdown
    PbSetColor(hFadeClient, "clr", color);
    EndMessage();
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
Так не PbSetColor() перекрывает HUD, а эффект "Fade".
 

oleg_nelasy

Участник
Сообщения
664
Реакции
46
Так не PbSetColor() перекрывает HUD, а эффект "Fade".
Можете пожалуйста объяснить как это работает?
Сообщения автоматически склеены:

Прошу прошение блокирует другой код выше я облежался.

После того как отрабатывает этот код при нажатии на таб худ не отрабатывает. Объясните код почему именно не отрабатывает пожалуйста. Насколько я понял этим методом запрещают игроку двигать камерой.

C-подобный:
stock void Client_BlockControls(int iClient, bool block = false)
{
    static int iFreeze = -1;
    
    if(iFreeze == -1)
        iFreeze = FindSendPropInfo("CBasePlayer", "m_fFlags");
    
    if(block)
    SetEntData(iClient, iFreeze, FL_CLIENT | FL_ATCONTROLS, 4, true);
    else SetEntData(iClient, iFreeze, FL_FAKECLIENT | FL_ONGROUND | FL_PARTIALGROUND, 4, true);
}
 
Последнее редактирование:
Сверху Снизу