PHP- Kodu:
  /* (c) Copyright 2009 by Rube
*
*    --------------------------------------
*    ---- Jailbreak Last Request ----------
*    --------------------------------------
*    ---------- Author: rube --------------
*    --------------------------------------
*        About the plugin:
*    This plugin allows the last terrorist access a menu to challenge a duel 
*    (typing / lr or !Lr ) the counter-terrorist that he want.
*    --------------------------------------
*        Credits:
*    - Emp` (New AMXX Menu System)
*    - MouseSplash! (Ideas and test)
*    - cikjam (how to optimize my submenu all in one)
*    - Ganz (test)
*    --------------------------------------
*    -v1.6: Optimized duel's menu ( all in one) and set glow with fun
*    -v1.5: Added teleport for every single duel (only map some1s_jailbreak)
*    -v1.4: Added ML.
*    -V1.3: Block the menu until the TE kills the CT that he challenge.
*    -v1.2: Add shot for shot on deagle duel.
*    -V1.1: Unable touch weapons during the duel.
*     -V1.0: First release.
*/
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
#include <fun>
#define PLUGIN "Jailbreak Last Request"
#define VERSION "1.6"
#define AUTHOR "rube"
/*================================================================================
    Variables | bools | Cvars        
=================================================================================*/
new g_maxPlayers, g_msgSayText, beacon_sprite
new cvar_granadas_bpammo, cvar_scout_bpammo, cvar_effect
new bool:touch_weapons[33], bool:once[33], bool:player_challenged[33], bool:duel_active,
bool:knife_duel[33] ,bool:deagle_duel[33], bool:grenade_duel[33], bool:scout_duel[33]
new tag[] = "[JailBreak]"
/*================================================================================
    Init n' precache        
=================================================================================*/
public plugin_precache() 
{    
    beacon_sprite = precache_model("sprites/shockwave.spr")
}
public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
    
    RegisterHam(Ham_Touch, "weaponbox", "fw_touch_weapon")
    RegisterHam(Ham_Touch, "armoury_entity", "fw_touch_weapon")
    RegisterHam(Ham_Touch, "weapon_shield", "fw_touch_weapon")
    RegisterHam(Ham_Spawn, "player", "fw_player_respawn", 1)
    RegisterHam(Ham_Killed, "player", "fw_player_killed")    
        
    register_forward(FM_CmdStart,"fw_cmdstart",1)
    
    // Comando de jugador - Client commands
    register_clcmd("say /lr", "duel_menu")
    register_clcmd("say !lr", "duel_menu")
    register_clcmd("say_team /lr", "duel_menu")
    register_clcmd("say_team !lr", "duel_menu")
    
    // Cvars
    cvar_granadas_bpammo = register_cvar("jb_grenade_bpammo","10") // amount bpammo grenade | cantidad de granadas
    cvar_scout_bpammo = register_cvar("jb_scout_bpammo", "10") // amount bpammo scout | cantidad de balas pa' la scout
    cvar_effect = register_cvar("jb_effect", "2") // 0 = glow , 1 = beacon, 2 = glow n' beacon
    
    g_maxPlayers = get_maxplayers()
    
    g_msgSayText = get_user_msgid("SayText")
    
    register_dictionary("jailbreak_last_request.txt")
}
/*================================================================================
    Round Start                
=================================================================================*/
public event_round_start()
{
    duel_active = false
}
        
/*================================================================================
    forwards                
=================================================================================*/
public fw_player_respawn(id)
{
    if(!is_user_alive(id) || !cs_get_user_team(id))
        return
      
    set_user_rendering(id)
    remove_task(id)
    touch_weapons[id] = false 
    once[id] = false 
    knife_duel[id] = false
    deagle_duel[id] = false
    grenade_duel[id] = false
    scout_duel[id] = false    
    player_challenged[id] = false
}
public fw_touch_weapon(weapon, id)
{
    if (!is_user_connected(id))
        return HAM_IGNORED;
    
    new players[32], pnum, tempid;
    get_players(players, pnum, "a");
    for( new i; i<pnum; i++ )
    {        
        tempid = players[i];
    }
    
    if (touch_weapons[id] || touch_weapons[tempid])
        return HAM_SUPERCEDE;
    
    return HAM_IGNORED;
}
public fw_cmdstart(player,uc_handle,random_seed)
{
    if(deagle_duel[player])
    {
        cs_set_user_bpammo(player, CSW_DEAGLE, 1)
    }
}
public fw_player_killed(victim, attacker, shouldgib)
{
    new name[32]
    get_user_name(attacker, name, 31)
            
    if(duel_active)
    {
        if(cs_get_user_team(victim) == CS_TEAM_CT && player_challenged[victim])
        {
            knife_duel[attacker] = false
            deagle_duel[attacker] = false
            grenade_duel[attacker] = false
            scout_duel[attacker] = false
            once[attacker] = false
            strip_user_weapons(attacker)
            give_item(attacker, "weapon_knife")
            set_user_rendering(attacker)
            duel_menu(attacker)
        }
        else if(cs_get_user_team(victim) == CS_TEAM_CT && !player_challenged[victim])
        {
            set_task(0.4, "kill_player", attacker)
            set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
            show_hudmessage(0, "%L", LANG_PLAYER,"DUEL_DOWN", name)
                
        }
    }
    remove_task(attacker)
    remove_task(victim)
}
public kill_player(id)
{
    user_kill(id)
}
/*================================================================================
    Main Menu                
=================================================================================*/
public duel_menu(id)
{    
    if(!is_user_alive(id))
        return PLUGIN_HANDLED
    
    if (!once[id])
    {
        if(cs_get_user_team(id) == CS_TEAM_T)
        {
            new cts[32], ts[32], ctsnum, tsnum 
    
            for (new id=1; id <= g_maxPlayers; id++)
            {
                if (!is_user_connected(id) || !is_user_alive(id)) 
                { 
                    continue 
                } 
    
                if (cs_get_user_team(id) == CS_TEAM_T) 
                { 
                    ts[tsnum++] = id
                } 
                else if (cs_get_user_team(id) == CS_TEAM_CT) 
                { 
                    cts[ctsnum++] = id
                } 
            } 
            if (tsnum == 1 && ctsnum >= 1) 
            {  
            
                static opcion[64]
    
                formatex(opcion, charsmax(opcion),"\y%L:", id, "CHOOSE_DUEL")
                new iMenu = menu_create(opcion, "sub_duel_menu")
    
                formatex(opcion, charsmax(opcion),"\w%L", id, "DUEL_1")
                menu_additem(iMenu, opcion, "1")    
    
                formatex(opcion, charsmax(opcion),"\w%L", id, "DUEL_2")
                menu_additem(iMenu, opcion, "2")
            
                formatex(opcion, charsmax(opcion),"\w%L", id, "DUEL_3")
                menu_additem(iMenu, opcion, "3")    
    
                formatex(opcion, charsmax(opcion),"\w%L", id, "DUEL_4")
                menu_additem(iMenu, opcion, "4")
            
                menu_setprop(iMenu, MPROP_EXIT, MEXIT_ALL)
                menu_display(id, iMenu, 0)
                        
            }
            else if    (tsnum == 1 && ctsnum < 1)
            {
                ChatColor(id, "%L", LANG_PLAYER,"NOT_CTS", tag) 
            }
            else if    (tsnum > 1)
            {
                ChatColor(id, "%L", LANG_PLAYER,"ONLY_LAST", tag)
            }
        }
        else
        {
            ChatColor(id, "%L", LANG_PLAYER,"ONLY_TTS", tag) 
        }
    }
    else
    {
        ChatColor(id, "%L", LANG_PLAYER,"KILL_CHALLENGED", tag) 
    }
    return PLUGIN_HANDLED
}
public sub_duel_menu(id, menu, item)
{
    
    if (item == MENU_EXIT)
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    }
    
    new Data[6], Name[64]
    new Access, Callback
    
    menu_item_getinfo(menu, item, Access, Data,5, Name, 63, Callback)
    
    new Key = str_to_num(Data)
    
    switch (Key)
    {
        case 1:
        {    
            knife_duel[id] = true
            choose_enemy(id)
        }
        case 2: 
        {
            deagle_duel[id] = true
            choose_enemy(id)
        }
        case 3: 
        {
            grenade_duel[id] = true
            choose_enemy(id)
        }
        case 4: 
        {
            scout_duel[id] = true
            choose_enemy(id)
        }
    }
    
    menu_destroy(menu)    
    return PLUGIN_HANDLED
}
/*================================================================================
    Menu of challenges                
=================================================================================*/
public choose_enemy(id)
{
    static opcion[64]
    
    formatex(opcion, charsmax(opcion),"\y%L:", id, "CHOOSE_ENEMY")
    new iMenu = menu_create(opcion, "sub_choose_enemy")
    
    new players[32], pnum, tempid
    new szName[32], szTempid[10]
    
    get_players(players, pnum, "a")
    
    for( new i; i<pnum; i++ )
    {
        tempid = players[i]
        
        if (cs_get_user_team(tempid) != CS_TEAM_CT)
        {
            continue
        }
        
        get_user_name(tempid, szName, 31)
        num_to_str(tempid, szTempid, 9)
        menu_additem(iMenu, szName, szTempid, 0)
    }
    
    menu_display(id, iMenu)
    return PLUGIN_HANDLED
}
public sub_choose_enemy(id, menu, item)
{
    if( item == MENU_EXIT )
    {
        menu_destroy(menu)
        return PLUGIN_HANDLED
    }
    
    new Data[6], Name[64]
    new Access, Callback
    menu_item_getinfo(menu, item, Access, Data,5, Name, 63, Callback)
    
    new tempid = str_to_num(Data)
    
    new mapname[32], challenger[32], challenged[32], ct_origin[3], te_origin[3]
    get_mapname(mapname,31)
    get_user_name(id, challenger, 31)
    get_user_name(tempid, challenged, 31)
    
    // strip weapons
    strip_user_weapons(id)
    strip_user_weapons(tempid)
    
    // health
    set_user_health(id, 100)
    set_user_health(tempid, 100)
    
    // effects
    switch (get_pcvar_num(cvar_effect))
    {
        case 0: // glow
        {
            set_user_rendering(id, kRenderFxGlowShell, 250, 0, 0, kRenderNormal, 20)    
            set_user_rendering(tempid, kRenderFxGlowShell, 0, 0, 250, kRenderNormal, 20)
        }
        case 1: // beacon
        {
            set_task(1.0, "beacon", id)
            set_task(1.0, "beacon", tempid)
        }
        case 2: // glow n' beacon
        {
            set_user_rendering(id, kRenderFxGlowShell, 250, 0, 0, kRenderNormal, 20)    
            set_task(1.0, "beacon", id)
            set_user_rendering(tempid, kRenderFxGlowShell, 0, 0, 250, kRenderNormal, 20)
            set_task(1.0, "beacon", tempid)
        }
    }
    
    // player challenged
    player_challenged[tempid] = true
    
    // lr menu once until he kills the player challenged
    once[id] = true 
    
    // unable pick up weapon (only the 2 players on duel)
    touch_weapons[id] = true
    touch_weapons[tempid] = true
            
    if(knife_duel[id])
    {
        give_item(id, "weapon_knife")
        give_item(tempid, "weapon_knife")
                
        if(equali(mapname,"some1s_jailbreak"))
        {
            ct_origin[0] = -759, ct_origin[1] = 1047, ct_origin[2] = 100
            te_origin[0] = -585, te_origin[1] = 867, te_origin[2] = 100
            set_user_origin(id,te_origin)
            set_user_origin(tempid,ct_origin)
        }
        
        set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
        show_hudmessage(0, "%L",LANG_PLAYER,"KNIFE_DUEL", challenger, challenged)
        
    }
    else if(deagle_duel[id])
    {
        deagle_duel[tempid] = true
        
        cs_set_weapon_ammo(give_item(id, "weapon_deagle"), 1)
        cs_set_weapon_ammo(give_item(tempid, "weapon_deagle"), 1)
        
        if(equali(mapname,"some1s_jailbreak"))
        {
            ct_origin[0] = -1352, ct_origin[1] = 271, ct_origin[2] = 38
            te_origin[0] = -1338, te_origin[1] = -782, te_origin[2] = 38
            set_user_origin(id,te_origin)
            set_user_origin(tempid,ct_origin)
        }
        
        set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
        show_hudmessage(0, "%L", LANG_PLAYER,"DEAGLE_DUEL", challenger, challenged)
    }
    else if(grenade_duel[id])
    {
        give_item(id, "weapon_hegrenade")
        give_item(tempid, "weapon_hegrenade")
        cs_set_user_bpammo(id, CSW_HEGRENADE,get_pcvar_num(cvar_granadas_bpammo))        
        cs_set_user_bpammo(tempid, CSW_HEGRENADE,get_pcvar_num(cvar_granadas_bpammo))
        
        if(equali(mapname,"some1s_jailbreak"))
        {
            ct_origin[0] = -1756, ct_origin[1] = -2526, ct_origin[2] = 36
            te_origin[0] = -3020, te_origin[1] = -2529, te_origin[2] = 36
            set_user_origin(id,te_origin)
            set_user_origin(tempid,ct_origin)
        }
        
        set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
        show_hudmessage(0, "%L", LANG_PLAYER,"GRENADE_DUEL", challenger, challenged)
    }
    else if(scout_duel[id])
    {
        give_item(id, "weapon_scout")
        give_item(tempid, "weapon_scout")
        cs_set_user_bpammo(id, CSW_SCOUT, get_pcvar_num(cvar_scout_bpammo))
        cs_set_user_bpammo(tempid, CSW_SCOUT, get_pcvar_num(cvar_scout_bpammo))
        
        if(equali(mapname,"some1s_jailbreak"))
        {
            ct_origin[0] = -2898, ct_origin[1] = -2040, ct_origin[2] = 37
            te_origin[0] = -2908, te_origin[1] = 905, te_origin[2] = 37
            set_user_origin(id,te_origin)
            set_user_origin(tempid,ct_origin)
        }
        
        set_hudmessage( 0, 255, 0, -1.0, 0.40, 2, 5.0, 8.0, 0.0, 0.0, 10)
        show_hudmessage(0, "%L", LANG_PLAYER,"SCOUT_DUEL", challenger, challenged)
    }
    
    duel_active = true
    
    menu_destroy(menu)
    return PLUGIN_HANDLED
}
public beacon(id)
{
    if(cs_get_user_team(id) == CS_TEAM_CT)
    {
        static origin[3]
        get_user_origin(id, origin)
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_BEAMCYLINDER)    // TE id
        write_coord(origin[0])         // x
        write_coord(origin[1])        // y
        write_coord(origin[2]-20)    // z
        write_coord(origin[0])        // x axis
        write_coord(origin[1])        // y axis
        write_coord(origin[2]+200)    // z axis
        write_short(beacon_sprite)    // sprite
        write_byte(0)            // startframe   
        write_byte(1)            // framerate   
        write_byte(6)            // life
        write_byte(2)              // width
        write_byte(1)               // noise    
        write_byte(0)              // red  
        write_byte(0)               // green 
        write_byte(250)         // blue
        write_byte(200)            // brightness
        write_byte(0)            // speed
        message_end()
    }
    else
    {
        static origin[3]
        get_user_origin(id, origin)
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(TE_BEAMCYLINDER)    // TE id
        write_coord(origin[0])         // x
        write_coord(origin[1])        // y
        write_coord(origin[2]-20)    // z
        write_coord(origin[0])        // x axis
        write_coord(origin[1])        // y axis
        write_coord(origin[2]+200)    // z axis
        write_short(beacon_sprite)    // sprite
        write_byte(0)            // startframe   
        write_byte(1)            // framerate   
        write_byte(6)            // life
        write_byte(2)              // width
        write_byte(1)               // noise    
        write_byte(250)            // red  
        write_byte(0)               // green 
        write_byte(0)             // blue
        write_byte(200)            // brightness
        write_byte(0)            // speed
        message_end()
    }
    set_task(1.0, "beacon", id)
        
}
/*================================================================================
    Stocks                    
=================================================================================*/
stock ChatColor(const id, const input[], any:...)
{
    new count = 1, players[32]
    static msg[191]
    vformat(msg, 190, input, 3)
    
    replace_all(msg, 190, "!g", "^4") // Green Color
    replace_all(msg, 190, "!y", "^1") // Default Color
    replace_all(msg, 190, "!team", "^3") // Team Color
    
    if (id) players[0] = id
    else get_players(players, count, "ch")
    for (new i = 0; i < count; i++)
    {
        if (is_user_connected(players[i]))
        {
            message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, players[i])
            write_byte(players[i])
            write_string(msg)
            message_end()
        }
    }
}