#include <amxmodx>
    #include <amxmisc>
    #include <cstrike>
    #include <csdm>
     
    new D_PLUGIN[]  = "CSDM Main"
    new D_ACCESS    = ADMIN_MAP
     
    #define CSDM_OPTIONS_TOTAL              2
     
    new bool:g_StripWeapons = true
    new bool:g_RemoveBomb = true
    new g_StayTime
    new g_drop_fwd
    new g_options[CSDM_OPTIONS_TOTAL]
     
    //new g_MenuPages[33]
    new g_MainMenu = -1
     
    public plugin_natives()
    {
            register_native("csdm_main_menu", "native_main_menu")
            register_native("csdm_set_mainoption", "__csdm_allow_option")
            register_native("csdm_fwd_drop", "__csdm_fwd_drop")
            register_library("csdm_main")
    }
     
    public native_main_menu(id, num)
    {
            return g_MainMenu
    }
     
    public __csdm_allow_option(id, num)
    {
            new option = get_param(1)
           
            if (option <= 0 || option >= CSDM_OPTIONS_TOTAL)
            {
                    log_error(AMX_ERR_NATIVE, "Invalid option number: %d", option)
                    return 0
            }
           
            g_options[option] = get_param(2)
           
            return 1
    }
     
    public __csdm_fwd_drop(id, num)
    {
            new id = get_param(1)
            new wp = get_param(2)
            new name[32]
           
            get_string(3, name, 31)
           
            return run_drop(id, wp, name)  
    }
     
    public csdm_Init(const version[])
    {
            if (version[0] == 0)
            {
                    set_fail_state("CSDM failed to load.")
                    return
            }
    }
     
    public csdm_CfgInit()
    {      
            csdm_reg_cfg("settings", "read_cfg")
    }
     
    public plugin_init()
    {
            register_plugin(D_PLUGIN, CSDM_VERSION, "CSDM Team")
           
            register_clcmd("say respawn", "say_respawn")
            register_clcmd("say /respawn", "say_respawn")
           
            register_concmd("csdm_enable", "csdm_enable", D_ACCESS, "Enables CSDM")
            register_concmd("csdm_disable", "csdm_disable", D_ACCESS, "Disables CSDM")
            register_concmd("csdm_ctrl", "csdm_ctrl", D_ACCESS, "")
            register_concmd("csdm_reload", "csdm_reload", D_ACCESS, "Reloads CSDM Config")
            register_clcmd("drop", "hook_drop")
           
            register_concmd("csdm_cache", "cacheInfo", ADMIN_MAP, "Shows cache information")
           
           
            new callback = menu_makecallback("hook_item_display")
            menu_additem(g_MainMenu, "DM Be/DM Ki", "csdm_ctrl", D_ACCESS, callback)
            menu_additem(g_MainMenu, "DM config ujratoltese", "csdm_reload", D_ACCESS)
           
            g_drop_fwd = CreateMultiForward("csdm_HandleDrop", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL)
    }
     
    public cacheInfo(id, level, cid)
    {
            if (!cmd_access(id, level, cid, 1))
                    return PLUGIN_HANDLED
                   
            new ar[6]
            csdm_cache(ar)
           
            console_print(id, "[CSDM] Free tasks: respawn=%d, findweapon=%d", ar[0], ar[5])
            console_print(id, "[CSDM] Weapon removal cache: %d total, %d live", ar[4], ar[3])
            console_print(id, "[CSDM] Live tasks: %d (%d free)", ar[2], ar[1])
           
            return PLUGIN_HANDLED
    }
     
    public hook_drop(id)
    {
            if (!csdm_active())
            {
                    return
            }
           
            if (!is_user_connected(id))
            {
                    return
            }
           
            new wp, c, a, name[24]
            if (cs_get_user_shield(id))
            {
                    //entirely different...
                    wp = -1
                    copy(name, 23, "weapon_shield")
            } else {
                    if (read_argc() <= 1)
                    {
                            wp = get_user_weapon(id, c, a)
                    } else {
                            read_argv(1, name, 23)
                            wp = getWepId(name)
                    }
            }
     
            run_drop(id, wp, name)
    }
     
    run_drop(id, wp, const name[])
    {
            new ret
            ExecuteForward(g_drop_fwd, ret, id, wp, 0)
           
            if (ret == CSDM_DROP_REMOVE)
            {
                    new _name[24]
                    if (name[0] == 0)
                    {
                            get_weaponname(wp, _name, 23)
                    }
                    csdm_remove_weapon(id, _name, 0, 1)
                    return 1
            } else if (ret == CSDM_DROP_IGNORE) {
                    return 0
            }
           
            if (g_StayTime > 20 || g_StayTime < 0)
            {
                    return 0
            }
           
            if (wp)
            {
                    remove_weapon(id, wp)
                    return 1
            }
           
            return 0
    }
     
    public csdm_PostDeath(killer, victim, headshot, const weapon[])
    {
            if (g_StayTime > 20 || g_StayTime < 0)
                    return PLUGIN_CONTINUE
     
            new weapons[MAX_WEAPONS], num, name[24]
            new wp, slot, ret
     
            get_user_weapons(victim, weapons, num)
     
            for (new i=0; i<num; i++)
            {
                    wp = weapons[i]
                    slot = g_WeaponSlots[wp]
     
                    ExecuteForward(g_drop_fwd, ret, victim, wp, 1)
     
                    if (ret == CSDM_DROP_REMOVE)
                    {
                            get_weaponname(wp, name, 23)
                            csdm_remove_weapon(victim, name, 0, 1)
                    } else if (ret == CSDM_DROP_IGNORE) {
                            continue
                    } else {
                            if (slot == SLOT_PRIMARY || slot == SLOT_SECONDARY || slot == SLOT_C4)
                            {
                                    remove_weapon(victim, wp)
                            }
                    }
            }
           
            if (cs_get_user_shield(victim))
            {
                    ExecuteForward(g_drop_fwd, ret, victim, -1, 1)
                    if (ret == CSDM_DROP_REMOVE)
                    {
                            csdm_remove_weapon(victim, "weapon_shield", 0, 1)
                    } else if (ret == CSDM_DROP_IGNORE) {
                            /* do nothing */
                    } else {
                            remove_weapon(victim, -1)
                    }
            }
           
            return PLUGIN_CONTINUE
    }
     
    public csdm_PreSpawn(player, bool:fake)
    {
            //we'll just have to back out for now
            if (cs_get_user_shield(player))
            {
                    return
            }
            new team = get_user_team(player)
            if (g_StripWeapons)
            {
                    if (team == _TEAM_T)
                    {
                            if (cs_get_user_shield(player))
                            {
                                    drop_with_shield(player, CSW_GLOCK18)
                            } else {
                                    csdm_force_drop(player, "weapon_glock18")
                            }
                    } else if (team == _TEAM_CT) {
                            if (cs_get_user_shield(player))
                            {
                                    drop_with_shield(player, CSW_USP)
                            } else {
                                    csdm_force_drop(player, "weapon_usp")
                            }
                    }
            }
            if (team == _TEAM_T)
            {
                    if (g_RemoveBomb)
                    {
                            new weapons[MAX_WEAPONS], num
                            get_user_weapons(player, weapons, num)
                            for (new i=0; i<num; i++)
                            {
                                    if (weapons[i] == CSW_C4)
                                    {
                                            if (cs_get_user_shield(player))
                                            {
                                                    drop_with_shield(player, CSW_C4)
                                            } else {
                                                    csdm_force_drop(player, "weapon_c4")
                                            }
                                            break
                                    }
                            }
                    }
            }
    }
     
    remove_weapon(id, wp)
    {
            new name[24]
           
            if (wp == -1)
            {
                    copy(name, 23, "weapon_shield")
            } else {
                    get_weaponname(wp, name, 23)
            }
     
            if ((wp == CSW_C4) && g_RemoveBomb)
            {      
                    csdm_remove_weapon(id, name, 0, 1)
            } else {
                    if (wp != CSW_C4)
                    {
                            csdm_remove_weapon(id, name, g_StayTime, 1)
                    }
            }
    }
     
    public hook_item_display(player, menu, item)
    {
            new paccess, command[24], call
           
            menu_item_getinfo(menu, item, paccess, command, 23, _, 0, call)
           
            if (equali(command, "csdm_ctrl"))
            {
                    if (!csdm_active())
                    {
                            menu_item_setname(menu, item, "DM Be")
                    } else {
                            menu_item_setname(menu, item, "DM Ki")
                    }
            }
    }
     
    public read_cfg(readAction, line[], section[])
    {
            if (readAction == CFG_READ)
            {
                    new setting[24], sign[3], value[32];
     
                    parse(line, setting, 23, sign, 2, value, 31);
                   
                    if (equali(setting, "strip_weapons"))
                    {
                            g_StripWeapons = str_to_num(value) ? true : false
                    } else if (equali(setting, "weapons_stay")) {
                            g_StayTime = str_to_num(value)
                    } else if (equali(setting, "spawnmode")) {
                            new var = csdm_setstyle(value)
                            if (var)
                            {
                                    log_amx("CSDM spawn mode set to %s", value)
                            } else {
                                    log_amx("CSDM spawn mode %s not found", value)
                            }
                    } else if (equali(setting, "remove_bomb")) {
                            g_RemoveBomb = str_to_num(value) ? true : false
                    } else if (equali(setting, "enabled")) {
                            csdm_set_active(str_to_num(value))
                    } else if (equali(setting, "spawn_wait_time")) {
                            csdm_set_spawnwait(str_to_float(value))
                    }
            }
    }
     
    public csdm_reload(id, level, cid)
    {
            if (!cmd_access(id, level, cid, 1))
                    return PLUGIN_HANDLED
                   
            new file[33] = ""
            if (read_argc() >= 2)
            {
                    read_argv(1, file, 32)
            }
                   
            if (csdm_reload_cfg(file))
            {
                    client_print(id, print_chat, "[CSDM] Deathmatch config ujratoltve.")
            } else {
                    client_print(id, print_chat, "[CSDM] Unable to find config file.")
            }
                   
            return PLUGIN_HANDLED
    }
     
    public csdm_menu(id, level, cid)
    {
            if (!cmd_access(id, level, cid, 1))
                    return PLUGIN_HANDLED
           
            menu_display(id, g_MainMenu, 0)
           
            return PLUGIN_HANDLED
    }
     
    public csdm_ctrl(id, level, cid)
    {
            if (!cmd_access(id, level, cid, 1))
                    return PLUGIN_HANDLED
           
            csdm_set_active( csdm_active() ? 0 : 1 )
            client_print(id, print_chat, "CSDM Deathmatch mod magyarositotta,Expert_IMI")
           
            return PLUGIN_HANDLED
    }
     
    public use_csdm_menu(id, menu, item)
    {
            if (item < 0)
                    return PLUGIN_CONTINUE
           
            new command[24], paccess, call
            if (!menu_item_getinfo(g_MainMenu, item, paccess, command, 23, _, 0, call))
            {
                    log_amx("Error: csdm_menu_item() failed (menu %d) (page %d) (item %d)", g_MainMenu, 0, item)
                    return PLUGIN_HANDLED
            }
            if (paccess && !(get_user_flags(id) & paccess))
            {
                    client_print(id, print_chat, "You do not have access to this menu option.")
                    return PLUGIN_HANDLED
            }
           
            client_cmd(id, command)
           
            return PLUGIN_HANDLED
    }
     
    public csdm_enable(id, level, cid)
    {
            if (!cmd_access(id, level, cid, 1))
                    return PLUGIN_HANDLED
     
            csdm_set_active(1)
            client_print(id, print_chat, "CSDM Deathmatch mod bekapcsolva.")
           
            return PLUGIN_HANDLED  
    }
     
    public csdm_disable(id, level, cid)
    {
            if (!cmd_access(id, level, cid, 1))
                    return PLUGIN_HANDLED
     
            csdm_set_active(0)
            client_print(id, print_chat, "CSDM Deathmach mod kikapcsolva.")
           
            return PLUGIN_HANDLED  
    }
     
    public say_respawn(id)
    {
            if (g_options[CSDM_OPTION_SAYRESPAWN] == CSDM_SET_DISABLED)
            {
                    client_print(id, print_chat, "[CSDM] Parancs letiltva")
                    return PLUGIN_HANDLED
            }
           
            if (!is_user_alive(id) && csdm_active())
            {
                    new team = get_user_team(id)
                    if (team == _TEAM_T || team == _TEAM_CT)
                    {
                            csdm_respawn(id)
                    }
            }
           
            return PLUGIN_CONTINUE
    }