// SKELETOR! from HE-MAN, The evil sorcerer.
// REQUIRES Monster Mod (Botman version 3.00.00 or above)
// Created 5/17/2003

/* CVARS - copy and paste to shconfig.cfg

//Skeletor
skeletor_level 0
skeletor_cooldown 30            // # of seconds for skeletor cooldown
skeletor_camptime 10            // # of seconds player considered camping w/o x/y movement
skeletor_movedist 10            // minimum amount of dist player has to move b4 considered not camping
skeletor_maxsnarks 10            // maximum amount of snarks to spawn on a player

*/

#include <superheromod>

// GLOBAL VARIABLES
new gHeroID
new const gHeroName[] = "Skeletor"
new bool:gHasSkeletor[SH_MAXSLOTS+1]
new gPlayerPosition[SH_MAXSLOTS+1][3]  // keeps track of last known origin
new gMoveTimer[SH_MAXSLOTS+1]          // incremented if player didn't move far enough
new const gSoundSummon[] = "ambience/port_suckin1.wav"
new pCvarCooldown, pCvarCampTime, pCvarMoveDist, pCvarMaxSnarks
//----------------------------------------------------------------------------------------------
public plugin_init()
{
    // Plugin Info
    register_plugin("SUPERHERO Skeletor", SH_VERSION_STR, "{HOJ} Batman")

    register_dictionary("sh_skeletor.txt")

    // Make sure monster mod is loaded, otherwise this hero is useless
    if ( !cvar_exists("monster_spawn") ) {
        set_fail_state("Monster Mod not loaded, Skeletor requires the monster ^"snark^"")
    }

    // DO NOT EDIT THIS FILE TO CHANGE CVARS, USE THE SHCONFIG.CFG
    new pcvarLevel = register_cvar("skeletor_level", "0")
    pCvarCooldown = register_cvar("skeletor_cooldown", "30")
    pCvarCampTime = register_cvar("skeletor_camptime", "10")
    pCvarMoveDist = register_cvar("skeletor_movedist", "10")
    pCvarMaxSnarks = register_cvar("skeletor_maxsnarks", "10")

    // FIRE THE EVENTS TO CREATE THIS SUPERHERO!
    gHeroID = sh_create_hero(gHeroName, pcvarLevel)
    sh_set_hero_info(gHeroID, "Summon Monsters", "Will automatically Summon Monsters to Attack Enemy Campers")

    set_task(1.0, "skeletor_campcheck", _, _, _, "b")
}
//----------------------------------------------------------------------------------------------
public plugin_precache()
{
    precache_sound(gSoundSummon)
}
//----------------------------------------------------------------------------------------------
public sh_hero_init(id, heroID, mode)
{
    if ( gHeroID != heroID ) return

    gHasSkeletor[id] = mode ? true : false

    sh_debug_message(id, 1, "%s %s", gHeroName, mode ? "ADDED" : "DROPPED")
}
//----------------------------------------------------------------------------------------------
public sh_client_spawn(id)
{
    remove_task(id)
    gMoveTimer[id] = 0
    gPlayerInCooldown[id] = false

    get_user_origin(id, gPlayerPosition[id])
}
//----------------------------------------------------------------------------------------------
public skeletor_campcheck()
{
    if ( !sh_is_active() || sh_is_freezetime() ) return

    // Check all players to see if they've moved...
    static origin[3]
    static dx, dy, dz, distance

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

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

        if ( pev(player, pev_flags) & FL_NOTARGET ) continue

        get_user_origin(player, origin)

        dx = gPlayerPosition[player][0] - origin[0]
        dy = gPlayerPosition[player][1] - origin[1]
        dz = gPlayerPosition[player][2] - origin[2]

        distance = sqroot(dx*dx + dy*dy + dz*dz)

        if ( distance <= get_pcvar_num(pCvarMoveDist) ) {
            gMoveTimer[player]++

            if ( gMoveTimer[player] > get_pcvar_num(pCvarCampTime) ) {
                gMoveTimer[player] = 0

                skeletor_summon(player)
            }
        }
        else {
            gMoveTimer[player] = 0
        }

        gPlayerPosition[player][0] = origin[0]
        gPlayerPosition[player][1] = origin[1]
        gPlayerPosition[player][2] = origin[2]
    }
}
//----------------------------------------------------------------------------------------------
skeletor_summon(victim)
{
    // Go through a list of skeletor looking for
    // 1) ultimate available
    // 2) opposite team than (id)
    // 3) skeletor powers...

    if ( !is_user_connected(victim) ) return

    new CsTeams:victimTeam = cs_get_user_team(victim)

    new players[SH_MAXSLOTS], playerCount, player
    get_players(players, playerCount, "a")

    for ( new i = 0; i < playerCount; i++ ) {
        player = players[i]
        if ( gHasSkeletor[player] && victimTeam != cs_get_user_team(player) && !gPlayerInCooldown[player] ) {
            // COOL WE HAVE A SKELETOR TO STICK SNARKS ON Player id!
            new Float:cooldown = get_pcvar_float(pCvarCooldown)
            if ( cooldown > 0.0 ) sh_set_cooldown(player, cooldown)

            // SUMMON THE MONSTERS USING MONSTOR MOD
            new name[32]
            new victimName[32]
            get_user_name(victim, victimName, charsmax(victimName))
            get_user_name(player, name, charsmax(name))
            sh_chat_message(0, gHeroID, "[SH] %L", LANG_PLAYER, "SH_SKELETOR_SUMMONED", name, victimName)
            emit_sound(victim, CHAN_STATIC, gSoundSummon, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
            emit_sound(player, CHAN_STATIC, gSoundSummon, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)

            // The Higher the Level - The more Snarks!
            new numSnarks = min(get_pcvar_num(pCvarMaxSnarks), sh_get_user_lvl(player)/2 + 1)
            for ( new m = 1; m <= numSnarks ; m++ ) {
                set_task(m * 0.2, "summon_monster", victim)
            }

            break // ok no more poeple need to syc this guy
        }
    }
}
//----------------------------------------------------------------------------------------------
public summon_monster(victim)
{
    if ( is_user_alive(victim) && sh_is_inround() ) {
        server_cmd("monster snark #%d", victim)
    }
}
//----------------------------------------------------------------------------------------------