Invalid timer handle,не корректная работа плагина.

Soredmg8841

Участник
Сообщения
6
Реакции
0
Добрый час столкнулся с такой ошибкой!
PHP:
L 08/09/2018 - 09:36:40: [SM] Exception reported: Invalid timer handle 7d2a05a8 (error 1)
L 08/09/2018 - 09:36:40: [SM] Blaming: army_ranks_hud_info.smx
L 08/09/2018 - 09:36:40: [SM] Call stack trace:
L 08/09/2018 - 09:36:40: [SM]   [0] KillTimer
L 08/09/2018 - 09:36:40: [SM]   [1] Line 41, E:\WorkSpace\GitHub\ArmyRanks\scripting\army_ranks_hud_info.sp::ARMY_PlayerDisconnect
L 08/09/2018 - 09:36:40: [SM]   [3] Call_Finish
L 08/09/2018 - 09:36:40: [SM]   [4] Line 8, army/events/OnClientDisconnect.sp::OnClientDisconnect

Исходя из данных записей лога,я понял что нужно искать в файлах OnClientDisconnect.sp ,army_ranks_hud_info.sp. Но я немного не понимаю что нужно сделать,прошу Вашей помощи.

army_ranks_hud_info.sp:
PHP:
new Deaths[MAXPLAYERS+1] = -1;
new NextRankKills[MAXPLAYERS+1] = -1;

public Plugin:myinfo =
{
    name = "[ ARMY ] Hud info",
    author = "sahapro33",
    description = "",
    version = "1.1"
}
public OnPluginStart()
{
    RegConsoleCmd("sm_hud", cmd);
}
new bool:b_e[66];
public Action:cmd(cl, argcc)
{
    b_e[cl] = !b_e[cl];
    return Plugin_Handled;
}
public ARMY_PlayerConnect(client, g_sRank[], g_iKills[], g_iDeaths[])
{
    if (IsClientInGame(client) && !IsFakeClient(client))
    {
        if (Hud[client] == INVALID_HANDLE)
        {
            Hud[client] = CreateTimer(1.0, HudStart, client, TIMER_REPEAT);
        }
    }
}
public ARMY_PlayerDisconnect(client, g_sRank[], g_iKills[], g_iDeaths[])
{
    if (Hud[client] != INVALID_HANDLE)
    {
        KillTimer(Hud[client]);
        Hud[client] = INVALID_HANDLE;
    }
    sRank[client] = "";
    Kills[client] = -1;
    Deaths[client] = -1;
    sNextRank[client] = "";
    NextRankKills[client] = -1;
}

public Action:HudStart(Handle:timer, any:client)
{
    if (b_e[client] && IsClientInGame(client) && !IsFakeClient(client))
    {
        if (IsPlayerAlive(client))
        {
            decl String:Message[256];
            
            if (!Army_GetStringRank(client, sRank[client]))
            {
                return Plugin_Stop;
            }
            if ((Kills[client] = Army_GetClientKills(client)) == -1)return Plugin_Stop;
            if ((Deaths[client] = Army_GetClientDeaths(client)) == -1)return Plugin_Stop;
            NextRankKills[client] = Army_GetClientNextRankKills(client);
            new Handle:hBuffer = StartMessageOne("KeyHintText", client);
            BfWriteByte(hBuffer, 1);
            if (Army_GetClientStringNextRank(client, sNextRank[client], sizeof(sNextRank[])))
            {
                Format(Message, sizeof(Message), "Ваше звание - %s\n\nУбийств -  %d \nСмертей -  %d \n\nСледующее звание - %s\nТребуется убийств -  %d ",
                    sRank[client],
                    Kills[client],
                    Deaths[client],
                    sNextRank[client],
                    NextRankKills[client] - Kills[client]);
                BfWriteString(hBuffer, Message);
                EndMessage();
            }
            else
            {
                Format(Message, sizeof(Message), "Ваше звание - %s\n\nУбийств -  %d\nСмертей -  %d\n\nУбрать с экрана sm_hud",
                    sRank[client],
                    Kills[client],
                    Deaths[client]);
                BfWriteString(hBuffer, Message);
                EndMessage();
            }
        }
    }
    else return Plugin_Stop;
    return Plugin_Continue;
}

OnClientDisconnect.sp:
PHP:
public OnClientDisconnect(iClient)
{
    Call_StartForward(OnPlayerDisconnect);
    Call_PushCell(iClient);
    Call_PushString(g_sRank[iClient]);
    Call_PushCell(g_iKills[iClient]);
    Call_PushCell(g_iDeaths[iClient]);
    Call_Finish();
    if ( g_bLoaded[iClient] )
    {
        SaveClient(iClient);
        g_bLoaded[iClient] = false;
    }
}

SaveClient(iClient)
{
    if ( g_bLoaded[iClient] )
    {
        decl String:sQuery[256], String:sName[MAX_NAME_LENGTH*2+1];
        GetClientName(iClient, sQuery, sizeof(sQuery));
        SQL_EscapeString(g_hSQLdb, sQuery, sName, sizeof(sName));
        Format(sQuery, sizeof(sQuery), "UPDATE `army_ranks` SET `kills` = %d, `deaths` = %d, `name` = '%s', `irank` = '%d' WHERE `auth` = '%s'", g_iKills[iClient], g_iDeaths[iClient], sName, (g_iRank[iClient]< GetArraySize(g_hArray_iKills))?g_iRank[iClient]:g_iRank[iClient]-1, g_sAuth[iClient]);
        SQL_TQuery(g_hSQLdb, SQLT_OnClientDisconnect, sQuery);
    }
}

public SQLT_OnClientDisconnect(Handle:hOwner, Handle:hQuery, const String:sError[], any:iUserId)
{
    if ( !hQuery )
    {
        LogError("SQLT_OnClientDisconnect: %s", sError);
    }
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
в таймере вместо else return Plugin_Stop; нужно сделать
PHP:
    else
    {
        Hud[client] = INVALID_HANDLE;
        return Plugin_Stop;
    }
--- Добавлено позже ---
вообще в результате должно быть что-то типа этого:
PHP:
#include <сам добавляй инклюд>
new bool:b_e[66],
    Handle:Hud[MAXPLAYERS+1];

public Plugin:myinfo =
{
    name = "[ ARMY ] Hud info",
    author = "sahapro33 (fixed by Grey83)",
    description = "",
    version = "1.2.0"
}

public OnPluginStart()
{
    RegConsoleCmd("sm_hud", cmd);
}


public Action:cmd(client, argc)
{
    if((b_e[client] = !b_e[client]))
        Hud[client] = CreateTimer(1.0, HudStart, GetClientUserId(client), TIMER_REPEAT);
    else if(Hud[client] != INVALID_HANDLE)
    {
        KillTimer(Hud[client]);
        Hud[client] = INVALID_HANDLE;
    }
    return Plugin_Handled;
}

public ARMY_PlayerConnect(client, g_sRank[], g_iKills[], g_iDeaths[])
{
    if(IsClientInGame(client) && !IsFakeClient(client))
        Hud[client] = CreateTimer(1.0, HudStart, GetClientUserId(client), TIMER_REPEAT);
}

public ARMY_PlayerDisconnect(client, g_sRank[], g_iKills[], g_iDeaths[])
{
    if(Hud[client] != INVALID_HANDLE)
    {
        KillTimer(Hud[client]);
        Hud[client] = INVALID_HANDLE;
    }
}

public Action:HudStart(Handle:timer, any:client)
{
    if((client = GetClientOfUserId(client)) && IsPlayerAlive(client))
    {
        static deaths, kills;
        static String:rank[64];
        if(!Army_GetStringRank(client, rank) || (kills = Army_GetClientKills(client)) == -1
        && (deaths = Army_GetClientDeaths(client)) == -1)
        {
            Hud[client] = INVALID_HANDLE;
            return Plugin_Stop;
        }

        static Handle:msg = StartMessageOne("KeyHintText", client);
        BfWriteByte(msg, 1);
        static String:buffer[256], String:next_rank[64];
        if(Army_GetClientStringNextRank(client, next_rank, sizeof(next_rank)))
            Format(buffer, sizeof(buffer), "Ваше звание - %s\n \nУбийств -  %d \nСмертей -  %d \n \nСледующее звание - %s\nТребуется убийств -  %d ", rank, kills, deaths, next_rank, Army_GetClientNextRankKills(client) - kills);
        else Format(buffer, sizeof(buffer), "Ваше звание - %s\n \nУбийств -  %d\nСмертей -  %d\n \nУбрать с экрана - sm_hud", rank, kills, deaths);
        BfWriteString(msg, buffer);
        EndMessage();
    }
    else
    {
        Hud[client] = INVALID_HANDLE;
        return Plugin_Stop;
    }
    return Plugin_Continue;
}
 
Последнее редактирование:

Soredmg8841

Участник
Сообщения
6
Реакции
0
в таймере вместо else return Plugin_Stop; нужно сделать
PHP:
    else
    {
        Hud[client] = INVALID_HANDLE;
        return Plugin_Stop;
    }
--- Добавлено позже ---
вообще в результате должно быть что-то типа этого:
PHP:
#include <сам добавляй инклюд>
new bool:b_e[66],
    Handle:Hud[MAXPLAYERS+1];

public Plugin:myinfo =
{
    name = "[ ARMY ] Hud info",
    author = "sahapro33 (fixed by Grey83)",
    description = "",
    version = "1.2.0"
}

public OnPluginStart()
{
    RegConsoleCmd("sm_hud", cmd);
}


public Action:cmd(client, argc)
{
    if((b_e[client] = !b_e[client]))
        Hud[client] = CreateTimer(1.0, HudStart, GetClientUserId(client), TIMER_REPEAT);
    else if(Hud[client] != INVALID_HANDLE)
    {
        KillTimer(Hud[client]);
        Hud[client] = INVALID_HANDLE;
    }
    return Plugin_Handled;
}

public ARMY_PlayerConnect(client, g_sRank[], g_iKills[], g_iDeaths[])
{
    if(IsClientInGame(client) && !IsFakeClient(client))
        Hud[client] = CreateTimer(1.0, HudStart, GetClientUserId(client), TIMER_REPEAT);
}

public ARMY_PlayerDisconnect(client, g_sRank[], g_iKills[], g_iDeaths[])
{
    if(Hud[client] != INVALID_HANDLE)
    {
        KillTimer(Hud[client]);
        Hud[client] = INVALID_HANDLE;
    }
}

public Action:HudStart(Handle:timer, any:client)
{
    if((client = GetClientOfUserId(client)) && IsPlayerAlive(client))
    {
        static deaths, kills;
        static String:rank[64];
        if(!Army_GetStringRank(client, rank) || (kills = Army_GetClientKills(client)) == -1
        && (deaths = Army_GetClientDeaths(client)) == -1)
        {
            Hud[client] = INVALID_HANDLE;
            return Plugin_Stop;
        }

        static Handle:msg = StartMessageOne("KeyHintText", client);
        BfWriteByte(msg, 1);
        static String:buffer[256], String:next_rank[64];
        if(Army_GetClientStringNextRank(client, next_rank, sizeof(next_rank)))
            Format(buffer, sizeof(buffer), "Ваше звание - %s\n \nУбийств -  %d \nСмертей -  %d \n \nСледующее звание - %s\nТребуется убийств -  %d ", rank, kills, deaths, next_rank, Army_GetClientNextRankKills(client) - kills);
        else Format(buffer, sizeof(buffer), "Ваше звание - %s\n \nУбийств -  %d\nСмертей -  %d\n \nУбрать с экрана - sm_hud", rank, kills, deaths);
        BfWriteString(msg, buffer);
        EndMessage();
    }
    else
    {
        Hud[client] = INVALID_HANDLE;
        return Plugin_Stop;
    }
    return Plugin_Continue;
}
Ща чекну отпишу!
--- Добавлено позже ---
в таймере вместо else return Plugin_Stop; нужно сделать
PHP:
    else
    {
        Hud[client] = INVALID_HANDLE;
        return Plugin_Stop;
    }
--- Добавлено позже ---
вообще в результате должно быть что-то типа этого:
PHP:
#include <сам добавляй инклюд>
new bool:b_e[66],
    Handle:Hud[MAXPLAYERS+1];

public Plugin:myinfo =
{
    name = "[ ARMY ] Hud info",
    author = "sahapro33 (fixed by Grey83)",
    description = "",
    version = "1.2.0"
}

public OnPluginStart()
{
    RegConsoleCmd("sm_hud", cmd);
}


public Action:cmd(client, argc)
{
    if((b_e[client] = !b_e[client]))
        Hud[client] = CreateTimer(1.0, HudStart, GetClientUserId(client), TIMER_REPEAT);
    else if(Hud[client] != INVALID_HANDLE)
    {
        KillTimer(Hud[client]);
        Hud[client] = INVALID_HANDLE;
    }
    return Plugin_Handled;
}

public ARMY_PlayerConnect(client, g_sRank[], g_iKills[], g_iDeaths[])
{
    if(IsClientInGame(client) && !IsFakeClient(client))
        Hud[client] = CreateTimer(1.0, HudStart, GetClientUserId(client), TIMER_REPEAT);
}

public ARMY_PlayerDisconnect(client, g_sRank[], g_iKills[], g_iDeaths[])
{
    if(Hud[client] != INVALID_HANDLE)
    {
        KillTimer(Hud[client]);
        Hud[client] = INVALID_HANDLE;
    }
}

public Action:HudStart(Handle:timer, any:client)
{
    if((client = GetClientOfUserId(client)) && IsPlayerAlive(client))
    {
        static deaths, kills;
        static String:rank[64];
        if(!Army_GetStringRank(client, rank) || (kills = Army_GetClientKills(client)) == -1
        && (deaths = Army_GetClientDeaths(client)) == -1)
        {
            Hud[client] = INVALID_HANDLE;
            return Plugin_Stop;
        }

        static Handle:msg = StartMessageOne("KeyHintText", client);
        BfWriteByte(msg, 1);
        static String:buffer[256], String:next_rank[64];
        if(Army_GetClientStringNextRank(client, next_rank, sizeof(next_rank)))
            Format(buffer, sizeof(buffer), "Ваше звание - %s\n \nУбийств -  %d \nСмертей -  %d \n \nСледующее звание - %s\nТребуется убийств -  %d ", rank, kills, deaths, next_rank, Army_GetClientNextRankKills(client) - kills);
        else Format(buffer, sizeof(buffer), "Ваше звание - %s\n \nУбийств -  %d\nСмертей -  %d\n \nУбрать с экрана - sm_hud", rank, kills, deaths);
        BfWriteString(msg, buffer);
        EndMessage();
    }
    else
    {
        Hud[client] = INVALID_HANDLE;
        return Plugin_Stop;
    }
    return Plugin_Continue;
}
При компиляции пишет следующее "error 008:must be a constant expression; assumed zero"
 
Последнее редактирование:

Soredmg8841

Участник
Сообщения
6
Реакции
0
в какой хоть строке?
Безымянный.jpg
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Soredmg8841, вместо
PHP:
        static Handle:msg = StartMessageOne("KeyHintText", client);
сделай
PHP:
        static Handle:msg;
        msg = StartMessageOne("KeyHintText", client);
 

Soredmg8841

Участник
Сообщения
6
Реакции
0
@Soredmg8841, вместо
PHP:
        static Handle:msg = StartMessageOne("KeyHintText", client);
сделай
PHP:
        static Handle:msg;
        msg = StartMessageOne("KeyHintText", client);
Ок ,закомпилилось без запинок.Да заработало.
Но , в худ окне есть все кроме кнопки закрыть окно , хотя об этом есть запись в .sp
PHP:
 else Format(buffer, sizeof(buffer), "Ваше звание - %s\n \nУбийств -  %d\nСмертей -  %d\n \nУбрать с экрана - sm_hud", rank, kills, deaths);
        BfWriteString(msg, buffer);
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,521
Реакции
4,980
@Soredmg8841, а это отображается только тем, у кого нулевой ранг
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Статическая переменная для Handle, который закрывается с End_Message просто не нужна и её даже глупо так использовать.
 
Сверху Снизу