PHP Code:
/*****************************************************************************
ВозможноÑти:
1. ÐаÑтроить Ñколько игроков выводить в ÑпиÑок
2. ÐаÑтроить минимальное количеÑтво игроков Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð°
3. ÐаÑтроить Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾ раунда выводить
4. Ð’Ñ€ÐµÐ¼Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°
5. Мгновенное закрытие меню по нажатию на клавиши цифр
6. Отключение показа через команду /damage , реализовано через setinfo
7. Помимо урона Ñ€Ñдом выводит также количеÑтво убийÑтв
8. ÐŸÑ€ÐµÑ„Ð¸ÐºÑ Ð¿ÐµÑ€ÐµÐ´ Ñообщением в чате
9. ÐаÑтроить Ñколько денег давать лучшему игроку раунда
Только на реапи, без реапи делать не буду, не вижу ÑмыÑла
*****************************************************************************/
#include <amxmodx>
#include <reapi>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif
#define PLUGIN "Top Round Damage"
#define VERSION "1.0.1 ReAPI"
#define AUTHOR "Dager* *.* -G-"
#if !defined MAX_PLAYERS
#define MAX_PLAYERS 32
#endif
#if !defined MAX_NAME_LENGTH
#define MAX_NAME_LENGTH 32
#endif
#define IsPlayer(%1) (1 <= %1 <= g_iMaxPlayers)
#define ClearArr(%1) arrayset(_:%1, _:0.0, sizeof(%1))
#define Keys (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9)
/* наÑтройки */
#define PREFIX "^4[CS]" // префикÑ
#define TOP_PLAYERS 5 // количеÑтво выводимых игроков в топ по дамагу [больше 10 нет ÑмыÑла указывать]
#define MIN_PLAYERS 2 // минимальное количеÑтво игроков Ð´Ð»Ñ Ð²Ñ‹Ð²Ð¾Ð´Ð° топа
#define ROUND_NUMBER 2 // Ñ ÐºÐ°ÐºÐ¾Ð³Ð¾ раунда выводить
#define SHOW_TIME 3 // через Ñколько Ñекунд закроетÑÑ Ð¼ÐµÐ½ÑŽ лучших игроков по дамагу за раунд [целое чиÑло]
#define GIVE_MONEY 500 // Ñколько денег давать лучшему игроку
/* не трогать вÑÑ‘ что ниже*/
enum _:ePlayerData
{
PLAYER_ID,
Float:DAMAGE,
KILLS
};
new g_arrData[MAX_PLAYERS + 1][ePlayerData];
new Float:g_flPlayerDmg[MAX_PLAYERS + 1];
new g_iPlayerKills[MAX_PLAYERS + 1];
new g_iRoundCounter;
new g_iMaxPlayers;
new g_bShow = true;
new g_isSwitch[MAX_PLAYERS + 1] = {0, ...};
new g_szText[3] = "";
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_clcmd("say /damage", "cmdTopDamageSwitch");
register_clcmd("say_team /damage", "cmdTopDamageSwitch");
RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Pre", false);
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", true);
RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed", true);
RegisterHookChain(RG_RoundEnd, "RoundEnd", true);
register_menucmd(register_menuid("TopDmg"), Keys, "fnTopDmgHandler");
g_iMaxPlayers = get_member_game(m_nMaxPlayers);
}
public client_putinserver(id)
{
if(g_bShow)
{
get_user_info(id, "_topdamage", g_szText, charsmax(g_szText));
g_isSwitch[id] = (g_szText[0]) ? str_to_num(g_szText) : 1;
}
else
g_isSwitch[id] = 0;
g_flPlayerDmg[id] = 0.0;
g_iPlayerKills[id] = 0;
}
public cmdTopDamageSwitch(id)
{
g_isSwitch[id] = (g_isSwitch[id]) ? 0 : 1;
num_to_str(g_isSwitch[id], g_szText, charsmax(g_szText));
client_cmd(id, "setinfo _topdamage %s", g_szText);
new szSwitch[20];
formatex(szSwitch, charsmax(szSwitch), "%s", g_isSwitch[id] ? "включили" : "отключили");
client_print_color(id, print_team_default,
"%s ^1Ð’Ñ‹ %s ^4TOP-%d DAMAGE PROVOCAT ^1IN ACEASTA RUNDA",
PREFIX, szSwitch, TOP_PLAYERS
);
return PLUGIN_CONTINUE;
}
public CSGameRules_RestartRound_Pre()
{
if(get_member_game(m_bCompleteReset))
g_iRoundCounter = 0;
g_iRoundCounter++;
ClearArr(g_flPlayerDmg);
ClearArr(g_iPlayerKills);
for(new i = 1; i <= g_iMaxPlayers; i++)
arrayset(g_arrData[i], 0, ePlayerData);
}
public CBasePlayer_TakeDamage(const pevVictim, pevInflictor, const pevAttacker, Float:flDamage, bitsDamageType)
{
if(pevVictim == pevAttacker || get_member(pevVictim, m_iTeam) == get_member(pevAttacker, m_iTeam) || bitsDamageType & DMG_BLAST)
return HC_CONTINUE;
if(IsPlayer(pevAttacker) && rg_is_player_can_takedamage(pevVictim, pevAttacker))
g_flPlayerDmg[pevAttacker] += flDamage;
return HC_CONTINUE;
}
public CBasePlayer_Killed(const Victim, Attacker)
{
if(!is_user_connected(Victim) || Victim == Attacker || !IsPlayer(Attacker) || get_member(Victim, m_iTeam) == get_member(Attacker, m_iTeam))
return HC_CONTINUE;
g_iPlayerKills[Attacker]++;
return HC_CONTINUE;
}
public fnCompareDamage()
{
new iPlayers[MAX_PLAYERS], iNum, iPlayer, szName[MAX_NAME_LENGTH];
get_players(iPlayers, iNum, "h");
for(new i = 0; i < iNum; i++)
{
iPlayer = iPlayers[i];
g_arrData[i][PLAYER_ID] = iPlayer;
g_arrData[i][DAMAGE] = _:g_flPlayerDmg[iPlayer];
g_arrData[i][KILLS] = _:g_iPlayerKills[iPlayer];
}
SortCustom2D(g_arrData, sizeof(g_arrData), "SortRoundDamage");
get_user_name(g_arrData[0][PLAYER_ID], szName, charsmax(szName));
rg_add_account(g_arrData[0][PLAYER_ID], GIVE_MONEY, AS_ADD, true);
client_print_color(0, print_team_default,
"%s ^3%s ^1a provocat cel mai mult damage in runda precedenta [^4%0.0f^1] si primeste [^4%d^3$^1].",
PREFIX, szName, g_arrData[0][DAMAGE], GIVE_MONEY
);
return PLUGIN_HANDLED;
}
public SortRoundDamage(const elem1[], const elem2[])
{
return (elem1[DAMAGE] < elem2[DAMAGE]) ? 1 : (elem1[DAMAGE] > elem2[DAMAGE]) ? -1 : 0;
}
public RoundEnd()
{
if(g_iRoundCounter >= ROUND_NUMBER)
{
set_task(0.1, "fnCompareDamage");
new iPlayers[MAX_PLAYERS], iNum, iPlayer;
get_players(iPlayers, iNum, "h");
for(new i = 0; i < iNum; i++)
{
iPlayer = iPlayers[i];
set_task(0.2, "fnShowStats", iPlayer);
}
}
}
public fnShowStats(id)
{
if(!g_isSwitch[id])
return PLUGIN_CONTINUE;
new iPlayers[MAX_PLAYERS], iNum, szMenu[512], szName[MAX_NAME_LENGTH], iLen;
get_players(iPlayers, iNum, "h");
iLen = formatex(szMenu, charsmax(szMenu), "\w#. \r[\yDamage\r] [\yFraguri\r] \win aceasta runda:^n^n");
if(iNum < MIN_PLAYERS)
return PLUGIN_CONTINUE;
if(iNum < TOP_PLAYERS)
{
for(new i = 0; i < iNum; i++)
{
get_user_name(g_arrData[i][PLAYER_ID], szName, charsmax(szName));
if(0.0 <= g_arrData[i][DAMAGE] < 10.0)
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y00%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
else if(10.0 <= g_arrData[i][DAMAGE] < 100.0)
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y0%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
else
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
}
}
else
{
for(new i = 0; i < TOP_PLAYERS; i++)
{
get_user_name(g_arrData[i][PLAYER_ID], szName, charsmax(szName));
if(0.0 <= g_arrData[i][DAMAGE] < 10.0)
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y00%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
else if(10.0 <= g_arrData[i][DAMAGE] < 100.0)
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y0%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
else
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\w%d. \r[\y%0.0f\r] [\y%d\r] \w%s^n", i + 1, g_arrData[i][DAMAGE], g_arrData[i][KILLS], szName);
}
}
show_menu(id, Keys, szMenu, SHOW_TIME, "TopDmg");
return PLUGIN_HANDLED;
}
public fnTopDmgHandler(id, iKey)
{
if(iKey >= 0 || iKey <= 9)
return PLUGIN_CONTINUE;
return PLUGIN_HANDLED;
}