// DAZZLER!

/* CVARS - copy and paste to shconfig.cfg

//Dazzler
dazzler_level 0
dazzler_radius 3000        //radius of people affected
dazzler_cooldown 15        //# of seconds before Dazzler can flash

*/

#include <superheromod>

// GLOBAL VARIABLES
new gHeroID
new const gHeroName[] = "Dazzler"
new bool:gHasDazzler[SH_MAXSLOTS+1]
new const gSoundFlash[] = "debris/beamstart15.wav"
new gSprite[4]
new gPcvarRadius, gPcvarCooldown
//----------------------------------------------------------------------------------------------
public plugin_init()
{
    // Plugin Info
    register_plugin("SUPERHERO Dazzler", SH_VERSION_STR, "{HOJ} Batman")

    // DO NOT EDIT THIS FILE TO CHANGE CVARS, USE THE SHCONFIG.CFG
    new pcvarLevel = register_cvar("dazzler_level", "0")
    gPcvarRadius = register_cvar("dazzler_radius", "3000")
    gPcvarCooldown = register_cvar("dazzler_cooldown", "15")

    // FIRE THE EVENTS TO CREATE THIS SUPERHERO!
    gHeroID = sh_create_hero(gHeroName, pcvarLevel)
    sh_set_hero_info(gHeroID, "Sparkle Flash", "Flash Nearby Enemies - Grows in intensity as you level up")
    sh_set_hero_bind(gHeroID)
}
//----------------------------------------------------------------------------------------------
public plugin_precache()
{
    gSprite[0] = precache_model("sprites/flare3.spr")
    gSprite[1] = precache_model("sprites/flare6.spr")
    gSprite[2] = precache_model("sprites/blueflare2.spr")
    gSprite[3] = precache_model("sprites/redflare2.spr")
    precache_sound(gSoundFlash)
}
//----------------------------------------------------------------------------------------------
public sh_hero_init(id, heroID, mode)
{
    if ( gHeroID != heroID ) return

    gHasDazzler[id] = mode ? true : false

    sh_debug_message(id, 1, "%s %s", gHeroName, mode ? "ADDED" : "DROPPED")
}
//----------------------------------------------------------------------------------------------
public sh_client_spawn(id)
{
    gPlayerInCooldown[id] = false
}
//----------------------------------------------------------------------------------------------
public sh_hero_key(id, heroID, key)
{
    if ( gHeroID != heroID || sh_is_freezetime() ) return
    if ( !is_user_alive(id) || !gHasDazzler[id] ) return

    if ( key == SH_KEYDOWN ) {

        // Let them know they already used their ultimate if they have
        if ( gPlayerInCooldown[id] ) {
            sh_sound_deny(id)
            return
        }

        new Float:idLevelPct = float(sh_get_user_lvl(id)) / float(sh_get_num_lvls())

        new num = floatround(1.0 + (8.0 * idLevelPct))
        new life = floatround(1.0 + (8.0 * idLevelPct))
        new size = floatround(50.0 + (150.0 * idLevelPct))

        // just checks to see if this may be causing server crashes...
        life = clamp(life, 1, 10)
        size = clamp(size, 50, 200)

        // OK Power dazzle enemies closer than x distance
        new players[SH_MAXSLOTS], playerCount, player
        new fromOrigin[3], toOrigin[3], distanceBetween
        new dazzlerRadius = get_pcvar_num(gPcvarRadius)
        new CsTeams:idTeam = cs_get_user_team(id)
        new count = 0

        get_user_origin(id, fromOrigin)

        get_players(players, playerCount, "ah")

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

            if ( idTeam != cs_get_user_team(player) ) {
                get_user_origin(player, toOrigin)
                distanceBetween = get_distance(fromOrigin, toOrigin)

                if ( distanceBetween < dazzlerRadius ) {
                    // tracer fireworks
                    dazzler_sprite_flash(toOrigin, toOrigin, num, life, size, 10)
                    dazzler_sprite_flash(fromOrigin, toOrigin, 10, 5, 10, 1000)

                    emit_sound(id, CHAN_STATIC, gSoundFlash, VOL_NORM, ATTN_NORM, 0, PITCH_HIGH)
                    emit_sound(player, CHAN_STATIC, gSoundFlash, VOL_NORM, ATTN_NORM, 0, PITCH_HIGH)

                    count++
                }
            }
        }

        if ( count > 0 ) {
            new Float:cooldown = get_pcvar_float(gPcvarCooldown)
            if ( cooldown > 0.0 ) sh_set_cooldown(id, cooldown)
        }
    }
}
//----------------------------------------------------------------------------------------------
dazzler_sprite_flash(fromOrigin[3], toOrigin[3], count, life, size, speed)
{
    // TE_SPRITETRAIL - GLOW SPRITE
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(TE_SPRITETRAIL)    // line of moving glow sprites with gravity, fadeout, and collisions
    write_coord(fromOrigin[0])    // pos
    write_coord(fromOrigin[1])
    write_coord(fromOrigin[2])
    write_coord(toOrigin[0])    // pos
    write_coord(toOrigin[1])
    write_coord(toOrigin[2] + 100)
    write_short(gSprite[random_num(0, 3)])    // (sprite index)
    write_byte(count)    // (count)
    write_byte(life)    // (life in 0.1's)
    write_byte(size)    // byte (scale in 0.1's)
    write_byte(speed)    // (velocity along vector in 10's)
    write_byte(5)        // (randomness of velocity in 10's)
    message_end()
}
//----------------------------------------------------------------------------------------------
public client_connect(id)
{
    gHasDazzler[id] = false
}
//----------------------------------------------------------------------------------------------