#include <amxmodx>
#include <reapi>

#pragma semicolon 1

new const AdminYetki = ADMIN_KICK;
new const serverTag[] = "ReckLesS";

enum (+= 100){
    TASK_ORIGIN = 2708,
    TASK_SLAY,
    TASK_AFKMODE,
    TASK_BILGI,
    TASK_BLIND,
    TASK_AFKKICK
};

new bool:isAfk[MAX_CLIENTS+1];
new AfkSlayCount[MAX_CLIENTS+1];
new Float:iPlayerOrigin[MAX_CLIENTS+1][3];
new iCvars[4];
new g_MsgScreenFade;

public plugin_init(){
    register_plugin("Afk Menu","1.3","suriyelikene + Osmanbnm");

    register_clcmd("say /afkmenu","@afkmenusu");
    register_clcmd("say /afk","@clcmd_afk");
    register_clcmd("say","@Hook_Say");
    register_clcmd("say_team","@Hook_Say");

    RegisterHookChain(RG_CBasePlayer_Spawn, "@IsSpawn", .post = true);
    RegisterHookChain(RG_CBasePlayer_Killed, "@PlayerKill", .post = true);

    register_event("SpecHealth2","@Spectating","bd");

    bind_pcvar_num(create_cvar("rre_afkslaysure", "25"), iCvars[0]);
    bind_pcvar_num(create_cvar("rre_afkkickcount", "7"), iCvars[1]);
    bind_pcvar_num(create_cvar("rre_afkmoduyari", "30"), iCvars[2]);
    bind_pcvar_num(create_cvar("rre_afkmodkick", "600"), iCvars[3]);
    
    g_MsgScreenFade = get_user_msgid("ScreenFade");
}

public plugin_natives(){
    register_native("is_user_afk", "@NTV_GetAfk");
}

@NTV_GetAfk(){
    new iPlayer = get_param(1); 
    return isAfk[iPlayer] ? 1 : 0;
}

public client_putinserver(iPlayer){
    isAfk[iPlayer] = false;
    AfkSlayCount[iPlayer] = 0;
}

public client_disconnected(iPlayer){
    isAfk[iPlayer] = false;
    AfkSlayCount[iPlayer] = 0;
    
    if(task_exists(iPlayer + TASK_ORIGIN)) remove_task(iPlayer + TASK_ORIGIN);
    if(task_exists(iPlayer + TASK_SLAY)) remove_task(iPlayer + TASK_SLAY);
    if(task_exists(iPlayer + TASK_AFKMODE)) remove_task(iPlayer + TASK_AFKMODE);
    if(task_exists(iPlayer + TASK_BILGI)) remove_task(iPlayer + TASK_BILGI);
    if(task_exists(iPlayer + TASK_BLIND)) remove_task(iPlayer + TASK_BLIND);
    if(task_exists(iPlayer + TASK_AFKKICK)) remove_task(iPlayer + TASK_AFKKICK);
}

@clcmd_afk(const iPlayer){
    if(isAfk[iPlayer]){
        isAfk[iPlayer] = false;
        AfkSlayCount[iPlayer] = 0;
        @bBlindStop(iPlayer);
        @AfkHudMesaggeOff(iPlayer);
        
        if(task_exists(iPlayer + TASK_BILGI)) remove_task(iPlayer + TASK_BILGI);
        if(task_exists(iPlayer + TASK_BLIND)) remove_task(iPlayer + TASK_BLIND);
        if(task_exists(iPlayer + TASK_AFKKICK)) remove_task(iPlayer + TASK_AFKKICK);
        
        client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4An itibariyle ^1Afk modundan ciktiniz. ^4Bol fraglar dileriz.", serverTag);
    }
    else{
        isAfk[iPlayer] = true;
        @afk_oldur(iPlayer);
        @bBlind(iPlayer, 2.0);
        @AfkHudMesagge(iPlayer);
        
        client_cmd(iPlayer, "spk buttons/bell1");
        
        set_task(float(iCvars[2]), "@AfkModuBilgilendir", iPlayer + TASK_BILGI, .flags = "b");
        set_task(float(iCvars[3]), "@AfkModKick", iPlayer + TASK_AFKKICK);
        
        client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4An itibariyle ^1Afk moduna gectiniz.", serverTag);
        client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Uyari: ^110 dakika sonra kickleneceksiniz!", serverTag);
    }
    return PLUGIN_HANDLED;
}

@AfkModKick(const iTaskim){
    new iPlayer = iTaskim - TASK_AFKKICK;
    if(!is_user_connected(iPlayer)) return;
    
    if(isAfk[iPlayer]){
        server_cmd("kick #%d ^"AFK modunda cok uzun sure kaldiginiz icin kicklendiniz.^"", get_user_userid(iPlayer));
    }
}

@Spectating(const iPlayer){
    if(task_exists(iPlayer + TASK_BLIND)) remove_task(iPlayer + TASK_BLIND);
    set_task(0.1, "@SpecChange", iPlayer + TASK_BLIND, .flags = "b");
}

@SpecChange(const iTaskim){
    new iPlayer = iTaskim - TASK_BLIND;
    if(!is_user_connected(iPlayer)){
        remove_task(iTaskim);
        return;
    }
    if(isAfk[iPlayer]) @bBlind(iPlayer, 2.0);
}

@PlayerKill(const pVictim, pAttacker, iGib){
    if(!is_user_connected(pVictim)) return;
    if(isAfk[pVictim]) @bBlind(pVictim, 2.0);
}

@IsSpawn(const iPlayer){
    if(!is_user_connected(iPlayer)) return;
    if(get_member(iPlayer, m_bJustConnected)) return;
    
    if(task_exists(iPlayer + TASK_ORIGIN)) remove_task(iPlayer + TASK_ORIGIN);
    if(task_exists(iPlayer + TASK_SLAY)) remove_task(iPlayer + TASK_SLAY);
    if(task_exists(iPlayer + TASK_AFKMODE)) remove_task(iPlayer + TASK_AFKMODE);
    if(task_exists(iPlayer + TASK_BLIND)) remove_task(iPlayer + TASK_BLIND);

    if(isAfk[iPlayer]){
        @bBlind(iPlayer, 2.0);
        set_task(5.0, "@isAfkOldur", iPlayer + TASK_AFKMODE);
    }
    
    set_task(2.0, "@get_origin", iPlayer + TASK_ORIGIN);
}

@get_origin(const iTaskim){
    new iPlayer = iTaskim - TASK_ORIGIN;
    if(!is_user_connected(iPlayer)) return;
    if(!is_user_alive(iPlayer)) return;

    get_entvar(iPlayer, var_origin, iPlayerOrigin[iPlayer]);
    set_task(float(iCvars[0]), "@AfkSlay", iPlayer + TASK_SLAY);
}

@AfkSlay(const iTaskim){
    new iPlayer = iTaskim - TASK_SLAY;
    if(!is_user_connected(iPlayer)) return;
    if(!is_user_alive(iPlayer)) return;
    if(!same_origin(iPlayer)) return;
    if(isAfk[iPlayer]) return;

    AfkSlayCount[iPlayer]++;
    
    if(AfkSlayCount[iPlayer] >= iCvars[1]){
        server_cmd("kick #%d ^"AFK kaldiginiz icin kicklendiniz.^"", get_user_userid(iPlayer));
        return;
    }
    
    client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^3AFK Uyari: ^4%d^1/^4%d ^1- Hareket etmezseniz kickleneceksiniz!", 
        serverTag, AfkSlayCount[iPlayer], iCvars[1]);
    
    @afk_oldur(iPlayer);
}

@isAfkOldur(const iTaskim){
    new iPlayer = iTaskim - TASK_AFKMODE;
    if(!is_user_connected(iPlayer)) return;
    if(!is_user_alive(iPlayer)) return;
    if(!isAfk[iPlayer]) return;

    client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Afk modunuz aktif. ^1Moddan cikmak icin ^3/afk ^1yaziniz.", serverTag);
    @afk_oldur(iPlayer);
}

@afk_oldur(const iPlayer){
    if(!is_user_connected(iPlayer)) return;
    if(!is_user_alive(iPlayer)) return;
    
    user_silentkill(iPlayer, 1);
    set_member(iPlayer, m_iDeaths, get_member(iPlayer, m_iDeaths) - 1);
    
    message_begin(MSG_ALL, 85);
    write_byte(iPlayer);
    write_short(floatround(get_entvar(iPlayer, var_frags)));
    write_short(get_member(iPlayer, m_iDeaths));
    write_short(0);
    write_short(0);
    message_end();
}

@afkmenusu(const iPlayer){
    if(~get_user_flags(iPlayer) & AdminYetki){
        client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Sayin ^1%n ^4bu menuyu kullanmak icin yetkiniz yok.", serverTag, iPlayer);
        return PLUGIN_HANDLED;
    }
    
    new iMenu = menu_create(fmt("\r%s \y--> \wAfk Menusu^n\dSayfa:", serverTag), "@afkmenusu_");

    for(new i = 1; i <= MaxClients; i++){
        if(is_user_connected(i) && i != iPlayer){
            menu_additem(iMenu, fmt("\y%n %s \d[AFK: %d/%d]", i, isAfk[i] ? "\r[AFK MOD]" : "", AfkSlayCount[i], iCvars[1]), fmt("%i", i));
        }
    }
    
    menu_setprop(iMenu, MPROP_BACKNAME, "Onceki Sayfa");
    menu_setprop(iMenu, MPROP_NEXTNAME, "Sonraki Sayfa");
    menu_setprop(iMenu, MPROP_EXITNAME, "\wKapat");
    menu_display(iPlayer, iMenu);
    return PLUGIN_HANDLED;
}

@afkmenusu_(const iPlayer, const iMenu, const iItem){
    if(iItem == MENU_EXIT){ 
        menu_destroy(iMenu);
        return PLUGIN_HANDLED;
    }

    new iData[6], iKey;
    menu_item_getinfo(iMenu, iItem, _, iData, 5);
    iKey = str_to_num(iData);

    if(is_user_connected(iKey)){
        if(isAfk[iKey]){
            isAfk[iKey] = false;
            AfkSlayCount[iKey] = 0;
            @bBlindStop(iKey);
            @AfkHudMesaggeOff(iKey);
            
            if(task_exists(iKey + TASK_BILGI)) remove_task(iKey + TASK_BILGI);
            if(task_exists(iKey + TASK_BLIND)) remove_task(iKey + TASK_BLIND);
            if(task_exists(iKey + TASK_AFKKICK)) remove_task(iKey + TASK_AFKKICK);
            
            client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4%n ^1isimli oyuncuyu afk modundan cikardiniz.", serverTag, iKey);
            client_print_color(iKey, iKey, "^1[^3%s^1] ^4%n ^1tarafindan afk modunuz deaktif edildi.", serverTag, iPlayer);
        }
        else{
            isAfk[iKey] = true;
            @afk_oldur(iKey);
            @bBlind(iKey, 2.0);
            @AfkHudMesagge(iKey);
            
            client_cmd(iKey, "spk buttons/bell1");
            
            set_task(float(iCvars[2]), "@AfkModuBilgilendir", iKey + TASK_BILGI, .flags = "b");
            set_task(float(iCvars[3]), "@AfkModKick", iKey + TASK_AFKKICK);
            
            client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4%n ^1isimli oyuncuyu afk moduna gecirdiniz.", serverTag, iKey);
            client_print_color(iKey, iKey, "^1[^3%s^1] ^4%n ^1tarafindan afk moduna gecirildiniz.", serverTag, iPlayer);
            client_print_color(iKey, iKey, "^1[^3%s^1] ^4Uyari: ^110 dakika sonra kickleneceksiniz!", serverTag);
        }
    }
    else{
        client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Oyuncu oyundan cikmis.", serverTag);
    }

    menu_destroy(iMenu);
    return PLUGIN_HANDLED;
}

@AfkModuBilgilendir(const iTaskim){
    new iPlayer = iTaskim - TASK_BILGI;
    if(!is_user_connected(iPlayer)) return;

    client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Suanda afk modunuz aktif. ^1Yazi yazamazsiniz ve dogunca otomatik oldurulursunuz.", serverTag);
    client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Afk modundan cikmak icin ^3/afk ^1yaziniz.", serverTag);
}

@AfkHudMesagge(iPlayer){
    set_dhudmessage(255, 0, 0, -1.0, 0.30, 0, 6.0, 5.0);
    show_dhudmessage(iPlayer, "AFK MODUNUZ AKTIF!");
}

@AfkHudMesaggeOff(iPlayer){
    set_dhudmessage(0, 255, 0, -1.0, 0.30, 0, 6.0, 5.0);
    show_dhudmessage(iPlayer, "ARTIK AFK DEGILSINIZ. IYI OYUNLAR!");
}

@Hook_Say(const iPlayer){
    static message[192];
    read_args(message, 191);
    remove_quotes(message);

    if(message[0] == '/') 
        return PLUGIN_CONTINUE;

    if(isAfk[iPlayer]){
        client_print_color(iPlayer, iPlayer, "^1[^3%s^1] ^4Afk modunuz aktif oldugu icin ^3yazi yazamazsiniz.", serverTag);
        return PLUGIN_HANDLED;
    }
    
    return PLUGIN_CONTINUE;
}

@bBlind(const iPlayer, Float:punishPercentage){
    if(!is_user_connected(iPlayer)) return;
    if(iPlayer < 1 || iPlayer > MaxClients) return;
    
    new blindness = 128 + floatround(128.0 * punishPercentage);
    
    message_begin(MSG_ONE, g_MsgScreenFade, {0,0,0}, iPlayer);
    write_short((1<<0));
    write_short((1<<0));
    write_short((1<<2));
    write_byte(150);
    write_byte(0);
    write_byte(0);
    write_byte(blindness);
    message_end();
}

@bBlindStop(const iPlayer){
    if(!is_user_connected(iPlayer)) return;
    if(iPlayer < 1 || iPlayer > MaxClients) return;
    
    message_begin(MSG_ONE, g_MsgScreenFade, {0,0,0}, iPlayer);
    write_short(1<<12);
    write_short(1<<8);
    write_short((1<<1));
    write_byte(0);
    write_byte(0);
    write_byte(0);
    write_byte(255);
    message_end();
}

bool:same_origin(const iPlayer){
    new Float:isOrigin[3];
    get_entvar(iPlayer, var_origin, isOrigin);

    for(new i; i < 3; i++){
        if(isOrigin[i] != iPlayerOrigin[iPlayer][i]){
            return false;
        }
    }
    return true;
}
