Иконка ресурса

[Levels Ranks] Lvl Show Info 2.5.2

Нет прав для скачивания
Сообщения
22
Реакции
20

KonveeR

Кон Чен Ый
Сообщения
1,559
Реакции
559
@Drumanid, Заметил небольшую проблему
У игрока в табе будет (к примеру) звание сильвер 5, а в hint будет писать от плагина , сильвер 6
Он в общем пишет , на одно звание выше нужного.
 
Последнее редактирование:

Drumanid

Неактивный пользователь
Сообщения
1,768
Реакции
1,448
@Drumanid, Заметил небольшую проблему
У игрока в табе будет (к примеру) звание сильвер 5, а в hint будет писать от плагина , сильвер 6
Он в общем пишет , на одно звание выше нужного.
Забавно, ладно... Сделай так:

PHP:
    int iCount;
    hKeyValues.GotoFirstSubKey();
    do hKeyValues.GetSectionName(g_sRanksInfo[iCount++], sizeof(g_sRanksInfo[]));
>>
PHP:
    int iCount = 1;
    g_sRanksInfo[0] = "NONE";
    hKeyValues.GotoFirstSubKey();
    do hKeyValues.GetSectionName(g_sRanksInfo[iCount++], sizeof(g_sRanksInfo[]));
и добавь файл перевода
Код:
"NONE"
{
     "en"     "None"
     "ru"     "Нету"
}
или

PHP:
FormatEx(SZF(sRank), "%T", g_sRanksInfo[LR_GetClientInfo(iTarget, ST_RANK)], iClient);
>>
PHP:
FormatEx(SZF(sRank), "%T", g_sRanksInfo[LR_GetClientInfo(iTarget, ST_RANK) +1], iClient);
Обновил пост.
 
Последнее редактирование:
Сообщения
364
Реакции
56
Ждал пока @Faya™ опубликует свой плагин, чтобы потом его немного отредактировать под себя и использовать.
Итог: не дождался, написал сам. (Делаю под себя один сервер с системой lvl ranks)
Кстати, думал что он вроде как в привате от @RoadSide Romeo.
Давайте сначала пройдемся по коду @BaFeR .

PHP:
            iKill = LR_GetClientInfo(i, 2);
            iDeath = LR_GetClientInfo(i, 3);
            iAssists = LR_GetClientInfo(i, 7);
            iOnline = LR_GetClientInfo(i, 10);

            FormatEx(sHud, sizeof(sHud), "%N\nУБИЙСТВ: %i\nСМЕРТЕЙ: %i\nПОМОЩЬ: %i\nKDA: %0.1f\nОНЛАЙН: %i ч.",i , iKill, iDeath, iAssists, float(iKill)/float(iDeath), RoundToCeil(float(iOnline)/60.0/60.0));


            SetHudTextParams(g_fPostion[0], g_fPostion[1], g_fTimer + 0.1, g_iColors[0] , g_iColors[1], g_iColors[2], g_iColors[3], 2 , 0.0, 0.0, 0.0);
            ShowHudText(i, -1, sHud);
Это можно было вывести в отдельный паблик, у тебя один и тот же код используется два раза.
Настройку худа лучше выносить за цикл, ты же не используешь индивидуальные настройки игроков, для всех единые, значит смысла нет.

Зачем была подключена библиотека 'clientprefs'?

Получение KD игрока неправильное...
Что если у игрока n кол-во убийств и 0 смертей, делим, каков итог?

Для переменной 'g_bStatus' я бы создал отдельный цикл, а не использовал его в цикле.
Ну и забавный момент: if(iTarget != i) как можно наблюдать за собой?
Код идеальным никогда не будет :biggrin:

Теперь критикуем меня, с̶о̶б̶е̶н̶н̶о̶ ̶м̶н̶е̶ ̶Н̶Е̶ ̶н̶р̶а̶в̶и̶т̶с̶я̶ ̶'̶ф̶о̶р̶м̶а̶т̶и̶р̶о̶в̶а̶н̶и̶е̶'̶ ̶в̶р̶е̶м̶е̶н̶и̶ ̶и̶г̶р̶о̶к̶а̶. @Grey83

PHP:
#include <sourcemod>
#include <lvl_ranks>
#include <clientprefs>

public Plugin myinfo =
{
    name = "[LR] Players info",
    author = "Drumanid",
    version = "1.0.1",
    url = "Discord: Drumanid#9108"
};

Handle g_hCookie;
char g_sRanksInfo[19][32];
bool g_bUse[MAXPLAYERS +1];

#define SZF(%0) %0, sizeof(%0)
#define CyclePlayers(%0) for(int %0 = 1; %0 <= MaxClients; ++%0) if(IsClientInGame(%0))
public void OnPluginStart()
{
    // load translation file
    LoadTranslations("levels_ranks_playersinfo.phrases.txt");

    // Parser ranks info
    char sPath[64];
    BuildPath(Path_SM, SZF(sPath), "configs/levels_ranks/settings_ranks.ini");
    KeyValues hKeyValues = new KeyValues("LR_Settings");
    if(!hKeyValues.ImportFromFile(sPath))
        SetFailState("No found file: '%s'", sPath);

    hKeyValues.Rewind();
    if(!hKeyValues.JumpToKey("Ranks"))
        SetFailState("No found key: 'Ranks'", sPath);

    int iCount;
    hKeyValues.GotoFirstSubKey();
    do hKeyValues.GetString("name", g_sRanksInfo[iCount++], sizeof(g_sRanksInfo[]));
    while(hKeyValues.GotoNextKey());
    delete hKeyValues;

    // Update info
    CreateTimer(1.0, view_as<Timer>(TimerUpdate), _, TIMER_REPEAT);

    // Create cookie
    g_hCookie = RegClientCookie("levelranks_playerinfo", "On/off player information", CookieAccess_Private);

    // Load data players
    CyclePlayers(iClient)
        OnClientCookiesCached(iClient);
}

// Show info
#define KD(%0) float(%0 == 0 ? 1 : %0)
void TimerUpdate()
{
    int iTarget, iKills, iDeaths, iAssists, iSeconds;
    CyclePlayers(iClient)
    {
        if(g_bUse[iClient] && !IsFakeClient(iClient) && !IsPlayerAlive(iClient) && 3 < GetEntProp(iClient, Prop_Send, "m_iObserverMode") < 6 &&
        1 < (iTarget = GetEntPropEnt(iClient, Prop_Send, "m_hObserverTarget")) <= MaxClients && IsClientInGame(iTarget))
        {
            iKills = LR_GetClientInfo(iTarget, ST_KILLS);
            iDeaths = LR_GetClientInfo(iTarget, ST_DEATHS);
            iAssists = LR_GetClientInfo(iTarget, ST_ASSISTS);
            iSeconds = LR_GetClientInfo(iTarget, ST_PLAYTIME);

            PrintHintText(iClient, "%t", "Player information",  g_sRanksInfo[LR_GetClientInfo(iTarget, ST_RANK)],
                                                                LR_GetClientPos(iTarget),
                                                                LR_GetClientInfo(iTarget, ST_VALUE),
                                                                iKills,
                                                                iDeaths,
                                                                iAssists,
                                                                (KD(iKills) + float(iAssists / 2)) / KD(iDeaths),
                                                                LR_GetClientInfo(iTarget, ST_SHOOTS),
                                                                LR_GetClientInfo(iTarget, ST_HITS),
                                                                LR_GetClientInfo(iTarget, ST_HEADSHOTS),
                                                                iSeconds / 3600,
                                                                iSeconds / 60 %60,
                                                                iSeconds %60);
        }
    }
}

// Get info from cookie and record in variable
public void OnClientCookiesCached(int iClient)
{
    if(IsFakeClient(iClient))
        return;

    char sValue[4];
    GetClientCookie(iClient, g_hCookie, SZF(sValue));
    g_bUse[iClient] = sValue[0] && sValue[0] != '0';
}

// Add item in lvl menu
public void LR_OnMenuCreated(int iClient, Menu& hMenu)
{
    char sBuffer[64];
    FormatEx(SZF(sBuffer), "%T", g_bUse[iClient] ? "Item, on":"Item, off", iClient);
    hMenu.AddItem("playersinfo", sBuffer);
}

public void LR_OnMenuItemSelected(int iClient, const char[] sInfo)
{
    if(!StrEqual(sInfo, "playersinfo"))
        return;

    PrintToChat(iClient, "%t", (g_bUse[iClient] = !g_bUse[iClient]) ? "Message, on":"Message, off");
    LR_MenuInventory(iClient);
}

// Save data
public void OnClientDisconnect(int iClient)
{
    if(!IsFakeClient(iClient))
        SetClientCookie(iClient, g_hCookie, g_bUse[iClient] ? "1":"0");
}

public void OnPluginEnd()
{
    CyclePlayers(iClient)
        OnClientDisconnect(iClient);
}
Файл перевода:
Код:
"Phrases"
{
   "Player information"
   {
       // 1 - rank, 2 - top, 3 - score, 4 - kills, 5 - deaths, 6 - assists, 7 - kda, 8 - shoots, 9 - hits, 10 - headhshots, 11 - hours, 12 - minutes, 13 - seconds
       "#format"   "{1:s},{2:i},{3:i},{4:i},{5:i},{6:i},{7:.2f},{8:i},{9:i},{10:i},{11:i},{12:i},{13:i}"

       "en"       "Rank: {1} | Place in top: {2} | Score: {3}\nKills: {4} | Deaths: {5} | Assists: {6} | KDA: {7}\nPlayed: {11} hour(s) {12} minute(s) {13} second(s)"
       "ru"       "Ранг: {1} | Место в топе: {2} | Очки: {3}\nУбийств: {4} | Смертей: {5} | Содействий: {6} | KDA: {7}\nОтыграл: {11} час(а/ов) {12} минут(ы) {13} секунд(ы)"
   }

   "Item, on"
   {
       "en"       "Players information - [on]"
       "ru"       "Информация об игроках - [вкл]"
   }

   "Item, off"
   {
       "en"       "Players information - [off]"
       "ru"       "Информация об игроках - [выкл]"
   }

   "Message, on"
   {
       "en"       "Players information - on"
       "ru"       "Информация об игроках - включено"
   }

   "Message, off"
   {
       "en"       "Players information - off"
       "ru"       "Информация об игроках - выключено"
   }
}

/*
Rank: {1} | Place in top: {2} | Score: {3}\nKills: {4} | Deaths: {5} | Assists: {6} | KDA: {7}\nShoots: {8} | Hits: {9} | In the headshot: {10}\nPlayed: {11} hour(s) {12} minute(s) {13} second(s)
Ранг: {1} | Место в топе: {2} | Очки: {3}\nУбийств: {4} | Смертей: {5} | Содействий: {6} | KDA: {7}\nВыстрелов: {8} | Попаданий: {9} | В голову: {10}\nОтыграл: {11} час(а/ов) {12} минут(ы) {13} секунд(ы)
*/
Публиковать плагин как ресурс не буду, кто хочет сделает сам.
Поддержку плагина не оказываю, писал для себя.
Хотите убрать какую то информацию > редактируйте файл перевода.

Скриншот:
Посмотреть вложение 41013
Прости что беспокою, можешь подправить плагин? Ошибка - levelsranks_playersinfo.smx ([LR] Players info): Native "LR_MenuInventory" was not found
 

Drumanid

Неактивный пользователь
Сообщения
1,768
Реакции
1,448
Прости что беспокою, можешь подправить плагин? Ошибка - levelsranks_playersinfo.smx ([LR] Players info): Native "LR_MenuInventory" was not found
Я Romeo скидывал последнюю версию, вроде как хочет сделать свою.


1579056086723.png
 

Вложения

  • Мне нравится
Реакции: s777
Сверху