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

alexmy

Участник
Сообщения
284
Реакции
13
а что в консоли клиента при входе на сервер?
Вообще нечего нет, в том то и дело что консоль пустая, даже не каких ошибок нет. Качаются файлы nav, txt, vmt ну и тд. кроме самих карт bsp. Главное что я нечего вообще не делал, было недавно обновление от valve, после этого и начались проблемы. Пробовал другие плагины, все они игнорят загрузку bsp файлов.
 

7pElllHuK

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

7pElllHuK

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

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

Grey83

не пишу плагины с весны 2022
Сообщения
8,520
Реакции
4,979
@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,837
Не думал с этой точки зрения. Хорошо понял, спасибо
Сообщения автоматически склеены:


Подскажите пожалуйста, как это реализовать
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,416
Реакции
465
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,520
Реакции
4,979
@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,416
Реакции
465
@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,520
Реакции
4,979
в чем разница между 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,416
Реакции
465
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
 
Последнее редактирование:

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

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

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Всем привет!
Если кому не сложно,накидайте пожалуйста простенький плагин.
Чтоб при команде в чат,давало скорость на 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 или ник, ты можешь изменить значение куков на невалидное для клиента
 
Последнее редактирование:

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

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
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,416
Реакции
465
Время если будет,добавь пожалуйста чтоб можно было использовать один раз за раунд.
Что-то сразу не подумал написать.
Заранее благодарю!
А так все четко работает
Код:
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;
}
}
Проверь, должно работать
 

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

вся жизнь,сплошной цирк.
Сообщения
876
Реакции
212
Код:
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;
}
}
Проверь, должно работать
Вроде все четко
 
Сверху Снизу