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

vio_line

Участник
Сообщения
44
Реакции
8
В логах:
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()

Код плагина:

C-подобный:
#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;
}
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@vio_line, ты можешь код вставлять через Вставить... > код. Ты понимаешь что табуляция ломается у скрипта?
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
ну вроде как не хватает проверки на клиента. Компилироваться будет с двумя ошибками, их я решить не могу ибо они остались после автора. Легче написать аналогичный плагин с нуля, но это уже другая история. Эти ошибки не критичны.
C-подобный:
#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;
}
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@AlmazON, что мне переделывать то? я уже скинул рабочий код вроде как.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Стоило бы заглянуть в исходы натива и тогда точно узнаешь, на что ругается. Ну, а так обычно 2 варианта: либо индекс игрока выполз за пределы максимума слотов (больше MaxClients), либо просто "не в игре" (IsClientInGame).
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
либо индекс игрока выполз за пределы максимума слотов (больше MaxClients)

Впервые такое слышу вообще.
--- Добавлено позже ---
либо просто "не в игре" (IsClientInGame)
Тогда добавить нужно еще проверку и все тут.
 
Последнее редактирование:

vio_line

Участник
Сообщения
44
Реакции
8
Оффтоп

К сожалению, ошибки по прежнему остались:
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.
 

vio_line

Участник
Сообщения
44
Реакции
8
Еще ошибки пришли после обновления.
Оффтоп
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@vio_line, не знаю вообщем, обратись к алмазону, мне пока опыту не хватает решить эту проблему. Можно попробовать провверку на валидность использовать но и это не факт что поможет.

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

vio_line

Участник
Сообщения
44
Реакции
8
@vio_line, не знаю вообщем, обратись к алмазону, мне пока опыту не хватает решить эту проблему. Можно попробовать провверку на валидность использовать но и это не факт что поможет.
Все равно спасибо, что откликнулся. Плагин нужный, а вот ошибки в логах напрягают.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@AlmazON, я решил просто ввалидность на весь код и все.
--- Добавлено позже ---
@AlmazON, а не iclienttoshow?
 

inklesspen

Не пишу модули под LSD :с
Сообщения
1,775
Реакции
967
Там и на то, и на то ругается. На второе прямым текстом, что игрок "вне сети" (не подключён к серверу).
Я видел... Но это не ответило на мой вопрос... Просто я не вкурсе что за iclienttoshow. в функциях я такого не нашел.
 
Сверху Снизу