Забавно, ладно... Сделай так:@Drumanid, Заметил небольшую проблему
У игрока в табе будет (к примеру) звание сильвер 5, а в hint будет писать от плагина , сильвер 6
Он в общем пишет , на одно звание выше нужного.
int iCount;
hKeyValues.GotoFirstSubKey();
do hKeyValues.GetSectionName(g_sRanksInfo[iCount++], sizeof(g_sRanksInfo[]));
int iCount = 1;
g_sRanksInfo[0] = "NONE";
hKeyValues.GotoFirstSubKey();
do hKeyValues.GetSectionName(g_sRanksInfo[iCount++], sizeof(g_sRanksInfo[]));
"NONE"
{
"en" "None"
"ru" "Нету"
}
FormatEx(SZF(sRank), "%T", g_sRanksInfo[LR_GetClientInfo(iTarget, ST_RANK)], iClient);
FormatEx(SZF(sRank), "%T", g_sRanksInfo[LR_GetClientInfo(iTarget, ST_RANK) +1], iClient);
Прости что беспокою, можешь подправить плагин? Ошибка - levelsranks_playersinfo.smx ([LR] Players info): Native "LR_MenuInventory" was not foundЖдал пока @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); }
Файл перевода:
Публиковать плагин как ресурс не буду, кто хочет сделает сам.C-подобный:"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
Я Romeo скидывал последнюю версию, вроде как хочет сделать свою.Прости что беспокою, можешь подправить плагин? Ошибка - levelsranks_playersinfo.smx ([LR] Players info): Native "LR_MenuInventory" was not found
Работает, спасибо!