Code:
#include <amxmod>
#include <Vexd_Utilities>
#include <superheromod>
/* CVARS - COPY AND PASTE INTO shconfig.cfg
//Tracker
tracker_level 9 //Level at which you can get tracker (Default: 9)
tracker_scale 8 //Size of the target sprite (Default: 8)
tracker_bright 255 //Brightness of the target sprite (0-255) (Default: 255)
tracker_maxtargets 0 //Max number of targets that can be tracked at one time (0 is unlimited) (Default: 0)
tracker_timetargeted 0.0 //Ammount of time you can track someone before you lose the target on them (in seconds) (float) (0.0 is unlimited) (Default: 0.0)
tracker_refreshrate 1.0 //Ammount of time between showings of the target sprite (in seconds) (float) (Default: 1.0)
*/
/* VERSION HISTORY
1.0 - IT LIVES!
1.1 - Now prevents tracking of teammates and self, changed the sprite, got the sprite out of the wall
1.2 - Added maxtargets, timetargeted, and refreshrate cvars (by request)
1.3 - Changed the sprite again, reduced the distance between wall and sprite, sprite no longer obscures the view of the target
*/
new spriteTarget
new bool:hasTrackerPowers[SH_MAXSLOTS+1]
new bool:isTagged[SH_MAXSLOTS+1][SH_MAXSLOTS+1]
new Float:timeLeft[SH_MAXSLOTS+1][SH_MAXSLOTS+1]
new numTargets[SH_MAXSLOTS+1]
//----------------------------------------------------------------------------------------------
public plugin_init()
{
//Register the plugin
register_plugin("SUPERHERO Tracker", "1.3", "Kunlock")
//Create the hero
register_cvar("tracker_level","14")
register_cvar("tracker_scale","5")
register_cvar("tracker_bright","150")
register_cvar("tracker_maxtargets","0")
register_cvar("tracker_timetargeted","0.0")
register_cvar("tracker_refreshrate","0.1")
//Hero Name- Short Description- Long Description- false=Automatic Powers true=KeyDown powers- Hero level
shCreateHero("Tracker", "Tracks victims", "Shooting enemies tags them so you can track them down", false, "tracker_level" )
//Initialize the hero
register_srvcmd("tracker_init", "tracker_init")
shRegHeroInit("Tracker", "tracker_init")
//Hook the events
register_event("ResetHUD","newRound","b")
register_event("Damage", "tracker_damage", "b", "2!0")
//Start the loop
set_task(get_cvar_float("tracker_refreshrate"), "tracker_loop")
}
//----------------------------------------------------------------------------------------------
public plugin_precache()
{
spriteTarget = precache_model("sprites/shmod/tracker_target.spr")
}
//----------------------------------------------------------------------------------------------
public newRound(id)
{
new players[32], num
get_players(players, num, "a")
numTargets[id] = 0
for(new v=0; v<num; v++)
isTagged[id][players[v]] = false
for(new a=0; a<num; a++)
if(isTagged[players[a]][id])
{
isTagged[players[a]][id] = false
numTargets[players[a]] = numTargets[players[a]]--
}
}
//----------------------------------------------------------------------------------------------
public tracker_init()
{
new temp[128]
// First Argument is an id of the player
read_argv(1, temp, 5)
new id = str_to_num(temp)
// 2nd Argument is 0 if the player doesnt have Tracker powers, 1 if the player does have Tracker powers
read_argv(2, temp, 5)
new hasPowers = str_to_num(temp)
if(hasPowers == 1)
hasTrackerPowers[id] = true
else
hasTrackerPowers[id] = false
}
//----------------------------------------------------------------------------------------------
public tracker_damage(id)
{
new victim = id
new attacker = get_user_attacker(victim)
new maxTargets = get_cvar_num("tracker_maxtargets")
if(maxTargets == 0)
maxTargets = 32
if(hasTrackerPowers[attacker] && attacker!=victim && get_user_team(attacker)!=get_user_team(victim) && numTargets[attacker]<maxTargets)
{
isTagged[attacker][victim] = true
numTargets[attacker] = numTargets[attacker]++
timeLeft[attacker][victim] = get_cvar_float("tracker_timetargeted")
if(timeLeft[attacker][victim]==0.0)
timeLeft[attacker][victim] = -1.0
}
}
//----------------------------------------------------------------------------------------------
public tracker_loop()
{
new players[32], num
get_players(players, num, "a")
new bright = get_cvar_num("tracker_bright")
new scale = get_cvar_num("tracker_scale")
for(new a=0; a<num; a++)
{
for(new v=0; v<num; v++)
{
if(isTagged[players[a]][players[v]] && (timeLeft[players[a]][players[v]]>0.0 || timeLeft[players[a]][players[v]]==-1.0))
{
new Float:source[3], Float:target[3], Float:location[3], view[3], hit[3]
get_user_origin(players[a],view,1)
source[0] = float(view[0])
source[1] = float(view[1])
source[2] = float(view[2])
Entvars_Get_Vector(players[v],EV_VEC_origin,target)
new hitent=TraceLn(players[a], source, target, location)
if(hitent!=players[v])
{
location[0] = (((((source[0]+location[0])/2.0)+location[0])/2.0)+location[0])/2.0
location[1] = (((((source[1]+location[1])/2.0)+location[1])/2.0)+location[1])/2.0
location[2] = (((((source[2]+location[2])/2.0)+location[2])/2.0)+location[2])/2.0
}
else
{
location[0]=target[0]
location[1]=target[1]
location[2]=target[2]
}
hit[0] = floatround(location[0])
hit[1] = floatround(location[1])
hit[2] = floatround(location[2])
message_begin(MSG_ONE, SVC_TEMPENTITY, hit, players[a])
write_byte(17)//additive sprite, plays 1 cycle
write_coord(hit[0])//x
write_coord(hit[1])//y
write_coord(hit[2])//z
write_short(spriteTarget)//sprite index
write_byte(scale)//scale in 0.1's
write_byte(bright)//brightness
message_end()
if(timeLeft[players[a]][players[v]]!=-1.0)
{
timeLeft[players[a]][players[v]] = timeLeft[players[a]][players[v]] - get_cvar_float("tracker_refreshrate")
if(timeLeft[players[a]][players[v]]<0.0)
timeLeft[players[a]][players[v]] = 0.0
}
}
}
}
set_task(get_cvar_float("tracker_refreshrate"), "tracker_loop")
}