Написание плагинов

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
Всем привет, подскажите пожалуйста, как сделать проверку на то вышло ли время закупа
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
Проверить значение квара и таймер от старта раунда по 1 секунде отсчёт
Не думал с этой точки зрения. Хорошо понял, спасибо
Сообщения автоматически склеены:

Проверить значение квара и таймер от старта раунда по 1 секунде отсчёт
Подскажите пожалуйста, как это реализовать
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,805
Реакции
5,254
@7pElllHuK, что именно?
Отлов значения переменной?
C-подобный:
"mp_buytime" = "1.5" ( def. "1.5" ) min. 0.250000
 game replicated
 - How many minutes after round start players can buy items for.
Отлов события round_start?
Или создание таймера?
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,839
Не думал с этой точки зрения. Хорошо понял, спасибо
Сообщения автоматически склеены:


Подскажите пожалуйста, как это реализовать
C-подобный:
float globalCounter = 0.0;
Handle g_hTimer;

public void OnPluginStart()
{
    HookEvent("round_start", rs);
}

public void rs(Event hEvent, const char[] sEvent, bool bdb)
{
    globalCounter = 0.0;
   
    if(g_hTimer != null) delete g_hTimer;
    g_hTimer = null;
   
    g_hTimer = CreateTimer(0.1, Updater, _, TIMER_REPEAT);
}

public Action Updater(Handle hTimer)
{
    globalCounter++;
   
    if(globalCounter >= GetConVarFloat(FindConVar("mp_buytime")))
    {
        if(g_hTimer != null) delete g_hTimer;
        g_hTimer = null;
        PrintToChatAll("Закуп запрещен!");
        return Plugin_Stop;
    }
    return Plugin_Continue;
}
 
Последнее редактирование:

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
C-подобный:
float globalCounter = 0.0;
Handle g_hTimer;

public void OnPluginStart()
{
    HookEvent("round_start", rs);
}

public void rs(Event hEvent, const char[] sEvent, bool bdb)
{
    globalCounter = 0.0;
   
    if(g_hTimer != null) delete g_hTimer;
    g_hTimer = null;
   
    g_hTimer = CreateTimer(0.1, Updater, _, TIMER_REPEAT);
}

public Action Updater(Handle hTimer)
{
    globalCounter++;
   
    if(globalCounter >= GetConVarFloat(FindConVar("mp_buytime")))
    {
        if(g_hTimer != null) delete g_hTimer;
        g_hTimer = null;
        PrintToChatAll("Закуп запрещен!");
    }
    return Plugin_Continue;
}
Спасибо большое
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,805
Реакции
5,254
@Palonez, строки 14, и 25 можно удалить.

Таймер у тебя срабатывает 10 раз в секунду, а у квара значение в минутах.

Кроме того эффект изменения значения квара почуствуется только в следующем раунде, емнип. Поэтому значение квара лучше получать в момент запуска таймера и сохранять во float. И с ним уже сравнивать значение счётчика.
Но лучше сохранить не значение квара, а время когда таймер должен остановиться. =)
Это в случае если нужно реализовать отсчёт.

Если же требуется только сообщить об окончании, то достаточно будет вот этого:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

Handle hTimer;

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start);
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    if(hTimer) CloseHandle(hTimer);

    static ConVar hCVar;
    if(hCVar || (hCVar = FindConVar("mp_buytime"))) hTimer = CreateTimer(hCVar.FloatValue * 60, Timer_End);
}

public Action Timer_End(Handle timer)
{
    hTimer = null;
    PrintToChatAll("Закуп запрещен!");
    return Plugin_Stop;
}
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
@7pElllHuK, что именно?
Отлов значения переменной?
C-подобный:
"mp_buytime" = "1.5" ( def. "1.5" ) min. 0.250000
 game replicated
 - How many minutes after round start players can buy items for.
Отлов события round_start?
Или создание таймера?
Спасибо большое, уже разобрался
Сообщения автоматически склеены:

@Palonez, строки 14, и 25 можно удалить.

Таймер у тебя срабатывает 10 раз в секунду, а у квара значение в минутах.

Кроме того эффект изменения значения квара почуствуется только в следующем раунде, емнип. Поэтому значение квара лучше получать в момент запуска таймера и сохранять во float. И с ним уже сравнивать значение счётчика.
Но лучше сохранить не значение квара, а время когда таймер должен остановиться. =)
Это в случае если нужно реализовать отсчёт.

Если же требуется только сообщить об окончании, то достаточно будет вот этого:
C-подобный:
#pragma semicolon 1
#pragma newdecls required

Handle hTimer;

public void OnPluginStart()
{
    HookEvent("round_start", Event_Start);
}

public void Event_Start(Event event, const char[] name, bool dontBroadcast)
{
    if(hTimer) CloseHandle(hTimer);

    static ConVar hCVar;
    if(hCVar || (hCVar = FindConVar("mp_buytime"))) hTimer = CreateTimer(hCVar.FloatValue * 60, Timer_End);
}

public Action Timer_End(Handle timer)
{
    hTimer = null;
    PrintToChatAll("Закуп запрещен!");
    return Plugin_Stop;
}
Подскажите пожалуйтста, в чем разница между timer = INVALID_HANDLE и timer = null
И в чем разница между CloseHandle и KillTimer
Вроде все одно и тоже
 
Последнее редактирование:

Grey83

не пишу плагины с весны 2022
Сообщения
8,805
Реакции
5,254
в чем разница между timer = INVALID_HANDLE и timer = null
INVALID_HANDLE - это запись согласно старому синтакису, а null - новому:
Кстати: This page was last edited on 4 February 2015, at 18:52 Т.е. новому синтаксису уже больше 8 лет.
в чем разница между CloseHandle и KillTimer
Вроде все одно и тоже
нет, не одно и то же:
C-подобный:
/**
 * Closes a Handle.  If the handle has multiple copies open,
 * it is not destroyed unless all copies are closed.
 *
 * @note Closing a Handle has a different meaning for each Handle type.  Make
 *       sure you read the documentation on whatever provided the Handle.
 *
 * @param hndl      Handle to close.
 * @error           Invalid handles will cause a run time error.
 */
native void CloseHandle(Handle hndl);
C-подобный:
/**
 * Kills a timer.  Use this instead of CloseHandle() if you need more options.
 *
 * @param timer         Timer Handle to kill.
 * @param autoClose     If autoClose is true, the data that was passed to CreateTimer() will
 *                      be closed as a handle if TIMER_DATA_HNDL_CLOSE was not specified.
 * @error               Invalid handles will cause a run time error.
 */
native void KillTimer(Handle timer, bool autoClose=false);
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
INVALID_HANDLE - это запись согласно старому синтакису, а null - новому:
Кстати: This page was last edited on 4 February 2015, at 18:52 Т.е. новому синтаксису уже больше 8 лет.

нет, не одно и то же:
C-подобный:
/**
 * Closes a Handle.  If the handle has multiple copies open,
 * it is not destroyed unless all copies are closed.
 *
 * @note Closing a Handle has a different meaning for each Handle type.  Make
 *       sure you read the documentation on whatever provided the Handle.
 *
 * @param hndl      Handle to close.
 * @error           Invalid handles will cause a run time error.
 */
native void CloseHandle(Handle hndl);
C-подобный:
/**
 * Kills a timer.  Use this instead of CloseHandle() if you need more options.
 *
 * @param timer         Timer Handle to kill.
 * @param autoClose     If autoClose is true, the data that was passed to CreateTimer() will
 *                      be closed as a handle if TIMER_DATA_HNDL_CLOSE was not specified.
 * @error               Invalid handles will cause a run time error.
 */
native void KillTimer(Handle timer, bool autoClose=false);
Спасибо большое
Сообщения автоматически склеены:

Всем привет, подскажите пожалуйста, как очистить игроку Cookies
 
Последнее редактирование:

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
969
Реакции
279
Всем привет!
Если кому не сложно,накидайте пожалуйста простенький плагин.
Чтоб при команде в чат,давало скорость на 2-3 секунды.
Заранее благодарю.
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,839
Всем привет!
Если кому не сложно,накидайте пожалуйста простенький плагин.
Чтоб при команде в чат,давало скорость на 2-3 секунды.
Заранее благодарю.
C++:
bool inSpeed[MAXPLAYERS+1];

public void OnClientPutInServer(int client)
{
    inSpeed[client] = false;
}

public void OnClientDisconnect(int client)
{
    inSpeed[client] = false;
}

public void OnPluginStart()
{
    RegConsoleCmd("sm_speedme", speedme);
}

public Action speedme(int client, int args)
{
    if(!inSpeed[client])
    {
        SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 5.0);
        inSpeed[client] ^= true;
        CreateTimer(2.0, ff, client);
    }
    return Plugin_Handled;
}

public Action ff(Handle hTimer, int client)
{
    if(IsClientInGame(client))
    {
        SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.0);
        inSpeed[client] ^= true;
    }
    return Plugin_Continue;
}
Сообщения автоматически склеены:

Спасибо большое
Сообщения автоматически склеены:

Всем привет, подскажите пожалуйста, как очистить игроку Cookies
Куки представляют собой sqlite базу данных. Очистить данные конкретного клиента можно спокойно, если ты знаешь по каким условиям их чистить и какие куки по тому же принципу, как ты чистишь данные в бд, не совсем конечно так. Например зная steamid или ник, ты можешь изменить значение куков на невалидное для клиента
 
Последнее редактирование:

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
969
Реакции
279
C++:
bool inSpeed[MAXPLAYERS+1];

public void OnClientPutInServer(int client)
{
    inSpeed[client] = false;
}

public void OnClientDisconnect(int client)
{
    inSpeed[client] = false;
}

public void OnPluginStart()
{
    RegConsoleCmd("sm_speedme", speedme);
}

public Action speedme(int client, int args)
{
    if(!inSpeed[client])
    {
        SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 5.0);
        inSpeed[client] ^= true;
        CreateTimer(2.0, ff, client);
    }
    return Plugin_Handled;
}

public Action ff(Handle hTimer, int client)
{
    if(IsClientInGame(client))
    {
        SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.0);
        inSpeed[client] ^= true;
    }
    return Plugin_Continue;
}
Сообщения автоматически склеены:


Куки представляют собой sqlite базу данных. Очистить данные конкретного клиента можно спокойно, если ты знаешь по каким условиям их чистить и какие куки по тому же принципу, как ты чистишь данные в бд, не совсем конечно так. Например зная steamid или ник, ты можешь изменить значение куков на невалидное для клиента
Время если будет,добавь пожалуйста чтоб можно было использовать один раз за раунд.
Что-то сразу не подумал написать.
Заранее благодарю!
А так все четко работает
 

7pElllHuK

Участник
Сообщения
1,654
Реакции
639
Время если будет,добавь пожалуйста чтоб можно было использовать один раз за раунд.
Что-то сразу не подумал написать.
Заранее благодарю!
А так все четко работает
Код:
bool inSpeed[MAXPLAYERS+1];
int iLimitSpeed[MAXPLAYERS+1];

public void OnClientPutInServer(int client)
{
    inSpeed[client] = false;
}

public void OnClientDisconnect(int client)
{
    inSpeed[client] = false;
}

public void OnPluginStart()
{
    RegConsoleCmd("sm_speedme", speedme);
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i))
    {
        iLimitSpeed[i] = 1;
    }
}

public Action speedme(int client, int args)
{
    if(!inSpeed[client] && iLimitSpeed[client] > 0)
    {
        SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 5.0);
        inSpeed[client] ^= true;
        CreateTimer(2.0, ff, client);
        iLimitSpeed[client]--;
        return Plugin_Continue;
    }
    return Plugin_Handled;
}

public Action ff(Handle hTimer, int client)
{
    if(IsClientInGame(client))
    {
        SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.0);
        inSpeed[client] ^= true;
    }
    return Plugin_Continue;
}
}
Проверь, должно работать
 

-=|УЧЕНИК|=-

вся жизнь,сплошной цирк.
Сообщения
969
Реакции
279
Код:
bool inSpeed[MAXPLAYERS+1];
int iLimitSpeed[MAXPLAYERS+1];

public void OnClientPutInServer(int client)
{
    inSpeed[client] = false;
}

public void OnClientDisconnect(int client)
{
    inSpeed[client] = false;
}

public void OnPluginStart()
{
    RegConsoleCmd("sm_speedme", speedme);
    HookEvent("round_start", Event_RoundStart, EventHookMode_PostNoCopy);
}

public void Event_RoundStart(Event hEvent, const char[] sEvName, bool bDontBroadcast)
{
    for(int i = 1; i <= MaxClients; i++) if(IsClientInGame(i) && !IsFakeClient(i))
    {
        iLimitSpeed[i] = 1;
    }
}

public Action speedme(int client, int args)
{
    if(!inSpeed[client] && iLimitSpeed[client] > 0)
    {
        SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 5.0);
        inSpeed[client] ^= true;
        CreateTimer(2.0, ff, client);
        iLimitSpeed[client]--;
        return Plugin_Continue;
    }
    return Plugin_Handled;
}

public Action ff(Handle hTimer, int client)
{
    if(IsClientInGame(client))
    {
        SetEntPropFloat(client, Prop_Send, "m_flLaggedMovementValue", 1.0);
        inSpeed[client] ^= true;
    }
    return Plugin_Continue;
}
}
Проверь, должно работать
Вроде все четко
 
Сверху Снизу