// XAVIER! - BASED ON SPACEDUDE'S NEW XTRAFUNMOD - FORGOT WHERE I FOUND THE TRACEME CODE
// 1.14.4 - significant change - no xtrafun needed for this now...

/* CVARS - copy and paste to shconfig.cfg

//Xavier
xavier_level 7
xavier_traillength 25            //Length of trail behind players
xavier_showteam 0            //Show trails on your team
xavier_showenemy 1            //Show trails on enemies
xavier_refreshtimer 5.0            //How often do the trails refresh

*/

#include <superheromod>

// GLOBAL VARIABLES
new gHeroID
new const gHeroName[] = "Xavier"
new bool:gHasXavier[SH_MAXSLOTS+1]
new gSpriteLaserBeam
new gPcvarTrailLength, gPcvarShowTeam, gPcvarShowEnemy, gPcvarRefreshTimer
//----------------------------------------------------------------------------------------------
public plugin_init()
{
    // Plugin Info
    register_plugin("SUPERHERO Xavier", SH_VERSION_STR, "{HOJ} Batman")

    // DO NOT EDIT THIS FILE TO CHANGE CVARS, USE THE SHCONFIG.CFG
    new pcvarLevel = register_cvar("xavier_level", "7")
    gPcvarTrailLength = register_cvar("xavier_traillength", "25")
    gPcvarShowTeam = register_cvar("xavier_showteam", "0")
    gPcvarShowEnemy = register_cvar("xavier_showenemy", "1")
    gPcvarRefreshTimer = register_cvar("xavier_refreshtimer", "5.0")

    // FIRE THE EVENT TO CREATE THIS SUPERHERO!
    gHeroID = sh_create_hero(gHeroName, pcvarLevel)
    sh_set_hero_info(gHeroID, "Team Detection", "Detect what team a player is on by a glowing trail")
}
//----------------------------------------------------------------------------------------------
public plugin_precache()
{
    gSpriteLaserBeam = precache_model("sprites/laserbeam.spr")
}
//----------------------------------------------------------------------------------------------
public sh_hero_init(id, heroID, mode)
{
    if ( gHeroID != heroID ) return

    // Clear out any stale tasks
    remove_task(id)

    switch(mode) {
        case SH_HERO_ADD: {
            gHasXavier[id] = true
            add_all_marks(id)
            set_task(get_pcvar_float(gPcvarRefreshTimer), "add_all_marks", id, _, _, "b")
        }
        case SH_HERO_DROP: {
            gHasXavier[id] = false
            remove_all_marks(id)
        }
    }

    sh_debug_message(id, 1, "%s %s", gHeroName, mode ? "ADDED" : "DROPPED")
}
//----------------------------------------------------------------------------------------------
public sh_client_spawn(id)
{
    if ( gHasXavier[id] ) {
        add_all_marks(id)
    }
}
//----------------------------------------------------------------------------------------------
public add_all_marks(id)
{
    if ( !sh_is_active() || !is_user_alive(id) || !gHasXavier[id] )
        return

    static bool:sameTeam
    static bool:showTeam
    static bool:showEnemy
    static CsTeams:idTeam
    static CsTeams:playerTeam

    showTeam = get_pcvar_num(gPcvarShowTeam) ? true : false
    showEnemy = get_pcvar_num(gPcvarShowEnemy) ? true : false
    idTeam = cs_get_user_team(id)

    static players[SH_MAXSLOTS], playerCount, player, i
    get_players(players, playerCount, "ah")

    for ( i = 0; i < playerCount; i++ ) {
        player = players[i]

        if ( player == id ) continue

        playerTeam = cs_get_user_team(player)

        sameTeam = idTeam == playerTeam ? true : false

        if ( (sameTeam && showTeam) || (!sameTeam && showEnemy) ) {
            remove_mark(id, player)

            switch(playerTeam) {
                case CS_TEAM_T: make_trail(id, player, 255, 0, 0)
                case CS_TEAM_CT: make_trail(id, player, 0, 0, 255)
            }
        }
    }
}
//----------------------------------------------------------------------------------------------
make_trail(id, player, iRed, iGreen, iBlue)
{
    if ( !sh_is_active() || !is_user_alive(id) || !is_user_alive(player) ) return

    message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, id)
    write_byte(TE_BEAMFOLLOW)
    write_short(player)
    write_short(gSpriteLaserBeam)
    write_byte(get_pcvar_num(gPcvarTrailLength)) //length
    write_byte(8)      //width
    write_byte(iRed)   //red
    write_byte(iGreen) //green
    write_byte(iBlue)  //blue
    write_byte(150)    //bright
    message_end()
}
//----------------------------------------------------------------------------------------------
remove_all_marks(id)
{
    if ( is_user_connected(id) && gHasXavier[id] )  {
        new players[SH_MAXSLOTS]
        new playerCount, player
        get_players(players, playerCount, "ah")

        for ( new i = 0; i < playerCount; i++ ) {
            player = players[i]

            if ( player == id ) continue

            remove_mark(id, player)
        }
    }
}
//----------------------------------------------------------------------------------------------
remove_mark(id, player)
{
    if ( !is_user_connected(id) || !is_user_connected(player) ) return

    message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, id)
    write_byte(TE_KILLBEAM)
    write_short(player)
    message_end()
}
//----------------------------------------------------------------------------------------------
public sh_client_death(victim)
{
    if ( !sh_is_active() ) return

    remove_all_marks(victim)
}
//----------------------------------------------------------------------------------------------
public client_disconnected(id)
{
    remove_task(id)
    gHasXavier[id] = false
}
//----------------------------------------------------------------------------------------------