i decided to show the ifnromation gathered by the plugin like ljstats does. this means ill add something like colorchat and i think ill change the hardcoded values to cvars.
what about a top15? #1 = player with most frags or most damage done or even best k/d ratio?
PHP Code:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#pragma semicolon 1
#define isPlayer(%1) (1 <= %1 <= g_iMaxPlayers)
#define TRACE_OFFSET 4
#define COLOR_RED 0
#define COLOR_GREEN 250
#define COLOR_BLUE 150
#define COORDS_X -0.75
#define COORDS_Y -1.0
#define HOLDTIME 1.5
enum AttackType
{
STAB = 0,
SLASH
}
enum TraceType
{
TRACELINE = 0,
TRACEHULL
}
new g_szTraceType[TraceType][] =
{
"TraceLine",
"TraceHull"
};
new g_szHitgroup[8][] =
{
"Full Body",
"Head",
"Chest",
"Stomach",
"Left Arm",
"Right Arm",
"Left Leg",
"Right Leg"
};
new g_iTraceHandle[33][AttackType];
new g_szBuffer[512];
new g_bAlive[33];
new g_szNickname[33][32];
new g_iMaxPlayers;
public plugin_init( )
{
register_plugin( "Knife Distance", "TEST", "SchlumPF" );
register_forward( FM_TraceLine, "fwdTraceLine_Post", 1 );
register_forward( FM_TraceHull, "fwdTraceHull_Post", 1 );
RegisterHam( Ham_TakeDamage, "player", "hamTakeDamagePlayer_Post", 1 );
RegisterHam( Ham_Killed, "player", "hamKilledPlayer_Post", 1 );
RegisterHam( Ham_Spawn, "player", "hamSpawnPlayer_Post", 1 );
g_iMaxPlayers = get_maxplayers( );
}
// i couldn't retrieve the received damage in the trace-hooks :X
public hamTakeDamagePlayer_Post( plr, inflictor, attacker, Float:damage, damage_bits )
{
if( get_user_weapon( attacker ) == CSW_KNIFE )
{
static len;
len = strlen( g_szBuffer );
formatex( g_szBuffer[len], 511 - len, "^nDamage: %.f", damage );
set_hudmessage( COLOR_RED, COLOR_GREEN, COLOR_BLUE, COORDS_X, COORDS_Y, 0, 0.0, HOLDTIME, 0.0, 0.0, 1 );
show_hudmessage( attacker, g_szBuffer );
}
}
public client_connect( plr )
{
get_user_name( plr, g_szNickname[plr], 31 );
}
public client_infochanged( plr )
{
static curName[32], newName[32];
get_user_name( plr, curName, 31 );
get_user_info( plr, "name", newName, 31 );
if( !equal( newName, curName ) )
{
copy( g_szNickname[plr], 31, newName );
}
}
public hamKilledPlayer_Post( plr )
{
g_bAlive[plr] = false;
}
public hamSpawnPlayer_Post( plr )
{
if( is_user_alive( plr ) && get_user_team( plr ) )
{
g_bAlive[plr] = true;
}
}
public fwdTraceLine_Post( Float:vecSrc[3], Float:vecEnd[3], condition, ent, tr )
{
if( isPlayer( ent ) && g_bAlive[ent] )
{
if( !g_iTraceHandle[ent][STAB] && condition == DONT_IGNORE_MONSTERS )
{
static distance;
distance = floatround( get_distance_f( vecSrc, vecEnd ) );
if( distance == 48.0 )
{
g_iTraceHandle[ent][STAB] = tr - TRACE_OFFSET;
g_iTraceHandle[ent][SLASH] = tr;
}
else if( distance == 32.0 )
{
g_iTraceHandle[ent][STAB] = tr;
g_iTraceHandle[ent][SLASH] = tr + TRACE_OFFSET;
}
}
if( tr == g_iTraceHandle[ent][STAB] )
{
getKnifeDistance( ent, vecSrc, tr, STAB, TRACELINE );
}
else if( tr == g_iTraceHandle[ent][SLASH] )
{
getKnifeDistance( ent, vecSrc, tr, SLASH, TRACELINE );
}
}
}
public fwdTraceHull_Post( Float:vecSrc[3], Float:vecEnd[3], condition, hull, ent, tr )
{
if( isPlayer( ent ) && g_bAlive[ent] )
{
if( tr == g_iTraceHandle[ent][STAB] )
{
getKnifeDistance( ent, vecSrc, tr, STAB, TRACEHULL );
}
else if( tr == g_iTraceHandle[ent][SLASH] )
{
getKnifeDistance( ent, vecSrc, tr, SLASH, TRACEHULL );
}
}
}
public getKnifeDistance( ent, Float:vecSrc[3], tr, AttackType:attack, TraceType:trace )
{
static fraction;
get_tr2( tr, TR_flFraction, fraction );
if( fraction == 1.0 )
{
return 0;
}
static hit;
hit = get_tr2( tr, TR_pHit );
if( !isPlayer( hit ) )
{
return 0;
}
static Float:vecEndPos[3];
if( attack == STAB )
{
get_tr2( tr, TR_vecEndPos, vecEndPos );
format( g_szBuffer, 511, "Stab Stats (%s)^nDistance: %.6f (max 32.0)^nHit: %s (%s)", g_szTraceType[trace], get_distance_f( vecSrc, vecEndPos ), g_szNickname[hit], g_szHitgroup[get_tr2( tr, TR_iHitgroup )] );
}
else if( attack == SLASH )
{
get_tr2( tr, TR_vecEndPos, vecEndPos );
format( g_szBuffer, 511, "Slash Stats (%s)^nDistance: %.6f (max 48.0)^nHit: %s (%s)", g_szTraceType[trace], get_distance_f( vecSrc, vecEndPos ), g_szNickname[hit], g_szHitgroup[get_tr2( tr, TR_iHitgroup )] );
}
return FMRES_IGNORED;
}