PHP Code:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <fun>
#tryinclude <cstrike_pdatas>
#if !defined _cbaseentity_included
#assert Cstrike Pdatas and Offsets library required! Read the below instructions: \
1. Download it at forums.alliedmods.net/showpost.php?p=1712101#post1712101 \
2. Put it into amxmodx/scripting/include/ folder \
3. Compile this plugin locally, details: wiki.amxmodx.org/index.php/Compiling_Plugins_%28AMX_Mod_X%29 \
4. Install compiled plugin, details: wiki.amxmodx.org/index.php/Configuring_AMX_Mod_X#Installing
#endif
#define PLUGIN "Pause"
#define VERSION "0.1.0"
new const Float:VEC_DUCK_HULL_MIN[3] = {-16.0, -16.0, -18.0 }
new const Float:VEC_DUCK_HULL_MAX[3] = { 16.0, 16.0, 32.0 }
new const Float:VEC_DUCK_VIEW[3] = { 0.0, 0.0, 12.0 }
new const Float:VEC_NULL[3] = { 0.0, 0.0, 0.0 }
new m_usResetDecals
new Float:g_flNewRoundTime
new Float:g_flPlayersOrigin[33][3]
new Float:g_flPlayersAngles[33][3]
new Float:g_flPlayersGravity[33]
new g_pPlayerItems[33][6]
enum {
PAUSED_NOT,
PAUSED_ONLY_RESPAWN,
PAUSED_RESTORE
}
enum _:hudHide ( <<= 1 )
{
HUD_HIDE_CAL = 1,
HUD_HIDE_FLASH,
HUD_HIDE_ALL,
HUD_HIDE_RHA,
HUD_HIDE_TIMER,
HUD_HIDE_MONEY,
HUD_HIDE_CROSS,
HUD_DRAW_CROSS
}
enum _:physicFlags ( <<= 1 )
{
PFLAG_ONLADDER_ONSWING = 1,
PFLAG_ONTRAIN,
PFLAG_ONBARNACLE,
PFLAG_DUCKING, // In the process of ducking, but totally squatted yet
PFLAG_USING, // Using a continuous entity
PFLAG_OBSERVER // player is locked in stationary cam mode. Spectators can move, observers can't.
}
enum _USE_TYPE
{
USE_OFF = 0,
USE_ON = 1,
USE_SET = 2,
USE_TOGGLE = 3
}
enum _BOOL
{
FALSE,
TRUE
}
enum _:observerModes
{
OBS_NONE,
OBS_CHASE_LOCKED,
OBS_CHASE_FREE,
OBS_ROAMING,
OBS_IN_EYE,
OBS_MAP_FREE,
OBS_MAP_CHASE
}
new g_iPausedStatus[33 char]
new HamHook:g_iHhCBasePlayerRoundRespawn
public plugin_init()
{
register_event("HLTV", "Event_HLTV_New_Round", "a", "1=0", "2=0")
m_usResetDecals = engfunc(EngFunc_PrecacheEvent, 1, "events/decal_reset.sc")
register_forward(FM_PlaybackEvent, "OnPlaybackEvent")
DisableHamForward
(
g_iHhCBasePlayerRoundRespawn = RegisterHam(Ham_CS_RoundRespawn, "player", "OnCBasePlayer_RoundRespawn", false)
)
register_clcmd("say /pause", "ClCmd_Pause")
register_clcmd("say_team /pause", "ClCmd_Pause")
register_message(get_user_msgid("ClCorpse"), "Message_ClCorpse")
}
public Message_ClCorpse()
{
if( g_iPausedStatus{ get_msg_arg_int(12) } )
{
return PLUGIN_HANDLED
}
return PLUGIN_CONTINUE
}
public client_putinserver(id)
{
g_iPausedStatus{id} = PAUSED_NOT
}
public Event_HLTV_New_Round()
{
g_flNewRoundTime = get_gametime()
EnableHamForward( g_iHhCBasePlayerRoundRespawn )
}
public OnCBasePlayer_RoundRespawn( id )
{
switch( g_iPausedStatus{id} )
{
case PAUSED_RESTORE:
{
g_iPausedStatus{id} = PAUSED_ONLY_RESPAWN
for(new i=1; i<=5; i++)
{
set_pdata_cbase(id, m_rgpPlayerItems_CBasePlayer[i], g_pPlayerItems[id][i])
}
strip_user_weapons(id)
set_pdata_int(id, m_fHasPrimary, FALSE)
return HAM_SUPERCEDE
}
case PAUSED_ONLY_RESPAWN:
{
return HAM_SUPERCEDE
}
}
return HAM_IGNORED
}
public OnPlaybackEvent(flags, entid, eventid /* , Float:delay, Float:Origin[3], Float:Angles[3], Float:fparam1, Float:fparam2, iparam1, iparam2, bparam1, bparam2 */ )
{
if( eventid == m_usResetDecals && !floatcmp(get_gametime(), g_flNewRoundTime) )
{
DisableHamForward( g_iHhCBasePlayerRoundRespawn )
}
}
public ClCmd_Pause( id )
{
switch( g_iPausedStatus{id} )
{
case PAUSED_NOT :
{
if( is_user_alive(id) )
{
if( get_user_health(id) < 100 )
{
client_print(id, print_chat, " ** [PAUSE] You must have 100HP !!")
return
}
if( ~pev(id, pev_flags) & FL_ONGROUND )
{
client_print(id, print_chat, " ** [PAUSE] You must be on the ground !!")
return
}
new Float:velocity[3]
pev(id, pev_velocity, velocity)
if( vector_length(velocity) > 0.0 )
{
client_print(id, print_chat, " ** [PAUSE] You mustn't move !!")
return
}
pev(id, pev_origin, g_flPlayersOrigin[id])
pev(id, pev_v_angle, g_flPlayersAngles[id])
pev(id, pev_gravity, g_flPlayersGravity[id])
if( user_has_weapon(id, CSW_C4) )
{
engclient_cmd(id, "drop", "weapon_c4")
}
for(new i=1; i<=5; i++)
{
g_pPlayerItems[id][i] = get_pdata_cbase(id, m_rgpPlayerItems_CBasePlayer[i])
set_pdata_cbase(id, m_rgpPlayerItems_CBasePlayer[i], FM_NULLENT) // so CBasePlayer::HasWeapon return 0 and weapons are not stripped
}
set_pev(id, pev_deadflag, DEAD_DEAD)
StartObserver(id, g_flPlayersOrigin[id], g_flPlayersAngles[id])
g_iPausedStatus{id} = PAUSED_RESTORE
}
else
{
g_iPausedStatus{id} = PAUSED_ONLY_RESPAWN
}
}
case PAUSED_ONLY_RESPAWN:
{
g_iPausedStatus{id} = PAUSED_NOT
ExecuteHamB(Ham_CS_RoundRespawn, id)
}
case PAUSED_RESTORE:
{
g_iPausedStatus{id} = PAUSED_NOT
set_pdata_int(id, m_iClientHideHUD, -1)
set_pdata_cbase(id, m_pClientActiveItem, FM_NULLENT)
for(new i=1; i<=5; i++)
{
set_pdata_cbase(id, m_rgpPlayerItems_CBasePlayer[i], g_pPlayerItems[id][i])
}
ExecuteHam(Ham_Spawn, id) // reset values
Util_SetOrigin(id, g_flPlayersOrigin[id], g_flPlayersAngles[id], g_flPlayersGravity[id])
new iActiveItem = get_pdata_cbase(id, m_pActiveItem)
if( iActiveItem > 0 )
{
ExecuteHamB(Ham_Item_Deploy, iActiveItem)
}
}
}
}
StartObserver(id, Float:origin[3], Float:angles[3])
{
Util_TE_KILLPLAYERATTACHMENTS( id )
new iTank = get_pdata_ent(id, m_pTank_pent)
if( iTank && pev_valid(iTank) )
{
ExecuteHamB(Ham_Use, iTank, id, id, USE_OFF, 0.0)
// m_pTank = NULL;
}
// in cs routine this is before m_pTank check but m_pTank->StopControl can make player deploy m_pActiveItem
new iActiveItem = get_pdata_cbase(id, m_pActiveItem)
if( iActiveItem > 0 )
{
ExecuteHam(Ham_Item_Holster, iActiveItem, 0)
}
Util_CurWeapon(id, 0, 0xFF, 0xFF)
set_pev(id, pev_fov, 0.0)
set_pdata_int(id, m_iFOV, 0)
set_pdata_int(id, m_iClientFOV, 0)
Util_SetFov(id, 0)
set_pdata_int(id, m_iHideHUD, HUD_HIDE_RHA | HUD_HIDE_CAL)
// set_pdata_int(id, m_afPhysicsFlags, get_pdata_int(id, m_afPhysicsFlags) | PFLAG_OBSERVER) // this would prevent player from moving
set_pev(id, pev_solid, SOLID_NOT)
set_pev(id, pev_effects, /* pev(id, pev_effects) | */ EF_NODRAW)
set_pev(id, pev_view_ofs, VEC_NULL)
set_pev(id, pev_v_angle, angles)
set_pev(id, pev_angles, angles)
set_pev(id, pev_fixangle, 1)
set_pev(id, pev_solid, SOLID_NOT)
set_pev(id, pev_takedamage, DAMAGE_NO)
set_pev(id, pev_movetype, MOVETYPE_NONE)
engfunc(EngFunc_SetOrigin, id, origin)
set_pdata_int(id, m_afPhysicsFlags, get_pdata_int(id, m_afPhysicsFlags) & ~PFLAG_DUCKING)
set_pev(id, pev_flags, pev(id, pev_flags) & ~FL_DUCKING)
set_pev(id, pev_health, 0.0)
set_pdata_int(id, m_iSpectatedPlayerWeaponId, 0)
set_pdata_int(id, m_fHasSpectatedPlayerC4, FALSE)
set_pdata_int(id, m_fHasSpectatedPlayerDefuseKit, FALSE)
set_pdata_float(id, m_flNextSpecButtonTime, 0.0)
// set_pev(id, pev_iuser1, 0)
// since we don't want to make Observer_SetMode yet, try to set free look.
set_pev(id, pev_iuser1, OBS_ROAMING)
set_pev(id, pev_iuser2, 0)
set_pev(id, pev_iuser3, 0)
set_pdata_int(id, m_iObserverMode, OBS_ROAMING)
set_pdata_int(id, m_fObserverHasTarget, FALSE)
set_pdata_float(id, m_flFindNextPlayerTime, 0.0)
Util_Crosshair(id, 1)
// if ( g_pGameRules
// && CBasePlayer::StartObserver_Vector_Vector_::iFirstTime
// && CHalfLifeMultiplay::IsCareer(g_pGameRules)
// && !is_user_bot(id) )
// {
// CBasePlayer::Observer_SetMode(this, 1);
// (g_engfuncs.pfnClientCommand)(this->pev->pContainingEntity, "spec_autodirector_internal 1\n");
// CBasePlayer::StartObserver_Vector_Vector_::iFirstTime = 0;
// }
// else
// {
// CBasePlayer::Observer_SetMode(this, this->m_iObserverMode);
// }
ExecuteHamB(Ham_CS_Player_ResetMaxSpeed, id)
Util_Spectator(0, id, 1)
}
Util_SetOrigin(id, Float:origin[3], Float:angles[3], Float:gravity)
{
set_pev(id, pev_flags, pev(id, pev_flags) | FL_DUCKING)
engfunc(EngFunc_SetSize, id, VEC_DUCK_HULL_MIN, VEC_DUCK_HULL_MAX)
engfunc(EngFunc_SetOrigin, id, origin)
set_pev(id, pev_view_ofs, VEC_DUCK_VIEW)
set_pev(id, pev_v_angle, VEC_NULL)
set_pev(id, pev_velocity, VEC_NULL)
set_pev(id, pev_angles, angles)
set_pev(id, pev_punchangle, VEC_NULL)
set_pev(id, pev_fixangle, 1)
set_pev(id, pev_gravity, gravity)
set_pev(id, pev_fuser2, 0.0)
}
Util_TE_KILLPLAYERATTACHMENTS(id)
{
new origin[3];
get_user_origin(id, origin);
message_begin(MSG_PAS, SVC_TEMPENTITY, origin);
write_byte(TE_KILLPLAYERATTACHMENTS);
write_byte(id);
message_end();
}
Util_CurWeapon(id, IsActive, WeaponID, ClipAmmo)
{
static _msgCurWeapon = 0;
if( !_msgCurWeapon )
{
_msgCurWeapon = get_user_msgid("CurWeapon");
}
message_begin(id ? MSG_ONE : MSG_ALL, _msgCurWeapon, .player=id);
write_byte(IsActive);
write_byte(WeaponID);
write_byte(ClipAmmo);
message_end();
}
Util_SetFov(id, Degrees)
{
static _msgSetFOV = 0;
if( !_msgSetFOV )
{
_msgSetFOV = get_user_msgid("SetFOV");
}
message_begin(id ? MSG_ONE : MSG_ALL, _msgSetFOV, .player=id);
write_byte(Degrees);
message_end();
}
Util_Spectator( id , playerIndex, flag )
{
static _msgSpectator = 0;
if( !_msgSpectator )
{
_msgSpectator = get_user_msgid("Spectator");
}
message_begin(id ? MSG_ONE : MSG_ALL, _msgSpectator, .player = id);
write_byte(playerIndex);
write_byte(flag);
message_end();
}
Util_Crosshair(id, iStatus)
{
static _msgCrosshair = 0
if( !_msgCrosshair )
{
_msgCrosshair = get_user_msgid("Crosshair")
}
message_begin(id ? MSG_ONE : MSG_ALL, _msgCrosshair, .player=id)
write_byte(iStatus)
message_end()
}