/*
[DeathRun] Duel (CT Choose ONLY)
Plugin by Shidla [SGC]
Idea & Pay (xD):
DarkNill | ICQ: 555-995-004 (zombie-mod.ru)
Credits:
xPaw
DJ_WEST
Shidla [SGC] | 2010 | ICQ: 312-298-513
1.3 [Final Version] | 23/11/2010
http://Shidla.Gm-Project.NET/
*/
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
#define OFFSET_RELOAD 54
#define LINUX_DIFF 4
#define fm_create_entity(%1) engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, %1))
/*========================================================================================================
===========================================[ Customizations ]=============================================
========================================================================================================*/
new const BOT_NAME[] = "DRM Fake Player" // InGame Bot Name (in DeathrunManager!)
new const g_ChatPrefix[] = "[DynamicSpace]"
new const CT_Aura[] = { 0, 0, 250 }
new const T_Aura[] = { 250, 0, 0 }
new const s_StartDuel[][] = { "vox/bizwarn.wav" } // Duel starting sounds
/*========================================================================================================
=========================================[ Customizations End ]===========================================
========================================================================================================*/
new SayText, g_Maxplayers, g_Num_CT, g_MsgCurWeapon, g_DuelStarted, g_Weapon[33], g_WeaponClip[33],
g_OneShot, g_ScoutBPAmmo, g_DeagleBPAmmo, g_AWPBPAmmo, g_Round_Ended, g_New_Round, RingSprite,
CT_Player, T_Player, g_PlayerHP, g_DuelTimeOut, g_MsgSync, CountDown_Timer, g_ButtonsDisable
new const TASK_CONT = 1352 // CountDown task
public plugin_init()
{
register_plugin("DeathRun Duel (CT Choose ONLY)", "1.3", "Shidla")
register_cvar("Shidla", "DeathRun Duel 1.3 (CT Choose ONLY)", FCVAR_SERVER|FCVAR_SPONLY)
register_clcmd("say /duel", "StartDuel")
register_clcmd("say_team /duel", "StartDuel")
register_clcmd("drop", "Drop_Cmd")
g_ScoutBPAmmo = register_cvar("dr_duel_scout_bpammo", "100")
g_DeagleBPAmmo = register_cvar("dr_duel_deagle_bpammo", "50")
g_AWPBPAmmo = register_cvar("dr_duel_awp_bpammo", "100")
g_PlayerHP = register_cvar("dr_duel_player_hp", "100")
g_DuelTimeOut = register_cvar("dr_duel_timeout", "5")
g_OneShot = register_cvar("dr_duel_one_shot", "1") // 1 - one clip bullet (ONLY!); 0 - disable
g_ButtonsDisable = register_cvar("dr_duel_buttons_disable", "1")
register_event("DeathMsg", "Event_Death", "a")
register_event("HLTV", "Event_Round_Start", "a", "1=0", "2=0" )
register_event("SendAudio", "Event_Round_End", "a", "2&%!MRAD_terwin")
register_event("SendAudio", "Event_Round_End", "a", "2&%!MRAD_ctwin")
register_event("SendAudio", "Event_Round_End", "a", "2&%!MRAD_rounddraw")
register_event("CurWeapon","Event_CurWeapon","b")
register_forward(FM_CmdStart, "fw_CmdStart",1)
RegisterHam(Ham_Touch, "weaponbox", "fw_TouchWeapon")
RegisterHam(Ham_Touch, "weapon_shield", "fw_TouchWeapon")
RegisterHam(Ham_Touch, "armoury_entity", "fw_TouchWeapon")
RegisterHam(Ham_Weapon_Reload, "weapon_scout", "fw_Reload_Post", 1)
RegisterHam(Ham_Weapon_Reload, "weapon_deagle", "fw_Reload_Post", 1)
RegisterHam(Ham_Weapon_Reload, "weapon_awp", "fw_Reload_Post", 1)
RegisterHam(Ham_Use, "func_button", "fw_Use")
SayText = get_user_msgid("SayText")
g_MsgCurWeapon = get_user_msgid("CurWeapon")
g_MsgSync = CreateHudSyncObj()
g_Maxplayers = get_maxplayers()
register_dictionary( "dr_duel.txt" )
}
public plugin_precache()
{
RingSprite = precache_model("sprites/zbeam5.spr")
static i
for(i = 0; i < sizeof s_StartDuel; i++)
precache_sound(s_StartDuel)
}
public client_putinserver(id)
{
g_Weapon[id] = 0
g_WeaponClip[id] = 0
}
public StartDuel(id)
{
if(!is_user_alive(id))
{
new t_Cant_Dead[600 char]
formatex(t_Cant_Dead, charsmax(t_Cant_Dead), "%L", id, "DR_CANT_DEAD")
print_col_chat(id, "^4%s^1 %s",g_ChatPrefix, t_Cant_Dead)
return PLUGIN_CONTINUE
}
if(g_Round_Ended)
{
new t_Cant_Round_End[600 char]
formatex(t_Cant_Round_End, charsmax(t_Cant_Round_End), "%L", id, "DR_CANT_ROUND_END")
print_col_chat(id, "^4%s^1 %s",g_ChatPrefix, t_Cant_Round_End)
return PLUGIN_CONTINUE
}
if(cs_get_user_team(id) == CS_TEAM_T)
{
new t_Cant_Ter[600 char]
formatex(t_Cant_Ter, charsmax(t_Cant_Ter), "%L", id, "DR_CANT_TER")
print_col_chat(id, "^4%s^1 %s",g_ChatPrefix, t_Cant_Ter)
return PLUGIN_CONTINUE
}
if(g_DuelStarted)
{
new t_Cant_Started[600 char]
formatex(t_Cant_Started, charsmax(t_Cant_Started), "%L", id, "DR_CANT_STARTED")
print_col_chat(id, "^4%s^1 %s",g_ChatPrefix, t_Cant_Started)
return PLUGIN_CONTINUE
}
for(new i = 1; i <= g_Maxplayers; i++)
{
new Name[32]
get_user_name(i, Name, 31)
if(is_user_alive(i) && cs_get_user_team(i) == CS_TEAM_CT)
{
g_Num_CT++
if(g_Num_CT == 1)
CT_Player = i
else
CT_Player = 0
}
if(is_user_alive(i) && (cs_get_user_team(i) == CS_TEAM_T) && !equal(Name, BOT_NAME))
T_Player = i
}
if(g_Num_CT == 1)
{
new TextTitle[ 200 char ]
formatex(TextTitle, charsmax(TextTitle), "\rAlegeti arma pentru Duel:")
new WeapScout[ 200 char ]
formatex(WeapScout, charsmax(WeapScout), "\ySeringa")
new WeapDeagle[ 200 char ]
formatex(WeapDeagle, charsmax(WeapDeagle), "\yDeagle")
new WeapAWP[ 200 char ]
formatex(WeapAWP, charsmax(WeapAWP), "\yAwp")
new WeapKNife[ 200 char ]
formatex(WeapKNife, charsmax(WeapKNife), "\yCutit")
new i_Menu = menu_create(TextTitle, "WeaponMenu")
menu_additem(i_Menu, WeapScout, "1", 0)
menu_additem(i_Menu, WeapDeagle, "2", 0)
menu_additem(i_Menu, WeapAWP, "3", 0)
menu_additem(i_Menu, WeapKNife, "4", 0)
g_DuelStarted = true
g_New_Round = false
fm_strip_user_weapons(CT_Player)
fm_strip_user_weapons(T_Player)
set_pev(CT_Player, pev_health, float(get_pcvar_num(g_PlayerHP))) // Set CT HP
set_pev(T_Player, pev_health, float(get_pcvar_num(g_PlayerHP))) // Set T HP
if(is_user_alive(CT_Player) && is_user_connected(CT_Player))
{
fm_set_user_godmode(CT_Player, 1)
set_task(0.5, "Show_Ring", CT_Player)
}
if(is_user_alive(T_Player) && is_user_connected(T_Player))
{
fm_set_user_godmode(T_Player, 1)
set_task(0.5, "Show_Ring", T_Player)
}
menu_display(CT_Player, i_Menu, 0)
}
else
{
new t_Cant_Too_Many[600 char]
formatex(t_Cant_Too_Many, charsmax(t_Cant_Too_Many), "%L", id, "DR_CANT_TOO_MANY", g_Num_CT)
print_col_chat(id, "^4%s^1 %s",g_ChatPrefix, t_Cant_Too_Many)
}
g_Num_CT = 0
return PLUGIN_CONTINUE
}
public WeaponMenu(id, menu, item)
{
new s_Data[4], s_Name[64], i_Access, i_Callback
menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
new i_Key = str_to_num(s_Data)
switch(i_Key)
{
case 1:
{
Give_Scout(CT_Player)
Give_Scout(T_Player)
}
case 2:
{
Give_Deagle(CT_Player)
Give_Deagle(T_Player)
}
case 3:
{
Give_AWP(CT_Player)
Give_AWP(T_Player)
}
case 4:
{
fm_give_item(CT_Player, "weapon_knife")
fm_give_item(T_Player, "weapon_knife")
}
}
menu_destroy(menu)
if(is_user_alive(CT_Player) && is_user_connected(CT_Player))
fm_set_rendering(CT_Player, kRenderFxGlowShell, CT_Aura[0], CT_Aura[1], CT_Aura[2], kRenderNormal, 20)
if(is_user_alive(T_Player) && is_user_connected(T_Player))
fm_set_rendering(T_Player, kRenderFxGlowShell, T_Aura[0], T_Aura[1], T_Aura[2], kRenderNormal, 20)
CountDown_Timer = get_pcvar_num(g_DuelTimeOut)
set_task(float(get_pcvar_num(g_DuelTimeOut)), "Duel_Informer", TASK_CONT)
return PLUGIN_HANDLED
}
public Event_Death()
{
new CT_Count, CT_Last_Player
for(new i = 1; i <= g_Maxplayers; i++)
{
new Name[32]
get_user_name(i, Name, 31)
if(is_user_alive(i) && cs_get_user_team(i) == CS_TEAM_CT)
{
CT_Count++
if(CT_Count == 1)
CT_Last_Player = i
else
CT_Last_Player = 0
}
}
if(CT_Count == 1 && !g_Round_Ended && is_user_alive(CT_Last_Player) && is_user_connected(CT_Last_Player) && is_user_alive(T_Player))
{
new t_Can_Start[600 char]
formatex(t_Can_Start, charsmax(t_Can_Start), "%L", CT_Last_Player, "DR_CAN_START")
print_col_chat(CT_Last_Player, "^4%s^1 %s",g_ChatPrefix, t_Can_Start)
}
CT_Count = 0
}
public Event_Round_Start()
{
g_DuelStarted = false
g_Round_Ended = false
g_New_Round = true
g_Num_CT = 0
CT_Player = 0
T_Player = 0
remove_task(TASK_CONT)
for(new id = 1; id <= g_Maxplayers; id++)
fm_set_rendering(id)
}
public Event_Round_End()
{
g_Round_Ended = true
CT_Player = 0
T_Player = 0
}
public Event_CurWeapon(id)
{
g_Weapon[id] = read_data(2)
g_WeaponClip[id] = read_data(3)
if(g_DuelStarted)
{
if(g_WeaponClip[id] > 1)
{
if(g_Weapon[id] == CSW_SCOUT)
Weapon_ReChek(id, CSW_SCOUT)
else if(g_Weapon[id] == CSW_DEAGLE)
Weapon_ReChek(id, CSW_DEAGLE)
else if(g_Weapon[id] == CSW_AWP)
Weapon_ReChek(id, CSW_AWP)
}
}
}
public fw_CmdStart(id, handle, seed)
{
if(!is_user_alive(id) || !g_DuelStarted)
return FMRES_IGNORED
if((g_Weapon[id] == CSW_SCOUT || g_Weapon[id] == CSW_DEAGLE || g_Weapon[id] == CSW_AWP) && get_pcvar_num(g_OneShot))
{
//if(pev(id, pev_button) & IN_RELOAD)
if(get_uc(handle, UC_Buttons) & IN_RELOAD)
{
set_uc(handle, UC_Buttons, get_uc(handle, UC_Buttons) & ~IN_RELOAD)
return FMRES_HANDLED
}
}
return FMRES_IGNORED
}
public Drop_Cmd(id)
{
if(g_DuelStarted)
{
new t_Cant_Drop[600 char]
formatex(t_Cant_Drop, charsmax(t_Cant_Drop), "%L", id, "DR_CANT_DROP")
print_col_chat(id, "^4%s^1 %s",g_ChatPrefix, t_Cant_Drop)
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public fw_TouchWeapon(weapon, id)
{
if(!is_user_connected(id))
return HAM_IGNORED
if(g_DuelStarted)
return HAM_SUPERCEDE
return HAM_IGNORED
}
public fw_Reload_Post(Weap)
{
if(!g_DuelStarted && !get_pcvar_num(g_OneShot))
return FMRES_IGNORED
if(is_user_alive(CT_Player) && get_pdata_int(Weap, OFFSET_RELOAD, LINUX_DIFF))
{
if(g_Weapon[CT_Player] == CSW_SCOUT)
cs_set_user_bpammo(CT_Player, CSW_SCOUT, cs_get_user_bpammo(CT_Player, CSW_SCOUT) + 9)
else if(g_Weapon[CT_Player] == CSW_DEAGLE)
cs_set_user_bpammo(CT_Player, CSW_DEAGLE, cs_get_user_bpammo(CT_Player, CSW_DEAGLE) + 6)
else if(g_Weapon[CT_Player] == CSW_AWP)
cs_set_user_bpammo(CT_Player, CSW_AWP, cs_get_user_bpammo(CT_Player, CSW_AWP) + 9)
}
if(is_user_alive(T_Player) && get_pdata_int(Weap, OFFSET_RELOAD, LINUX_DIFF))
{
if(g_Weapon[T_Player] == CSW_SCOUT)
cs_set_user_bpammo(T_Player, CSW_SCOUT, cs_get_user_bpammo(T_Player, CSW_SCOUT) + 9)
else if(g_Weapon[T_Player] == CSW_DEAGLE)
cs_set_user_bpammo(T_Player, CSW_DEAGLE, cs_get_user_bpammo(T_Player, CSW_DEAGLE) + 6)
else if(g_Weapon[T_Player] == CSW_AWP)
cs_set_user_bpammo(T_Player, CSW_AWP, cs_get_user_bpammo(T_Player, CSW_AWP) + 9)
}
return FMRES_IGNORED
}
public fw_Use(ent, idcaller, idactivator, use_type, Float:value)
{
if(g_ButtonsDisable && g_DuelStarted && is_user_alive(idactivator) && cs_get_user_team(idactivator) == CS_TEAM_T)
{
new t_Cant_Drop[600 char]
formatex(t_Cant_Drop, charsmax(t_Cant_Drop), "%L", idactivator, "DR_CANT_USE")
print_col_chat(idactivator, "^4%s^1 %s",g_ChatPrefix, t_Cant_Drop)
return HAM_SUPERCEDE
}
return HAM_IGNORED
}
public Duel_Informer()
{
if(CountDown_Timer > 1)
{
set_hudmessage(255, 0, 0, -1.0, 0.28, 2, 0.02, 1.0, 0.01, 0.1, -1)
if(CountDown_Timer != 1)
{
for(new id = 1; id <= g_Maxplayers; id++)
{
new t_Time_Delay[600 char]
formatex(t_Time_Delay, charsmax(t_Time_Delay), "%L", id, "DR_TIME_DELAY", CountDown_Timer - 1)
ShowSyncHudMsg(id, g_MsgSync, "%s", t_Time_Delay)
}
}
}
--CountDown_Timer
if(CountDown_Timer >= 1)
set_task(1.0, "Duel_Informer", TASK_CONT)
else
{
client_cmd(0, "spk %s", s_StartDuel[random_num(0, sizeof s_StartDuel - 1)])
if(is_user_alive(CT_Player) && is_user_connected(CT_Player))
fm_set_user_godmode(CT_Player, 0)
if(is_user_alive(T_Player) && is_user_connected(T_Player))
fm_set_user_godmode(T_Player, 0)
remove_task(TASK_CONT)
}
}
public Show_Ring(id)
{
if(g_DuelStarted && is_user_alive(id) && is_user_connected(id) && !g_New_Round)
{
static Float:origin[3]
pev(id, pev_origin, origin)
if(id == CT_Player)
Ring(origin, CT_Aura[0], CT_Aura[1], CT_Aura[2])
else if(id == T_Player)
Ring(origin, T_Aura[0], T_Aura[1], T_Aura[2])
set_task(0.5, "Show_Ring", id)
}
else
remove_task(id)
}
/*========================================================================================================
===============================================[ Stocks ]=================================================
========================================================================================================*/
stock fm_give_item(index, const item[])
{
if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10))
return 0
new ent = fm_create_entity(item)
if (!pev_valid(ent))
return 0
new Float:origin[3]
pev(index, pev_origin, origin)
set_pev(ent, pev_origin, origin)
set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN)
dllfunc(DLLFunc_Spawn, ent)
new save = pev(ent, pev_solid)
dllfunc(DLLFunc_Touch, ent, index)
if (pev(ent, pev_solid) != save)
return ent
engfunc(EngFunc_RemoveEntity, ent)
return -1
}
stock fm_strip_user_weapons(index)
{
new ent = fm_create_entity("player_weaponstrip")
if (!pev_valid(ent))
return 0
dllfunc(DLLFunc_Spawn, ent)
dllfunc(DLLFunc_Use, ent, index)
engfunc(EngFunc_RemoveEntity, ent)
return 1
}
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
new Float:RenderColor[3]
RenderColor[0] = float(r)
RenderColor[1] = float(g)
RenderColor[2] = float(b)
set_pev(entity, pev_renderfx, fx)
set_pev(entity, pev_rendercolor, RenderColor)
set_pev(entity, pev_rendermode, render)
set_pev(entity, pev_renderamt, float(amount))
return 1
}
stock get_weapon_ent(id,wpnid=0,wpnName[]="")
{
// who knows what wpnName will be
static newName[32]
// need to find the name
if(wpnid) get_weaponname(wpnid,newName,31)
// go with what we were told
else formatex(newName,31,"%s",wpnName)
// prefix it if we need to
if(!equal(newName,"weapon_",7))
format(newName,31,"weapon_%s",newName)
new ent
while((ent = engfunc(EngFunc_FindEntityByString,ent,"classname",newName)) && pev(ent,pev_owner) != id) {}
return ent
}
stock fm_set_user_godmode(index, godmode = 0)
{
set_pev(index, pev_takedamage, godmode == 1 ? DAMAGE_NO : DAMAGE_AIM)
return 1
}
stock print_col_chat(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 (Yellow)
replace_all(msg, 190, "!t", "^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) )
{
message_begin(MSG_ONE_UNRELIABLE, SayText, _, players)
write_byte(players)
write_string(msg)
message_end()
}
}
}
}
UpDate_HUD(id, csw_weapon)
{
message_begin(MSG_ONE, g_MsgCurWeapon, _, id)
write_byte(1)
write_byte(csw_weapon) //CSW_weapon
write_byte(1) // MaxClip
message_end()
}
Give_Scout(id)
{
if(is_user_alive(id) && is_user_connected(id))
{
fm_give_item(id, "weapon_scout")
new wEnt = get_weapon_ent(id, CSW_SCOUT)
if(pev_valid(wEnt) && get_pcvar_num(g_OneShot))
cs_set_weapon_ammo(wEnt, 1)
cs_set_user_bpammo(id, CSW_SCOUT, get_pcvar_num(g_ScoutBPAmmo))
UpDate_HUD(id, wEnt)
}
}
Give_Deagle(id)
{
if(is_user_alive(id) && is_user_connected(id))
{
fm_give_item(id, "weapon_deagle")
new wEnt = get_weapon_ent(id, CSW_DEAGLE)
if(pev_valid(wEnt) && get_pcvar_num(g_OneShot))
cs_set_weapon_ammo(wEnt, 1)
cs_set_user_bpammo(id, CSW_DEAGLE, get_pcvar_num(g_DeagleBPAmmo))
UpDate_HUD(id, wEnt)
}
}
Give_AWP(id)
{
if(is_user_alive(id) && is_user_connected(id))
{
fm_give_item(id, "weapon_awp")
new wEnt = get_weapon_ent(id, CSW_AWP)
if(pev_valid(wEnt) && get_pcvar_num(g_OneShot))
cs_set_weapon_ammo(wEnt, 1)
cs_set_user_bpammo(id, CSW_AWP, get_pcvar_num(g_AWPBPAmmo))
UpDate_HUD(id, wEnt)
}
}
Weapon_ReChek(id, Weap)
{
if(get_pcvar_num(g_OneShot) && is_user_alive(id) && is_user_connected(id))
{
new wEnt = get_weapon_ent(id, Weap)
if(pev_valid(wEnt))
{
cs_set_weapon_ammo(wEnt, 1)
UpDate_HUD(id, wEnt)
}
}
}
Ring(const Float:origin[3], R, G, B)
{
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, origin, 0)
write_byte(TE_BEAMCYLINDER) // TE id
engfunc(EngFunc_WriteCoord, origin[0]) // x 10
engfunc(EngFunc_WriteCoord, origin[1]) // y
engfunc(EngFunc_WriteCoord, origin[2]) // z
engfunc(EngFunc_WriteCoord, origin[0]-50.0) // x axis
engfunc(EngFunc_WriteCoord, origin[1]) // y axis
engfunc(EngFunc_WriteCoord, origin[2]+100.0) // z axis
write_short(RingSprite) // sprite
write_byte(0) // startframe
write_byte(0) // framerate
write_byte(5) // life
write_byte(5) // width
write_byte(0) // noise
write_byte(R) // red
write_byte(G) // green
write_byte(B) // blue
write_byte(200) // brightness
write_byte(0) // speed
message_end()
}