I want to extract the code for the fix that makes the roundtimer not disappear when changing map to a cs_ map if the bomb was still planted in a de_ map.
HTML Code:
/**
*
* Grenade/C4 Fixes & Hud Enhancement
* by Numb
*
*
* Description:
* This plugin is designed to fix variety of grenade and c4 related bugs, while introducing
* some amount of hud improvements and editions.
* Bomb Fixes:
* + When bomb is planted in water it will explode if not defused, instead of resulting in
* an infinite round.
* + Bomb cannot be moved by movable objects any longer.
* + Bomb cannot explode and be defused at the same time anymore.
* + Silent defuse by pressing use key twice, or using knife secondary attack, or
* activating flashlight is no longer possible.
* + Defuse cannot be started from air - log stays clean.
* + Bomb cannot squeeze itself through objects, to be planted outside the map.
* + "Counter-Terrorists win" sound doesn't overwrite "Bomb has been defused" one.
* + At new round reload isn't canceled if you have the bomb.
* + When dropped from large distance, bomb location on radar is accurate.
* + Secondary attack cancels the defuse.
* Grenade Fixes:
* + Grenades have reasonable velocities when breaking glass.
* + Flash grenades exploded underwater can blind players on land, and the opposed way
* around.
* + Underwater explosions have ability to damage players who are on land.
* + Grenades cannot squeeze themselves out of map.
* Other Fixes:
* + When disconnecting from a server where bomb was planted, and connecting into your
* non-bomb objective server, round timer is present anyway.
* + After playing a map with built-in echo system, echo glitch is fixed (however client
* must have s_eax set to 0 for it to work).
* + BarTime (loading bar) is canceled for spectators when planter or defuser dies.
* + BarTime (loading bar) is canceled when switching weapons during defuse or bomb plant.
* HUD Changes:
* + If bomb is planted, round timer shows seconds remaining until detonation.
* + Condition-Zero style c4 scenario icon near round timer when bomb is planted.
* + Silver defuse kit icon when bomb isn't planted, when planted - green.
* + Defuse kit icon is blinking in red and green when defusing without a kit.
* + Red defuse kit icon when defusing with a kit.
* + While planting the bomb, c4 icon is red.
* + Silver buyzone icon when buytime passed.
* Other Features:
* + Angle of planted bomb is the same as planter had when planting.
* + Flashbangs and he-grenades have a light effect when exploding.
*
*
* Requires:
* FakeMeta
* HamSandWich
*
*
* Additional info:
* Tested in Counter-Strike 1.6 with amxmodx 1.8.2 (dev build hg21). Should also work in
* Condition-Zero.
*
*
* Credits:
* Special thanks to Arkshine ( http://forums.alliedmods.net/member.php?u=7779 ) for
* Counter-Strike SDK ( https://github.com/Arkshine/CSSDK/ ), and for providing other
* useful information! Thanks to xPaw ( http://forums.alliedmods.net/member.php?u=39377 )
* for method of fixing "bomb has been defused" sound as well - method taken from his
* "The bomb has been defused" ( http://forums.alliedmods.net/showthread.php?p=883102 )
* plugin. Also thanks to FOUTA ( http://forums.alliedmods.net/member.php?u=96050 )
* for providing help by testing the plugin on live public server.
*
*
* Change-Log:
*
* + 1.2
* - Fixed: Crash when stopping the defuse.
* - Fixed: Error log due to client message.
* - Fixed: Custom team switching will now remove defuser kit icon at player hud update.
* - Fixed: Freezetime was not added to buytime - grey buy icon earlier than it should be.
* - Added: Compatibility with mission scenario plugin. Basically just auto-changes the cvar.
*
* + 1.1
* - Added: Secondary attack now cancels the defuse.
* - Added: BarTime (loading bar) is canceled when switching weapons during defuse or bomb plant.
* - Fixed: Pausing the plugin is now more friendly.
*
* + 1.0
* - First release.
*
*
* Downloads:
* Amx Mod X forums: http://forums.alliedmods.net/showthread.php?p=1594580#post1594580
*
**/
// ----------------------------------------- CONFIG START -----------------------------------------
// Light effect data for flashbangs
#define FLASH_RADIUS 50
#define FLASH_RED 255
#define FLASH_GREEN 255
#define FLASH_BLUE 255
#define FLASH_LIFE_MS 8
#define FLASH_DECAY_RATE 60
// Light effect data for he-grenades
#define HE_RADIUS 30
#define HE_RED 255
#define HE_GREEN 191
#define HE_BLUE 31
#define HE_LIFE_MS 12
#define HE_DECAY_RATE 20
// ------------------------------------------ CONFIG END ------------------------------------------
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#define PLUGIN_NAME "Grenade/C4 Fixes & Hud Enhancement"
#define PLUGIN_VERSION "1.2"
#define PLUGIN_AUTHOR "Numb"
#define SetPlayerBit(%1,%2) ( %1 |= ( 1 << ( %2 & 31 ) ) )
#define ClearPlayerBit(%1,%2) ( %1 &= ~( 1 << ( %2 & 31 ) ) )
#define CheckPlayerBit(%1,%2) ( %1 & ( 1 << ( %2 & 31 ) ) )
#define m_pPlayer 41
#define m_iId 43
#define m_flNextSecondaryAttack 47
#define m_fHasDefuseKit 193
#define HAS_DEFUSE_KIT (1<<16)
#define m_iTeam 114
#define CS_TEAM_UNASSIGNED 0
#define CS_TEAM_T 1
#define CS_TEAM_CT 2
#define CS_TEAM_SPECTATOR 3
#define m_fBombDefusing 232
#define BombStatus_BeingDefusing (1<<8)
#define m_iMapZone 235
#define CS_MAPZONE_BUY (1<<0)
#define CS_MAPZONE_BOMBTARGET (1<<1)
#define CS_MAPZONE_HOSTAGE_RESCUE (1<<2)
#define CS_MAPZONE_ESCAPE (1<<3)
#define CS_MAPZONE_VIP_SAFETY (1<<4)
#define m_pActiveItem 373
#define m_flProgressBarStartTime 605
#define m_flProgressBarEndTime 606
#define m_fBombStatus 96
#define BOMB_DEFUSING (1<<0) // m_fStartDefuse
#define BOMB_PLANTED (1<<8) // m_fPlantedC4
//#define m_hDefuser 97 // doesn't work - get_pdata_ent() doesn't return the expected value
#define m_flDefuseCountDown 99
#define m_flC4Blow 100
#define m_flNextBeep 102
#define m_flNextFreq 103
#define m_flNextBlink 106
#define m_flNextDefuseTime 107
#define m_bJustBlew 108
#define m_iC4Beep 110
#define m_usEvent 114
new g_iMsgId_StatusIcon;
new g_iMsgId_Scenario;
new g_iMsgId_SendAudio;
new g_iMsgId_BombDrop;
new g_iMsgId_BombPickup;
new g_iMsgId_ShowTimer;
new g_iMsgId_RoundTime;
new g_iMsgId_BarTime;
new g_iMsgId_TextMsg;
new bool:g_bIsCzero;
new bool:g_bPlanted;
new g_iMaxPlayers;
new Float:g_fOldSpeed;
new g_iIgnoreTimerFix;
new g_iConnected;
new g_iAlive;
new Float:g_fRoundStartedAt;
new Float:g_fFreezeTime;
new g_iCvar_buytime;
new g_iCvar_freezetime;
new g_iModifiedBuyZone;
new Float:g_fPlantedAt;
new g_iCvar_c4Timer;
new g_iCvar_MissionScenario
new g_iC4Timer;
new bool:g_bCheckTxtMsg;
new HamHook:g_hh_Think_grenade_Post;
new g_iBackupInfo[32][2];
new g_iBackupPlayerNum;
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
register_logevent("LogEvent_Defused_The_Bomb", 3, "1=triggered", "2=Defused_The_Bomb");
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
register_event("ShowTimer", "Event_ShowTimer", "b");
register_event("SendAudio", "Event_SendAudio", "a", "1=0", "2=%!MRAD_BOMBDEF");
register_event("BombDrop", "Event_BombPlant", "a", "4=1");
register_event("ResetHUD", "Event_ResetHUD", "b");
register_event("BarTime", "Event_BarTime", "b");
register_event("BarTime2", "Event_BarTime2", "b");
register_event("CurWeapon", "Event_CurWeapon", "be");
g_iMsgId_SendAudio = get_user_msgid("SendAudio");
g_iMsgId_BombDrop = get_user_msgid("BombDrop");
g_iMsgId_BombPickup = get_user_msgid("BombPickup");
g_iMsgId_StatusIcon = get_user_msgid("StatusIcon");
g_iMsgId_BarTime = get_user_msgid("BarTime");
g_iMsgId_Scenario = get_user_msgid("Scenario");
g_iMsgId_ShowTimer = get_user_msgid("ShowTimer");
g_iMsgId_RoundTime = get_user_msgid("RoundTime");
g_iMsgId_TextMsg = get_user_msgid("TextMsg");
register_message(g_iMsgId_StatusIcon, "Message_StatusIcon");
register_message(g_iMsgId_BombDrop, "Message_BombDrop");
register_message(g_iMsgId_RoundTime, "Message_RoundTime");
register_message(g_iMsgId_TextMsg, "Message_TextMsg");
set_task(0.5, "find_c4", 33, "", 0, "b");
register_forward(FM_EmitSound, "FM_EmitSound_Pre", 0);
register_forward(FM_SetModel, "FM_SetModel_Pre", 0);
new iGameMod[8];
get_modname(iGameMod, 7);
if( equali(iGameMod, "czero") )
g_bIsCzero = true;
RegisterHam(Ham_Spawn, "player", "Ham_Spawn_player_Post", 1);
RegisterHam(Ham_Killed, "player", "Ham_Killed_player_Post", 1);
RegisterHam(Ham_Spawn, "grenade", "Ham_Spawn_grenade_Post", 1);
RegisterHam(Ham_Use, "grenade", "Ham_Use_grenade_Pre", 0);
RegisterHam(Ham_Touch, "grenade", "Ham_Touch_grenade_Pre", 0);
RegisterHam(Ham_Touch, "grenade", "Ham_Touch_grenade_Post", 1);
RegisterHam(Ham_Think, "grenade", "Ham_Think_grenade_Pre", 0);
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_knife", "Ham_Wpn_SecAttack_Post", 1);
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_awp", "Ham_Wpn_SecAttack_Post", 1);
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_scout", "Ham_Wpn_SecAttack_Post", 1);
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_g3sg1", "Ham_Wpn_SecAttack_Post", 1);
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_sg550", "Ham_Wpn_SecAttack_Post", 1);
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_sg552", "Ham_Wpn_SecAttack_Post", 1);
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_aug", "Ham_Wpn_SecAttack_Post", 1);
g_hh_Think_grenade_Post = RegisterHam(Ham_Think, "grenade", "Ham_Think_grenade_Post", 1);
DisableHamForward(g_hh_Think_grenade_Post);
register_clcmd("say /hud", "Event_ResetHUD");
}
public plugin_cfg()
{
if( !g_iCvar_MissionScenario )
g_iCvar_MissionScenario = get_cvar_pointer("mp_mission_scenario");
}
public plugin_precache()
{
g_iCvar_buytime = get_cvar_pointer("mp_buytime");
g_iCvar_freezetime = get_cvar_pointer("mp_freezetime");
g_iCvar_c4Timer = get_cvar_pointer("mp_c4timer");
g_iC4Timer = clamp(get_pcvar_num(g_iCvar_c4Timer), 10, 90);
g_iMaxPlayers = clamp(get_maxplayers(), 1, 32);
}
public plugin_pause()
{
new iEnt, iPlayer;
while( (iEnt=engfunc(EngFunc_FindEntityByString, iEnt, "classname", "grenade"))>0 )
{
if( pev_valid(iEnt) )
{
if( fm_cs_get_grenade_type(iEnt)==CSW_C4 && pev(iEnt, pev_movetype)!=MOVETYPE_NONE )
{
engfunc(EngFunc_SetSize, iEnt, Float:{-0.021, -0.021, -0.021}, Float:{0.021, 0.021, 0.021});
set_pev(iEnt, pev_solid, SOLID_NOT);
set_pev(iEnt, pev_effects, (pev(iEnt, pev_effects)&~EF_NODRAW));
iPlayer = pev(iEnt, pev_owner);
if( 0<iPlayer<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iConnected, iPlayer) )
{
new Float:fAngles[3], Float:fAngle;
pev(iPlayer, pev_v_angle, fAngles);
fAngle = (fAngles[1]+90.0);
pev(iEnt, pev_angles, fAngles);
fAngles[1] = fAngle;
set_pev(iEnt, pev_angles, fAngles);
}
}
g_iBackupPlayerNum = 0;
for( iPlayer=1; iPlayer<=g_iMaxPlayers; iPlayer++ )
{
if( CheckPlayerBit(g_iConnected, iPlayer) )
{
g_iBackupInfo[g_iBackupPlayerNum][0] = iPlayer;
g_iBackupInfo[g_iBackupPlayerNum][1] = pev(iPlayer, pev_solid);
set_pev(iPlayer, pev_solid, SOLID_NOT);
g_iBackupPlayerNum++;
}
}
engfunc(EngFunc_DropToFloor, iEnt);
for( iPlayer=0; iPlayer<g_iBackupPlayerNum; iPlayer++ )
set_pev(g_iBackupInfo[iPlayer][0], pev_solid, g_iBackupInfo[iPlayer][1]);
g_iBackupPlayerNum = 0;
set_pev(iEnt, pev_movetype, MOVETYPE_NONE);
}
}
}
for( iPlayer=1; iPlayer<=g_iMaxPlayers; iPlayer++ )
{
if( CheckPlayerBit(g_iConnected, iPlayer) )
{
if( CheckPlayerBit(g_iAlive, iPlayer) )
{
iEnt = get_pdata_int(iPlayer, m_iMapZone, 5);
if( iEnt&CS_MAPZONE_BUY && CheckPlayerBit(g_iModifiedBuyZone, iPlayer) )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlayer);
write_byte(1);
write_string("buyzone");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
}
switch( get_pdata_int(iPlayer, m_iTeam, 5) )
{
case CS_TEAM_T:
{
if( get_user_weapon(iPlayer)==CSW_C4 )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlayer);
write_byte(((iEnt&CS_MAPZONE_BOMBTARGET)?2:1));
write_string("c4");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
}
}
case CS_TEAM_CT:
{
if( get_pdata_int(iPlayer, m_fHasDefuseKit, 5)&HAS_DEFUSE_KIT )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlayer);
write_byte(1);
write_string("defuser");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
}
else
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlayer);
write_byte(0);
write_string("defuser");
//write_byte(0);
//write_byte(0);
//write_byte(0);
message_end();
}
}
}
}
else if( pev(iPlayer, pev_iuser1)==4 )
{
if( 0<(iEnt=pev(iPlayer, pev_iuser2))<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, iEnt) )
{
switch( get_pdata_int(iEnt, m_iTeam, 5) )
{
case CS_TEAM_T:
{
if( get_user_weapon(iEnt)==CSW_C4 )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlayer);
write_byte(((get_pdata_int(iEnt, m_iMapZone, 5)&CS_MAPZONE_BOMBTARGET)?2:1));
write_string("c4");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
}
}
case CS_TEAM_CT:
{
if( get_pdata_int(iEnt, m_fHasDefuseKit, 5)&HAS_DEFUSE_KIT )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlayer);
write_byte(1);
write_string("defuser");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
}
else
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlayer);
write_byte(0);
write_string("defuser");
//write_byte(0);
//write_byte(0);
//write_byte(0);
message_end();
}
}
}
}
}
}
}
}
}
public plugin_unpause()
{
g_iIgnoreTimerFix = 0;
g_iConnected = 0;
g_iAlive = 0;
new iPlayers[32], iPlayerNum;
get_players(iPlayers, iPlayerNum);
for( new iPlayer; iPlayer<iPlayerNum; iPlayer++ )
{
SetPlayerBit(g_iConnected, iPlayers[iPlayer]);
if( is_user_alive(iPlayers[iPlayer]) )
SetPlayerBit(g_iAlive, iPlayers[iPlayer]);
}
DisableHamForward(g_hh_Think_grenade_Post);
g_bCheckTxtMsg = false;
new iEnt;
while( (iEnt=engfunc(EngFunc_FindEntityByString, iEnt, "classname", "grenade"))>0 )
{
if( pev_valid(iEnt) )
{
if( fm_cs_get_grenade_type(iEnt)==CSW_C4 )
{
g_bPlanted = true;
if( !get_pdata_int(iEnt, m_bJustBlew, 5) )
{
message_begin(MSG_ALL, g_iMsgId_Scenario);
write_byte(1);
write_string("bombticking");
write_byte(255);
switch( clamp((get_pdata_int(iEnt, m_iC4Beep, 5)-1), 0, 4) )
{
case 0: write_short(140);
case 1: write_short(70);
case 2: write_short(40);
case 3: write_short(30);
default: write_short(20);
}
write_short(0);
message_end();
}
g_fPlantedAt = get_gametime();
g_iC4Timer = (floatround(get_pdata_float(iEnt, m_flC4Blow, 5)-g_fPlantedAt));
if( g_iC4Timer<0 )
g_iC4Timer = 0;
message_begin(MSG_ALL, g_iMsgId_ShowTimer);
message_end();
message_begin(MSG_ALL, g_iMsgId_RoundTime);
if( g_iC4Timer>0 )
write_short(g_iC4Timer);
else
write_short(1);
message_end();
break;
}
}
}
if( iEnt<=0 )
{
g_bPlanted = false;
g_iC4Timer = clamp(get_pcvar_num(g_iCvar_c4Timer), 10, 90);
}
g_iBackupPlayerNum = 0;
g_fRoundStartedAt = -1.0;
g_iModifiedBuyZone = 0;
}
public client_connect(iPlrId)
{
ClearPlayerBit(g_iIgnoreTimerFix, iPlrId);
ClearPlayerBit(g_iConnected, iPlrId);
ClearPlayerBit(g_iAlive, iPlrId);
ClearPlayerBit(g_iModifiedBuyZone, iPlrId);
client_cmd(iPlrId, "room_type 0"); // note: this fix works only if client had s_eax 0 when game was launched
}
public client_putinserver(iPlrId)
{
ClearPlayerBit(g_iIgnoreTimerFix, iPlrId);
SetPlayerBit(g_iConnected, iPlrId);
ClearPlayerBit(g_iModifiedBuyZone, iPlrId);
if( g_bPlanted )
{
new iTimerLeft = (g_iC4Timer-floatround((get_gametime()-g_fPlantedAt)));
if( iTimerLeft<1 )
iTimerLeft = 1;
message_begin(MSG_ONE, g_iMsgId_ShowTimer, _, iPlrId);
message_end();
message_begin(MSG_ONE, g_iMsgId_RoundTime, _, iPlrId);
write_short(iTimerLeft);
message_end();
}
}
public client_disconnect(iPlrId)
{
ClearPlayerBit(g_iIgnoreTimerFix, iPlrId);
ClearPlayerBit(g_iConnected, iPlrId);
ClearPlayerBit(g_iAlive, iPlrId);
ClearPlayerBit(g_iModifiedBuyZone, iPlrId);
}
public LogEvent_Defused_The_Bomb()
{
new iArg[64], iName[32];
read_logargv(0, iArg, 63);
parse_loguser(iArg, iName, 31);
new iDefuser = find_player("a", iName);
if( 0<iDefuser<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, iDefuser) )
{
new bool:bHasKit = ((get_pdata_int(iDefuser, m_fHasDefuseKit, 5)&HAS_DEFUSE_KIT)?true:false);
for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
{
if( CheckPlayerBit(g_iConnected, iPlrId) )
{
if( (iDefuser==iPlrId) || (!CheckPlayerBit(g_iAlive, iPlrId) && pev(iPlrId, pev_iuser1)==4 && pev(iPlrId, pev_iuser2)==iDefuser) )
{
if( bHasKit )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(1);
write_string("defuser");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
}
else
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("defuser");
//write_byte(0);
//write_byte(0);
//write_byte(0);
message_end();
}
}
}
}
}
}
}
public Event_NewRound()
{
g_fFreezeTime = floatclamp(get_pcvar_float(g_iCvar_freezetime), 0.0, 30.0);
if( g_iCvar_MissionScenario )
{
new iMissionScenarioCvarNum = clamp(get_pcvar_num(g_iCvar_MissionScenario), 0, 3);
if( iMissionScenarioCvarNum>1 && iMissionScenarioCvarNum!=2 )
set_pcvar_num(g_iCvar_MissionScenario, 2);
}
new iEnt, iUserWeapons;
for( new iPlrId=1; iPlrId<g_iMaxPlayers; iPlrId++ )
{
if( CheckPlayerBit(g_iAlive, iPlrId) )
{
if( (iUserWeapons=pev(iPlrId, pev_weapons))&(1<<CSW_C4) && get_user_weapon(iPlrId)!=CSW_C4 )
{
iEnt = 0;
while( (iEnt=engfunc(EngFunc_FindEntityByString, iEnt, "classname", "weapon_c4"))>0 )
{
if( pev_valid(iEnt) )
{
if( pev(iEnt, pev_owner)==iPlrId && get_pdata_cbase(iEnt, m_pPlayer, 4)==iPlrId )
break;
}
}
if( iEnt<=g_iMaxPlayers )
continue;
if( !ExecuteHamB(Ham_RemovePlayerItem, iPlrId, iEnt) )
continue;
ExecuteHamB(Ham_Item_Kill, iEnt);
set_pev(iPlrId, pev_weapons, (iUserWeapons&~(1<<CSW_C4)));
}
}
}
g_iC4Timer = clamp(get_pcvar_num(g_iCvar_c4Timer), 10, 90);
g_bPlanted = false;
g_fRoundStartedAt = get_gametime();
g_iModifiedBuyZone = 0;
remove_task(33);
set_task(0.5, "find_c4", 33, "", 0, "b");
}
public Event_ShowTimer(iPlrId)
SetPlayerBit(g_iIgnoreTimerFix, iPlrId);
public Event_SendAudio()
{
if( get_msg_block(g_iMsgId_SendAudio)==BLOCK_NOT )
set_msg_block(g_iMsgId_SendAudio, BLOCK_ONCE);
g_fPlantedAt = (get_gametime()-float(g_iC4Timer));
message_begin(MSG_ALL, g_iMsgId_ShowTimer);
message_end();
message_begin(MSG_ALL, g_iMsgId_RoundTime);
write_short(1);
message_end();
}
public Event_BombPlant()
{
if( g_bPlanted )
{
message_begin(MSG_ALL, g_iMsgId_ShowTimer);
message_end();
message_begin(MSG_ALL, g_iMsgId_RoundTime);
if( g_iC4Timer>0 )
write_short(g_iC4Timer);
else
write_short(1);
message_end();
}
}
public Event_ResetHUD(iPlrId)
{
if( g_bPlanted )
{
new iTimerLeft = (g_iC4Timer-floatround((get_gametime()-g_fPlantedAt)));
if( iTimerLeft<1 )
iTimerLeft = 1;
message_begin(MSG_ONE, g_iMsgId_ShowTimer, _, iPlrId);
message_end();
message_begin(MSG_ONE, g_iMsgId_RoundTime, _, iPlrId);
write_short(iTimerLeft);
message_end();
}
if( get_pdata_int(iPlrId, m_iTeam, 5)==CS_TEAM_T )
{
static s_iKitInfo;
s_iKitInfo = get_pdata_int(iPlrId, m_fHasDefuseKit, 5);
if( s_iKitInfo&HAS_DEFUSE_KIT )
{
set_pdata_int(iPlrId, m_fHasDefuseKit, (s_iKitInfo&~HAS_DEFUSE_KIT), 5);
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("defuser");
message_end();
}
}
}
public Event_BarTime(iPlrId)
{
if( CheckPlayerBit(g_iAlive, iPlrId) )
{
switch( read_data(1) )
{
case 10: write_statusicon(iPlrId, 2, "defuser", 0, 160, 0);
case 5: write_statusicon(iPlrId, 1, "defuser", 255, 0, 0);
case 3: write_statusicon(iPlrId, 1, "c4", 255, 0, 0);
case 0:
{
switch( get_pdata_int(iPlrId, m_iTeam, 5) )
{
case CS_TEAM_T:
{
if( pev(iPlrId, pev_weapons)&(1<<CSW_C4) )
{
if( g_bPlanted )
write_statusicon(iPlrId, ((get_pdata_int(iPlrId, m_iMapZone, 5)&CS_MAPZONE_BOMBTARGET)?2:1), "c4", 160, 160, 160, true);
else
write_statusicon(iPlrId, ((get_pdata_int(iPlrId, m_iMapZone, 5)&CS_MAPZONE_BOMBTARGET)?2:1), "c4", 0, 160, 0, true);
}
else
write_statusicon(iPlrId, -1, "", 0, 0, 0, true);
}
case CS_TEAM_CT:
{
if( get_pdata_int(iPlrId, m_fHasDefuseKit, 5)&HAS_DEFUSE_KIT )
write_statusicon(iPlrId, 1, "defuser", 0, 160, 0, true);
else
write_statusicon(iPlrId, 0, "defuser", 0, 0, 0, true);
}
}
}
}
}
else if( !read_data(1) )
{
if( pev(iPlrId, pev_iuser1)==4 )
{
static s_iSpectated;
if( 0<(s_iSpectated=pev(iPlrId, pev_iuser2))<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, s_iSpectated) )
{
switch( get_pdata_int(s_iSpectated, m_iTeam, 5) )
{
case CS_TEAM_T:
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("defuser");
//write_byte(0);
//write_byte(0);
//write_byte(0);
message_end();
if( pev(s_iSpectated, pev_weapons)&(1<<CSW_C4) )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(((get_pdata_int(s_iSpectated, m_iMapZone, 5)&CS_MAPZONE_BOMBTARGET)?2:1));
write_string("c4");
if( g_bPlanted )
{
write_byte(160);
write_byte(160);
write_byte(160);
}
else
{
write_byte(0);
write_byte(160);
write_byte(0);
}
message_end();
}
else
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("c4");
//write_byte(0);
//write_byte(0);
//write_byte(0);
message_end();
}
}
case CS_TEAM_CT:
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("c4");
//write_byte(0);
//write_byte(0);
//write_byte(0);
message_end();
if( get_pdata_int(s_iSpectated, m_fHasDefuseKit, 5)&HAS_DEFUSE_KIT )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(1);
write_string("defuser");
if( g_bPlanted )
{
write_byte(0);
write_byte(160);
write_byte(0);
}
else
{
write_byte(160);
write_byte(160);
write_byte(160);
}
message_end();
}
else
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("defuser");
//write_byte(0);
//write_byte(0);
//write_byte(0);
message_end();
}
}
default:
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("defuser");
//write_byte(0);
//write_byte(0);
//write_byte(0);
message_end();
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("c4");
//write_byte(0);
//write_byte(0);
//write_byte(0);
message_end();
}
}
return;
}
}
}
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("defuser");
message_end();
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(0);
write_string("c4");
message_end();
}
}
public Event_BarTime2(iPlrId)
{
if( !CheckPlayerBit(g_iAlive, iPlrId) )
{
if( pev(iPlrId, pev_iuser1)==4 )
{
static s_iSpectated;
if( 0<(s_iSpectated=pev(iPlrId, pev_iuser2))<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, s_iSpectated) )
{
switch( get_pdata_int(s_iSpectated, m_iTeam, 5) )
{
case CS_TEAM_T:
{
if( pev(s_iSpectated, pev_weapons)&(1<<CSW_C4) && get_pdata_int(s_iSpectated, m_iMapZone, 5)&CS_MAPZONE_BOMBTARGET )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(1);
write_string("c4");
write_byte(255);
write_byte(0);
write_byte(0);
message_end();
}
}
case CS_TEAM_CT:
{
if( get_pdata_int(s_iSpectated, m_fHasDefuseKit, 5)&HAS_DEFUSE_KIT )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(1);
write_string("defuser");
write_byte(255);
write_byte(0);
write_byte(0);
message_end();
}
else
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(2);
write_string("defuser");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
}
}
}
}
}
}
}
}
public Event_CurWeapon(iPlrId)
{
static Float:s_fGameTime;
s_fGameTime = get_gametime();
if( get_pdata_float(iPlrId, m_flProgressBarEndTime, 5)>s_fGameTime )
{
switch( get_pdata_int(iPlrId, m_iTeam, 5) )
{
case CS_TEAM_T:
{
set_pdata_float(iPlrId, m_flProgressBarEndTime, s_fGameTime, 5);
message_begin(MSG_ONE, g_iMsgId_BarTime, _, iPlrId);
write_short(0);
message_end();
if( pev(iPlrId, pev_weapons)&(1<<CSW_C4) )
{
if( g_bPlanted )
write_statusicon(iPlrId, ((get_pdata_int(iPlrId, m_iMapZone, 5)&CS_MAPZONE_BOMBTARGET)?2:1), "c4", 160, 160, 160, true);
else
write_statusicon(iPlrId, ((get_pdata_int(iPlrId, m_iMapZone, 5)&CS_MAPZONE_BOMBTARGET)?2:1), "c4", 0, 160, 0, true);
}
else
write_statusicon(iPlrId, -1, "", 0, 0, 0, true);
}
case CS_TEAM_CT:
{
// We don't need to disable the bar and reset defuser icon, cause we execute C4Think, and eventually it should execute Event_BarTime(), where I'm configurating everything anyway.
//if( get_pdata_int(iPlrId, m_fHasDefuseKit, 5)&HAS_DEFUSE_KIT )
// write_statusicon(iPlrId, 1, "defuser", 0, 160, 0, true);
//else
// write_statusicon(iPlrId, 0, "defuser", 0, 0, 0, true);
if( g_bPlanted && get_pdata_int(iPlrId, m_fBombDefusing, 5)&BombStatus_BeingDefusing )
cancel_defuse_now(iPlrId, (s_fGameTime+1.0));
}
}
//set_pdata_float(iPlrId, m_flProgressBarEndTime, s_fGameTime, 5);
//message_begin(MSG_ONE, g_iMsgId_BarTime, _, iPlrId);
//write_short(0);
//message_end();
}
}
public Message_StatusIcon(iMsgId, iMsgType, iPlrId)
{
if( CheckPlayerBit(g_iAlive, iPlrId) )
{
static s_iSprite[9];
get_msg_arg_string(2, s_iSprite, 8);
if( equal(s_iSprite, "buyzone") )
{
if( !get_msg_arg_int(1) )
ClearPlayerBit(g_iModifiedBuyZone, iPlrId);
else if( g_fRoundStartedAt>=0.0 )
{
static Float:s_fBuyTime;
s_fBuyTime = (get_pcvar_float(g_iCvar_buytime)*60.0);
if( s_fBuyTime<15.0 )
s_fBuyTime = 15.0;
s_fBuyTime += g_fFreezeTime;
if( (get_gametime()-g_fRoundStartedAt)>s_fBuyTime )
{
SetPlayerBit(g_iModifiedBuyZone, iPlrId);
set_msg_arg_int(3, ARG_BYTE, 160);
set_msg_arg_int(4, ARG_BYTE, 160);
set_msg_arg_int(5, ARG_BYTE, 160);
}
else
ClearPlayerBit(g_iModifiedBuyZone, iPlrId);
}
}
else if( get_msg_arg_int(1) )
{
if( g_bPlanted )
{
if( equal(s_iSprite, "c4") )
{
set_msg_arg_int(1, ARG_BYTE, 1);
set_msg_arg_int(3, ARG_BYTE, 160);
set_msg_arg_int(4, ARG_BYTE, 160);
set_msg_arg_int(5, ARG_BYTE, 160);
}
}
else if( equal(s_iSprite, "defuser") )
{
set_msg_arg_int(3, ARG_BYTE, 160);
set_msg_arg_int(4, ARG_BYTE, 160);
set_msg_arg_int(5, ARG_BYTE, 160);
}
}
}
else if( pev(iPlrId, pev_iuser1)==4 )
{
static s_iSpectated;
if( 0<(s_iSpectated=pev(iPlrId, pev_iuser2))<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, s_iSpectated) )
{
static s_iSprite[9];
get_msg_arg_string(2, s_iSprite, 8);
if( g_bPlanted )
{
if( equal(s_iSprite, "c4") )
{
if( get_msg_arg_int(1) )
{
set_msg_arg_int(1, ARG_BYTE, 1);
set_msg_arg_int(3, ARG_BYTE, 160);
set_msg_arg_int(4, ARG_BYTE, 160);
set_msg_arg_int(5, ARG_BYTE, 160);
}
}
else if( equal(s_iSprite, "defuser") )
{
switch( get_msg_arg_int(1) )
{
case 1:
{
if( get_pdata_int(s_iSpectated, m_fBombDefusing, 5)&BombStatus_BeingDefusing )
{
set_msg_arg_int(3, ARG_BYTE, 255);
set_msg_arg_int(4, ARG_BYTE, 0);
set_msg_arg_int(5, ARG_BYTE, 0);
}
}
case 0:
{
if( get_pdata_int(s_iSpectated, m_fBombDefusing, 5)&BombStatus_BeingDefusing )
{
//set_msg_arg_int(1, ARG_BYTE, 2);
//set_msg_arg_int(3, ARG_BYTE, 0); // it appears that color code isn't sent when status is 0
//set_msg_arg_int(4, ARG_BYTE, 160);
//set_msg_arg_int(5, ARG_BYTE, 0);
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(2);
write_string("defuser");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
return PLUGIN_HANDLED;
}
}
}
}
}
else if( equal(s_iSprite, "defuser") )
{
if( get_msg_arg_int(1) )
{
set_msg_arg_int(3, ARG_BYTE, 160);
set_msg_arg_int(4, ARG_BYTE, 160);
set_msg_arg_int(5, ARG_BYTE, 160);
}
}
else if( equal(s_iSprite, "c4") )
{
if( get_msg_arg_int(1)==2 )
{
static Float:s_fGameTime;
s_fGameTime = get_gametime();
if( s_fGameTime<get_pdata_float(s_iSpectated, m_flProgressBarEndTime, 5) )
{
if( pev(s_iSpectated, pev_weapons)&(1<<CSW_C4) && get_user_weapon(s_iSpectated)==CSW_C4 )
{
set_msg_arg_int(1, ARG_BYTE, 1);
set_msg_arg_int(3, ARG_BYTE, 255);
set_msg_arg_int(4, ARG_BYTE, 0);
set_msg_arg_int(5, ARG_BYTE, 0);
}
}
}
}
}
}
}
return PLUGIN_CONTINUE;
}
public Message_BombDrop(iMsgId, iMsgType, iPlrId)
{
if( get_msg_arg_int(4) )
{
message_begin(MSG_ALL, g_iMsgId_BombPickup, _, _)
message_end();
if( !g_bPlanted )
{
g_bPlanted = true;
g_fPlantedAt = get_gametime();
new iSpectated;
for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
{
if( CheckPlayerBit(g_iConnected, iPlrId) )
{
if( CheckPlayerBit(g_iAlive, iPlrId) )
check_status_icon_at_planted(iPlrId, iPlrId);
else
{
if( pev(iPlrId, pev_iuser1)==4 )
{
if( 0<(iSpectated=pev(iPlrId, pev_iuser2))<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, iSpectated) )
check_status_icon_at_planted(iSpectated, iPlrId);
}
}
}
}
}
}
}
else if( g_bPlanted )
return PLUGIN_HANDLED;
return PLUGIN_CONTINUE;
}
public Message_RoundTime(iMsgId, iMsgType, iPlrId)
{
if( g_bPlanted )
{
SetPlayerBit(g_iIgnoreTimerFix, iPlrId);
message_begin(iMsgType, g_iMsgId_ShowTimer, _, iPlrId);
message_end();
new iTimerLeft = (g_iC4Timer-floatround((get_gametime()-g_fPlantedAt)));
if( iTimerLeft<1 )
iTimerLeft = 1;
set_msg_arg_int(1, ARG_SHORT, iTimerLeft);
}
else
{
if( get_msg_arg_int(1)<=0 )
set_msg_arg_int(1, ARG_SHORT, 1);
if( !CheckPlayerBit(g_iIgnoreTimerFix, iPlrId) )
{
SetPlayerBit(g_iIgnoreTimerFix, iPlrId);
message_begin(iMsgType, g_iMsgId_ShowTimer, _, iPlrId);
message_end();
}
}
return PLUGIN_CONTINUE;
}
public Message_TextMsg(iMsgId, iMsgType, iPlrId)
{
if( g_bCheckTxtMsg )
{
if( iMsgType==MSG_ONE && get_msg_arg_int(1)==print_center )
{
g_iBackupPlayerNum *= -1;
if( CheckPlayerBit(g_iBackupPlayerNum, iPlrId) )
{
new iText[32];
get_msg_arg_string(2, iText, 31);
if( equal(iText, "#C4_Defuse_Must_Be_On_Ground") )
{
set_pev(iPlrId, pev_flags, (pev(iPlrId, pev_flags)|FL_ONGROUND));
ClearPlayerBit(g_iBackupPlayerNum, iPlrId);
if( g_iBackupPlayerNum )
g_iBackupPlayerNum *= -1;
else
{
DisableHamForward(g_hh_Think_grenade_Post);
g_bCheckTxtMsg = false;
}
return PLUGIN_HANDLED;
}
}
g_iBackupPlayerNum *= -1;
}
}
return PLUGIN_CONTINUE;
}
public FM_EmitSound_Pre(iEnt, iChannel, iSample[], Float:fVolume, Float:fAttenuation, iFlags, iPitch)
{
if( g_bPlanted && iChannel==CHAN_ITEM && 0<iEnt<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, iEnt) )
{
if( equal(iSample, "weapons/c4_disarm.wav") )
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
static s_iClassName[9];
pev(iEnt, pev_classname, s_iClassName, 8);
if( s_iClassName[0]=='g' && s_iClassName[1]=='r' && s_iClassName[2]=='e' && s_iClassName[3]=='n' && s_iClassName[4]=='a' && s_iClassName[5]=='d' && s_iClassName[6]=='e' && !s_iClassName[7] )
{
switch( fm_cs_get_grenade_type(iEnt) )
{
case CSW_FLASHBANG:
{
if( equal(iSample, "weapons/flashbang-1.wav") || equal(iSample, "weapons/flashbang-2.wav") )
{
new Float:fOrigin[3];
pev(iEnt, pev_origin, fOrigin);
message_begin(MSG_ALL, SVC_TEMPENTITY);
write_byte(TE_DLIGHT);
engfunc(EngFunc_WriteCoord, fOrigin[0]);
engfunc(EngFunc_WriteCoord, fOrigin[1]);
engfunc(EngFunc_WriteCoord, fOrigin[2]);
write_byte(FLASH_RADIUS);
write_byte(FLASH_RED);
write_byte(FLASH_GREEN);
write_byte(FLASH_BLUE);
write_byte(FLASH_LIFE_MS);
write_byte(FLASH_DECAY_RATE);
message_end();
}
}
case CSW_HEGRENADE:
{
if( equal(iSample, "weapons/debris1.wav") || equal(iSample, "weapons/debris2.wav") || equal(iSample, "weapons/debris3.wav") )
{
new Float:fOrigin[3];
pev(iEnt, pev_origin, fOrigin);
message_begin(MSG_ALL, SVC_TEMPENTITY);
write_byte(TE_DLIGHT);
engfunc(EngFunc_WriteCoord, fOrigin[0]);
engfunc(EngFunc_WriteCoord, fOrigin[1]);
engfunc(EngFunc_WriteCoord, fOrigin[2]);
write_byte(HE_RADIUS);
write_byte(HE_RED);
write_byte(HE_GREEN);
write_byte(HE_BLUE);
write_byte(HE_LIFE_MS);
write_byte(HE_DECAY_RATE);
message_end();
}
}
}
}
return FMRES_IGNORED;
}
public FM_SetModel_Pre(iEnt, iModel[])
{
if( equal(iModel, "models/w_c4.mdl") )
{
static s_iClassName[9];
pev(iEnt, pev_classname, s_iClassName, 8);
if( equal(s_iClassName, "grenade") )
set_pev(iEnt, pev_effects, (pev(iEnt, pev_effects)|EF_NODRAW));
}
}
public Ham_Spawn_player_Post(iPlrId)
{
if( CheckPlayerBit(g_iConnected, iPlrId) )
{
if( is_user_alive(iPlrId) )
SetPlayerBit(g_iAlive, iPlrId);
else
ClearPlayerBit(g_iAlive, iPlrId);
}
else
ClearPlayerBit(g_iAlive, iPlrId);
}
public Ham_Killed_player_Post(iPlrId, iAttackerId, iShouldGib)
{
if( CheckPlayerBit(g_iConnected, iPlrId) )
{
if( is_user_alive(iPlrId) )
SetPlayerBit(g_iAlive, iPlrId);
else
{
ClearPlayerBit(g_iAlive, iPlrId);
ClearPlayerBit(g_iModifiedBuyZone, iPlrId);
}
}
else
ClearPlayerBit(g_iAlive, iPlrId);
message_begin(MSG_ONE, g_iMsgId_BarTime, _, iPlrId);
write_short(0);
message_end();
write_statusicon(iPlrId, 0, "defuser", 0, 0, 0, true);
}
public Ham_Spawn_grenade_Post(iEnt)
{
if( pev_valid(iEnt) )
engfunc(EngFunc_SetSize, iEnt, Float:{-0.021, -0.021, -0.021}, Float:{0.021, 0.021, 0.021});
}
public Ham_Use_grenade_Pre(iEnt, iCallerId, iActivatorId, iUseType, Float:fValue)
{
static s_iBombStatus;
s_iBombStatus = get_pdata_int(iEnt, m_fBombStatus, 5);
if( (~s_iBombStatus&BOMB_PLANTED) || (s_iBombStatus&BOMB_DEFUSING) || get_pdata_int(iEnt, m_bJustBlew, 5) )
return HAM_IGNORED;
if( 0<iCallerId<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, iCallerId) )
{
if( get_pdata_int(iCallerId, m_iTeam, 5)==CS_TEAM_CT )
{
if( pev(iCallerId, pev_flags)&FL_ONGROUND )
{
if( is_user_in_secondary_attack(iCallerId, true) )
return HAM_SUPERCEDE;
emit_sound(iEnt, CHAN_WEAPON, "weapons/c4_disarm.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}
else if( is_user_in_secondary_attack(iCallerId, true) )
return HAM_SUPERCEDE;
else
{
static Float:s_fGameTime;
s_fGameTime = get_gametime();
if( (get_pdata_float(iCallerId, m_flProgressBarEndTime, 5)+0.5)<s_fGameTime )
{
set_pdata_float(iCallerId, m_flProgressBarEndTime, s_fGameTime, 5);
message_begin(MSG_ONE, g_iMsgId_TextMsg, _, iCallerId);
write_byte(print_center);
write_string("#C4_Defuse_Must_Be_On_Ground");
message_end();
}
return HAM_SUPERCEDE;
}
}
}
}
return HAM_IGNORED;
}
public Ham_Think_grenade_Pre(iEnt)
{
switch( fm_cs_get_grenade_type(iEnt) )
{
case CSW_FLASHBANG: check_grenade_pre_explosion(iEnt);
case CSW_HEGRENADE:
{
if( pev(iEnt, pev_waterlevel) )
check_grenade_pre_explosion(iEnt);
}
case CSW_C4:
{
if( pev(iEnt, pev_movetype)!=MOVETYPE_NONE )
{
engfunc(EngFunc_SetSize, iEnt, Float:{-0.021, -0.021, -0.021}, Float:{0.021, 0.021, 0.021});
set_pev(iEnt, pev_solid, SOLID_NOT);
set_pev(iEnt, pev_effects, (pev(iEnt, pev_effects)&~EF_NODRAW));
new iPlayer = pev(iEnt, pev_owner);
if( 0<iPlayer<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iConnected, iPlayer) )
{
new Float:fAngles[3], Float:fAngle;
pev(iPlayer, pev_v_angle, fAngles);
fAngle = (fAngles[1]+90.0);
pev(iEnt, pev_angles, fAngles);
fAngles[1] = fAngle;
set_pev(iEnt, pev_angles, fAngles);
}
}
g_iBackupPlayerNum = 0;
for( iPlayer=1; iPlayer<=g_iMaxPlayers; iPlayer++ )
{
if( CheckPlayerBit(g_iConnected, iPlayer) )
{
g_iBackupInfo[g_iBackupPlayerNum][0] = iPlayer;
g_iBackupInfo[g_iBackupPlayerNum][1] = pev(iPlayer, pev_solid);
set_pev(iPlayer, pev_solid, SOLID_NOT);
g_iBackupPlayerNum++;
}
}
engfunc(EngFunc_DropToFloor, iEnt);
for( iPlayer=0; iPlayer<g_iBackupPlayerNum; iPlayer++ )
set_pev(g_iBackupInfo[iPlayer][0], pev_solid, g_iBackupInfo[iPlayer][1]);
g_iBackupPlayerNum = 0;
set_pev(iEnt, pev_movetype, MOVETYPE_NONE);
}
static Float:s_fGameTime;
s_fGameTime = get_gametime();
if( get_pdata_float(iEnt, m_flC4Blow, 5)<=s_fGameTime )
{
if( pev(iEnt, pev_waterlevel) )
{
set_pev(iEnt, pev_waterlevel, 0);
set_pev(iEnt, pev_flags, (pev(iEnt, pev_flags)|FL_INWATER));
}
else if( pev(iEnt, pev_flags)&FL_INWATER )
grenade_pre_explosion();
set_pdata_float(iEnt, m_flDefuseCountDown, (s_fGameTime+0.5), 5); // prevent defuse and explosion at the same time
}
else
{
if( !g_bIsCzero )
{
if( get_pdata_float(iEnt, m_flNextFreq, 5)<=s_fGameTime )
{
message_begin(MSG_ALL, g_iMsgId_Scenario);
write_byte(1);
write_string("bombticking");
write_byte(255);
switch( get_pdata_int(iEnt, m_iC4Beep, 5) )
{
case 0: write_short(140);
case 1: write_short(70);
case 2: write_short(40);
case 3: write_short(30);
default: write_short(20);
}
write_short(0);
message_end();
}
}
if( get_pdata_int(iEnt, m_fBombStatus, 5)&BOMB_DEFUSING )
{
/*static s_iDefuser;
s_iDefuser = get_pdata_ent(iEnt, m_hDefuser, 5); // this doesn't work - get_pdata_ent() doesn't work for this
if( 0<s_iDefuser<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, s_iDefuser) )
{
if( get_pdata_int(s_iDefuser, m_fBombDefusing, 5)&BombStatus_BeingDefusing && (get_pdata_float(s_iDefuser, m_flProgressBarStartTime, 5)+0.5)<=s_fGameTime && ~pev(s_iDefuser, pev_button)&IN_USE )
set_pdata_float(iEnt, m_flNextDefuseTime, 1.0, 5);
}
}*/
g_iBackupPlayerNum = 0;
static s_iPlayer, s_iFlags;
for( s_iPlayer=1; s_iPlayer<=g_iMaxPlayers; s_iPlayer++ )
{
if( CheckPlayerBit(g_iAlive, s_iPlayer) )
{
if( get_pdata_int(s_iPlayer, m_fBombDefusing, 5)&BombStatus_BeingDefusing
&& (((get_pdata_float(s_iPlayer, m_flProgressBarStartTime, 5)+0.5)<=s_fGameTime
&& ~pev(s_iPlayer, pev_button)&IN_USE) || is_user_in_secondary_attack(s_iPlayer)) )
{
if( (s_iFlags=pev(s_iPlayer, pev_flags))&FL_ONGROUND )
{
SetPlayerBit(g_iBackupPlayerNum, s_iPlayer);
set_pev(s_iPlayer, pev_flags, (s_iFlags&~FL_ONGROUND));
}
}
}
}
if( g_iBackupPlayerNum )
{
g_iBackupPlayerNum *= -1;
g_bCheckTxtMsg = true;
EnableHamForward(g_hh_Think_grenade_Post);
}
}
}
}
}
}
public Ham_Think_grenade_Post(iEnt)
{
if( g_iBackupPlayerNum>0 )
{
for( new iLoop; iLoop<g_iBackupPlayerNum; iLoop++ )
set_pev(g_iBackupInfo[iLoop][0], pev_waterlevel, g_iBackupInfo[iLoop][1]);
}
else if( g_iBackupPlayerNum<0 )
{
g_iBackupPlayerNum *= -1;
for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
{
if( CheckPlayerBit(g_iBackupPlayerNum, iPlrId) && CheckPlayerBit(g_iAlive, iPlrId) )
set_pev(iPlrId, pev_flags, (pev(iPlrId, pev_flags)|FL_ONGROUND));
}
g_bCheckTxtMsg = false;
}
g_iBackupPlayerNum = 0;
DisableHamForward(g_hh_Think_grenade_Post);
}
public Ham_Touch_grenade_Pre(iGrenEnt, iEnt)
{
if( pev_valid(iGrenEnt) && pev_valid(iEnt) )
{
static s_iClassName[16];
pev(iEnt, pev_classname, s_iClassName, 15);
if( equal(s_iClassName, "func_breakable") && pev(iEnt, pev_rendermode) )
{
static Float:s_fVelocity[3];
pev(iGrenEnt, pev_velocity, s_fVelocity);
g_fOldSpeed = vector_length(s_fVelocity);
}
else
g_fOldSpeed = 0.0;
}
else
g_fOldSpeed = 0.0;
}
public Ham_Touch_grenade_Post(iGrenEnt, iEnt)
{
if( g_fOldSpeed )
{
if( pev_valid(iGrenEnt) )
{
static Float:s_fVelocity[3], Float:s_fFraction;
pev(iGrenEnt, pev_velocity, s_fVelocity);
s_fFraction = (vector_length(s_fVelocity)/g_fOldSpeed);
if( s_fFraction>1.0 )
{
s_fVelocity[0] /= s_fFraction;
s_fVelocity[1] /= s_fFraction;
s_fVelocity[2] /= s_fFraction;
}
if( s_fFraction>0.5 )
{
s_fVelocity[0] *= 0.5;
s_fVelocity[1] *= 0.5;
s_fVelocity[2] *= 0.5;
}
set_pev(iGrenEnt, pev_velocity, s_fVelocity);
}
}
}
public Ham_Wpn_SecAttack_Post(iWpnEnt)
{
if( g_bPlanted && pev_valid(iWpnEnt) )
{
if( get_pdata_float(iWpnEnt, m_flNextSecondaryAttack, 4)>0.0 )
{
static s_iPlrId;
if( 0<(s_iPlrId=get_pdata_cbase(iWpnEnt, m_pPlayer, 4))<=g_iMaxPlayers )
{
if( CheckPlayerBit(g_iAlive, s_iPlrId) )
{
if( get_pdata_int(s_iPlrId, m_fBombDefusing, 5)&BombStatus_BeingDefusing )
cancel_defuse_now(s_iPlrId, (get_gametime()+1.0));
}
}
}
}
}
public find_c4()
{
if( g_fRoundStartedAt>=0.0 )
{
new Float:fBuyTime = (get_pcvar_float(g_iCvar_buytime)*60.0);
if( fBuyTime<15.0 )
fBuyTime = 15.0;
fBuyTime += g_fFreezeTime;
new bool:bBuyTimePassed = (((get_gametime()-g_fRoundStartedAt)>fBuyTime)?true:false);
for( new iPlrId=1; iPlrId<=g_iMaxPlayers; iPlrId++ )
{
if( CheckPlayerBit(g_iAlive, iPlrId) )
{
if( get_pdata_int(iPlrId, m_iMapZone, 5)&CS_MAPZONE_BUY )
{
if( CheckPlayerBit(g_iModifiedBuyZone, iPlrId) )
{
if( !bBuyTimePassed )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(1);
write_string("buyzone");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
ClearPlayerBit(g_iModifiedBuyZone, iPlrId);
}
}
else if( bBuyTimePassed )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iPlrId);
write_byte(1);
write_string("buyzone");
write_byte(160);
write_byte(160);
write_byte(160);
message_end();
SetPlayerBit(g_iModifiedBuyZone, iPlrId);
}
}
}
}
}
if( !g_bPlanted )
{
new iEnt, iOwner;
while( (iEnt=engfunc(EngFunc_FindEntityByString, iEnt, "classname", "weapon_c4"))>0 )
{
if( pev_valid(iEnt) )
{
iOwner = pev(iEnt, pev_owner);
if( iOwner>g_iMaxPlayers && pev_valid(iOwner) )
{
message_begin(MSG_ALL, g_iMsgId_BombPickup);
message_end();
new Float:fOrigin[3];
pev(iOwner, pev_origin, fOrigin);
message_begin(MSG_ALL, g_iMsgId_BombDrop);
engfunc(EngFunc_WriteCoord, fOrigin[0]);
engfunc(EngFunc_WriteCoord, fOrigin[1]);
engfunc(EngFunc_WriteCoord, fOrigin[2]);
write_byte(0);
message_end();
break;
}
}
}
}
}
write_statusicon(iPlrId, iEffect, iSprite[], iRed, iGreen, iBlue, bool:bRemoveBarTime=false)
{
for( new iSpectator=1; iSpectator<=g_iMaxPlayers; iSpectator++ )
{
if( iPlrId==iSpectator )
{
if( iEffect>=0 )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iSpectator);
write_byte(iEffect);
write_string(iSprite);
if( iEffect )
{
write_byte(iRed);
write_byte(iGreen);
write_byte(iBlue);
}
message_end();
}
}
else if( CheckPlayerBit(g_iConnected, iSpectator) && !CheckPlayerBit(g_iAlive, iSpectator) )
{
if( pev(iSpectator, pev_iuser2)==iPlrId && pev(iSpectator, pev_iuser1)==4 )
{
if( iEffect>=0 )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iSpectator);
write_byte(iEffect);
write_string(iSprite);
if( iEffect )
{
write_byte(iRed);
write_byte(iGreen);
write_byte(iBlue);
}
message_end();
}
if( bRemoveBarTime )
{
message_begin(MSG_ONE, g_iMsgId_BarTime, _, iSpectator);
write_short(0);
message_end();
}
}
}
}
}
check_status_icon_at_planted(iSpectated, iSpectator)
{
switch( get_pdata_int(iSpectated, m_iTeam, 5) )
{
case CS_TEAM_CT:
{
if( get_pdata_int(iSpectated, m_fHasDefuseKit, 5)&HAS_DEFUSE_KIT )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iSpectator);
write_byte(1);
write_string("defuser");
write_byte(0);
write_byte(160);
write_byte(0);
message_end();
}
}
case CS_TEAM_T:
{
if( pev(iSpectated, pev_weapons)&(1<<CSW_C4) )
{
message_begin(MSG_ONE, g_iMsgId_StatusIcon, _, iSpectator);
write_byte(1);
write_string("c4");
write_byte(160);
write_byte(160);
write_byte(160);
message_end();
}
}
}
}
check_grenade_pre_explosion(iEnt)
{
static Float:s_fDmgTime;
pev(iEnt, pev_dmgtime, s_fDmgTime);
if( s_fDmgTime<=get_gametime() )
grenade_pre_explosion();
}
grenade_pre_explosion()
{
g_iBackupPlayerNum = 0;
for( new iPlayer=1; iPlayer<=g_iMaxPlayers; iPlayer++ )
{
if( CheckPlayerBit(g_iAlive, iPlayer) )
{
g_iBackupInfo[g_iBackupPlayerNum][0] = iPlayer;
g_iBackupInfo[g_iBackupPlayerNum][1] = pev(iPlayer, pev_waterlevel);
set_pev(iPlayer, pev_waterlevel, 1);
g_iBackupPlayerNum++;
}
}
if( g_iBackupPlayerNum )
EnableHamForward(g_hh_Think_grenade_Post);
}
bool:is_user_in_secondary_attack(iPlrId, bool:bCheckPreAttack=false)
{
new iWpnEnt = get_pdata_cbase(iPlrId, m_pActiveItem, 5);
if( pev_valid(iWpnEnt) )
{
if( get_pdata_float(iWpnEnt, m_flNextSecondaryAttack, 4)>0.0 )
return true;
else if( bCheckPreAttack )
{
if( pev(iPlrId, pev_button)&IN_ATTACK2 )
{
switch( get_pdata_int(iWpnEnt, m_iId, 4) )
{
case CSW_AWP, CSW_SCOUT, CSW_G3SG1, CSW_SG550, CSW_SG552, CSW_AUG: return true;
default: return false;
}
}
}
}
return false;
}
cancel_defuse_now(iPlrId, Float:fSafeGameTime) // fSafeGameTime is get_gametime()+1.0
{
new iEnt, Float:fNextThink, Float:fNextFreq, Float:fNextBeep, Float:fNextBlink, Float:fC4Blow, Float:fDefuseCountDown, iFlags, bool:bIsOnGround;
new bool:bMsgBackUp = g_bCheckTxtMsg;
new iPlrBackup = g_iBackupPlayerNum;
iFlags = pev(iPlrId, pev_flags);
if( iFlags&FL_ONGROUND )
{
set_pev(iPlrId, pev_flags, (iFlags&~FL_ONGROUND));
bIsOnGround = true;
}
if( bMsgBackUp )
{
DisableHamForward(g_hh_Think_grenade_Post);
g_bCheckTxtMsg = false;
}
while( (iEnt=engfunc(EngFunc_FindEntityByString, iEnt, "classname", "grenade"))>0 )
{
if( pev_valid(iEnt) )
{
if( get_pdata_int(iEnt, m_fBombStatus, 5)&(BOMB_PLANTED|BOMB_DEFUSING) )
{
pev(iEnt, pev_nextthink, fNextThink);
fNextFreq = get_pdata_float(iEnt, m_flNextFreq, 5);
fNextBeep = get_pdata_float(iEnt, m_flNextBeep, 5);
fNextBlink = get_pdata_float(iEnt, m_flNextBlink, 5);
fC4Blow = get_pdata_float(iEnt, m_flC4Blow, 5);
fDefuseCountDown = get_pdata_float(iEnt, m_flDefuseCountDown, 5);
set_pev(iEnt, pev_nextthink, fSafeGameTime);
set_pdata_float(iEnt, m_flNextFreq, fSafeGameTime, 5);
set_pdata_float(iEnt, m_flNextBeep, fSafeGameTime, 5);
set_pdata_float(iEnt, m_flNextBlink, fSafeGameTime, 5);
set_pdata_float(iEnt, m_flC4Blow, fSafeGameTime, 5);
set_pdata_float(iEnt, m_flDefuseCountDown, fSafeGameTime, 5);
if( bIsOnGround )
{
g_iBackupPlayerNum = 0;
SetPlayerBit(g_iBackupPlayerNum, iPlrId);
g_iBackupPlayerNum *= -1;
g_bCheckTxtMsg = true;
ExecuteHam(Ham_Think, iEnt);
g_bCheckTxtMsg = false;
}
else
ExecuteHam(Ham_Think, iEnt);
set_pev(iEnt, pev_nextthink, fNextThink);
set_pdata_float(iEnt, m_flNextFreq, fNextFreq, 5);
set_pdata_float(iEnt, m_flNextBeep, fNextBeep, 5);
set_pdata_float(iEnt, m_flNextBlink, fNextBlink, 5);
set_pdata_float(iEnt, m_flC4Blow, fC4Blow, 5);
if( get_pdata_int(iEnt, m_fBombStatus, 5)&BOMB_DEFUSING )
set_pdata_float(iEnt, m_flDefuseCountDown, fDefuseCountDown, 5);
}
}
}
if( bIsOnGround && CheckPlayerBit(g_iAlive, iPlrId) )
set_pev(iPlrId, pev_flags, (pev(iPlrId, pev_flags)|FL_ONGROUND));
if( bMsgBackUp )
{
g_bCheckTxtMsg = true;
g_iBackupPlayerNum = iPlrBackup;
EnableHamForward(g_hh_Think_grenade_Post);
}
}
fm_cs_get_grenade_type(iEnt)
{
// you can comment/remove this
// if you are sure that the entity
// with the given index are valid
//if( !pev_valid(iEnt) )
// return 0;
// you can comment/remove this
// if you are sure that the entity
// with the given index are "grenade"
//new iClassname[9];
//pev(iEnt, pev_classname, iClassname, 8);
//if( !equal(classname, "grenade") )
// return 0;
//if( get_pdata_int(iEnt, 96, 5)&(1<<8) ) // m_fBombStatus & m_fPlantedC4 || m_bIsC4 & IS_C4
if( get_pdata_int(iEnt, m_fBombStatus, 5)&BOMB_PLANTED )
return CSW_C4;
//new iBits = get_pdata_int(iEnt, 114, 5); // m_usEvent || m_iGrenadeType
new iBits = get_pdata_int(iEnt, m_usEvent, 5);
if( iBits&(1<<0) )
return CSW_HEGRENADE;
else if( iBits&(1<<1) )
return CSW_SMOKEGRENADE;
else if( !iBits )
return CSW_FLASHBANG;
return 0
}