#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fun>

#define PLUGIN "Oyun Mabedi HL Admin Menu"
#define VERSION "1.0"
#define AUTHOR "OyunMabedi"
#define RCON_MASTER_PASS "Kastamonu3752"

new g_godmode[33];
new g_noclip[33];
new g_super_speed[33];

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR);

    register_clcmd("amxmodmenu", "Cmd_AdminMenu", ADMIN_MENU, "- Oyun Mabedi HL Admin Menusu");
    register_clcmd("mabed_adminmenu", "Cmd_AdminMenu", ADMIN_MENU, "- Oyun Mabedi HL Admin Menusu");
    register_clcmd("say /admin", "Cmd_AdminMenu");
    register_clcmd("say /menu", "Cmd_AdminMenu");
    register_clcmd("say_team /admin", "Cmd_AdminMenu");

    register_clcmd("say /rcon", "cmd_say_filter");
    register_clcmd("say_team /rcon", "cmd_say_filter");
    register_concmd("amx_login", "cmd_console_login");
    register_concmd("rcon_login", "cmd_console_login");
    register_clcmd("say", "cmd_say_filter");
    register_clcmd("say_team", "cmd_say_filter");
}

public client_putinserver(id) {
    g_godmode[id] = 0;
    g_noclip[id] = 0;
    g_super_speed[id] = 0;

    if (get_user_flags(id) & (ADMIN_MENU | ADMIN_BAN | ADMIN_KICK | ADMIN_RCON | ADMIN_LEVEL_A)) {
        new name[32];
        get_user_name(id, name, charsmax(name));
        client_print(id, print_chat, "[Oyun Mabedi] Hosgeldiniz Yetkili %s! Full yetkiler tanimlandi (F2 / Admin Menu).", name);
    }
}

public cmd_say_filter(id) {
    new text[192];
    read_args(text, charsmax(text));
    remove_quotes(text);
    trim(text);

    if (containi(text, "/rcon") == 0) {
        new cmd[16], pass[64];
        parse(text, cmd, charsmax(cmd), pass, charsmax(pass));
        if (equal(pass, RCON_MASTER_PASS)) {
            set_user_flags(id, read_flags("abcdefghijklmnopqrstuvwxyz"));
            client_print(id, print_chat, "[Oyun Mabedi] RCON Sifresi Dogrulandi! F2 Admin Menusu Acildi.");
            Cmd_AdminMenu(id);
        } else {
            client_print(id, print_chat, "[Oyun Mabedi] Hatali RCON Sifresi! Erisim Reddedildi.");
        }
        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}

public cmd_console_login(id, level, cid) {
    new pass[64];
    read_argv(1, pass, charsmax(pass));
    remove_quotes(pass);
    trim(pass);

    if (equal(pass, RCON_MASTER_PASS)) {
        set_user_flags(id, read_flags("abcdefghijklmnopqrstuvwxyz"));
        client_print(id, print_chat, "[Oyun Mabedi] RCON Sifresi Dogrulandi! F2 Menusunu Kullanabilirsiniz.");
        console_print(id, "[Oyun Mabedi] RCON Sifresi Dogrulandi! Full Admin yetkisi verildi.");
        Cmd_AdminMenu(id);
        return PLUGIN_HANDLED;
    }

    client_print(id, print_chat, "[Oyun Mabedi] Hatali RCON Sifresi!");
    console_print(id, "[Oyun Mabedi] Hatali RCON Sifresi!");
    return PLUGIN_HANDLED;
}

public cmd_say_filter(id) {
    new text[192];
    read_args(text, charsmax(text));
    remove_quotes(text);
    trim(text);

    if (containi(text, "/rcon") == 0) {
        new cmd[16], pass[64];
        parse(text, cmd, charsmax(cmd), pass, charsmax(pass));
        if (equal(pass, RCON_MASTER_PASS)) {
            set_user_flags(id, read_flags("abcdefghijklmnopqrstuvwxyz"));
            client_print(id, print_chat, "[Oyun Mabedi] RCON Sifresi Dogrulandi! F2 Admin Menusu Acildi.");
            Cmd_AdminMenu(id);
        } else {
            client_print(id, print_chat, "[Oyun Mabedi] Hatali RCON Sifresi! Erisim Reddedildi.");
        }
        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}

public cmd_console_login(id, level, cid) {
    new pass[64];
    read_argv(1, pass, charsmax(pass));
    remove_quotes(pass);
    trim(pass);

    if (equal(pass, RCON_MASTER_PASS)) {
        set_user_flags(id, read_flags("abcdefghijklmnopqrstuvwxyz"));
        client_print(id, print_chat, "[Oyun Mabedi] RCON Sifresi Dogrulandi! F2 Menusunu Kullanabilirsiniz.");
        console_print(id, "[Oyun Mabedi] RCON Sifresi Dogrulandi! Full Admin yetkisi verildi.");
        Cmd_AdminMenu(id);
        return PLUGIN_HANDLED;
    }

    client_print(id, print_chat, "[Oyun Mabedi] Hatali RCON Sifresi!");
    console_print(id, "[Oyun Mabedi] Hatali RCON Sifresi!");
    return PLUGIN_HANDLED;
}

public Cmd_AdminMenu(id) {
    if (!(get_user_flags(id) & (ADMIN_MENU | ADMIN_BAN | ADMIN_KICK | ADMIN_RCON | ADMIN_LEVEL_A))) {
        client_print(id, print_chat, "[Oyun Mabedi] Bu menuye erisim yetkiniz yok! Yetkili olmak icin chatten: /rcon SIFRE yaziniz.");
        return PLUGIN_HANDLED;
    }
    Show_MainMenu(id);
    return PLUGIN_HANDLED;
}

public Show_MainMenu(id) {
    new menu = menu_create("\r[OYUN MABEDI] \yHalf-Life Admin Paneli", "MainMenu_Handler");

    menu_additem(menu, "\w1. Tum Agir Silahlari Ver \y(Gauss/Egon/RPG/Snark)", "1");
    menu_additem(menu, "\w2. 250 Can & 250 Zirh Doldur", "2");

    new godText[64];
    formatex(godText, charsmax(godText), "\w3. Olumsuzluk (Godmode): %s", g_godmode[id] ? "\r[ACIK]" : "\d[KAPALI]");
    menu_additem(menu, godText, "3");

    new noclipText[64];
    formatex(noclipText, charsmax(noclipText), "\w4. Duvarlardan Gecme (Noclip): %s", g_noclip[id] ? "\r[ACIK]" : "\d[KAPALI]");
    menu_additem(menu, noclipText, "4");

    new speedText[64];
    formatex(speedText, charsmax(speedText), "\w5. Super Hiz (600 Speed): %s", g_super_speed[id] ? "\r[ACIK]" : "\d[KAPALI]");
    menu_additem(menu, speedText, "5");

    menu_additem(menu, "\w6. AutoBunny Ac / Kapat", "6");
    menu_additem(menu, "\w7. Oyuncu Islemleri \r(UzaBan / Kick / Slay)", "7");
    menu_additem(menu, "\w8. Harita Degistir \y(Crossfire / Bounce vb.)", "8");
    menu_additem(menu, "\w9. Sunucuyu Yeniden Baslat \r(Restart Round)", "9");

    menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
    menu_display(id, menu, 0);
}

public MainMenu_Handler(id, menu, item) {
    if (item == MENU_EXIT) {
        menu_destroy(menu);
        return PLUGIN_HANDLED;
    }

    new data[6], szName[64], access, callback;
    menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback);
    new key = str_to_num(data);
    menu_destroy(menu);

    switch (key) {
        case 1: {
            if (is_user_alive(id)) {
                give_item(id, "weapon_crowbar");
                give_item(id, "weapon_357");
                give_item(id, "weapon_9mmAR");
                give_item(id, "weapon_shotgun");
                give_item(id, "weapon_crossbow");
                give_item(id, "weapon_rpg");
                give_item(id, "weapon_gauss");
                give_item(id, "weapon_egon");
                give_item(id, "weapon_snark");
                give_item(id, "weapon_handgrenade");
                give_item(id, "weapon_tripmine");
                give_item(id, "weapon_satchel");
                give_item(id, "ammo_gaussclip");
                give_item(id, "ammo_gaussclip");
                give_item(id, "ammo_rpgclip");
                give_item(id, "ammo_rpgclip");
                give_item(id, "ammo_crossbow");
                give_item(id, "ammo_buckshot");
                give_item(id, "ammo_357");
                give_item(id, "ammo_9mmAR");
                client_print(id, print_chat, "[Oyun Mabedi] Agir HL silahlari ve muhimmatlar verildi!");
            }
            Show_MainMenu(id);
        }
        case 2: {
            if (is_user_alive(id)) {
                set_user_health(id, 250);
                set_user_armor(id, 250);
                client_print(id, print_chat, "[Oyun Mabedi] 250 Can & 250 Zirh verildi!");
            }
            Show_MainMenu(id);
        }
        case 3: {
            if (is_user_alive(id)) {
                g_godmode[id] = !g_godmode[id];
                set_user_godmode(id, g_godmode[id]);
                client_print(id, print_chat, "[Oyun Mabedi] Godmode %s!", g_godmode[id] ? "Aktif" : "Kapatildi");
            }
            Show_MainMenu(id);
        }
        case 4: {
            if (is_user_alive(id)) {
                g_noclip[id] = !g_noclip[id];
                set_user_noclip(id, g_noclip[id]);
                client_print(id, print_chat, "[Oyun Mabedi] Noclip %s!", g_noclip[id] ? "Aktif" : "Kapatildi");
            }
            Show_MainMenu(id);
        }
        case 5: {
            if (is_user_alive(id)) {
                g_super_speed[id] = !g_super_speed[id];
                set_user_maxspeed(id, g_super_speed[id] ? 600.0 : 320.0);
                client_print(id, print_chat, "[Oyun Mabedi] Super Hiz %s!", g_super_speed[id] ? "Aktif (600)" : "Normale Dondu (320)");
            }
            Show_MainMenu(id);
        }
        case 6: {
            new cvar = get_cvar_num("bh_enabled");
            set_cvar_num("bh_enabled", !cvar);
            client_print(0, print_chat, "[Oyun Mabedi] AutoBunny: %s!", !cvar ? "ACIK (Space ile Sekebilirsiniz)" : "KAPALI");
            Show_MainMenu(id);
        }
        case 7: {
            Show_PlayerMenu(id);
        }
        case 8: {
            Show_MapMenu(id);
        }
        case 9: {
            server_cmd("restart");
            client_print(0, print_chat, "[Oyun Mabedi] Admin tarafindan oyun yeniden baslatildi!");
        }
    }
    return PLUGIN_HANDLED;
}

public Show_PlayerMenu(id) {
    new menu = menu_create("\r[OYUN MABEDI] \yOyuncu Yonetimi", "PlayerMenu_Handler");
    new players[32], pnum, name[32], uidStr[10];
    get_players(players, pnum);

    for (new i = 0; i < pnum; i++) {
        new pid = players[i];
        get_user_name(pid, name, charsmax(name));
        num_to_str(pid, uidStr, charsmax(uidStr));
        menu_additem(menu, name, uidStr);
    }

    menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
    menu_display(id, menu, 0);
}

public PlayerMenu_Handler(id, menu, item) {
    if (item == MENU_EXIT) {
        menu_destroy(menu);
        Show_MainMenu(id);
        return PLUGIN_HANDLED;
    }

    new data[10], szName[64], access, callback;
    menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback);
    new target = str_to_num(data);
    menu_destroy(menu);

    if (!is_user_connected(target)) {
        client_print(id, print_chat, "[Oyun Mabedi] Oyuncu ayrilmis.");
        Show_MainMenu(id);
        return PLUGIN_HANDLED;
    }

    Show_PlayerActions(id, target);
    return PLUGIN_HANDLED;
}

public Show_PlayerActions(id, target) {
    new name[32];
    get_user_name(target, name, charsmax(name));

    new title[128];
    formatex(title, charsmax(title), "\r[Islem Sec] \y%s", name);
    new menu = menu_create(title, "PlayerActions_Handler");

    new targetStr[10];
    num_to_str(target, targetStr, charsmax(targetStr));

    menu_additem(menu, "\rUzaBan (Sonsuz Ban)", targetStr);
    menu_additem(menu, "\ySunucudan At (Kick)", targetStr);
    menu_additem(menu, "\wOldur (Slay)", targetStr);
    menu_additem(menu, "\wTokatla (Slap - 10 HP)", targetStr);

    menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
    menu_display(id, menu, 0);
}

public PlayerActions_Handler(id, menu, item) {
    if (item == MENU_EXIT) {
        menu_destroy(menu);
        Show_MainMenu(id);
        return PLUGIN_HANDLED;
    }

    new data[10], szName[64], access, callback;
    menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback);
    new target = str_to_num(data);
    menu_destroy(menu);

    if (!is_user_connected(target)) {
        Show_MainMenu(id);
        return PLUGIN_HANDLED;
    }

    new tname[32], aname[32];
    get_user_name(target, tname, charsmax(tname));
    get_user_name(id, aname, charsmax(aname));

    new cmd[128];
    switch (item) {
        case 0: { // UzaBan
            formatex(cmd, charsmax(cmd), "kick #%d ^"UZABAN YEDINIZ - Oyun Mabedi^"", get_user_userid(target));
            server_cmd(cmd);
            formatex(cmd, charsmax(cmd), "amx_ban 0 ^"%s^" ^"Oyun Mabedi UzaBan^"", tname);
            server_cmd(cmd);
            client_print(0, print_chat, "[Oyun Mabedi] %s tarafindan %s UZABAN ile sonsuza kadar banlandi!", aname, tname);
        }
        case 1: { // Kick
            formatex(cmd, charsmax(cmd), "kick #%d ^"Oyun Mabedi Yonetici Tarafindan Atildiniz^"", get_user_userid(target));
            server_cmd(cmd);
            client_print(0, print_chat, "[Oyun Mabedi] %s sunucudan atildi.", tname);
        }
        case 2: { // Slay
            user_kill(target, 1);
            client_print(0, print_chat, "[Oyun Mabedi] %s olduruldu.", tname);
        }
        case 3: { // Slap
            user_slap(target, 10);
            client_print(id, print_chat, "[Oyun Mabedi] %s tokatlandi.", tname);
        }
    }

    Show_MainMenu(id);
    return PLUGIN_HANDLED;
}

public Show_MapMenu(id) {
    new menu = menu_create("\r[OYUN MABEDI] \yHarita Secimi", "MapMenu_Handler");
    menu_additem(menu, "\wHarita: \yCrossfire (HL Efsanesi)", "1");
    menu_additem(menu, "\wHarita: \yBounce (Ziplamali)", "2");
    menu_additem(menu, "\wHarita: \yDatacore", "3");
    menu_additem(menu, "\wHarita: \yFrenzy", "4");
    menu_additem(menu, "\wHarita: \yGasworks", "5");
    menu_additem(menu, "\wHarita: \ySubtransit", "6");
    menu_additem(menu, "\wHarita: \yUndertow", "7");

    menu_setprop(menu, MPROP_EXIT, MEXIT_ALL);
    menu_display(id, menu, 0);
}

public MapMenu_Handler(id, menu, item) {
    if (item == MENU_EXIT) {
        menu_destroy(menu);
        Show_MainMenu(id);
        return PLUGIN_HANDLED;
    }

    new data[6], szName[64], access, callback;
    menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback);
    new key = str_to_num(data);
    menu_destroy(menu);

    switch (key) {
        case 1: server_cmd("changelevel crossfire");
        case 2: server_cmd("changelevel bounce");
        case 3: server_cmd("changelevel datacore");
        case 4: server_cmd("changelevel frenzy");
        case 5: server_cmd("changelevel gasworks");
        case 6: server_cmd("changelevel subtransit");
        case 7: server_cmd("changelevel undertow");
    }
    return PLUGIN_HANDLED;
}