Помощь с стилем для Shavit timer

sojio12

Участник
Сообщения
34
Реакции
0
Кароче, есть идея создать новый стиль для bhop, однако в sourcepawn вообще не силен, помогите вызвать повторяющийся таймер с интервалом в 6 секунд который вызывает функцию отправки сообщения когда у игрока стартует таймер(игры) и убивать таймер когда тот финиширует карту. В целом почти все готово, однако Shavit_OnUserCmdPre вызывется каждый тик и происходит бешеный спам. Не могу вызвать таймер 1 раз. Хелп!

shavit:
#include <sourcemod>
#include <sdktools>

#include <shavit>


ConVar g_hSpecialString;
char g_sSpecialString[stylestrings_t::sSpecialString];

bool g_EnforceFade[MAXPLAYERS + 1];


public Plugin myinfo =
{
    author = "",
    url = "",
    name = "",
    description = "",
    version = "0.01",
};


//Специалньая строка стиля
public void OnPluginStart()
{
    g_hSpecialString = CreateConVar("ss_fade_specialstrng", "fade", "Special string value to use in shavit-styles.cfg");
    g_hSpecialString.AddChangeHook(ConVar_OnSpecialStringChanged);
    g_hSpecialString.GetString(g_sSpecialString, sizeof(g_sSpecialString));

    AutoExecConfig();
}
//Сбрасываем стиль
public void OnClientDisconnect(int client)
{
    g_EnforceFade[client] = false;
}

//Неудачная попытка вызвать таймер
public Action Shavit_OnUserCmdPre(int client)
{
    if (!IsClientInGame(client) || !IsPlayerAlive(client) || IsFakeClient(client) || !g_EnforceFade[client])
        return Plugin_Continue;
    CreateTimer(3.0, Timermessage, GetClientUserId(client), TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}

//Таймер сообщения
public Action Timermessage(Handle hTimer, any UserId)
{
    int iClient = GetClientOfUserId(UserId);
    if(iClient)
    {
        PrintToChat(iClient, "Держи сообщение");
    }

    return Plugin_Stop;
}

//Убиваем таймер
public void Shavit_OnFinish(int client)
{
    return Plugin_Stop;
}

public void Shavit_OnStyleChanged(int client, int oldstyle, int newstyle, int track, bool manual)
{
    char sStyleSpecial[sizeof(stylestrings_t::sSpecialString)];
    Shavit_GetStyleStrings(newstyle, sSpecialString, sStyleSpecial, sizeof(sStyleSpecial));

    g_EnforceFade[client] = (StrContains(sStyleSpecial, g_sSpecialString) != -1);
}

public void ConVar_OnSpecialStringChanged(ConVar convar, const char[] oldValue, const char[] newValue)
{
    convar.GetString(g_sSpecialString, sizeof(g_sSpecialString));
}
 

Вложения

  • shavit.inc
    53 КБ · Просмотры: 3

Reiko1231

AlexTheRegent
Сообщения
508
Реакции
1,335
По идее как-то так:

1. Добавьте глобальную переменную для таймера
C-подобный:
Handle g_Timer[MAXPLAYERS + 1];
2. Добавьте сброс таймера при выходе игрока в OnClientDisconnect
C-подобный:
if (g_Timer[client] != INVALID_HANDLE)
{
    KillTimer(g_Timer[client]);
    g_Timer[client] = INVALID_HANDLE;
}
3. Перед созданием таймера проверьте, что таймер не был запущен. Если это так, то тогда запускайте его в Shavit_OnUserCmdPre
C-подобный:
if (g_Timer[client] == INVALID_HANDLE) {
    g_Timer[client] = CreateTimer(3.0, Timermessage, GetClientUserId(client), TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
4. Отключайте таймер при завершении карты
C-подобный:
public void Shavit_OnFinish(int client, int style, float time, int jumps, int strafes, float sync, int track, float oldtime, float perfs)
{
    if (g_Timer[client] != INVALID_HANDLE)
    {
        KillTimer(g_Timer[client]);
        g_Timer[client] = INVALID_HANDLE;
    }
}
 

sojio12

Участник
Сообщения
34
Реакции
0
По идее как-то так:

1. Добавьте глобальную переменную для таймера
C-подобный:
Handle g_Timer[MAXPLAYERS + 1];
2. Добавьте сброс таймера при выходе игрока в OnClientDisconnect
C-подобный:
if (g_Timer[client] != INVALID_HANDLE)
{
    KillTimer(g_Timer[client]);
    g_Timer[client] = INVALID_HANDLE;
}
3. Перед созданием таймера проверьте, что таймер не был запущен. Если это так, то тогда запускайте его в Shavit_OnUserCmdPre
C-подобный:
if (g_Timer[client] == INVALID_HANDLE) {
    g_Timer[client] = CreateTimer(3.0, Timermessage, GetClientUserId(client), TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
4. Отключайте таймер при завершении карты
C-подобный:
public void Shavit_OnFinish(int client, int style, float time, int jumps, int strafes, float sync, int track, float oldtime, float perfs)
{
    if (g_Timer[client] != INVALID_HANDLE)
    {
        KillTimer(g_Timer[client]);
        g_Timer[client] = INVALID_HA
[/QUOTE]
Благодарю, жалко что уже сам разобрался.
 
Сверху Снизу