#include <amxmodx>
#include <fakemeta>
#include <reapi>

native remove_entity(iIndex);
native entity_set_size(index, const Float:mins[3], const Float:maxs[3]);

native bazukaxver(id);

native jb_get_user_packs(id);
native jb_set_user_packs(id, amount);

new const tag[] = "JailBreak";

new Float:g_fAirDropOrigins[33][3], g_szModelIndex, bool:g_blUsed[MAX_CLIENTS+1], iAirDrop[MAX_CLIENTS+1], bool:g_GivedSpecial[MAX_CLIENTS+1], bool:Engel[MAX_CLIENTS+1],
g_UseTime[MAX_CLIENTS+1], cvars[3], g_totalAirDrops;

new const g_szAirDropModel[] =		"models/airDrop.mdl"
new const g_szAirDropAppearSound[] =	"airdrop_appear.wav"
new const g_szAirDropClassName[] =	"class_airdrop"

public plugin_init() 
{
    register_plugin("AirDrop", "0.1", "LyNcH");

    RegisterHookChain(RG_CSGameRules_RestartRound, "@CSGameRules_RestartRound", .post = true);
    
    register_clcmd("say /airdrop", "@AirDropCagir");

    bind_pcvar_num(create_cvar("airdrop_kullanim", "1"), cvars[0]);
    bind_pcvar_num(create_cvar("airdrop_total", "1"), cvars[1]);
    bind_pcvar_num(create_cvar("airdrop_fiyat", "100"), cvars[2]);
}

public plugin_precache()
{
    g_szModelIndex = precache_model(g_szAirDropModel);
    precache_sound(g_szAirDropAppearSound);
}

public plugin_natives()
{	
    register_native("AirDropCagir","@AirDropCagir", 1);
}

@AirDropCagir(id)
{
    if(!is_user_alive(id)) {
        client_print_color(id, id, "^1[^3%s^1] ^4Oluyken AirDrop Cagiramazsin ^1!", tag);
        return PLUGIN_HANDLED;
    }
    if(g_totalAirDrops >= cvars[1]) {
        client_print_color(id, id, "^1[^3%s^1] ^4Haritada mevcut %i AirDrop var.Daha fazla cagirilamaz ^1!", tag, cvars[1]);
        return PLUGIN_HANDLED;
    }
    if(!adamdisaridami(id)) {
        client_print_color(id, id, "^1[^3%s^1] ^4Kapali Alanda AirDrop Cagiramazsin ^1!", tag);
        return PLUGIN_HANDLED;
    }
    @AirDrop(id);

    return PLUGIN_HANDLED;
}

@CSGameRules_RestartRound()
{
    new iAirDrops = -1
    while((iAirDrops = rg_find_ent_by_class(iAirDrops, g_szAirDropClassName))) 
    {
        remove_task(iAirDrops + 3751741);
        remove_task(4717421);
        remove_task(3751741);
        remove_entity(iAirDrops);
    }
    for(new i = 0; i < MaxClients; i++) 
    {
        if(is_user_connected(i)) 
        {
            g_blUsed[i] = false;
            g_GivedSpecial[i] = false;
            Engel[i] = false;
            g_UseTime[i] = 0;
            g_totalAirDrops = 0;
        }
    }
}

@AirDrop(const id)
{
    if(!is_user_alive(id)) {
        client_print_color(id, id, "^1[^3%s^1] ^4Oluyken AirDrop Cagiramazsin ^1!", tag);
        return PLUGIN_HANDLED;
    }
    if(g_totalAirDrops >= cvars[1]) {
        client_print_color(id, id, "^1[^3%s^1] ^4Haritada mevcut %i AirDrop var.Daha fazla cagirilamaz ^1!", tag, cvars[1]);
        return PLUGIN_HANDLED;
    }
    if(!adamdisaridami(id)) {
        client_print_color(id, id, "^1[^3%s^1] ^4Kapali Alanda AirDrop Cagiramazsin ^1!", tag);
        return PLUGIN_HANDLED;
    }

    new Float:Origin[3];
    get_entvar(id, var_origin, Origin);

    g_fAirDropOrigins[id][0] = Origin[0];
    g_fAirDropOrigins[id][1] = Origin[1];
    g_fAirDropOrigins[id][2] = GetMaxHeightByStartOrigin(Origin);

    g_totalAirDrops++;

    client_print_color(id, id, "^1[^3%s^1] ^4AirDrop Cagirisi Alindi ^1!", tag);
    client_print_color(id, id, "^1[^3%s^1] ^4Yakinda Dusecek ^1!", tag);
    set_task(1.0, "@spawnAirDrop", id + 5045812);

    return PLUGIN_HANDLED;
}

@spawnAirDrop(id)
{
    id -= 5045812;

    iAirDrop[id] = rg_create_entity("func_button");
    if(is_nullent(iAirDrop[id])) {
        return PLUGIN_HANDLED;
    }

    set_entvar(iAirDrop[id], var_origin, g_fAirDropOrigins[id]);
    set_entvar(iAirDrop[id], var_modelindex, g_szModelIndex);
    
    entity_set_size(iAirDrop[id],Float:{-25.0,-25.0,-5.0},Float:{25.0,25.0,55.0});

    set_entvar(iAirDrop[id], var_gravity, 0.4);
    set_entvar(iAirDrop[id], var_iuser1, id);
    set_entvar(iAirDrop[id], var_movetype, MOVETYPE_TOSS);
    set_entvar(iAirDrop[id], var_solid, SOLID_SLIDEBOX);
    set_entvar(iAirDrop[id], var_classname, g_szAirDropClassName);

    SetUse(iAirDrop[id], "@EntityEBastim");

    set_task(0.2, "@checkHeight", iAirDrop[id] + 3751741, .flags = "b");

    return PLUGIN_HANDLED;
}

@EntityEBastim(const iEntity, const activator, const caller, USE_TYPE:useType, Float:value)
{
    if(g_UseTime[activator] >= cvars[0])
    {
        client_print_color(activator, activator, "^1[^3%s^1] ^4Hey, Bir Kutuyu %i Kez Karistirabilirsin ^1!", tag, cvars[0]);
        return PLUGIN_HANDLED;
    }
    if(get_entvar(iEntity, var_iuser1) == activator) 
    {
        remove_task(activator + 1003);
        remove_task(activator + 4717421);

        Engel[activator] = false;
        g_blUsed[activator] = true;
        g_GivedSpecial[activator] = false;

        rg_send_bartime(activator, 3);

        set_task(0.2, "@checkDistance", activator + 4717421, .flags = "b");
        set_task(3.0, "@GiveWeapon", activator + 1003);
    }
    else
    {
        client_print_color(activator, activator, "^1[^3%s^1] ^4Sadece Cagiran Kisi Bunu Kullanabilir ^1!", tag);
        return PLUGIN_HANDLED;
    }
    return PLUGIN_HANDLED;
}

@GiveWeapon(id)
{
    id -= 1003;

    g_GivedSpecial[id] = true;
    g_UseTime[id]++;
    bazukaxver(id);
}

@checkHeight(iEntity)
{
    iEntity -= 3751741;

    if(get_entvar(iEntity, var_flags) & FL_ONGROUND) {
        remove_task(iEntity + 3751741);

        emit_sound(iEntity, CHAN_ITEM, g_szAirDropAppearSound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    }
}

@checkDistance(id)
{
    id -= 4717421;

    for(new enemy = 1; enemy <= MaxClients; enemy++) 
    {
        if ( !is_user_alive(enemy) ) continue;

        new Float:Torigin[3], Float:fOrigin[3];
        get_entvar(iAirDrop[id], var_origin, fOrigin);
        get_entvar(enemy, var_origin, Torigin);

        new Float:Distance;
        Distance = get_distance_f(fOrigin, Torigin);

        if ( Distance > 100.0 && !Engel[id] && !g_GivedSpecial[id])
        {
            Engel[enemy] = true;
            remove_task(enemy + 1003);
            rg_send_bartime(enemy, 0);
        }
    }
    return PLUGIN_HANDLED;
}

stock Float:adamdisaridami(id)
{
	new Float:vOrigin[3], Float:fDist;
	get_entvar(id, var_origin, vOrigin)
	
	fDist = vOrigin[2];
	
	while(engfunc(EngFunc_PointContents, vOrigin) == CONTENTS_EMPTY)
		vOrigin[2] += 5.0;
	if(engfunc(EngFunc_PointContents, vOrigin) == CONTENTS_SKY)
		return (vOrigin[2] - fDist);
	
	return 0.0;
} 

Float:GetMaxHeightByStartOrigin(Float:fOrigin[3]) 
{ 
	new pcCurrent
	while(engfunc(EngFunc_PointContents, fOrigin) == CONTENTS_EMPTY)
	{
		fOrigin[2] += 5.0
	}
	
	pcCurrent = engfunc(EngFunc_PointContents, fOrigin)
	return ((pcCurrent == CONTENTS_SKY) || (pcCurrent == CONTENTS_SOLID)) ? fOrigin[2] - 115.0 : fOrigin[2]
} 