Wyglądać ma to tak:
http://www66.zippysh...28kC/file.html
a wygląda to tak:
http://www66.zippysh...2iL1/file.html
to sp tego pluginu, próbowałem sam to zrobić, lecz się nie udało na hudzie pokazuje %s
Spoiler
#pragma semicolon 1
#include <sourcemod>
#include <topmenus>
#include <smrpg>
#include <smlib/clients>
#include <smrpg/smrpg_clients>
#include <smrpg/smrpg_topmenu>
#undef REQUIRE_EXTENSIONS
#include <clientprefs>
#pragma newdecls required
#define SECONDS_EXP_AVG_CALC 60.0
#define EXP_MEMORY_SIZE 10
// RPG Topmenu
TopMenu g_hRPGMenu;
// Clientprefs
bool g_bClientHidePanel[MAXPLAYERS+1];
Handle g_hCookieHidePanel;
// Last experience memory
int g_iLastExperience[MAXPLAYERS+1];
ArrayList g_hExperienceMemory[MAXPLAYERS+1];
int g_iExperienceThisMinute[MAXPLAYERS+1];
float g_fExperienceAverage[MAXPLAYERS+1];
bool g_bIsCSGO;
public Plugin myinfo =
{
name = "SM:RPG > Key Hint Infopanel",
author = "Jannik \"Peace-Maker\" Hartung",
description = "Shows some RPG stats in a panel on the screen",
version = SMRPG_VERSION,
url = "http://www.wcfan.de/"
}
public void OnPluginStart()
{
LoadTranslations("common.phrases");
LoadTranslations("smrpg.phrases");
LoadTranslations("smrpg_keyhint_info.phrases");
TopMenu hTopMenu;
if((hTopMenu = SMRPG_GetTopMenu()) != null)
SMRPG_OnRPGMenuReady(hTopMenu);
if(LibraryExists("clientprefs"))
OnLibraryAdded("clientprefs");
g_bIsCSGO = GetEngineVersion() == Engine_CSGO;
for(int i=1;i<=MaxClients;i++)
{
if(IsClientInGame(i))
OnClientPutInServer(i);
}
}
public void OnLibraryAdded(const char[] name)
{
if(StrEqual(name, "clientprefs"))
{
g_hCookieHidePanel = RegClientCookie("smrpg_keyhint_hide", "Hide the rpg info panel showing RPG stats.", CookieAccess_Protected);
}
}
public void OnLibraryRemoved(const char[] name)
{
if(StrEqual(name, "clientprefs"))
{
g_hCookieHidePanel = null;
}
}
public void OnClientCookiesCached(int client)
{
char sBuffer[4];
GetClientCookie(client, g_hCookieHidePanel, sBuffer, sizeof(sBuffer));
g_bClientHidePanel[client] = StringToInt(sBuffer)==1;
}
public void OnClientPutInServer(int client)
{
g_hExperienceMemory[client] = new ArrayList();
}
public void OnClientDisconnect(int client)
{
g_bClientHidePanel[client] = false;
g_iLastExperience[client] = 0;
ClearHandle(g_hExperienceMemory[client]);
g_iExperienceThisMinute[client] = 0;
g_fExperienceAverage[client] = 0.0;
}
public void OnMapStart()
{
CreateTimer(1.0, Timer_ShowInfoPanel, _, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
CreateTimer(SECONDS_EXP_AVG_CALC, Timer_CalculateEstimatedLevelupTime, _, TIMER_FLAG_NO_MAPCHANGE|TIMER_REPEAT);
}
public Action Timer_ShowInfoPanel(Handle timer)
{
if(!SMRPG_IsEnabled())
return Plugin_Continue;
int iTarget;
Obs_Mode iMode;
char sBuffer[512];
int iLevel, iExp, iExpForLevel, iExpNeeded;
char sTime[32];
int iRankCount = SMRPG_GetRankCount();
for(int i=1;i<=MaxClients;i++)
{
// This player doesn't want this info.
if(g_bClientHidePanel[i])
continue;
if(!IsClientInGame(i) || IsFakeClient(i))
continue;
iTarget = i;
// Show info of the player he's spectating
if(IsClientObserver(i) || !IsPlayerAlive(i))
{
// Only care for direct spectating of some player.
iMode = Client_GetObserverMode(i);
if(iMode != OBS_MODE_CHASE && iMode != OBS_MODE_IN_EYE)
continue;
// Make sure he's really observing someone.
iTarget = Client_GetObserverTarget(i);
if(iTarget <= 0 || iTarget > MaxClients)
continue;
}
// CS:GO doesn't support the KeyHint usermessage.
// Show a 3 line formatted HintText instead.
if (g_bIsCSGO)
strcopy(sBuffer, sizeof(sBuffer), "<font size=\"20\"><u>RPG Stats</u></font>");
else
strcopy(sBuffer, sizeof(sBuffer), "RPG Stats\n");
// Show the name of the player he's spectating
if(iTarget != i)
{
if (g_bIsCSGO)
Format(sBuffer, sizeof(sBuffer), "%s for <font color=\"#ff0000\">%N</font>\n", sBuffer, iTarget);
else
Format(sBuffer, sizeof(sBuffer), "%s%N\n", sBuffer, iTarget);
}
else if (g_bIsCSGO)
StrCat(sBuffer, sizeof(sBuffer), "\n");
iLevel = SMRPG_GetClientLevel(iTarget);
iExp = SMRPG_GetClientExperience(iTarget),
iExpForLevel = SMRPG_LevelToExperience(iLevel);
if (g_bIsCSGO)
{
Format(sBuffer, sizeof(sBuffer), "%s<font size=\"16\">%T\t", sBuffer, "Level", i, iLevel);
Format(sBuffer, sizeof(sBuffer), "%s%T\t", sBuffer, "Experience short", i, iExp, iExpForLevel);
Format(sBuffer, sizeof(sBuffer), "%s%T</font>", sBuffer, "Credits", i, SMRPG_GetClientCredits(iTarget));
}
else
{
Format(sBuffer, sizeof(sBuffer), "%s\n%T\n", sBuffer, "Level", i, iLevel);
Format(sBuffer, sizeof(sBuffer), "%s%T\n", sBuffer, "Experience short", i, iExp, iExpForLevel);
Format(sBuffer, sizeof(sBuffer), "%s%T", sBuffer, "Credits", i, SMRPG_GetClientCredits(iTarget));
}
// No space for that in CS:GO :(
if (!g_bIsCSGO)
{
int iRank = SMRPG_GetClientRank(iTarget);
if(iRank > 0)
Format(sBuffer, sizeof(sBuffer), "%s\n%T", sBuffer, "Rank", i, iRank, iRankCount);
}
if(g_fExperienceAverage[iTarget] > 0.0)
{
iExpNeeded = iExpForLevel - iExp;
SecondsToString(sTime, sizeof(sTime), RoundToCeil(float(iExpNeeded)/g_fExperienceAverage[iTarget]*SECONDS_EXP_AVG_CALC));
if (g_bIsCSGO)
Format(sBuffer, sizeof(sBuffer), "%s\t<font size=\"15\" color=\"#00ff00\"><i>%T: %s</i></font>", sBuffer, "Estimated time until levelup", i, sTime);
else
Format(sBuffer, sizeof(sBuffer), "%s\n%T: %s", sBuffer, "Estimated time until levelup", i, sTime);
}
// Not enough space in csgo..
if(!g_bIsCSGO)
{
if(g_iLastExperience[iTarget] > 0)
Format(sBuffer, sizeof(sBuffer), "%s\n%T: +%d", sBuffer, "Last Experience Short", i, g_iLastExperience[iTarget]);
if(SMRPG_IsClientAFK(iTarget))
Format(sBuffer, sizeof(sBuffer), "%s\n\n%T", sBuffer, "Player is AFK", i);
}
if (g_bIsCSGO)
Client_PrintHintText(i, "%s", sBuffer);
else
Client_PrintKeyHintText(i, "%s", sBuffer);
}
return Plugin_Continue;
}
public Action Timer_CalculateEstimatedLevelupTime(Handle timer)
{
int iCount, iTotalExp;
for(int client=1;client<=MaxClients;client++)
{
if(!IsClientInGame(client))
continue;
iCount = GetArraySize(g_hExperienceMemory[client]);
if(iCount < EXP_MEMORY_SIZE)
{
g_hExperienceMemory[client].Push(g_iExperienceThisMinute[client]);
}
// Keep the array at EXP_MEMORY_SIZE size
else
{
g_hExperienceMemory[client].ShiftUp(0);
g_hExperienceMemory[client].Set(0, g_iExperienceThisMinute[client]);
g_hExperienceMemory[client].Erase(EXP_MEMORY_SIZE);
}
// Start counting experience for the next minute.
g_iExperienceThisMinute[client] = 0;
// Get the average over the past few minutes
iCount = g_hExperienceMemory[client].Length;
iTotalExp = 0;
for(int i=0;i<iCount;i++)
{
iTotalExp += g_hExperienceMemory[client].Get(i);
}
g_fExperienceAverage[client] = float(iTotalExp)/float(iCount);
}
}
public void SMRPG_OnAddExperiencePost(int client, const char[] reason, int iExperience, int other)
{
g_iLastExperience[client] = iExperience;
g_iExperienceThisMinute[client] += iExperience;
}
/**
* RPG Topmenu stuff
*/
public void SMRPG_OnRPGMenuReady(TopMenu topmenu)
{
// Block us from being called twice!
if(g_hRPGMenu == topmenu)
return;
g_hRPGMenu = topmenu;
TopMenuObject iTopMenuSettings = g_hRPGMenu.FindCategory(RPGMENU_SETTINGS);
if(iTopMenuSettings != INVALID_TOPMENUOBJECT)
{
g_hRPGMenu.AddItem("rpgkeyhint_showinfo", TopMenu_SettingsItemHandler, iTopMenuSettings);
}
}
public void TopMenu_SettingsItemHandler(TopMenu topmenu, TopMenuAction action, TopMenuObject object_id, int param, char[] buffer, int maxlength)
{
switch(action)
{
case TopMenuAction_DisplayOption:
{
Format(buffer, maxlength, "%T: %T", "Hide stats info panel on the right", param, (g_bClientHidePanel[param]?"Yes":"No"), param);
}
case TopMenuAction_SelectOption:
{
g_bClientHidePanel[param] = !g_bClientHidePanel[param];
if(g_hCookieHidePanel != null && AreClientCookiesCached(param))
{
char sBuffer[4];
IntToString(g_bClientHidePanel[param], sBuffer, sizeof(sBuffer));
SetClientCookie(param, g_hCookieHidePanel, sBuffer);
}
topmenu.Display(param, TopMenuPosition_LastCategory);
// Hide the panel right away to be responsive!
if(g_bClientHidePanel[param] && !g_bIsCSGO)
Client_PrintKeyHintText(param, "TEKTSTTT");
}
}
}
// Taken from SourceBans 2's sb_bans :)
void SecondsToString(char[] sBuffer, int iLength, int iSecs, bool bTextual = true)
{
if(bTextual)
{
char sDesc[6][8] = {"mo", "wk", "d", "hr", "min", "sec"};
int iCount, iDiv[6] = {60 * 60 * 24 * 30, 60 * 60 * 24 * 7, 60 * 60 * 24, 60 * 60, 60, 1};
sBuffer[0] = '\0';
for(int i = 0; i < sizeof(iDiv); i++)
{
if((iCount = iSecs / iDiv[i]) > 0)
{
Format(sBuffer, iLength, "%s%i %s, ", sBuffer, iCount, sDesc[i]);
iSecs %= iDiv[i];
}
}
sBuffer[strlen(sBuffer) - 2] = '\0';
}
else
{
int iHours = iSecs / 60 / 60;
iSecs -= iHours * 60 * 60;
int iMins = iSecs / 60;
iSecs %= 60;
Format(sBuffer, iLength, "%02i:%02i:%02i", iHours, iMins, iSecs);
}
}


Dodatki SourceMod




Moja zawartość
Mężczyzna