/* Credits:
- Thanks to Spartan-117 and vittu for their Master Chief Code.
*/

/* CVARS - copy and paste to shconfig.cfg

// Deadpool
deadpool_level 1                //Which level you get the hero
deadpool_knifemult 1.5            //Damage Multiplyer for the Knife (Default 1.5)
deadpool_pistolmult 1.5            //Damage Multiplyer for all Pistols (Default 1.5)
deadpool_shottymult 1.5            //Damage Multiplyer for both Shotgun-Types (Default 1.5)
deadpool_smgmult 1.75            //Damage Multiplyer for all SMGs (Default 1.75)
deadpool_riflemult 1.25            //Damage Multiplyer for all Rifles (Default 1.25)
deadpool_snipermult 1.05        //Damage Multiplyer for all Snipers (Default 1.05)
deadpool_paramult 1.25            //Damage Multiplyer for the M249 alias Para (Default 1.25)
deadpool_givepistols 1            //If you get all pistols or not (0=no | 1=yes - Default 1)
deadpool_giveshotties 0            //If you get both Shotgun-Types or not (0=no | 1=yes - Default 0)
deadpool_givesmgs 0                //If you get all SMGs or not (0=no | 1=yes - Default 0)
deadpool_giverifles 0            //If you get all Rifles or not (0=no | 1=yes - Default 0)
deadpool_givesnipers 0            //If you get all Snipers or not (0=no | 1=yes - Default 0)
deadpool_givepara 0                //If you get the M249 (Para) gun or not (0=no | 1=yes - Default 0)
deadpool_givenades 1            //If you get all Grenades or not (0=no | 1=yes - Default 1)
deadpool_health 105                //How much health the hero has (no extra hp = 100 - Default 105)
deadpool_armor 105                //How much armor the hero has (no extra ap = 100 - Default 105)

*/

#include <amxmodx>
#include <Vexd_Utilities>
#include <superheromod>

/* Changes:
- Version 2.0
Renamed the hero, because the powers changed a bit.
Changed a bit of the code.
*/

// GLOBAL VARIABLES
new gHeroName[]="Deadpool"
new bool:gHasDeadpoolPower[SH_MAXSLOTS+1]
//----------------------------------------------------------------------------------------------
public plugin_init()
{
    // Plugin Info
    register_plugin("SUPERHERO Deadpool", "2.0", "-]Tical2k[-")

    // DO NOT EDIT THIS FILE TO CHANGE CVARS, USE THE SHCONFIG.CFG
    register_cvar("deadpool_level", "1")
    register_cvar("deadpool_knifemult", "1.5")
    register_cvar("deadpool_pistolmult", "1.5")
    register_cvar("deadpool_shottymult", "1.5")
    register_cvar("deadpool_smgmult", "1.75")
    register_cvar("deadpool_riflemult", "1.25")
    register_cvar("deadpool_snipermult", "1.05")
    register_cvar("deadpool_paramult", "1.25")
    register_cvar("deadpool_givepistols", "1")
    register_cvar("deadpool_giveshotties", "0")
    register_cvar("deadpool_givesmgs", "0")
    register_cvar("deadpool_givesnipers", "0")
    register_cvar("deadpool_giverifles", "0")
    register_cvar("deadpool_givepara", "0")
    register_cvar("deadpool_givenades", "1")
    register_cvar("deadpool_health", "105")
    register_cvar("deadpool_armor", "105")
    
    // FIRE THE EVENT TO CREATE THIS SUPERHERO!
    shCreateHero(gHeroName, "More DAMAGE!!!", "Do more damage with every gun + unlimited ammo.", false, "deadpool_level")

    // REGISTER EVENTS THIS HERO WILL RESPOND TO! (AND SERVER COMMANDS)
    // INIT
    register_srvcmd("deadpool_init", "deadpool_init")
    shRegHeroInit(gHeroName, "deadpool_init")

    // EVENTS
    register_event("ResetHUD", "newSpawn", "b")
    register_event("CurWeapon", "weaponChange", "be", "1=1")
    register_event("Damage", "deadpool_damage", "b", "2!0")
    register_event("DeathMsg", "deadpool_death", "a")

    // Let Server know about deadpool's Variables
    shSetShieldRestrict(gHeroName)
    shSetMaxHealth(gHeroName, "deadpool_health")
    shSetMaxArmor(gHeroName, "deadpool_armor")
}
//----------------------------------------------------------------------------------------------
public deadpool_init()
{
    // First Argument is an id
    new temp[6]
    read_argv(1, temp, 5)
    new id = str_to_num(temp)

    // 2nd Argument is 0 or 1 depending on whether the id has the hero
    read_argv(2, temp, 5)
    new hasPowers = str_to_num(temp)

    if (!is_user_connected(id)) return

    //Reset thier shield restrict status
    //Shield restrict MUST be before weapons are given out
    shResetShield(id)

    if ( is_user_alive(id) ) {
        if ( hasPowers ) {
            deadpool_weapons(id)
        }
        //This gets run if they had the power but don't anymore
        else if ( !hasPowers && gHasDeadpoolPower[id] ) {
            shRemHealthPower(id)
            shRemArmorPower(id)
        }
        else if ( !hasPowers && gHasDeadpoolPower[id] && get_cvar_num("deadpool_givepistols")) {
            engclient_cmd(id, "drop", "weapon_usp")
            engclient_cmd(id, "drop", "weapon_glock18")
            engclient_cmd(id, "drop", "weapon_p228")
            engclient_cmd(id, "drop", "weapon_deagle")
            engclient_cmd(id, "drop", "weapon_elite")
            engclient_cmd(id, "drop", "weapon_fiveseven")
        }
        else if ( !hasPowers && gHasDeadpoolPower[id] && get_cvar_num("deadpool_giveshotties")) {
            engclient_cmd(id, "drop", "weapon_m3")
            engclient_cmd(id, "drop", "weapon_xm1014")
        }
        else if ( !hasPowers && gHasDeadpoolPower[id] && get_cvar_num("deadpool_givesmgs")) {
            engclient_cmd(id, "drop", "weapon_mac10")
            engclient_cmd(id, "drop", "weapon_tmp")
            engclient_cmd(id, "drop", "weapon_mp5navy")
            engclient_cmd(id, "drop", "weapon_ump45")
            engclient_cmd(id, "drop", "weapon_p90")
        }
        else if ( !hasPowers && gHasDeadpoolPower[id] && get_cvar_num("deadpool_giverifles")) {
            engclient_cmd(id, "drop", "weapon_galil")
            engclient_cmd(id, "drop", "weapon_famas")
            engclient_cmd(id, "drop", "weapon_ak47")
            engclient_cmd(id, "drop", "weapon_aug")
            engclient_cmd(id, "drop", "weapon_sg552")
            engclient_cmd(id, "drop", "weapon_m4a1")
        }
        else if ( !hasPowers && gHasDeadpoolPower[id] && get_cvar_num("deadpool_givesnipers")) {
            engclient_cmd(id, "drop", "weapon_scout")
            engclient_cmd(id, "drop", "weapon_sg550")
            engclient_cmd(id, "drop", "weapon_awp")
            engclient_cmd(id, "drop", "weapon_g3sg1")
        }
        else if ( !hasPowers && gHasDeadpoolPower[id] && get_cvar_num("deadpool_givepara")) {
            engclient_cmd(id, "drop", "weapon_m249")
        }
    }

    //Sets this variable to the current status
    gHasDeadpoolPower[id] = (hasPowers != 0)
}
//----------------------------------------------------------------------------------------------
public newSpawn(id)
{
    if ( gHasDeadpoolPower[id] && is_user_alive(id) && shModActive() ) {
        set_task(0.1, "deadpool_weapons", id)
    }
}
//----------------------------------------------------------------------------------------------
public deadpool_weapons(id)
{
    if ( get_cvar_num("deadpool_givepistols") == 1 ) {
        shGiveWeapon(id, "weapon_fiveseven")
        shGiveWeapon(id, "weapon_elite")
        shGiveWeapon(id, "weapon_usp")
        shGiveWeapon(id, "weapon_glock18")
        shGiveWeapon(id, "weapon_p228")
        shGiveWeapon(id, "weapon_deagle")
    }
    if ( get_cvar_num("deadpool_giveshotties") == 1 ) {
        shGiveWeapon(id, "weapon_xm1014")
        shGiveWeapon(id, "weapon_m3")
    }
    if ( get_cvar_num("deadpool_givesmgs") == 1 ) {
        shGiveWeapon(id, "weapon_mac10")
        shGiveWeapon(id, "weapon_tmp")
        shGiveWeapon(id, "weapon_ump45")
        shGiveWeapon(id, "weapon_mp5navy")
        shGiveWeapon(id, "weapon_p90")
    }
    if ( get_cvar_num("deadpool_giverifles") == 1 ) {
        shGiveWeapon(id, "weapon_galil")
        shGiveWeapon(id, "weapon_famas")
        shGiveWeapon(id, "weapon_ak47")
        shGiveWeapon(id, "weapon_aug")
        shGiveWeapon(id, "weapon_sg552")
        shGiveWeapon(id, "weapon_m4a1")
    }
    if ( get_cvar_num("deadpool_givesnipers") == 1 ) {
        shGiveWeapon(id, "weapon_scout")
        shGiveWeapon(id, "weapon_g3sg1")
        shGiveWeapon(id, "weapon_awp")
        shGiveWeapon(id, "weapon_sg550")
    }
    if ( get_cvar_num("deadpool_givepara") == 1 ) {
        shGiveWeapon(id, "weapon_m249")
    }    
    if ( get_cvar_num("deadpool_givenades") == 1 ) {
        shGiveWeapon(id, "weapon_hegrenade")
        shGiveWeapon(id, "weapon_flashbang")
        shGiveWeapon(id, "weapon_smokegrenade")
    }
}
//----------------------------------------------------------------------------------------------
public weaponChange(id)
{
    if ( !gHasDeadpoolPower[id] || !shModActive() ) return

    new clip = read_data(3)

    // Never Run Out of Ammo!
    if ( clip == 0 ) {
        shReloadAmmo(id)
    }
}
//----------------------------------------------------------------------------------------------
public deadpool_damage(id)
{
    if ( !shModActive() || !is_user_alive(id) ) return

    new damage = read_data(2)
    new body, weapon, attacker = get_user_attacker(id, weapon, body)
    new headshot = body == 1 ? 1 : 0

    if ( attacker <= 0 || attacker > SH_MAXSLOTS ) return

    if ( gHasDeadpoolPower[attacker] && weapon == CSW_USP && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_pistolmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "usp", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_GLOCK18 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_pistolmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "glock18", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_P228 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_pistolmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "p228", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_DEAGLE && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_pistolmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "deagle", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_ELITE && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_pistolmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "elite", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_FIVESEVEN && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_pistolmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "fiveseven", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_XM1014 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_shottymult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "xm1014", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_M3 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_shottymult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "m3", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_MAC10 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_smgmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "mac10", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_TMP && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_smgmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "tmp", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_UMP45 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_smgmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "ump45", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_MP5NAVY && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_smgmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "mp5navy", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_P90 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_smgmult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "p90", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_GALIL && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_riflemult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "galil", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_FAMAS && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_riflemult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "famas", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_AK47 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_riflemult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "ak47", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_SCOUT && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_snipermult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "scout", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_AUG && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_riflemult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "aug", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_SG552 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_riflemult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "sg552", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_M4A1 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_riflemult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "m4a1", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_SG550 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_snipermult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "sg550", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_AWP && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_snipermult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "awp", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_G3SG1 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_snipermult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "g3sg1", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_M249 && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_paramult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "m249", headshot)
    }
    if ( gHasDeadpoolPower[attacker] && weapon == CSW_KNIFE && is_user_alive(id) ) {
        // do extra damage
        new extraDamage = floatround(damage * get_cvar_float("deadpool_knifemult") - damage)
        if (extraDamage > 0) shExtraDamage(id, attacker, extraDamage, "knife", headshot)
    }
}
//----------------------------------------------------------------------------------------------
public deadpool_death()
{
    new id = read_data(2)

    if ( !gHasDeadpoolPower[id] ) return

}
//----------------------------------------------------------------------------------------------