Иконка ресурса

Grey83

не пишу плагины с весны 2022
Сообщения
8,830
Реакции
5,267
@ColdWind, попробуй такой вариант:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <custom_rounds>
#include <sdktools_stringtables>

public Plugin myinfo =
{
    name = "[CR] Overlays",
    author = "Саша Шеин | vk.com/sahapro33",
    version = "1.2.3_fix",
    url = "vk.com/sahapro33"
}

Handle hTimer[MAXPLAYERS+1];
char g_sOverlayBuffer[PLATFORM_MAX_PATH + 20];
float g_fTime;

public void OnPluginStart()
{
    ConVar convar;
    (convar = CreateConVar("sm_cr_overlay_delay", "3.0", "How long will the overlay be displayed.", _, true, 1.0)).AddChangeHook(ChangeCvar_TimeDisplay);
    g_fTime = convar.FloatValue;
}

public void ChangeCvar_TimeDisplay(ConVar convar, const char[] oldValue, const char[] newValue)
{
    g_fTime = convar.FloatValue;
}

public void OnClientDisconnect(int client)
{
    if(hTimer[client]) delete hTimer[client];
}

public void CR_OnConfigSectionLoadPost(const char[] sName)
{
    char buffer[PLATFORM_MAX_PATH];
    KeyValues kvCR = CR_GetKeyValue();
    kvCR.GetString("overlay", buffer, sizeof(buffer));
    if (!buffer[0])
    {
        return;
    }
  
    PrecacheDecal(buffer);
  
    Format(buffer, sizeof(buffer), "materials/%s", buffer);
    AddFileToDownloadsTable(buffer);
    ReplaceString(buffer, sizeof(buffer), ".vmt", ".vtf");
    AddFileToDownloadsTable(buffer);
}

public void CR_OnRoundStart(KeyValues Kv)
{
    if (Kv)
    {
        char buffer[PLATFORM_MAX_PATH];
        Kv.GetString("overlay", buffer, sizeof(buffer), "");
        if (buffer[0]) {
            FormatEx(g_sOverlayBuffer, sizeof(g_sOverlayBuffer), "r_screenoverlay \"%s\"", buffer);
        }
    } else {
        g_sOverlayBuffer[0] = 0;
    }
}

public void CR_OnPlayerSpawn(int client, KeyValues Kv) {
    if (g_sOverlayBuffer[0]) {
        ClientCommand(client, g_sOverlayBuffer);
        hTimer[client] = CreateTimer(g_fTime, Timer_ClearOverlay, client);
    }
}

public Action Timer_ClearOverlay(Handle timer, int client)
{
    hTimer[client] = null;
    ClientCommand(client, "r_screenoverlay \"\"");

    return Plugin_Stop;
}
Набирал на смарте в блокноте, так что нужно ещё проверить компилится ли.

UPD поправил очепятку
 
Последнее редактирование:

Nekro

Терра инкогнита
Сообщения
4,186
Реакции
2,515
@ColdWind, попробуй такой вариант:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

#include <custom_rounds>
#include <sdktools_stringtables>

public Plugin myinfo =
{
    name = "[CR] Overlays",
    author = "Саша Шеин | vk.com/sahapro33",
    version = "1.2.3_fix",
    url = "vk.com/sahapro33"
}

Handle hTimer[MAXPLAYERS+1];
char g_sOverlayBuffer[PLATFORM_MAX_PATH + 20];
float g_fTime;

public void OnPluginStart()
{
    ConVar convar;
    (convar = CreateConVar("sm_cr_overlay_delay", "3.0", "How long will the overlay be displayed.", _, true, 1.0)).AddChangeHook(ChangeCvar_TimeDisplay);
    g_fTime = convar.FloatValue;
}

public void ChangeCvar_TimeDisplay(ConVar convar, const char[] oldValue, const char[] newValue)
{
    g_fTime = convar.FloatValue;
}

public void OnClientDisconnect(int client)
{
    if(hTimer[client]) delete hTimer[client];
}

public void CR_OnConfigSectionLoadPost(const char[] sName)
{
    char buffer[PLATFORM_MAX_PATH];
    KeyValues kvCR = CR_GetKeyValue();
    kvCR.GetString("overlay", buffer, sizeof(buffer));
    if (!buffer[0])
    {
        return;
    }
 
    PrecacheDecal(buffer);
 
    Format(buffer, sizeof(buffer), "materials/%s", buffer);
    AddFileToDownloadsTable(buffer);
    ReplaceString(buffer, sizeof(buffer), ".vmt", ".vtf");
    AddFileToDownloadsTable(buffer);
}

public void CR_OnRoundStart(KeyValues Kv)
{
    if (Kv)
    {
        char buffer[PLATFORM_MAX_PATH];
        Kv.GetString("overlay", buffer, sizeof(buffer), "");
        if (buffer[0]) {
            FormatEx(g_sOverlayBuffer, sizeof(g_sOverlayBuffer), "r_screenoverlay \"%s\"", buffer);
        }
    } else {
        g_sOverlayBuffer[0] = 0;
    }
}

public void CR_OnPlayerSpawn(int client, KeyValues Kv) {
    if (g_sOverlayBuffer[0]) {
        ClientCommand(client, g_sOverlayBuffer);
        hTimer[client] = CreateTimer(g_fTime, Timer_ClearOverlay, client);
    }
}

public Action Timer_ClearOverlay(Handle timer, int client)
{
    hTimer[client] = null;
    ClientCommand(client, "r_screenoverlay \"\"");

    return Plugin_Stop;
}
Набирал на смарте в блокноте, так что нужно ещё проверить компилится ли.

UPD поправил очепятку
А почему предпочтения именно к ChangeCvar? Именно громоздкие
C-подобный:
float g_fTime;

public void OnPluginStart()
{
    ConVar convar;
    (convar = CreateConVar("sm_cr_overlay_delay", "3.0", "How long will the overlay be displayed.", _, true, 1.0)).AddChangeHook(ChangeCvar_TimeDisplay);
    g_fTime = convar.FloatValue;
}

public void ChangeCvar_TimeDisplay(ConVar convar, const char[] oldValue, const char[] newValue)
{
    g_fTime = convar.FloatValue;
}

А не коротко

C-подобный:
ConVar cvTime;

public void OnPluginStart()
{
    cvTime = CreateConVar("sm_cr_overlay_delay", "3.0", "How long will the overlay be displayed.", _, true, 1.0);
}

Это привычка или технически чем то лучше?
 

VeNoM`1K =))

Живи и ошибайся. В этом жизнь.
Сообщения
723
Реакции
285
Фикса нет не у кого?
Сообщения автоматически склеены:

фикс
Все отлично! Спасибо. Но теперь баг и он оказывается и до этого был. Когда ноу зум раунд и меняешь карту , постоянный ноу зум , даже смена карты не помогает :) Только рестарт помогает.
Если можете фиксануть это - был бы благодарен.
 

Synd1qate

Участник
Сообщения
1,000
Реакции
466
Все отлично! Спасибо. Но теперь баг и он оказывается и до этого был. Когда ноу зум раунд и меняешь карту , постоянный ноу зум , даже смена карты не помогает :) Только рестарт помогает.
Если можете фиксануть это - был бы благодарен.
Добавить:
public void OnMapStart() { g_sOverlayBuffer[0] = '\0'; }
И в CR_OnRoundStart удалить CreateTimer(g_fTime, Timer_ClearOverlay);
 
Сверху Снизу