Kod:
 #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()
      }
   }
}