#include <amxmodx>
#include <reapi>

#define PLUGIN_NAME "HIT Smooth Double Jump"
#define PLUGIN_VERSION "1.0"
#define PLUGIN_AUTHOR "HIT"

new g_iJumpCount[MAX_CLIENTS + 1];
new bool:g_bDoJump[MAX_CLIENTS + 1];

new g_cvar_enable;
new g_cvar_extra_jumps;
new Float:g_cvar_jump_speed;

public plugin_init() {
    register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);

    bind_pcvar_num(create_cvar("hit_doublejump", "1", _, "Cift ziplama aktif (1: acik, 0: kapali)"), g_cvar_enable);
    bind_pcvar_num(create_cvar("hit_doublejump_num", "1", _, "Ekstra ziplama sayisi"), g_cvar_extra_jumps);
    bind_pcvar_float(create_cvar("hit_doublejump_speed", "280.0", _, "Ekstra ziplama gucu"), g_cvar_jump_speed);

    RegisterHookChain(RG_CBasePlayer_Jump, "fw_Player_Jump", false);
    RegisterHookChain(RG_CBasePlayer_PreThink, "fw_Player_PreThink", false);
}

public client_putinserver(id) {
    g_iJumpCount[id] = 0;
    g_bDoJump[id] = false;
}

public fw_Player_Jump(id) {
    if (!g_cvar_enable || !is_user_alive(id)) {
        return HC_CONTINUE;
    }

    new flags = get_entvar(id, var_flags);

    // Yerdeyse sayaci sifirla
    if (flags & FL_ONGROUND) {
        g_iJumpCount[id] = 0;
        g_bDoJump[id] = false;
        return HC_CONTINUE;
    }

    // Havada ise ve ekstra ziplama hakki varsa
    new oldbuttons = get_member(id, m_afButtonLast);
    new buttons = get_entvar(id, var_button);

    // Ziplama tusuna ilk kez basildiginda (tus basili tutulurken tekrar atmasin)
    if ((buttons & IN_JUMP) && !(oldbuttons & IN_JUMP)) {
        if (get_entvar(id, var_waterlevel) < 2 && g_iJumpCount[id] < g_cvar_extra_jumps) {
            g_bDoJump[id] = true;
            g_iJumpCount[id]++;
        }
    }

    return HC_CONTINUE;
}

public fw_Player_PreThink(id) {
    if (!g_cvar_enable || !is_user_alive(id)) {
        return HC_CONTINUE;
    }

    new flags = get_entvar(id, var_flags);
    if (flags & FL_ONGROUND) {
        g_iJumpCount[id] = 0;
        g_bDoJump[id] = false;
        return HC_CONTINUE;
    }

    if (g_bDoJump[id]) {
        new Float:velocity[3];
        get_entvar(id, var_velocity, velocity);
        velocity[2] = g_cvar_jump_speed;
        set_entvar(id, var_velocity, velocity);
        g_bDoJump[id] = false;
    }

    return HC_CONTINUE;
}
