const MAX_ENTSARRAYS_SIZE = 64
#define AlignEntArrayPos(%0) ( %0 >> 5 )
new const PLUGIN[] = "AntiRoxx";
new const VERSION[] = "5.0.12";
#include < amxmodx >
#include < amxmisc >
#include < engine >
#include < fakemeta >
#include < hamsandwich >
#include < cstrike >
#include < fun >
#include < nvault >
#pragma semicolon 1
//////////////////////////////////////////////////////////////////////////////////////////////
const FLAG_ADMIN_ANTIROXX = ADMIN_LEVEL_A;
// new OLD_ANTIROXX_PATH[] = "addons/amx/config/antiroxx_logs";
// new OLD_ANTIROXX_PATH[] = "addons/amxmodx/configs/antiroxx_logs";
new OLD_ANTIROXX_PATH[] = "";
//////////////////////////////////////////////////////////////////////////////////////////////
#define cm(%0) ( sizeof(%0) - 1 )
const MAX_MOTD_LENGTH = 1536;
new g_szMotd[MAX_MOTD_LENGTH];
const DMG_GRENADE = 1<<24;
#define pdata_valid(%0) ( pev_valid(%0) == 2 )
const NADES_BITSUM = 1< 0 )
{
switch( item )
{
case 1:
{
if( !g_iNewbieMode )
{
return ITEM_DISABLED;
}
}
case 2:
{
if( !g_iWeaponsMode )
{
return ITEM_DISABLED;
}
}
case 3:
{
if( !g_iHealthMode )
{
return ITEM_DISABLED;
}
}
case 4:
{
if( !g_iDamageMode )
{
return ITEM_DISABLED;
}
}
}
}
return ITEM_IGNORE;
}
public AntiRoxx_Menu_Handler(id, menu, item)
{
if( item == MENU_EXIT )
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
switch( item )
{
case 0: // main
{
ShowMain(id);
}
case 1: // newbie
{
ShowNewbie(id);
}
case 2: // weapons
{
ShowWeapons(id);
}
case 3: // health
{
ShowHealth(id);
}
case 4: // damage
{
ShowRatios(id);
}
case 5:
{
AdminsShowMotdStats(id);
}
case 6:
{
AdminsShowConStats(id);
}
}
cs_set_user_menu(id, 0);
menu_display(id, menu);
return PLUGIN_HANDLED;
}
HandleGlobalVars()
{
gmsgTextMsg = get_user_msgid("TextMsg");
g_iMaxPlayers = get_maxplayers();
}
HandleNVault()
{
if( !g_iVault )
{
g_iVault = nvault_open("antiroxx");
}
if( OLD_ANTIROXX_PATH[0] )
{
CheckOldSaveSystemFiles();
}
new prune = get_pcvar_num(antiroxx_prune_days);
if( prune > 0 )
{
nvault_prune(g_iVault, 0, get_systime(-prune * 86400)); // 1 day = 24 hours * 60 minutes * 60 seconds = 86400 seconds
}
}
CheckOldSaveSystemFiles()
{
new szFileName[40], szFullPathFileName[sizeof(OLD_ANTIROXX_PATH) + sizeof(szFileName)], szFrags[6], szDeaths[6], iLen;
new dp = open_dir(OLD_ANTIROXX_PATH, szFileName, cm(szFileName));
if( !dp )
{
return;
}
if( szFileName[0] )
{
new buffer[32], steamid[32];
do
{
if( equal(szFileName, "STEAM_", 6) )
{
formatex(szFullPathFileName, cm(szFullPathFileName), "%s/%s", OLD_ANTIROXX_PATH, szFileName);
read_file(szFullPathFileName, 0, buffer, cm(buffer), iLen);
parse(buffer, szFrags, cm(szFrags), szDeaths, cm(szDeaths));
formatex(buffer, cm(buffer), "%s %s", szFrags, szDeaths);
iLen = copy(steamid, cm(steamid), szFileName);
steamid[ 7 ] = steamid[ 9 ] = ':'; // 'STEAM_X_X_' to 'STEAM_X:X:'
steamid[ iLen - 4 ] = EOS; // remove extension
nvault_set(g_iVault, steamid, buffer);
}
delete_file(szFullPathFileName);
}
while( next_file(dp, szFileName, cm(szFileName)) );
}
close_dir(dp);
dp = 0;
unlink(OLD_ANTIROXX_PATH); // does this work for directory ?
}
HandleCvars()
{
set_pcvar_string
(
register_cvar(PLUGIN, VERSION, FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY),
VERSION
);
antiroxx_active = register_cvar("antiroxx_active", "1");
antiroxx_always_count = register_cvar("antiroxx_always_count", "1");
antiroxx_ratio_kick = register_cvar("antiroxx_ratio_kick", "-1.0");
antiroxx_kick_min_frags = register_cvar("antiroxx_kick_min_frags", "100");
antiroxx_default_score = register_cvar("antiroxx_default_score", "20");
antiroxx_maxcumul = register_cvar("antiroxx_maxcumul", "1000000"); // max 999999999
antiroxx_prune_days = register_cvar("antiroxx_prune_days", "0");
// Newbie Mode
antiroxx_newbie_mode = register_cvar("antiroxx_newbie_mode", "0");
antiroxx_ratio_newbie = register_cvar("antiroxx_ratio_newbie", "0.3");
antiroxx_glow_newbie_t = register_cvar("antiroxx_glow_newbie_t", "120 0 0 50");
antiroxx_glow_newbie_ct = register_cvar("antiroxx_glow_newbie_ct", "0 0 120 50");
// Weapons Mode
antiroxx_weapons_mode = register_cvar("antiroxx_weapons_mode", "0");
antiroxx_ratio_shield = register_cvar("antiroxx_ratio_shield", "-1.0");
new szCvarName[32] = "antiroxx_ratio_";
for(new iId = CSW_P228; iId <= CSW_P90; iId++)
{
if( iId != 2 && iId != CSW_C4 && g_szWeaponName[iId][0] )
{
formatex(szCvarName[15], cm(szCvarName)-15, g_szWeaponName[iId][7]);
antiroxx_ratio_wpn[iId] = register_cvar(szCvarName, "-1.0");
}
}
// Health Mode
antiroxx_health_mode = register_cvar("antiroxx_health_mode", "0");
antiroxx_health_bonus1 = register_cvar("antiroxx_health_bonus1", "10");
antiroxx_health_bonus2 = register_cvar("antiroxx_health_bonus2", "20");
antiroxx_health_bonus3 = register_cvar("antiroxx_health_bonus3", "30");
antiroxx_health_malus1 = register_cvar("antiroxx_health_malus1", "-10");
antiroxx_health_malus2 = register_cvar("antiroxx_health_malus2", "-20");
antiroxx_health_malus3 = register_cvar("antiroxx_health_malus3", "-30");
antiroxx_health_bonus_ratio1 = register_cvar("antiroxx_health_bonus_ratio1", "0.5");
antiroxx_health_bonus_ratio2 = register_cvar("antiroxx_health_bonus_ratio2", "0.4");
antiroxx_health_bonus_ratio3 = register_cvar("antiroxx_health_bonus_ratio3", "0.3");
antiroxx_health_malus_ratio1 = register_cvar("antiroxx_health_malus_ratio1", "2.0");
antiroxx_health_malus_ratio2 = register_cvar("antiroxx_health_malus_ratio2", "3.0");
antiroxx_health_malus_ratio3 = register_cvar("antiroxx_health_malus_ratio3", "4.0");
// Damage Mode
antiroxx_damage_mode = register_cvar("antiroxx_damage_mode", "0");
antiroxx_max_adv_factor = register_cvar("antiroxx_max_adv_factor", "10.0");
antiroxx_max_handicap_factor = register_cvar("antiroxx_max_handicap_factor", "0.04");
antiroxx_max_adv_factor_he = register_cvar("antiroxx_max_adv_factor_he", "1.0");
antiroxx_max_handicap_factor_he = register_cvar("antiroxx_max_handicap_factor_he", "0.2");
}
CacheCvarValues()
{
g_iActive = get_pcvar_num(antiroxx_active);
g_iAlwaysCount = get_pcvar_num(antiroxx_always_count);
g_iDefaultScore = get_pcvar_num(antiroxx_default_score);
g_iKickMinFrags = get_pcvar_num(antiroxx_kick_min_frags);
g_iNewbieMode = get_pcvar_num(antiroxx_newbie_mode);
g_iWeaponsMode = get_pcvar_num(antiroxx_weapons_mode);
g_iHealthMode = get_pcvar_num(antiroxx_health_mode);
g_iHealthBonus1 = get_pcvar_num(antiroxx_health_bonus1);
g_iHealthBonus2 = get_pcvar_num(antiroxx_health_bonus2);
g_iHealthBonus3 = get_pcvar_num(antiroxx_health_bonus3);
g_iHealthMalus1 = get_pcvar_num(antiroxx_health_malus1);
g_iHealthMalus2 = get_pcvar_num(antiroxx_health_malus2);
g_iHealthMalus3 = get_pcvar_num(antiroxx_health_malus3);
g_iDamageMode = get_pcvar_num(antiroxx_damage_mode);
new szValue[10];
get_pcvar_string(antiroxx_maxcumul, szValue, cm(szValue));
g_iMaxCumul = str_to_num(szValue);
g_flRatioKick = get_pcvar_float(antiroxx_ratio_kick);
g_flRatioNewbie = get_pcvar_float(antiroxx_ratio_newbie);
g_flLowestRatio = 99999.0;
new Float:flTempRatio;
for(new iId = CSW_P228; iId <= CSW_P90; iId++)
{
if( iId != 2 && antiroxx_ratio_wpn[iId] )
{
flTempRatio = g_flRatioWpn[iId] = get_pcvar_float(antiroxx_ratio_wpn[iId]);
if( 0.0 < flTempRatio < g_flLowestRatio )
{
g_flLowestRatio = flTempRatio;
}
}
}
g_flRatioShield = get_pcvar_float(antiroxx_ratio_shield);
g_flHealthBonusRatio1 = get_pcvar_float(antiroxx_health_bonus_ratio1);
g_flHealthBonusRatio2 = get_pcvar_float(antiroxx_health_bonus_ratio2);
g_flHealthBonusRatio3 = get_pcvar_float(antiroxx_health_bonus_ratio3);
g_flHealthMalusRatio1 = get_pcvar_float(antiroxx_health_malus_ratio1);
g_flHealthMalusRatio2 = get_pcvar_float(antiroxx_health_malus_ratio2);
g_flHealthMalusRatio3 = get_pcvar_float(antiroxx_health_malus_ratio3);
g_flMaxAdvFactor = get_pcvar_float(antiroxx_max_adv_factor);
g_flMaxHandicapFactor = get_pcvar_float(antiroxx_max_handicap_factor);
g_flMaxAdvFactorHe = get_pcvar_float(antiroxx_max_adv_factor_he);
g_flMaxHandicapFactorHe = get_pcvar_float(antiroxx_max_handicap_factor_he);
new szColor[16], szRenderings[4][4];
get_pcvar_string(antiroxx_glow_newbie_t, szColor, cm(szColor));
if( szColor[0] && parse(szColor, szRenderings[0], cm(szRenderings[]), szRenderings[1], cm(szRenderings[]), szRenderings[2], cm(szRenderings[]), szRenderings[3], cm(szRenderings[])) == 4 )
{
g_iGlowNewbieRenderTe[0] = str_to_num(szRenderings[0]);
g_iGlowNewbieRenderTe[1] = str_to_num(szRenderings[1]);
g_iGlowNewbieRenderTe[2] = str_to_num(szRenderings[2]);
g_iGlowNewbieRenderTe[3] = str_to_num(szRenderings[3]);
}
else
{
g_iGlowNewbieRenderTe[0] = 120;
g_iGlowNewbieRenderTe[1] = 0;
g_iGlowNewbieRenderTe[2] = 0;
g_iGlowNewbieRenderTe[3] = 50;
}
get_pcvar_string(antiroxx_glow_newbie_ct, szColor, cm(szColor));
if( szColor[0] && parse(szColor, szRenderings[0], cm(szRenderings[]), szRenderings[1], cm(szRenderings[]), szRenderings[2], cm(szRenderings[]), szRenderings[3], cm(szRenderings[])) == 4 )
{
g_iGlowNewbieRenderCt[0] = str_to_num(szRenderings[0]);
g_iGlowNewbieRenderCt[1] = str_to_num(szRenderings[1]);
g_iGlowNewbieRenderCt[2] = str_to_num(szRenderings[2]);
g_iGlowNewbieRenderCt[3] = str_to_num(szRenderings[3]);
}
else
{
g_iGlowNewbieRenderCt[0] = 0;
g_iGlowNewbieRenderCt[1] = 0;
g_iGlowNewbieRenderCt[2] = 120;
g_iGlowNewbieRenderCt[3] = 50;
}
ManageForwards();
}
ManageForwards()
{
if( g_iActive && (g_iNewbieMode || g_iDamageMode ) )
{
EnableHamForward( g_iHhTraceAttack );
EnableHamForward( g_iHhTakeDamage );
if( g_iHhTraceAttackCSBOT )
{
EnableHamForward( g_iHhTraceAttackCSBOT );
EnableHamForward( g_iHhTakeDamageCSBOT );
}
}
else
{
DisableHamForward( g_iHhTraceAttack );
DisableHamForward( g_iHhTakeDamage );
if( g_iHhTraceAttackCSBOT )
{
DisableHamForward( g_iHhTraceAttackCSBOT );
DisableHamForward( g_iHhTakeDamageCSBOT );
}
}
if( g_iActive && g_iWeaponsMode )
{
EnableHamForward( g_iHhWpnBxTouch );
EnableHamForward( g_iHhArmouryTouch );
EnableHamForward( g_iHhAddPlayerItem );
if( g_flRatioShield > 0.0 )
{
EnableHamForward( g_iHhShieldTouch );
}
else
{
DisableHamForward( g_iHhShieldTouch );
}
}
else
{
DisableHamForward( g_iHhWpnBxTouch );
DisableHamForward( g_iHhArmouryTouch );
DisableHamForward( g_iHhShieldTouch );
DisableHamForward( g_iHhAddPlayerItem );
}
}
HandleForwards()
{
new const PLAYER_CLASS[] = "player";
RegisterHam(Ham_Killed, PLAYER_CLASS, "OnCBasePlayer_Killed_P", true);
RegisterHam(Ham_Spawn, PLAYER_CLASS, "OnCBasePlayer_Spawn_P", true);
DisableHamForward( g_iHhTraceAttack = RegisterHam(Ham_TraceAttack, PLAYER_CLASS, "OnCBasePlayer_TraceAttack", false) );
DisableHamForward( g_iHhTakeDamage = RegisterHam(Ham_TakeDamage, PLAYER_CLASS, "OnCBasePlayer_TakeDamage", false) );
DisableHamForward( g_iHhWpnBxTouch = RegisterHam(Ham_Touch, "weaponbox", "OnCWeaponBox_Touch") );
DisableHamForward( g_iHhArmouryTouch = RegisterHam(Ham_Touch, "armoury_entity", "OnCArmoury_Touch") );
DisableHamForward( g_iHhShieldTouch = RegisterHam(Ham_Touch, "weapon_shield", "OnCWShield_Touch") );
DisableHamForward( g_iHhAddPlayerItem = RegisterHam(Ham_AddPlayerItem, PLAYER_CLASS, "OnCBasePlayer_AddPlayerItem") );
register_event("HLTV", "Event_HLTV_New_Round", "a", "1=0", "2=0");
state Not_Registered;
new modname[7];
get_modname(modname, cm(modname));
if( equal(modname, "czero") )
{
register_event("TextMsg", "Event_TextMsg_Game_connected", "a", "1=1", "2=#Game_connected");
}
}
public Event_TextMsg_Game_connected() {}
public Event_TextMsg_Game_connected()
{
new szName[32];
read_data(3, szName, cm(szName));
new id = find_player("ai", szName);
if( id && IsCzBot( id ) )
{
HandleCzBotsHamForwards(id);
state Registered;
}
}
IsCzBot( id )
{
#if defined Ham_CS_Player_IsBot
static valid = -1;
if( valid == -1 )
{
valid = IsHamValid( Ham_CS_Player_IsBot );
}
if( valid )
{
return ExecuteHam(Ham_CS_Player_IsBot, id);
}
return ExecuteHam(Ham_Weapon_ExtractClipAmmo, id, 0);
#else
return ExecuteHam(Ham_Weapon_ExtractClipAmmo, id, 0);
#endif
}
HandleCzBotsHamForwards( id )
{
RegisterHamFromEntity(Ham_Killed, id, "OnCBasePlayer_Killed_P", true);
RegisterHamFromEntity(Ham_Spawn, id, "OnCBasePlayer_Spawn_P", true);
DisableHamForward( g_iHhTraceAttackCSBOT = RegisterHamFromEntity(Ham_TraceAttack, id, "OnCBasePlayer_TraceAttack", false) );
DisableHamForward( g_iHhTakeDamageCSBOT = RegisterHamFromEntity(Ham_TakeDamage, id, "OnCBasePlayer_TakeDamage", false) );
ManageForwards();
}
HandleConfigs()
{
new szConfigDir[128], szMapName[32], szCfgFile[192];
get_configsdir(szConfigDir, cm(szConfigDir));
get_mapname(szMapName, cm(szMapName));
strtolower(szMapName);
// check for map specific first
formatex(szCfgFile, cm(szCfgFile), "%s/antiroxx/maps/%s.cfg", szConfigDir, szMapName);
if( !file_exists(szCfgFile) ) // check for prefix cfg file
{
szCfgFile[0] = EOS;
new i;
if( (i = contain(szMapName, "_")) > 0 && szMapName[i+1] != EOS )
{
szMapName[i] = EOS;
formatex(szCfgFile, cm(szCfgFile), "%s/antiroxx/maps/prefix_%s.cfg", szConfigDir, szMapName);
}
if( !szCfgFile[0] || !file_exists(szCfgFile) ) // default cfg file
{
formatex(szCfgFile, cm(szCfgFile), "%s/antiroxx/antiroxx.cfg", szConfigDir);
}
}
server_cmd("exec %s", szCfgFile);
}
public Event_HLTV_New_Round()
{
CacheCvarValues();
}
public plugin_end()
{
nvault_close(g_iVault);
g_iVault = 0;
}
public plugin_pause()
{
if( g_iVault )
{
new players[32], num;
get_players(players, num, "ch");
for(--num; num>=0; num--)
{
client_disconnect( players[num] );
}
nvault_close(g_iVault);
g_iVault = 0;
}
}
GETPLAYERAUTHID(id, bGet = false)
{
static szAuthid[33][32];
if( bGet )
{
get_user_authid(id, szAuthid[id], cm(szAuthid[]));
}
return szAuthid[id];
}
public plugin_unpause()
{
if( !g_iVault )
{
g_iVault = nvault_open("antiroxx");
}
new players[32], num;
get_players(players, num, "ch");
for(--num; num>=0; num--)
{
client_authorized( players[num] );
}
}
public client_authorized(id)
{
static szUserScore[22];
if( !is_user_bot(id) && nvault_get(g_iVault, GETPLAYERAUTHID(id, true), szUserScore, cm(szUserScore)) )
{
static szFrags[11], szDeaths[11];
parse(szUserScore, szFrags, cm(szFrags), szDeaths, cm(szDeaths));
g_iFrags[id] = str_to_num(szFrags);
g_iDeaths[id] = str_to_num(szDeaths);
}
else
{
new minScore = max(g_iDefaultScore, 10);
g_iFrags[id] = minScore;
g_iDeaths[id] = minScore;
}
if( g_iActive )
{
CheckUserRatio( id );
}
}
public client_connect(id)
{
g_iFrags[id] = 0;
g_iDeaths[id] = 0;
}
public client_disconnect(id)
{
if( g_iFrags[id] && !is_user_bot(id) )
{
static szUserScore[22];
formatex(szUserScore, cm(szUserScore), "%u %u", g_iFrags[id], g_iDeaths[id]);
nvault_set(g_iVault, GETPLAYERAUTHID(id), szUserScore);
}
}
public OnCBasePlayer_Killed_P(id, killer)
{
if( id != killer && IsPlayer(killer) && (g_iActive || g_iAlwaysCount) && is_user_connected(killer) && cs_get_user_team(id) != cs_get_user_team(killer) )
{
if( ++g_iDeaths[id] > g_iMaxCumul )
{
g_iDeaths[id] /= 2;
g_iFrags[id] /= 2;
}
if( ++g_iFrags[killer] > g_iMaxCumul )
{
g_iDeaths[killer] /= 2;
g_iFrags[killer] /= 2;
}
}
}
Float:GetUserRatio(id)
{
if( !g_iDeaths[id] )
{
abort(AMX_ERR_GENERAL, "Can't compute ratio, deaths == 0 !!");
return 9999.0;
}
return float(g_iFrags[id]) / float(g_iDeaths[id]);
}
CanUserBuyThisWeapons(id, iId)
{
if
( g_iActive
&& g_iWeaponsMode
&& ( iId == CSW_SHIELD || ( (CSW_P228 <= iId <= CSW_P90) && !user_has_weapon(id, iId) ) )
)
{
new Float:flMaxRatio = iId == CSW_SHIELD ? g_flRatioShield : g_flRatioWpn[iId];
if( flMaxRatio >= 0.0 && GetUserRatio(id) >= flMaxRatio )
{
message_begin(MSG_ONE, gmsgTextMsg, .player=id);
write_byte( print_center );
write_string( "#Alias_Not_Avail" );
write_string( g_szLabels[iId] );
message_end();
return false;
}
}
return true;
}
public OnCWeaponBox_Touch(weaponBox, id)
{
if( IsPlayer(id) && g_iActive && g_iWeaponsMode )
{
if( weaponBox == g_iLastTouchedGroundWeap[id] )
{
return HAM_SUPERCEDE;
}
if( is_user_alive(id) && pev(weaponBox, pev_flags) & FL_ONGROUND && pdata_valid(weaponBox) )
{
static weapon, iId;
iId = 0;
for(new i = 1; i < 5; i++) // don't check slot 5 CSW_C4
{
weapon = get_pdata_cbase(weaponBox, m_rgpPlayerItems_CWeaponBox[i], XO_CWEAPONBOX);
if( weapon > 0 && (iId = cs_get_weapon_id(weapon)) > 0 )
{
new Float:flMaxRatio = g_flRatioWpn[iId];
if( flMaxRatio >= 0.0 && GetUserRatio(id) >= flMaxRatio )
{
g_iLastTouchedGroundWeap[id] = weaponBox;
return HAM_SUPERCEDE;
}
return HAM_IGNORED;
}
}
}
}
return HAM_IGNORED;
}
public OnCBasePlayer_AddPlayerItem(id, iWeapon)
{
if( g_iActive && g_iWeaponsMode )
{
new iId = cs_get_weapon_id(iWeapon);
new Float:flMaxRatio = g_flRatioWpn[iId];
if( flMaxRatio >= 0.0 && GetUserRatio(id) >= flMaxRatio )
{
set_pev(iWeapon, pev_flags, pev(iWeapon, pev_flags) | FL_KILLME);
SetHamReturnInteger(0);
return HAM_SUPERCEDE;
}
}
return HAM_IGNORED;
}
public OnCArmoury_Touch(iArmoury, id)
{
if( IsPlayer(id) && g_iActive && g_iWeaponsMode )
{
if( iArmoury == g_iLastTouchedGroundWeap[id] )
{
return HAM_SUPERCEDE;
}
if( is_user_alive(id) && pdata_valid(iArmoury) )
{
new iId = get_armoury_type(iArmoury);
if( iId != -1 && iId <= CSW_P90 )
{
new Float:flMaxRatio = g_flRatioWpn[iId];
if( flMaxRatio >= 0.0 && GetUserRatio(id) >= flMaxRatio )
{
g_iLastTouchedGroundWeap[id] = iArmoury;
return HAM_SUPERCEDE;
}
}
}
}
return HAM_IGNORED;
}
public get_armoury_type( iArmoury ) // because cs_get_armoury_type throws errors on armouries created by plugins with altered classname.
{
const XO_CARMOURY = 4;
const m_iItem = 34;
static const Armoury_Types[] = {
CSW_MP5NAVY, CSW_TMP, CSW_P90, CSW_MAC10,
CSW_AK47, CSW_SG552, CSW_M4A1, CSW_AUG,
CSW_SCOUT, CSW_G3SG1, CSW_AWP, CSW_M3,
CSW_XM1014, CSW_M249, CSW_FLASHBANG, CSW_HEGRENADE,
CSW_VEST, CSW_VESTHELM, CSW_SMOKEGRENADE
};
new index = get_pdata_int(iArmoury, m_iItem, XO_CARMOURY);
if( 0 <= index < sizeof(Armoury_Types) )
{
return Armoury_Types[index];
}
abort(AMX_ERR_NATIVE, "Unexpected weapon type of %d!", index);
return -1;
}
public OnCWShield_Touch(iShield, id)
{
if( IsPlayer(id) && g_iActive && g_iWeaponsMode )
{
if( iShield == g_iLastTouchedGroundWeap[id] )
{
return HAM_SUPERCEDE;
}
if( g_flRatioShield >= 0.0 && GetUserRatio(id) >= g_flRatioShield && is_user_alive(id) && pdata_valid(iShield) )
{
g_iLastTouchedGroundWeap[id] = iShield;
return HAM_SUPERCEDE;
}
}
return HAM_IGNORED;
}
public OnCBasePlayer_Spawn_P(id)
{
if( is_user_alive(id) )
{
g_bLowRatioPlayer{id} = false;
set_user_rendering(id, _, 0, 0, 0, _, 0);
g_iLastTouchedGroundWeap[id] = 0;
if( !g_iActive )
{
return;
}
new Float:flUserRatio;
CheckUserRatio(id, flUserRatio);
if( g_iHealthMode )
{
new iBonusMalus;
if( g_flHealthMalusRatio3 > 0.0 && flUserRatio > g_flHealthMalusRatio3 )
{
iBonusMalus = g_iHealthMalus3;
}
else if( g_flHealthMalusRatio2 > 0.0 && flUserRatio > g_flHealthMalusRatio2 )
{
iBonusMalus = g_iHealthMalus2;
}
else if( g_flHealthMalusRatio1 > 0.0 && flUserRatio > g_flHealthMalusRatio1 )
{
iBonusMalus = g_iHealthMalus1;
}
else if( g_flHealthBonusRatio3 > 0.0 && flUserRatio < g_flHealthBonusRatio3 )
{
iBonusMalus = g_iHealthBonus3;
}
else if( g_flHealthBonusRatio2 > 0.0 && flUserRatio < g_flHealthBonusRatio2 )
{
iBonusMalus = g_iHealthBonus2;
}
else if( g_flHealthBonusRatio1 > 0.0 && flUserRatio < g_flHealthBonusRatio1 )
{
iBonusMalus = g_iHealthBonus1;
}
if( iBonusMalus )
{
new Float:flHealth;
pev(id, pev_health, flHealth);
flHealth += iBonusMalus;
if( flHealth >= 1.0 )
{
set_pev(id, pev_health, flHealth);
set_pev(id, pev_max_health, flHealth);
}
}
}
if( g_iWeaponsMode && flUserRatio >= g_flLowestRatio )
{
client_print(id, print_chat, "%L", id, "ANTIROXX_RESTRICTED_PLAYER", flUserRatio);
CheckPlayerWeapons( id );
}
if( (!g_iWeaponsMode || g_flRatioWpn[CSW_KNIFE] < 0.0 || flUserRatio < g_flRatioWpn[CSW_KNIFE]) && !user_has_weapon(id, CSW_KNIFE) )
{
give_item(id, "weapon_knife");
}
}
}
CheckUserRatio( id, &Float:flRatio = 0.0 )
{
new Float:flUserRatio = GetUserRatio(id);
flRatio = flUserRatio;
if( g_iNewbieMode && g_flRatioNewbie > 0.0 && flUserRatio <= g_flRatioNewbie )
{
ProtectLowRatioUser(id);
}
if( g_flRatioKick > 0.0 && flUserRatio >= g_flRatioKick && g_iFrags[id] > g_iKickMinFrags )
{
KickHighRatioUser(id);
}
}
KickHighRatioUser( id )
{
if( !is_user_admin(id) )
{
server_cmd("kick #%d %L", get_user_userid(id), id, "AR_HIGHRATIO_KICKMSG");
}
else
{
client_print(id, print_chat, "%L", id, "AR_HIGHRATIO_LUCKY_ADMIN");
client_print(id, print_console, "%L", id, "AR_HIGHRATIO_LUCKY_ADMIN");
}
}
ProtectLowRatioUser( id )
{
if( !g_bLowRatioPlayer{id} && is_user_alive(id) )
{
g_bLowRatioPlayer{id} = true;
switch( cs_get_user_team(id) )
{
case CS_TEAM_T:
{
set_user_rendering(id, kRenderFxGlowShell, g_iGlowNewbieRenderTe[0], g_iGlowNewbieRenderTe[1], g_iGlowNewbieRenderTe[2], _, g_iGlowNewbieRenderTe[3]);
}
case CS_TEAM_CT:
{
set_user_rendering(id, kRenderFxGlowShell, g_iGlowNewbieRenderCt[0], g_iGlowNewbieRenderCt[1], g_iGlowNewbieRenderCt[2], _, g_iGlowNewbieRenderCt[3]);
}
}
}
}
// int CBasePlayer :: TakeDamage( entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType )
public OnCBasePlayer_TakeDamage(id, iInflictor, iAttacker, Float:flDamage , bitsDamageType)
{
if( g_iActive && IsPlayer( iAttacker ) && id != iAttacker && bitsDamageType & DMG_GRENADE )
{
if( g_iNewbieMode && g_bLowRatioPlayer{id} )
{
SetHamParamFloat(4, 0.0);
SetHamReturnInteger(0);
return HAM_SUPERCEDE;
}
if( g_iDamageMode && cs_get_user_team(id) != cs_get_user_team(iAttacker) )
{
new Float:flFactor = GetDamageFactor(id, iAttacker, flDamage, true);
if( flFactor > 0.0 )
{
SetHamParamFloat(4, flDamage * flFactor);
return HAM_HANDLED;
}
}
}
return HAM_IGNORED;
}
// void CBasePlayer :: TraceAttack( entvars_t *pevAttacker, float flDamage, Vector vecDir, TraceResult *ptr, int bitsDamageType)
public OnCBasePlayer_TraceAttack(id, iAttacker, Float:flDamage, Float:fVecDir[3], ptr, bitsDamageType )
{
if( g_iActive && IsPlayer( iAttacker ) && bitsDamageType & DMG_BULLET )
{
new bool:bTeamAttack = cs_get_user_team(id) == cs_get_user_team(iAttacker);
if( g_iNewbieMode && g_bLowRatioPlayer{id} && (bTeamAttack || get_user_weapon(iAttacker) != CSW_KNIFE) )
{
return HAM_SUPERCEDE;
}
if( !bTeamAttack && g_iDamageMode )
{
new Float:flFactor = GetDamageFactor(id, iAttacker, flDamage, false);
if( flFactor > 0.0 )
{
SetHamParamFloat(3, flDamage * flFactor);
return HAM_HANDLED;
}
}
}
return HAM_IGNORED;
}
Float:GetDamageFactor(id, attacker, Float:flDamage, bool:bHeGrenade)
{
if( flDamage > 0.0 )
{
new Float:flThisRatio = GetUserRatio(id);
if( flThisRatio > 0.0 )
{
new Float:flAttackerRatio = GetUserRatio(attacker);
if( flAttackerRatio > 0.0 )
{
new Float:flFactor = flThisRatio / flAttackerRatio;
if( flFactor > 1.0 )
{
new Float:flMaxFactor = bHeGrenade ? g_flMaxAdvFactorHe : g_flMaxAdvFactor;
if( flFactor > flMaxFactor )
{
return flMaxFactor;
}
return flFactor;
}
else if( flFactor < 1.0 )
{
new Float:flMinFactor = bHeGrenade ? g_flMaxHandicapFactorHe : g_flMaxHandicapFactor;
if( flFactor < flMinFactor )
{
return flMinFactor;
}
return flFactor;
}
}
}
}
return -0.0;
}
AdminsShowMotdStats(id)
{
new n = copy(g_szMotd, cm(g_szMotd), "");
n += copy(g_szMotd[n], cm(g_szMotd)-n, "** AMXX ANTIROXX **
");
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%-24.24s %8s %8s %8s^n^n", "Pseudo", "Frags", "Morts", "Ratio");
new players[32], num, player, name[32];
get_players(players, num, "h");
for(--num; num>=0; num--)
{
player = players[num];
get_user_name(player, name, cm(name));
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%-24.24s %8d %8d %5.2f^n", name, g_iFrags[player], g_iDeaths[player], GetUserRatio(player));
}
n += copy(g_szMotd[n], cm(g_szMotd)-n, "
");
show_motd(id, g_szMotd, "AntiRoxx : Liste des joueurs");
}
AdminsShowConStats(id)
{
console_print(id, "** AMXX ANTIROXX **");
console_print(id, "%-32.32s %8s %8s %8s", "Pseudo", "Frags", "Morts", "Ratio");
new players[32], num, player, name[32];
get_players(players, num, "h");
for(--num; num>=0; num--)
{
player = players[num];
get_user_name(player, name, cm(name));
console_print(id, "%-32.32s %8d %8d %5.2f", name, g_iFrags[player], g_iDeaths[player], GetUserRatio(player));
}
}
ShowRatios(id)
{
new Float:flRatio = GetUserRatio(id);
if( flRatio > 0.0 )
{
new CsTeams:team = cs_get_user_team(id);
new bool:IsInTeam = ( CS_TEAM_T <= team <= CS_TEAM_CT );
new n;
new const szEndOfFormat[] = "
\
Name | Ratio | Damage Handicap");
}
new szName[128]; // in case an idiot has 32 times '<' or '>'
new players[32], player, num, Float:flRatioAttacker;
get_players(players, num, "h");
get_user_name(id, szName, 31);
if( IsInTeam )
{
replace_all(szName, cm(szName), "<", "<");
replace_all(szName, cm(szName), ">", ">");
szName[32] = EOS;
n += formatex(g_szMotd[n], cm(g_szMotd) - n,
" |
---|
%s | %.2f | -",
szName, flRatio);
}
console_print(id, "%L", id, "ANTIROXX_CONSOLE_RATIO", szName, flRatio, -1.0);
new szTemp[192], pos;
for(--num; num>=0; num--)
{
player = players[ num ];
if( player != id )
{
flRatioAttacker = GetUserRatio(player);
if( flRatioAttacker > 0.0 )
{
get_user_name(player, szName, 31);
console_print(id, "%L", id, "ANTIROXX_CONSOLE_RATIO", szName, flRatioAttacker, flRatioAttacker / flRatio);
if( IsInTeam && cs_get_user_team(player) + team == CsTeams:3 )
{
replace_all(szName, cm(szName), "<", "<");
replace_all(szName, cm(szName), ">", ">");
szName[32] = EOS;
for(pos=28; pos<30; pos++)
{
if( szName[pos] == '&' )
{
szName[pos] = EOS;
break;
}
}
if
(
formatex
(
szTemp,
cm(szTemp),
" |
%s | %.2f | %s%d%%",
szName,
flRatioAttacker,
flRatioAttacker > flRatio ? "+" : "",
floatround(flRatioAttacker*100.0 / flRatio) - 100
) + n + sizeof(szEndOfFormat) > sizeof(g_szMotd)
)
{
break;
}
n += copy(g_szMotd[n], cm(g_szMotd)-n, szTemp);
}
}
}
}
if( IsInTeam )
{
n += copy(g_szMotd[n], cm(g_szMotd) - n, szEndOfFormat);
show_motd(id, g_szMotd);
}
else
{
client_print(id, print_chat, "%L", id, "ANTIROXX_NOMOTD_CONSOLE");
}
}
}
ShowWeapons(id)
{
new n;
// new const szEndOfFormat[] = " |
\
Weapon Name | Max Ratio");
static const NOKILL_WEAPONS_BITSUM = 1<<2 | 1<", ">");
szName[31] = EOS;
for(new pos=28; pos<30; pos++)
{
if( szName[pos] == '&' )
{
szName[pos] = EOS;
break;
}
}
n += formatex(g_szMotd[n], cm(g_szMotd) - n,
"%s | %.2f", szName, flRatio);
new Float:flWeaponRatio;
for(new iId=CSW_P228; iId<=CSW_P90; iId++)
{
if( ~NOKILL_WEAPONS_BITSUM & 1<%s | %s%.2f", g_szWeaponName[iId][7], (0.0 < flWeaponRatio <= flRatio) ? "" : "", flWeaponRatio);
}
}
n += formatex(g_szMotd[n], cm(g_szMotd) - n,
"shield | %s%.2f", (0.0 < g_flRatioShield <= flRatio) ? "" : "", g_flRatioShield);
n += copy(g_szMotd[n], cm(g_szMotd) - n, " | | | |
---|
^n^n");
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_RATIO", g_flRatioNewbie);
n += copy(g_szMotd[n], cm(g_szMotd)-n,"
^n^n");
if( g_flHealthBonusRatio3 > 0.0 )
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHB_BELOW", g_flHealthBonusRatio3, g_iHealthBonus3);
}
if( g_flHealthBonusRatio2 > 0.0 )
{
if( g_flHealthBonusRatio3 > 0.0 )
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHB_BETWEEN", g_flHealthBonusRatio3, g_flHealthBonusRatio2, g_iHealthBonus2);
}
else
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHB_BELOW", g_flHealthBonusRatio2, g_iHealthBonus2);
}
}
if( g_flHealthBonusRatio1 > 0.0 )
{
if( g_flHealthBonusRatio2 > 0.0 )
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHB_BETWEEN", g_flHealthBonusRatio2, g_flHealthBonusRatio1, g_iHealthBonus1);
}
else
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHB_BELOW", g_flHealthBonusRatio1, g_iHealthBonus1);
}
}
if( g_flHealthMalusRatio3 > 0.0 )
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHM_ABOVE", g_flHealthMalusRatio3, g_iHealthMalus3);
}
if( g_flHealthMalusRatio2 > 0.0 )
{
if( g_flHealthMalusRatio3 > 0.0 )
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHM_BETWEEN", g_flHealthMalusRatio2, g_flHealthMalusRatio3, g_iHealthMalus2);
}
else
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHM_ABOVE", g_flHealthMalusRatio2, g_iHealthMalus2);
}
}
if( g_flHealthMalusRatio1 > 0.0 )
{
if( g_flHealthMalusRatio2 > 0.0 )
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHM_BETWEEN", g_flHealthMalusRatio1, g_flHealthMalusRatio2, g_iHealthMalus1);
}
else
{
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_NEWBIE_HEALTHM_ABOVE", g_flHealthMalusRatio1, g_iHealthMalus1);
}
}
n += copy(g_szMotd[n], cm(g_szMotd)-n,"
^n^n");
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_MAIN_1");
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_MAIN_2", g_flRatioNewbie);
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_MAIN_3");
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_MAIN_4");
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_MAIN_5");
n += formatex(g_szMotd[n], cm(g_szMotd)-n, "%L^n", id, "ANTIROXX_MAIN_6", PLUGIN, VERSION);
n += copy(g_szMotd[n], cm(g_szMotd)-n,"