Как выключить UnhookEvent

alexmy

Участник
Сообщения
284
Реакции
13
Всем привет, ребята как вырубить унхук если карта было проиграна, чтоб по новай хукались события и унхукались.
Пробовал что то типа такого, не работает...
PHP:
public void OnPluginStart
{
    HookEvent("round_start", OnReset);
    HookEvent("round_end", OnReset, EventHookMode_Pre);
    HookEvent("finale_win", OnReset, EventHookMode_Pre);
    HookEvent("mission_lost", OnReset, EventHookMode_Pre);
    HookEvent("map_transition", OnReset, EventHookMode_Pre);
}

public Action OnReset(Handle event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i))
        {
            g_EventTankKilled = false;
            g_EventTankSpawn = false;
            g_EventTankSpawnTwo = false;
        }
    }
}
 

pracc

Быть, а не казаться.
Сообщения
946
Реакции
541
Твой ответ в твоём вопросе.
 

FurFur

Участник
Сообщения
153
Реакции
85
На новом синтаксисе не
public Action OnReset(Handle event, const char[] name, bool dontBroadcast), а
public Action OnReset(Event event, const char[] name, bool dontBroadcast)
 

alexmy

Участник
Сообщения
284
Реакции
13
На новом синтаксисе не
public Action OnReset(Handle event, const char[] name, bool dontBroadcast), а
public Action OnReset(Event event, const char[] name, bool dontBroadcast)
Не помогло, а какая разница новый или старый синтаксис? если я не использую для проверки #pragma newdecls required
 

FurFur

Участник
Сообщения
153
Реакции
85
Скинь тогда весь код,а то не понятно куда именно ты присваиваешь g_EventTankKilled = false например, ну и зачем это делать во время перебора игроков тоже вопрос.
 

alexmy

Участник
Сообщения
284
Реакции
13
Смотри свежий взгляд всегда не помешает:
Оффтоп
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
не понимаю зачем делать такой цыкал, если нужно сбросить когда хоть один есть на сервере то нужно сделать так.
PHP:
for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i))
        {
            g_EventTankKilled = false;
            g_EventTankSpawn = false;
            g_EventCreate_Panic = false;
            g_EventTankSpawnTwo = false;
            break;
        }
    }
 

alexmy

Участник
Сообщения
284
Реакции
13
не понимаю зачем делать такой цыкал, если нужно сбросить когда хоть один есть на сервере то нужно сделать так.
PHP:
for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i))
        {
            g_EventTankKilled = false;
            g_EventTankSpawn = false;
            g_EventCreate_Panic = false;
            g_EventTankSpawnTwo = false;
            break;
        }
    }
Не помогло.
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
@alexmy, ну это и не была помощь в твоей проблеме, это просто оптимизация.
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, ну это и не была помощь в твоей проблеме, это просто оптимизация.
В первые вижу, на upgrades не когда не использовал.
--- Добавлено позже ---
Нашел выход как сбросить унхук, кто что думает для оптимизации!?
PHP:
public Action OnReset(Event event, const char[] name, bool dontBroadcast)
{
    for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i))
        {
            g_EventTankKilled = false;
            g_EventTankSpawn = false;
            g_EventCreate_Panic = false;
            g_EventTankSpawnTwo = false;
            ServerCommand("sm_rcon sm plugins reload l4d_tank_killed.smx");
        }
    }
}
 

alexmy

Участник
Сообщения
284
Реакции
13
А можно пример? Если честно я хз как, все уже перепробовал.
PHP:
bool g_EventTankKilled = false;

public void OnMapStart()
{
    if (!g_EventTankKilled)   
    {
        HookEvent("tank_killed", Event_tank_killed);
        g_EventTankKilled = true;
    }
}

public void Event_tank_killed(Event event, const char[] name, bool dontBroadcast)
{
    UnhookEvent("tank_killed", Event_tank_killed);
    g_EventTankKilled = false;
    {
        CreateTimer(5.0, timer_SpawnTank, GetClientOfUserId(GetEventInt(event, "userid")), TIMER_FLAG_NO_MAPCHANGE);
    }
}
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, эвент срабатывает?
Смысл такой, первый раз хукается и унхукается нормально. Но если команда проиграла что то типа рестарт карты, события больше не хукается.
--- Добавлено позже ---
Если сменишь карту опять все нормально., пока команда не проиграет.
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
@alexmy, если идёт рестарт карты то нужно как то ловить этот момент, а то что ты используешь исполняется тока при загрузки карты.
 

alexmy

Участник
Сообщения
284
Реакции
13
@alexmy, если идёт рестарт карты то нужно как то ловить этот момент, а то что ты используешь исполняется тока при загрузки карты.
Можешь пожалуйста помочь? Как бы события есть подходящие:
PHP:
HookEvent("finale_win", OnResetbonus, EventHookMode_Pre); //Победа/завершение кампании.
    HookEvent("mission_lost", OnResetbonus, EventHookMode_Pre); //Выжившие проиграли/умерли.
    HookEvent("map_transition", OnResetbonus, EventHookMode_Pre); //Переход карты.
 

Серый™

CS:S Server
Сообщения
2,925
Реакции
1,376
@alexmy, я не знаю как это рестарт карты в этой игре (не играю), пробуй методом тыка:biggrin:
 
Сверху Снизу