Помогите исправить ошибку в rankme_hud_info

Тема в разделе "Программирование / Скриптинг", создана пользователем vio_line, 12 июн 2016.

  1. vio_line

    vio_line

    Сообщения:
    41
    Симпатии:
    3
    В логах:
    L 06/12/2016 - 19:40:25: SourceMod error session started
    L 06/12/2016 - 19:40:25: Info (map "$2000$") (file "errors_20160612.log")
    L 06/12/2016 - 19:40:25: [SM] Native "Format" reported: Client index 10 is invalid
    L 06/12/2016 - 19:40:25: [SM] Displaying call stack trace for plugin "rankme_hud_info.smx":
    L 06/12/2016 - 19:40:25: [SM] [0] Line 104, E:\steampipe_server\css\cstrike\addons\sourcemod\scripting\rankme_hud_info.sp::RankCallback()

    Код плагина:

    Код:
    #include <sourcemod>
    #include <rankme>
    
    #define INTERVAL 1.0
    
    #define TEXT_PLAYER        "Игрок: "
    #define TEXT_RANK        "Позиция: "
    #define TEXT_POINTS        "Очки: "
    #define TEXT_KDR        "Уб. к смертям: "
    #define TEXT_HEADSHOTS    "Уб. в голову: "
    #define TEXT_HITS        "Попадания: "
    
    new Handle:g_hUpdateHudTimer = INVALID_HANDLE;
    new bool:g_bLoaded[MAXPLAYERS+1];
    
    public Plugin:myinfo = {
        name = "RankMe Hud Info",
        author = "413th",
        description = "Add-on for RankMe stats",
        version = "1.3",
        url = "n/a"
    };
    
    public OnMapStart()
    {
        if(g_hUpdateHudTimer == INVALID_HANDLE)
        {
            g_hUpdateHudTimer = CreateTimer(INTERVAL, Timer_UpdateHud, _, TIMER_REPEAT);
        }
    }
    
    public Action:Timer_UpdateHud(Handle:timer)
    {
        new iObserverMode, iClientToShow;
        for (new iClient = 1; iClient <= MaxClients; iClient++)
        {
            if(iClient == -1 || !IsClientInGame(iClient) || IsFakeClient(iClient) || !g_bLoaded[iClient])
            {
                continue;
            }
                   
            iClientToShow = iClient;
           
            if(!IsPlayerAlive(iClient) || IsClientObserver(iClient))
            {
                iObserverMode = GetEntProp(iClient, Prop_Send, "m_iObserverMode");
                if(iObserverMode == 4 || iObserverMode == 5)
                {
                    iClientToShow = GetEntPropEnt(iClient, Prop_Send, "m_hObserverTarget");
                }
            }
           
            if(iClientToShow == -1 || !g_bLoaded[iClientToShow] || IsFakeClient(iClientToShow))
            {
                iClientToShow = iClient;
            }
           
            RankMe_GetRank(iClientToShow, RankCallback, iClient);
        }
    }
    
    public RankCallback(iClientToShow, rank, any:iClient)
    {
        new stats[STATS_NAMES];
        new session[STATS_NAMES];
        RankMe_GetStats(iClientToShow, stats);
        RankMe_GetSession(iClientToShow, session);
        new iPoints = stats[SCORE];
        new iScore = session[SCORE];
        new iKills = stats[KILLS];
        new iDeaths = stats[DEATHS];
        new Float:fKDR;
        if(iDeaths == 0)
        {
            fKDR = 1.0*iKills;
        }
        else
        {
            fKDR = (1.0*iKills)/(1.0*iDeaths);
        }
        new Float:fAccuracy
        new iShots = stats[SHOTS];
        new iHits = stats[HITS];
        if(iShots == 0)
        {
            fAccuracy = 1.0*iHits;
        }
        else
        {
            fAccuracy = (1.0*iHits)/(1.0*iShots);
        }
        new iHeadshots = stats[HEADSHOTS];
        new Float:fHSR
        if(iKills == 0)
        {
            fHSR = 1.0*iHeadshots;
        }
        else
        {
            fHSR = (1.0*iHeadshots)/(1.0*iKills);
        }
       
        new String:sMessage[255];
        Format(sMessage, sizeof(sMessage), "%s%N\n%s%i\n%s%i (%s%i)\n%s", TEXT_PLAYER, iClientToShow, TEXT_RANK, rank, TEXT_POINTS, iPoints, (iScore > 0) ? "+" : "", iScore, TEXT_KDR);
        if(iKills >= 1000000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iKK/", sMessage, iKills/1000/1000);
        }
        else if(iKills >= 1000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iK/", sMessage, iKills/1000);
        }
        else
        {
            Format(sMessage, sizeof(sMessage), "%s%i/", sMessage, iKills);
        }
        if(iDeaths >= 1000000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iKK", sMessage, iDeaths/1000/1000);
        }
        else if(iDeaths >= 1000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iK", sMessage, iDeaths/1000);
        }
        else
        {
            Format(sMessage, sizeof(sMessage), "%s%i", sMessage, iDeaths);
        }
        Format(sMessage, sizeof(sMessage), "%s (%.2f)\n%s", sMessage, fKDR, TEXT_HEADSHOTS);
        if(iHeadshots >= 1000000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iKK", sMessage, iHeadshots/1000/1000);
        }
        else if(iHeadshots >= 1000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iK", sMessage, iHeadshots/1000);
        }
        else
        {
            Format(sMessage, sizeof(sMessage), "%s%i", sMessage, iHeadshots);
        }
        Format(sMessage, sizeof(sMessage), "%s (%.2f)\n%s", sMessage, fHSR, TEXT_HITS);
        if(iHits >= 1000000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iKK/", sMessage, iHits/1000/1000);
        }
        else if(iHits >= 1000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iK/", sMessage, iHits/1000);
        }
        else
        {
            Format(sMessage, sizeof(sMessage), "%s%i/", sMessage, iHits);
        }
        if(iShots >= 1000000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iKK", sMessage, iShots/1000/1000);
        }
        else if(iShots >= 1000)
        {
            Format(sMessage, sizeof(sMessage), "%s%iK", sMessage, iShots/1000);
        }
        else
        {
            Format(sMessage, sizeof(sMessage), "%s%i", sMessage, iShots);
        }
        Format(sMessage, sizeof(sMessage), "%s (%.2f)", sMessage, fAccuracy);
       
        new Handle:hBuffer = StartMessageOne("KeyHintText", iClient);
        BfWriteByte(hBuffer, 1);
        BfWriteString(hBuffer, sMessage);
        EndMessage();
    }
    
    public Action:RankMe_OnPlayerLoaded(client)
    {
        g_bLoaded[client] = true;
    }
    
    public OnClientDisconnect(client)
    {
        g_bLoaded[client] = false;
    }
     
    Последнее редактирование: 12 июн 2016
  2. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @vio_line, ты можешь код вставлять через Вставить... > код. Ты понимаешь что табуляция ломается у скрипта?
     
  3. vio_line

    vio_line

    Сообщения:
    41
    Симпатии:
    3
    Прошу прощения. Поправил.
     
  4. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    ну вроде как не хватает проверки на клиента. Компилироваться будет с двумя ошибками, их я решить не могу ибо они остались после автора. Легче написать аналогичный плагин с нуля, но это уже другая история. Эти ошибки не критичны.
    Код:
    #pragma semicolon 1
    #include <rankme>
    
    #define INTERVAL 1.0
    
    #define TEXT_PLAYER        "Игрок: "
    #define TEXT_RANK        "Позиция: "
    #define TEXT_POINTS        "Очки: "
    #define TEXT_KDR        "Уб. к смертям: "
    #define TEXT_HEADSHOTS    "Уб. в голову: "
    #define TEXT_HITS        "Попадания: "
    
    new Handle:g_hUpdateHudTimer = INVALID_HANDLE;
    new bool:g_bLoaded[MAXPLAYERS+1];
    
    public Plugin:myinfo = {
        name = "RankMe Hud Info",
        author = "413th",
        description = "Add-on for RankMe stats",
        version = "1.3.06a",
        url = "n/a"
    };
    
    public OnMapStart()
    {
        if(g_hUpdateHudTimer == INVALID_HANDLE)
        {
            g_hUpdateHudTimer = CreateTimer(INTERVAL, Timer_UpdateHud, _, TIMER_REPEAT);
        }
    }
    
    public Action:Timer_UpdateHud(Handle:timer)
    {
        new iObserverMode, iClientToShow;
        for (new iClient = 1; iClient <= MaxClients; iClient++)
        {
            if(iClient == -1 || !IsClientInGame(iClient) || IsFakeClient(iClient) || !g_bLoaded[iClient])
            {
                continue;
            }
                 
            iClientToShow = iClient;
         
            if(!IsPlayerAlive(iClient) || IsClientObserver(iClient))
            {
                iObserverMode = GetEntProp(iClient, Prop_Send, "m_iObserverMode");
                if(iObserverMode == 4 || iObserverMode == 5)
                {
                    iClientToShow = GetEntPropEnt(iClient, Prop_Send, "m_hObserverTarget");
                }
            }
         
            if(iClientToShow == -1 || !g_bLoaded[iClientToShow] || IsFakeClient(iClientToShow))
            {
                iClientToShow = iClient;
            }
         
            RankMe_GetRank(iClientToShow, RankCallback, iClient);
        }
    }
    
    public RankCallback(iClientToShow, rank, any:iClient)
    {
        if (!IsClientInGame(iClient) || !IsClientInGame(iClientToShow)) return;
       
        new stats[STATS_NAMES];
        new session[STATS_NAMES];
        RankMe_GetStats(iClientToShow, stats);
        RankMe_GetSession(iClientToShow, session);
        new iPoints = stats[SCORE];
        new iScore = session[SCORE];
        new iKills = stats[KILLS];
        new iDeaths = stats[DEATHS];
        new Float:fKDR;
        if(iDeaths == 0)
        {
            fKDR = 1.0*iKills;
        }
        else
        {
            fKDR = (1.0*iKills)/(1.0*iDeaths);
        }
        new Float:fAccuracy;
        new iShots = stats[SHOTS];
        new iHits = stats[HITS];
        if(iShots == 0)
        {
            fAccuracy = 1.0*iHits;
        }
        else
        {
            fAccuracy = (1.0*iHits)/(1.0*iShots);
        }
        new iHeadshots = stats[HEADSHOTS];
        new Float:fHSR;
        if(iKills == 0)
        {
            fHSR = 1.0*iHeadshots;
        }
        else
        {
            fHSR = (1.0*iHeadshots)/(1.0*iKills);
        }
        new String:sMessage[255];
        if (IsClientInGame(iClient) || IsClientInGame(iClientToShow))
        {
            FormatEx(sMessage, sizeof(sMessage), "%s%N\n%s%i\n%s%i (%s%i)\n%s", TEXT_PLAYER, iClientToShow, TEXT_RANK, rank, TEXT_POINTS, iPoints, (iScore > 0) ? "+" : "", iScore, TEXT_KDR);
            if(iKills >= 1000000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iKK/", sMessage, iKills/1000/1000);
            }
            else if(iKills >= 1000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iK/", sMessage, iKills/1000);
            }
            else
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%i/", sMessage, iKills);
            }
            if(iDeaths >= 1000000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iKK", sMessage, iDeaths/1000/1000);
            }
            else if(iDeaths >= 1000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iK", sMessage, iDeaths/1000);
            }
            else
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%i", sMessage, iDeaths);
            }
            FormatEx(sMessage, sizeof(sMessage), "%s (%.2f)\n%s", sMessage, fKDR, TEXT_HEADSHOTS);
            if(iHeadshots >= 1000000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iKK", sMessage, iHeadshots/1000/1000);
            }
            else if(iHeadshots >= 1000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iK", sMessage, iHeadshots/1000);
            }
            else
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%i", sMessage, iHeadshots);
            }
            FormatEx(sMessage, sizeof(sMessage), "%s (%.2f)\n%s", sMessage, fHSR, TEXT_HITS);
            if(iHits >= 1000000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iKK/", sMessage, iHits/1000/1000);
            }
            else if(iHits >= 1000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iK/", sMessage, iHits/1000);
            }
            else
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%i/", sMessage, iHits);
            }
            if(iShots >= 1000000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iKK", sMessage, iShots/1000/1000);
            }
            else if(iShots >= 1000)
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%iK", sMessage, iShots/1000);
            }
            else
            {
                FormatEx(sMessage, sizeof(sMessage), "%s%i", sMessage, iShots);
            }
            FormatEx(sMessage, sizeof(sMessage), "%s (%.2f)", sMessage, fAccuracy);
           
            new Handle:hBuffer = StartMessageOne("KeyHintText", iClient);
            if (hBuffer != INVALID_HANDLE)
            {
                BfWriteByte(hBuffer, 1);
                BfWriteString(hBuffer, sMessage);
                EndMessage();
            }
        }
    }
    
    public Action:RankMe_OnPlayerLoaded(client)
    {
        g_bLoaded[client] = true;
    }
    
    public OnClientDisconnect(client)
    {
        g_bLoaded[client] = false;
    }
    
    stock bool:IsValid(client)
    {
        if (0 < client && client <= MaxClients && IsClientInGame(client))
        {
            return true;
        }
        else return false;
    }
     
    Последнее редактирование: 13 июн 2016
    vio_line нравится это.
  5. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.579
    Симпатии:
    1.989
    Переделывай)
     
  6. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @AlmazON, что мне переделывать то? я уже скинул рабочий код вроде как.
     
  7. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.579
    Симпатии:
    1.989
    Одну проверку же добавил - ту, что указал? Тогда не пойдёт, она от нулевого индекса спасает, а там на 10-тый ругается)
     
  8. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
  9. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.579
    Симпатии:
    1.989
    Стоило бы заглянуть в исходы натива и тогда точно узнаешь, на что ругается. Ну, а так обычно 2 варианта: либо индекс игрока выполз за пределы максимума слотов (больше MaxClients), либо просто "не в игре" (IsClientInGame).
     
  10. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    Впервые такое слышу вообще.
    --- Добавлено позже ---
    Тогда добавить нужно еще проверку и все тут.
     
    Последнее редактирование: 12 июн 2016
  11. vio_line

    vio_line

    Сообщения:
    41
    Симпатии:
    3
    Оффтоп

    К сожалению, ошибки по прежнему остались:
    L 06/13/2016 - 00:02:43: SourceMod error session started
    L 06/13/2016 - 00:02:43: Info (map "$2000$") (file "errors_20160613.log")
    L 06/13/2016 - 00:02:43: [SM] Native "StartMessage" reported: Client 8 is not connected
    L 06/13/2016 - 00:02:43: [SM] Displaying call stack trace for plugin "rankme_hud_info.smx":
    L 06/13/2016 - 00:02:43: [SM] [0] Line 217, E:\steampipe_server\css\cstrike\addons\sourcemod\scripting\include\usermessages.inc::StartMessageOne()
    L 06/13/2016 - 00:02:43: [SM] [1] Line 169, E:\steampipe_server\css\cstrike\addons\sourcemod\scripting\rankme_hud_info.sp::RankCallback()
    L 06/13/2016 - 00:26:15: [SM] Native "Format" reported: Client index 5 is invalid
    L 06/13/2016 - 00:26:15: [SM] Displaying call stack trace for plugin "rankme_hud_info.smx":
    L 06/13/2016 - 00:26:15: [SM] [0] Line 104, E:\steampipe_server\css\cstrike\addons\sourcemod\scripting\rankme_hud_info.sp::RankCallback()
    L 06/13/2016 - 01:37:57: Error log file session closed.
     
  12. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
  13. vio_line

    vio_line

    Сообщения:
    41
    Симпатии:
    3
    Еще ошибки пришли после обновления.
    Оффтоп
     
  14. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @vio_line, не знаю вообщем, обратись к алмазону, мне пока опыту не хватает решить эту проблему. Можно попробовать провверку на валидность использовать но и это не факт что поможет.

    Обновил пост попробуй, если опят ошибки то тогда через алмазона, по сути впервый раз встречаюсь с подобной проблемой.
     
  15. vio_line

    vio_line

    Сообщения:
    41
    Симпатии:
    3
    Все равно спасибо, что откликнулся. Плагин нужный, а вот ошибки в логах напрягают.
     
  16. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @vio_line, попробуй последний раз я пост обновил.
     
  17. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.579
    Симпатии:
    1.989
    Тут уже прямым текстом ругается, поставь проверку IsClientInGame(iClient).
     
  18. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @AlmazON, я решил просто ввалидность на весь код и все.
    --- Добавлено позже ---
    @AlmazON, а не iclienttoshow?
     
  19. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    847
    Симпатии:
    200
    Что за iclienttoshow?
     
  20. inklesspen

    inklesspen После "Р" в слове "Лопата"

    Сообщения:
    847
    Симпатии:
    200
    Я видел... Но это не ответило на мой вопрос... Просто я не вкурсе что за iclienttoshow. в функциях я такого не нашел.