#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <reapi>

#define PLUGIN "HIT Auto Join T & Block Team Change"
#define VERSION "2.0"
#define PLUGIN_AUTHOR "HIT"

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

    // Block M button and console team commands
    register_clcmd("chooseteam", "cmd_block_team");
    register_clcmd("jointeam", "cmd_block_team");

    // Hook team selection menus so player is never asked for a team
    register_message(get_user_msgid("ShowMenu"), "msg_ShowMenu");
    register_message(get_user_msgid("VGUIMenu"), "msg_VGUIMenu");

    // Standard AMX Team Commands
    register_concmd("amx_team", "cmd_amx_team", ADMIN_KICK, "<target> <t/ct/spec> - Oyuncuyu belirtilen takima transfer eder");
    register_concmd("amx_transfer", "cmd_amx_team", ADMIN_KICK, "<target> <t/ct/spec> - Oyuncuyu belirtilen takima transfer eder");
    register_concmd("amx_ct", "cmd_transfer_ct", ADMIN_KICK, "<target> - Oyuncuyu CT Takimina transfer eder");
    register_concmd("amx_t", "cmd_transfer_t", ADMIN_KICK, "<target> - Oyuncuyu T Takimina transfer eder");
    register_concmd("amx_spec", "cmd_transfer_spec", ADMIN_KICK, "<target> - Oyuncuyu Izleyiciye transfer eder");
}

public client_putinserver(id) {
    if (!is_user_bot(id)) {
        set_task(0.3, "task_auto_join_t", id);
    }
}

public msg_ShowMenu(msgid, dest, id) {
    if (is_user_bot(id)) return PLUGIN_CONTINUE;

    static text[64];
    get_msg_arg_string(4, text, charsmax(text));
    if (containi(text, "Team_Select") != -1 || containi(text, "IG_Team_Select") != -1) {
        set_task(0.1, "task_auto_join_t", id);
        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}

public msg_VGUIMenu(msgid, dest, id) {
    if (is_user_bot(id)) return PLUGIN_CONTINUE;

    // Menu 2 is team selection VGUI
    if (get_msg_arg_int(1) == 2) {
        set_task(0.1, "task_auto_join_t", id);
        return PLUGIN_HANDLED;
    }
    return PLUGIN_CONTINUE;
}

public task_auto_join_t(id) {
    if (!is_user_connected(id) || is_user_bot(id)) return;

    new CsTeams:team = cs_get_user_team(id);
    if (team == CS_TEAM_UNASSIGNED) {
        rg_set_user_team(id, TEAM_TERRORIST);
        cs_set_user_team(id, CS_TEAM_T);
    }
}

public cmd_block_team(id) {
    if (is_user_bot(id)) return PLUGIN_CONTINUE;

    new CsTeams:team = cs_get_user_team(id);
    if (team == CS_TEAM_UNASSIGNED) {
        task_auto_join_t(id);
        return PLUGIN_HANDLED;
    }

    client_print(id, print_center, "[HIT] M Tusu Ile Takim Degismek Yasaktir! Sadece Komutcu/Admin Transfer Edebilir.");
    client_print_color(id, print_team_default, "^4[HIT]^3 M tusu ile takim degismek yasaktir! Sadece komutcu/admin transfer edebilir.");
    return PLUGIN_HANDLED;
}

public cmd_amx_team(id, level, cid) {
    if (!cmd_access(id, level, cid, 3)) return PLUGIN_HANDLED;

    new argTarget[32], argTeam[16];
    read_argv(1, argTarget, charsmax(argTarget));
    read_argv(2, argTeam, charsmax(argTeam));

    new CsTeams:destTeam = CS_TEAM_UNASSIGNED;
    if (equali(argTeam, "t") || equali(argTeam, "te") || equali(argTeam, "terror") || equali(argTeam, "1")) {
        destTeam = CS_TEAM_T;
    } else if (equali(argTeam, "ct") || equali(argTeam, "counter") || equali(argTeam, "2")) {
        destTeam = CS_TEAM_CT;
    } else if (equali(argTeam, "spec") || equali(argTeam, "spectator") || equali(argTeam, "3") || equali(argTeam, "6")) {
        destTeam = CS_TEAM_SPECTATOR;
    } else {
        client_print(id, print_console, "[HIT] Gecersiz takim! Kullanilabilir takimlar: t, ct, spec");
        return PLUGIN_HANDLED;
    }

    new admin_name[32];
    get_user_name(id, admin_name, charsmax(admin_name));

    // Check for @all, @t, @ct
    if (equal(argTarget, "@all") || equal(argTarget, "*")) {
        for (new i = 1; i <= get_maxplayers(); i++) {
            if (is_user_connected(i) && !is_user_bot(i)) {
                transfer_player(i, destTeam);
            }
        }
        client_print_color(0, print_team_default, "^4[HIT]^3 Admin ^4%s^3 tum oyunculari ^4%s^3 takimina transfer etti.", admin_name, get_team_name_str(destTeam));
        return PLUGIN_HANDLED;
    } else if (equal(argTarget, "@t")) {
        for (new i = 1; i <= get_maxplayers(); i++) {
            if (is_user_connected(i) && cs_get_user_team(i) == CS_TEAM_T && !is_user_bot(i)) {
                transfer_player(i, destTeam);
            }
        }
        client_print_color(0, print_team_default, "^4[HIT]^3 Admin ^4%s^3 tum T oyuncularini ^4%s^3 takimina transfer etti.", admin_name, get_team_name_str(destTeam));
        return PLUGIN_HANDLED;
    } else if (equal(argTarget, "@ct")) {
        for (new i = 1; i <= get_maxplayers(); i++) {
            if (is_user_connected(i) && cs_get_user_team(i) == CS_TEAM_CT && !is_user_bot(i)) {
                transfer_player(i, destTeam);
            }
        }
        client_print_color(0, print_team_default, "^4[HIT]^3 Admin ^4%s^3 tum CT oyuncularini ^4%s^3 takimina transfer etti.", admin_name, get_team_name_str(destTeam));
        return PLUGIN_HANDLED;
    }

    new target = 0;
    if (equal(argTarget, "me") || equal(argTarget, "ben") || equal(argTarget, "@me")) {
        target = id;
    } else {
        target = cmd_target(id, argTarget, CMDTARGET_ALLOW_SELF);
        if (!target) {
            target = find_player_by_part(argTarget);
        }
    }
    if (!target) {
        client_print(id, print_console, "[HIT] Oyuncu bulunamadi: %s", argTarget);
        return PLUGIN_HANDLED;
    }

    transfer_player(target, destTeam);
    new name[32];
    get_user_name(target, name, charsmax(name));
    client_print_color(0, print_team_default, "^4[HIT]^3 Admin ^4%s, ^4%s^3 adli oyuncuyu ^4%s^3 takimina transfer etti.", admin_name, name, get_team_name_str(destTeam));
    return PLUGIN_HANDLED;
}

public cmd_transfer_ct(id, level, cid) {
    if (!cmd_access(id, level, cid, 2)) return PLUGIN_HANDLED;
    new arg[32];
    read_argv(1, arg, charsmax(arg));

    new admin_name[32];
    get_user_name(id, admin_name, charsmax(admin_name));

    if (equal(arg, "@all") || equal(arg, "@t") || equal(arg, "*")) {
        for (new i = 1; i <= get_maxplayers(); i++) {
            if (is_user_connected(i) && !is_user_bot(i)) {
                transfer_player(i, CS_TEAM_CT);
            }
        }
        client_print_color(0, print_team_default, "^4[HIT]^3 Admin ^4%s^3 herkesi ^4CT^3 takimina transfer etti.", admin_name);
        return PLUGIN_HANDLED;
    }

    new target = 0;
    if (read_argc() < 2 || equal(arg, "") || equal(arg, "me") || equal(arg, "ben")) {
        target = id;
    } else {
        target = cmd_target(id, arg, CMDTARGET_ALLOW_SELF);
        if (!target) target = find_player_by_part(arg);
    }
    if (!target) return PLUGIN_HANDLED;

    transfer_player(target, CS_TEAM_CT);
    new name[32];
    get_user_name(target, name, charsmax(name));
    client_print_color(0, print_team_default, "^4[HIT]^3 Admin ^4%s, ^4%s^3 adli oyuncuyu ^4CT^3 takimina transfer etti.", admin_name, name);
    return PLUGIN_HANDLED;
}

public cmd_transfer_t(id, level, cid) {
    if (!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED;
    new arg[32];
    read_argv(1, arg, charsmax(arg));

    new admin_name[32];
    get_user_name(id, admin_name, charsmax(admin_name));

    if (equal(arg, "@all") || equal(arg, "@ct") || equal(arg, "*")) {
        for (new i = 1; i <= get_maxplayers(); i++) {
            if (is_user_connected(i) && !is_user_bot(i)) {
                transfer_player(i, CS_TEAM_T);
            }
        }
        client_print_color(0, print_team_default, "^4[HIT]^3 Admin ^4%s^3 herkesi ^4T^3 takimina transfer etti.", admin_name);
        return PLUGIN_HANDLED;
    }

    new target = 0;
    if (read_argc() < 2 || equal(arg, "") || equal(arg, "me") || equal(arg, "ben")) {
        target = id;
    } else {
        target = cmd_target(id, arg, CMDTARGET_ALLOW_SELF);
        if (!target) target = find_player_by_part(arg);
    }
    if (!target) return PLUGIN_HANDLED;

    transfer_player(target, CS_TEAM_T);
    new name[32];
    get_user_name(target, name, charsmax(name));
    client_print_color(0, print_team_default, "^4[HIT]^3 Admin ^4%s, ^4%s^3 adli oyuncuyu ^4T^3 takimina transfer etti.", admin_name, name);
    return PLUGIN_HANDLED;
}

public cmd_transfer_spec(id, level, cid) {
    if (!cmd_access(id, level, cid, 2)) return PLUGIN_HANDLED;
    new arg[32];
    read_argv(1, arg, charsmax(arg));

    new target = cmd_target(id, arg, CMDTARGET_ALLOW_SELF);
    if (!target) target = find_player_by_part(arg);
    if (!target) return PLUGIN_HANDLED;

    transfer_player(target, CS_TEAM_SPECTATOR);
    new name[32], admin_name[32];
    get_user_name(target, name, charsmax(name));
    get_user_name(id, admin_name, charsmax(admin_name));
    client_print_color(0, print_team_default, "^4[HIT]^3 Admin ^4%s, ^4%s^3 adli oyuncuyu ^4SPECTATOR^3 takimina transfer etti.", admin_name, name);
    return PLUGIN_HANDLED;
}

transfer_player(target, CsTeams:destTeam) {
    if (!is_user_connected(target)) return;

    if (destTeam == CS_TEAM_SPECTATOR) {
        if (is_user_alive(target)) {
            user_silentkill(target);
        }
        cs_set_user_team(target, CS_TEAM_SPECTATOR);
        return;
    }

    // T veya CT takimina transfer ve dogurma
    new TeamName:reapiTeam = (destTeam == CS_TEAM_T) ? TEAM_TERRORIST : TEAM_CT;
    rg_set_user_team(target, reapiTeam);
    cs_set_user_team(target, destTeam);

    // Yeni takiminda aninda karakterle canlansin
    set_task(0.1, "task_respawn_transferred", target);
}

public task_respawn_transferred(target) {
    if (is_user_connected(target)) {
        new CsTeams:team = cs_get_user_team(target);
        if (team == CS_TEAM_T || team == CS_TEAM_CT) {
            rg_round_respawn(target);
            rg_give_item(target, "weapon_knife");
        }
    }
}

find_player_by_part(const search[]) {
    for (new i = 1; i <= get_maxplayers(); i++) {
        if (is_user_connected(i)) {
            new name[32];
            get_user_name(i, name, charsmax(name));
            if (containi(name, search) != -1) {
                return i;
            }
        }
    }
    return 0;
}

get_team_name_str(CsTeams:team) {
    static res[24];
    switch(team) {
        case CS_TEAM_T: copy(res, charsmax(res), "TERRORIST (T)");
        case CS_TEAM_CT: copy(res, charsmax(res), "COUNTER-TERRORIST (CT)");
        case CS_TEAM_SPECTATOR: copy(res, charsmax(res), "SPECTATOR");
        default: copy(res, charsmax(res), "UNASSIGNED");
    }
    return res;
}
