/*
Fordította: BBk - Death of Legend
*/
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <xs>
new const PLUGIN[] = "Trukkos Terrorista"
new const AUTHOR[] = "joaquim e lucia andrade"
new const VERSION[] = "1.0a"
const FlDefusedTime = 99 // ConnorMcLeod
const FlDefusedTimeOffsetLinux = 5
new Array:Defusers
new Trie:DefusersData
enum SparkSounds
{
Spark1,
Spark2,
Spark3,
Spark4,
Spark5,
Spark6
}
enum TrickedDefuseSounds
{
Menu2,
Menu3,
Cock1
}
enum MiscSounds
{
Geiger
}
new SparkSoundsPath[SparkSounds][] = {"buttons/spark1.wav","buttons/spark2.wav","buttons/spark3.wav","buttons/spark4.wav","buttons/spark5.wav","buttons/spark6.wav"}
new TrickedDefuseSoundsPath[TrickedDefuseSounds][] = {"common/menu2.wav","common/menu3.wav","weapons/357_cock1.wav"}
new MiscSoundsPath[MiscSounds][] = {"player/geiger2.wav"}
enum _:DefuserData
{
PlayersStartTime,
Index,
NotSoDummy
}
new Float:defuserMaxDistance = 100.0
new LastDefuserWatched[33]
new msgBarTimeIndex
new msgBarTime2Index
new cvarDefuserTrickingDuration
new cvarDefuserTrickingReward
new cvarDefuserTrickingMinTime
new cvarDefuserTrickingMaxTime
new const TrickingDurationDefault[] = "5"
new const TrickingRewardDefault[] = "0"
new const TrickingMinTimeDefault[] = "2.0"
new const TrickingMaxDefault[] = "4.0"
new TrickingDuration
new const DefuserClassname[] = "item_thighpack"
new BarTimeHandlerThinker
new const BarTimeHandlerClassname[] = "barTimeHandler"
new Float:BarTimeHandlerThinkDelay = 0.2
new playerDefusing
new FM_ClientDisconnectForward
new HamHook:Ham_UseForward
new bool:PlayersDefuseTricked[33]
new const EV_ENT_tricked = EV_ENT_euser4
new bool:HadDefuse[33]
new bool:DefuseTricked
new maxPlayers
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV", "newRound", "a", "1=0", "2=0")
register_forward(FM_CmdStart,"FMCmdStart");
RegisterHam(Ham_Spawn,DefuserClassname,"defuserSpawn",1)
RegisterHam(Ham_Touch,DefuserClassname,"defuserTouchedPre")
RegisterHam(Ham_Touch,DefuserClassname,"defuserTouchedPost",1)
Ham_UseForward = RegisterHam(Ham_Use,"grenade","grenadeUse",1)
DisableHamForward(Ham_UseForward)
register_event("TextMsg","defuseEnd","a","2=#Bomb_Defused")
register_event("TextMsg","defuseStart","b","2=#Defusing_Bomb_With_Defuse_Kit")
register_event("BarTime","barTime","b","1=0")
register_think(BarTimeHandlerClassname,"barTimeHandlerThink")
msgBarTimeIndex = get_user_msgid("BarTime")
msgBarTime2Index = get_user_msgid("BarTime2")
cvarDefuserTrickingDuration = register_cvar("defuser_trick_duration",TrickingDurationDefault)
cvarDefuserTrickingReward = register_cvar("defuser_trick_reward",TrickingRewardDefault)
cvarDefuserTrickingMinTime = register_cvar("defuser_trick_mintime",TrickingMinTimeDefault)
cvarDefuserTrickingMaxTime = register_cvar("defuser_trick_maxtime",TrickingMaxDefault)
TrickingDuration = clamp( get_pcvar_num(cvarDefuserTrickingDuration) , 1, 10)
maxPlayers = get_maxplayers()
register_cvar("trickyTerrorist_version",VERSION,FCVAR_SERVER|FCVAR_SPONLY);
}
public plugin_cfg()
{
Defusers = ArrayCreate()
DefusersData = TrieCreate()
}
public plugin_precache()
{
for(new SparkSounds:i=SparkSounds:0 ; i<SparkSounds ;i++)
precache_sound(SparkSoundsPath[i])
for(new MiscSounds:i=MiscSounds:0 ; i<MiscSounds ;i++)
precache_sound(MiscSoundsPath[i])
for(new TrickedDefuseSounds:i=TrickedDefuseSounds:0 ; i<TrickedDefuseSounds ;i++)
precache_sound(TrickedDefuseSoundsPath[i])
}
public newRound(id)
{
ArrayClear(Defusers)
TrieClear(DefusersData)
TrickingDuration = clamp( get_pcvar_num(cvarDefuserTrickingDuration) , 1, 10)
}
public grenadeUse(this, idcaller, idactivator, use_type, Float:value)
{
DisableHamForward(Ham_UseForward)
new Float:minTime = get_pcvar_float(cvarDefuserTrickingMinTime)
new Float:maxTime = get_pcvar_float(cvarDefuserTrickingMaxTime)
minTime = minTime < 0.0 ? 0.0 : minTime > 10.0 ? 10.0 : minTime
maxTime = maxTime < minTime ? minTime : maxTime > 10.0 ? 10.0 : maxTime
set_pcvar_float(cvarDefuserTrickingMinTime,minTime)
set_pcvar_float(cvarDefuserTrickingMaxTime,maxTime)
set_pdata_float(this,FlDefusedTime,get_pdata_float(this,FlDefusedTime,FlDefusedTimeOffsetLinux) + random_float(minTime,maxTime) , FlDefusedTimeOffsetLinux)
}
public barTimeHandlerThink(id)
{
entity_set_float(id,EV_FL_nextthink, get_gametime() + BarTimeHandlerThinkDelay);
message_begin(MSG_ONE_UNRELIABLE, msgBarTime2Index, _, playerDefusing)
write_short(TrickingDuration)
write_short(random_num(1,100))
message_end()
emit_sound(playerDefusing,CHAN_AUTO,TrickedDefuseSoundsPath[TrickedDefuseSounds:random(_:TrickedDefuseSounds)],1.0,ATTN_NORM, 1, PITCH_NORM)
}
public defuseStart(id)
{
if(PlayersDefuseTricked[id])
{
defuseStarted(id)
}
}
public defuseStarted(id)
{
DefuseTricked = true;
playerDefusing = id;
EnableHamForward(Ham_UseForward)
BarTimeHandlerThinker = create_entity("info_target")
assert is_valid_ent(BarTimeHandlerThinker);
entity_set_string(BarTimeHandlerThinker,EV_SZ_classname,BarTimeHandlerClassname);
entity_set_float(BarTimeHandlerThinker,EV_FL_nextthink, get_gametime());
FM_ClientDisconnectForward = register_forward(FM_ClientDisconnect,"clientDisconnect")
}
public barTime(id)
{
if(DefuseTricked)
{
checkDefuseStop(playerDefusing)
}
}
defuseStop()
{
if(DefuseTricked)
{
DefuseTricked = false;
unregister_forward(FM_ClientDisconnect,FM_ClientDisconnectForward)
remove_entity(BarTimeHandlerThinker)
message_begin(MSG_ONE_UNRELIABLE, msgBarTimeIndex, _, playerDefusing)
write_short(0)
message_end()
playerDefusing = 0
}
}
checkDefuseStop(id)
{
if(id == playerDefusing)
{
defuseStop();
}
}
public clientDisconnect(id)
{
checkDefuseStop(id);
}
public defuseEnd()
{
defuseStop();
}
public defuserSpawn(id)
{
handleDroppedDefuser(id)
}
public defuserTouchedPre(touched,toucher)
{
if(1<=toucher<=maxPlayers)
{
HadDefuse[toucher] = bool:cs_get_user_defuse(toucher)
}
}
public defuserTouchedPost(touched,toucher)
{
if(1<=toucher<=maxPlayers)
{
new hasDefuse = cs_get_user_defuse(toucher)
if(!HadDefuse[toucher] && hasDefuse)
{
PlayersDefuseTricked[toucher] = bool:entity_get_edict(touched,EV_ENT_tricked)
deleteDefuserData(touched)
}
}
}
public handleDroppedDefuser(defuser)
{
new defuserData[DefuserData]
defuserData[PlayersStartTime] = _:ArrayCreate(1,maxPlayers+1);
for(new i=0;i<=maxPlayers;i++)
ArrayPushCell(Array:defuserData[PlayersStartTime],0.0)
defuserData[Index] = ArraySize(Defusers)
ArrayPushCell(Defusers,defuser)
new defuserString[2]
defuserString[0] = defuser;
TrieSetString(DefusersData,defuserString,defuserData);
}
deleteDefuserData(defuser)
{
new defuserString[2]
defuserString[0] = defuser
new defuserData[DefuserData]
if(TrieGetString(DefusersData,defuserString,defuserData,DefuserData-1))
{
new lastDefuserIndex = ArraySize(Defusers) - 1
new index = defuserData[Index]
if(index != lastDefuserIndex)
{
new lastDefuser = ArrayGetCell(Defusers,lastDefuserIndex)
new lastDefuserString[2]
lastDefuserString[0] = lastDefuser
new lastDefuserData[DefuserData]
TrieGetString(DefusersData,lastDefuserString,lastDefuserData,DefuserData-1);
lastDefuserData[Index] = index;
TrieSetString(DefusersData,lastDefuserString,lastDefuserData);
ArraySetCell(Defusers,index,lastDefuser);
}
ArrayDeleteItem(Defusers,lastDefuserIndex);
TrieDeleteKey(DefusersData,defuserString);
}
}
increaseDefuserCounter(id,defuser)
{
new defuserString[2]
defuserString[0] = defuser
new defuserData[DefuserData]
if(TrieGetString(DefusersData,defuserString,defuserData,DefuserData-1))
{
new Float:startTime = ArrayGetCell(Array:defuserData[PlayersStartTime],id)
if(!startTime)
{
ArraySetCell(Array:defuserData[PlayersStartTime],id, get_gametime() )
message_begin(MSG_ONE_UNRELIABLE, msgBarTimeIndex, _, id)
write_short(TrickingDuration)
message_end()
emit_sound(id,CHAN_AUTO,SparkSoundsPath[SparkSounds:random(_:SparkSounds)],1.0,ATTN_NORM, 1, PITCH_NORM)
}
else
{
new Float:timeTaken = get_gametime() - startTime;
if(timeTaken >= (TrickingDuration * 1.0))
{
entity_set_edict(defuser,EV_ENT_tricked,1)
deleteDefuserData(defuser)
emit_sound(id,CHAN_AUTO,MiscSoundsPath[Geiger],1.0,ATTN_NORM, 1, PITCH_NORM)
cs_set_user_money(id,cs_get_user_money(id) + clamp(get_pcvar_num(cvarDefuserTrickingReward),0,16000))
return false;
}
else
{
if(!random(100))
{
emit_sound(id,CHAN_AUTO,SparkSoundsPath[SparkSounds:random(_:SparkSounds)],1.0,ATTN_NORM, 1, PITCH_NORM)
}
}
}
return true;
}
return false;
}
resetDefuserCounter(id,defuser)
{
new defuserString[2]
defuserString[0] = defuser
new defuserData[DefuserData]
if(TrieGetString(DefusersData,defuserString,defuserData,DefuserData-1))
{
ArraySetCell(Array:defuserData[PlayersStartTime],id,0.0)
}
message_begin(MSG_ONE_UNRELIABLE, msgBarTimeIndex, _, id)
write_short(0)
message_end()
}
public FMCmdStart(id,uc_handle,random_seed)
{
if(cs_get_user_team(id) == CS_TEAM_T)
{
if(get_uc(uc_handle,UC_Buttons) & IN_USE)
{
new nDefusers = ArraySize(Defusers)
if(nDefusers)
{
static Float:start[3], Float:view_ofs[3], Float:origin[3], Float:dest[3]
pev(id, pev_origin, start);
pev(id, pev_view_ofs, view_ofs);
xs_vec_add(start, view_ofs, start);
pev(id, pev_v_angle, dest);
engfunc(EngFunc_MakeVectors, dest);
global_get(glb_v_forward, dest);
xs_vec_mul_scalar(dest, defuserMaxDistance, dest);
xs_vec_add(start, dest, dest);
engfunc(EngFunc_TraceLine, start, dest, 0, id, 0);
get_tr2(0, TR_vecEndPos, origin);
new watchingDefuser
for(new i=0;i<nDefusers;i++)
{
new defuser = ArrayGetCell(Defusers,i);
if(is_valid_ent(defuser))
{
engfunc ( EngFunc_TraceModel, start, dest, HULL_POINT, defuser ,0)
new hit = get_tr2(0, TR_pHit);
if(hit == defuser)
{
watchingDefuser = defuser;
break;
}
}
}
if(watchingDefuser)
{
if(LastDefuserWatched[id] == watchingDefuser)
{
if( increaseDefuserCounter(id,watchingDefuser))
LastDefuserWatched[id] = watchingDefuser
else
LastDefuserWatched[id] = 0
}
else
{
if(LastDefuserWatched[id])
resetDefuserCounter(id,LastDefuserWatched[id]);
LastDefuserWatched[id] = watchingDefuser
}
}
else if(LastDefuserWatched[id])
{
resetDefuserCounter(id,LastDefuserWatched[id])
LastDefuserWatched[id] = 0;
}
}
}
else if(LastDefuserWatched[id])
{
resetDefuserCounter(id,LastDefuserWatched[id])
LastDefuserWatched[id] = 0;
}
}
}