Пытался своими корявенькими ручонками добавить в статистику Хедшоты
Естественно у меня ниче не работает
Сам файл статистики rank.ini создется, в него записываются стим+ник игроков, но не записывается kills deaths hs
И окно MOTD top15 не открывается по команде.
Помогите пожалуйста инвалиду)))
Рабочий код выше, если что)
Код:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#define HTML_IN_MOTD
#define SAVE_RANKS_AFTER_SORT
#define SORT_INTERVAL 3.0
enum RankData
{
Data_SteamID[32],
Data_Name[32],
Data_Kills,
Data_Deaths,
Data_HS
};
new g_File[80];
new Array:g_SteamID;
new Trie:g_Name, Trie:g_Kills, Trie:g_Deaths, Trie:g_HS;
new g_Top15[2048];
new bool:g_Sort = true;
new g_Data[33][RankData], bool:g_Authorized[33];
public plugin_init()
{
register_plugin("Rank", "3.0", "hleV");
RegisterHam( Ham_Spawn, "player", "FwdPlayerSpawnPost", 1 );
get_datadir(g_File, 79);
add(g_File, 79, "/ranks.ini");
g_SteamID = ArrayCreate(32, 1);
g_Name = TrieCreate();
g_Kills = TrieCreate();
g_Deaths = TrieCreate();
g_HS = TrieCreate();
LoadRanks();
ArraySort(g_SteamID, "SortRanks");
WriteTop15();
set_task(SORT_INTERVAL, "SortTask", _, _, _, "b");
register_clcmd("say /rank", "SayRank");
register_clcmd("say /top", "SayTop15");
register_clcmd("say /top15", "SayTop15");
register_event("DeathMsg", "DeathMsg", "a");
}
public plugin_end()
{
ArraySort(g_SteamID, "SortRanks");
SaveRanks();
ArrayDestroy(g_SteamID);
}
public client_putinserver(Client)
{
if(!is_user_steam(Client))
return;
get_user_authid(Client, g_Data[Client][Data_SteamID], 31);
get_user_name(Client, g_Data[Client][Data_Name], 31);
if (!TrieKeyExists(g_Name, g_Data[Client][Data_SteamID]))
AddRank(Client);
else
LoadData(Client);
UpdateRank(Client, true);
g_Authorized[Client] = true;
}
public client_disconnect(Client)
g_Authorized[Client] = false;
public client_infochanged(Client)
{
if (!g_Authorized[Client])
return;
static Name[32];
get_user_info(Client, "name", Name, 31);
if (equal(Name, g_Data[Client][Data_Name]))
return;
copy(g_Data[Client][Data_Name], 31, Name);
UpdateRank(Client, true);
}
public FwdPlayerSpawnPost( Client )
{
if(!is_user_steam(Client))
return;
if( is_user_alive( Client ) )
{
set_task(0.1, "SayRank", Client)
}
}
public SayRank(Client)
{
if(!is_user_steam(Client))
{
client_print(Client,print_chat, "Stats only for STEAM players!");
return;
}
new Position = GetPosition(Client);
if (!g_Authorized[Client] || !Position)
{
client_print(Client, print_chat, "* You are not ranked.");
return;
}
client_print
(
Client,
print_chat,
"* Your rank is %d of %d with %d kills, %d deaths, %d HeadShots.",
Position,
ArraySize(g_SteamID),
g_Data[Client][Data_Kills],
g_Data[Client][Data_Deaths],
g_Data[Client][Data_HS]
);
}
public SayTop15(Client)
show_motd(Client, g_Top15, "Top 15");
public DeathMsg()
{
new Killer = read_data(1);
new Victim = read_data(2);
new HS = read_data(3);
if (g_Authorized[Victim])
{
g_Data[Victim][Data_Deaths]++;
g_Sort = true;
UpdateRank(Victim, false);
}
if (g_Authorized[Killer] && Killer != Victim)
{
g_Data[Killer][Data_Kills]++;
g_Data[HS][Data_HS]++;
g_Sort = true;
UpdateRank(Killer, false);
}
}
public SortTask()
{
if (!g_Sort)
return;
ArraySort(g_SteamID, "SortRanks");
WriteTop15();
#if defined SAVE_RANKS_AFTER_SORT
SaveRanks();
#endif
}
public SortRanks(Array:SteamID, Position1, Position2)
{
static SteamID1[32];
ArrayGetString(SteamID, Position1, SteamID1, 31);
static SteamID2[32];
ArrayGetString(SteamID, Position2, SteamID2, 31);
static Kills1;
TrieGetCell(g_Kills, SteamID1, Kills1);
static Kills2;
TrieGetCell(g_Kills, SteamID2, Kills2);
static Deaths1;
TrieGetCell(g_Deaths, SteamID1, Deaths1);
static Deaths2;
TrieGetCell(g_Deaths, SteamID2, Deaths2);
static HS1;
TrieGetCell(g_HS, SteamID1, HS1);
static HS2;
TrieGetCell(g_HS, SteamID2, HS2);
if (Kills1 - Deaths1 + HS1 < Kills2 - Deaths2 + HS2)
return 1;
else if (Kills1 - Deaths1 + HS1 > Kills2 - Deaths2 + HS2)
return -1;
return 0;
}
LoadRanks()
{
new File = fopen(g_File, "r");
if (!File)
return;
new Data[112], SteamID[32], Name[32], Kills[16], Deaths[16], HS[16];
while (!feof(File))
{
fgets(File, Data, 112);
if (!strlen(Data))
continue;
parse(Data, SteamID, 31, Name, 31, Kills, 15, Deaths, 15, HS, 15);
ArrayPushString(g_SteamID, SteamID);
TrieSetString(g_Name, SteamID, Name);
TrieSetCell(g_Kills, SteamID, str_to_num(Kills));
TrieSetCell(g_Deaths, SteamID, str_to_num(Deaths));
TrieSetCell(g_HS, SteamID, str_to_num(HS));
}
fclose(File);
}
SaveRanks()
{
new File = fopen(g_File, "w+");
if (!File)
return;
for (new Position, Size = ArraySize(g_SteamID), SteamID[32], Name[32], Kills, Deaths, HS; Position < Size; Position++)
{
ArrayGetString(g_SteamID, Position, SteamID, 31);
TrieGetString(g_Name, SteamID, Name, 31);
TrieGetCell(g_Kills, SteamID, Kills);
TrieGetCell(g_Deaths, SteamID, Deaths);
TrieGetCell(g_HS, SteamID, HS);
fprintf(File, "%s ^"%s^" %d %d %d^n", SteamID, Name, Kills, Deaths, HS);
}
fclose(File);
}
AddRank(Client)
{
g_Data[Client][Data_Kills] = 0;
g_Data[Client][Data_Deaths] = 0;
g_Data[Client][Data_HS] = 0;
ArrayPushString(g_SteamID, g_Data[Client][Data_SteamID]);
TrieSetString(g_Name, g_Data[Client][Data_SteamID], g_Data[Client][Data_Name]);
}
LoadData(Client)
{
TrieGetCell(g_Kills, g_Data[Client][Data_SteamID], g_Data[Client][Data_Kills]);
TrieGetCell(g_Deaths, g_Data[Client][Data_SteamID], g_Data[Client][Data_Deaths]);
TrieGetCell(g_HS, g_Data[Client][Data_SteamID], g_Data[Client][Data_HS]);
}
UpdateRank(Client, bool:Name)
{
if (Name)
TrieSetString(g_Name, g_Data[Client][Data_SteamID], g_Data[Client][Data_Name]);
TrieSetCell(g_Kills, g_Data[Client][Data_SteamID], g_Data[Client][Data_Kills]);
TrieSetCell(g_Deaths, g_Data[Client][Data_SteamID], g_Data[Client][Data_Deaths]);
TrieSetCell(g_HS, g_Data[Client][Data_SteamID], g_Data[Client][Data_HS]);
}
GetPosition(Client)
{
static Position, Size, SteamID[32];
for (Position = 0, Size = ArraySize(g_SteamID); Position < Size; Position++)
{
ArrayGetString(g_SteamID, Position, SteamID, 31);
if (equal(SteamID, g_Data[Client][Data_SteamID]))
return Position + 1;
}
return 0;
}
WriteTop15()
{
#if defined HTML_IN_MOTD
static const Header[] = "<body bgcolor=#000000><font color=#87cefa><pre>%5s %30s %5s %5s %s^n^n";
static const Buffer[] = "%5d %30s %5d %5d %5d^n";
#else
static const Header[] = "%5s %22s %5s %5s^n^n";
static const Buffer[] = "%5d %22s %5d %5d^n";
#endif
static Length, Position, Size, SteamID[32], Name[32], Kills, Deaths, HS;
Length = formatex(g_Top15[Length], 2047 - Length, Header, "Rank", "Name", "Kills", "Deaths, HS");
for (Position = 0, Size = min(ArraySize(g_SteamID), 20); Position < Size; Position++)
{
ArrayGetString(g_SteamID, Position, SteamID, 31);
TrieGetString(g_Name, SteamID, Name, 31);
TrieGetCell(g_Kills, SteamID, Kills);
TrieGetCell(g_Deaths, SteamID, Deaths);
TrieGetCell(g_HS, SteamID, HS);
Length += formatex(g_Top15[Length], 2047 - Length, Buffer, Position + 1, Name, Kills, Deaths, HS);
}
}
stock bool:is_user_steam(Client)
{
static dp_pointer;
if(dp_pointer || (dp_pointer = get_cvar_pointer("dp_r_id_provider")))
{
server_cmd("dp_clientinfo %d", Client);
server_exec();
return (get_pcvar_num(dp_pointer) == 2) ? true : false;
}
new szAuthid[34];
get_user_authid(Client, szAuthid, charsmax(szAuthid));
return (containi(szAuthid, "LAN") < 0);
}