#if defined _roundcontrol_included
	#endinput
#endif

#define _roundcontrol_included

#if AMXX_VERSION_NUM >= 175
	#pragma reqlib roundcontrol
	#if !defined AMXMODX_NOAUTOLOAD
		#pragma loadlib roundcontrol
	#endif
#else
	#pragma library roundcontrol
#endif

#define DONT_REG			-1
#define BLOCK_BOTH			0
#define BLOCK_ONLY_EXPIRED		1

#define FLAG_RETRACT_EXPIRED		(1<<0)							/* Этот флаг убирает перехват функции HasRoundTimeExpired за ненадобностью. */

#define RC_NONE				0
#define RC_SOUND			(1<<0)							/* Воспроизводить звук победы. */
#define RC_MESSAGE			(1<<1)							/* Сообщение окончания раунда. ( Автоматически составляет сообщение по событии eventid ) */
#define RC_SCORE			(1<<2)							/* Прибавлять команде победные очки. */

#define RC_ALL_AUTO			(RC_SOUND|RC_SCORE)
#define RC_ALL_CUSTOM			(RC_SOUND|RC_MESSAGE|RC_SCORE)

#define ROUND_CONTINUE			0							/* Продолжает выполнение функции */
#define ROUND_SUPERCEDE			4							/* Блокирует дальнейшее выполнение функции */

enum (+= 4)
{
	m_bFreezePeriod = 4,
	m_bBombDropped,

	m_flRestartRoundTime = 48,		// +4 float	| W.48 | L.40
	m_flCheckWinConditions,			// +4 float	| W.52 | L.44
	m_fRoundCount,				// +4 float	| W.56 | L.48
	m_iRoundTime,				// +4 int	| W.60 | L.52
	m_iRoundTimeSecs,			// +4 int	| W.64 | L.56
	m_iIntroRoundTime,			// +4 int	| W.68 | L.60
	m_fIntroRoundCount,			// +4 int	| W.72 | L.64
	m_iAccountTerrorist,			// +4 int	| W.76 | L.68
	m_iAccountCT,				// +4 int	| W.80 | L.68
	m_iNumTerrorist,			// +4 int	| W.84 | L.76
	m_iNumCT,				// +4 int	| W.88 | L.80
	m_iNumSpawnableTerrorist,		// +4 int	| W.92 | L.84
	m_iNumSpawnableCT,			// +4 int	| W.96 | L.88
	m_iSpawnPointCount_Terrorist,		// +4 int	| W.100 | L.92
	m_iSpawnPointCount_CT,			// +4 int	| W.104 | L.96
	m_iHostagesRescued,			// +4 int	| W.108 | L.100
	m_iHostagesTouched,			// +4 int	| W.112 | L.104
	m_iRoundWinStatus,			// +4 int	| W.116 | L.108
	m_iNumCTWins,				// +2 short	| W.120 | L.112
	m_iNumTerroristWins = 122,		// +2 short	| W.122 | L.114
	m_bTargetBombed = 124,			// +1 bool	| W.124 | L.116
	m_bBombDefused = 125,			// +1 bool	| W.125 | L.117
	m_bMapHasBombTarget = 126,		// +1 bool	| W.126 | L.118
	m_bMapHasBombZone = 127,		// +1 bool	| W.127 | L.119
	m_bMapHasBuyZone = 128,			// +1 bool	| W.128 | L.120
	m_bMapHasRescueZone = 129,		// +1 bool	| W.129 | L.121
	m_bMapHasEscapeZone = 130,		// +1 bool	| W.130 | L.122
	m_iMapHasVIPSafetyZone = 132,		// +4 int	| W.132 | L.124
	m_bMapHasCameras,			// +4 bool	| W.136 | L.128
	m_iC4Timer,				// +4 int	| W.140 | L.132
	m_iC4Guy,				// +4 int	| W.144 | L.136
	m_iLoserBonus,				// +4 int	| W.148 | L.140
	m_iNumConsecutiveCTLoses,		// +4 int	| W.152 | L.144
	m_iNumConsecutiveTerroristLoses,	// +4 int	| W.156 | L.148
	m_fMaxIdlePeriod,			// +4 int	| W.160 | L.152
	m_iLimitTeams,				// +4 int	| W.164 | L.156
	m_bLevelInitialized,			// +1 bool	| W.168 | L.160
	m_bRoundTerminating = 169,		// +1 bool	| W.169 | L.161
	m_bCompleteReset = 170,			// +1 bool	| W.170 | L.162
	m_flRequiredEscapeRatio = 172,		// +4 float	| W.172 | L.164
	m_iNumEscapers,				// +4 float	| W.176 | L.168
	m_iHaveEscaped,				// +4 float	| W.180 | L.172
	m_bCTCantBuy,				// +1 bool	| W.184 | L.176
	m_bTCantBuy = 185,			// +1 bool	| W.185 | L.177
	m_flBombRadius = 188,			// +4 float	| W.188 | L.180
	m_iConsecutiveVIP,			// +4 float	| W.192 | L.184
	m_iTotalGunCount,			// +4 int	| W.196 | L.188
	m_iTotalGrenadeCount,			// +4 int	| W.200 | L.192
	m_iTotalArmourCount,			// +4 int	| W.204 | L.196
	m_iUnBalancedRounds,			// +4 int	| W.208 | L.200
	m_iNumEscapeRounds,			// +4 int	| W.212 | L.204
	m_iMapVotes,				// +400 int	| W.216 | L.208
	m_iLastPick = 616,			// +4 int	| W.616 | L.608
	m_iMaxMapTime,				// +4 int	| W.620 | L.612
	m_iMaxRounds,				// +4 int	| W.624 | L.616
	m_iTotalRoundsPlayed,			// +4 int	| W.628 | L.620
	m_iMaxRoundsWon,			// +4 int	| W.632 | L.624
	m_iStoredSpectValue,			// +4 int	| W.636 | L.628
	m_flForceCameraValue,			// +4 float	| W.640 | L.632
	m_flForceChaseCamValue,			// +4 float	| W.644 | L.636
	m_flFadeToBlackValue,			// +4 float	| W.648 | L.640
	m_pVIP,					// +4 pvdata	| W.652 | L.644
	VIPQueue,				// +20 pvdata	| W.656 | L.648
	m_flIntermissionEndTime = 676,		// +4 pvdata	| W.676 | L.668
	m_flIntermissionStartTime,		// +4 float	| W.680 | L.672
	m_iEndIntermissionButtonHit,		// +4 int	| W.684 | L.676
	m_tmNextPeriodicThink,			// +4 float	| W.688 | L.680
	m_bFirstConnected,			// +1 bool	| W.692 | L.684
	m_bInCareerGame = 693,			// +1 bool	| W.693 | L.685
	m_fCareerRoundMenuTime = 696,		// +4 float	| W.696 | L.688
	m_iCareerMatchWins,			// +4 int	| W.700 | L.692
	m_iRoundWinDifference,			// +4 int	| W.704 | L.696
	m_fCareerMatchMenuTime,			// +4 float	| W.708 | L.700
	m_bSkipSpawn				// +1 bool	| W.712 | L.704
};

enum RoundEvent
{
	EventDefault = 0,
	TargetBombed,
	VIPEscaped,
	VIPAssassinated,
	TerroristEscaped,
	CTsPreventEscape,
	EscapingTerroristNeutralized,
	BombDefused,
	CTsWin,
	TerroristWin,
	RoundDraw,
	AllHostagesRescued,
	TargetSaved,
	HostagesNotRescued,
	TerroristNotEscaped,
	VIPNotEscaped,
	GameCommencing
};

enum RoundControlWin
{
	WINSTATUS_CT = 1,
	WINSTATUS_TERRORIST,
	WINSTATUS_DRAW
};

enum RoundControlFunc
{
	/*
	* void
	*/
	RC_CheckWinConditions = 0,			// (void);

	/*
	 * teamWins - какая команда побеждает.
	 * numWins - победные очки.
	 * eventRound - событие окончание раунда.
	 * bHasExpired - раунд закончился по истечению времени.
	*/
	RC_RoundEnd					// (RoundControlWin:teamWins,numWins,RoundEvent:eventRound,bool:bHasExpired)
};

/*
 * Регистрация форварда
 *
*/
native RoundControlHook:RegisterControl(RoundControlFunc:function,const callback[],Post = 0);

/*
 * Удаление форварда
 *
*/
native UnregisterControl(RoundControlFunc:function,RoundControlHook:hookid,Post = 0);

/*
 * Позволяет составить условие для постоянной блокировки
 * 
*/
native RoundControlHook:SetBlockControl(RoundControlFunc:function,any:...);

/*
 * Удаляет блокировку
 * 
*/
native RemoveBlockControl(RoundControlFunc:function,RoundControlHook:hookid);

/**
 * Возобновляет вызов форварда
 *
*/
native EnableControl(RoundControlHook:hookid,Post = 0);

/**
 * Приостанавливает вызов форварда
 *
*/
native DisableControl(RoundControlHook:hookid,Post = 0);

/*
 * Вызов функции из gamedll, в частности функцию CheckWinConditions
 * Вызов RoundEnd имитирует конце раунда
 *
*/
native ExecuteControl(RoundControlFunc:function,any:...);

/*
 * Действует только для RoundEnd и только в PRE
 * Дает возможность изменить параметры, которые передается в функции. 
*/
native SetReturnParamControl(RoundControlFunc:function,any:...);

/*
 * Устанавливает особые флаги
 *
*/
native SetFlagsControl(const flags = FLAG_RETRACT_EXPIRED);

/*
 * Обновить табло счёта и установить/добавить очки команде.
 *
*/
native RoundUpdateScoreWins(ctsWins = 0,tsWins = 0,bool:bAdd = true);

/*
 * Принудительное окончание раунда.
 *
 * @param winStatus		Команда которая побеждает.
 * @param fDelay		Время (задержка), через которое наступит следующий раунд.
 * @param flags			Флаги RC_SOUND, RC_MESSAGE,RC_SCORE.
 * @param sentence		Своё сообщение о победе. (По умолчанию сообщение определяется по eventid)
 * @param eventid		Событие победы, "RoundEvent".
 * @param numScore		Сколько очков получает побежденная команда (По умолчанию +1)
 * @param bReset		Отбирать всю экипировку, фраги, смерти, победы в начале нового раунда. (Идентично sv_restart 1)
 *
 * @return			nothing
 */
native RoundEndForceControl(RoundControlWin:winStatus = WINSTATUS_CT,Float:fDelay = 5.0,flags = RC_ALL_CUSTOM,const sentence[] = "#Round_Draw",RoundEvent:eventid = EventDefault,numScore = 1,bool:bReset = false);

native set_pgame_int(_offset,_value,_linuxdiff = 8);

native get_pgame_int(_offset,_linuxdiff = 8);

native set_pgame_float(_offset,Float:_value,_linuxdiff = 8);

native Float:get_pgame_float(_offset,_linuxdiff = 8);

native set_pgame_short(_offset,Float:_value,_linuxdiff = 8);

native get_pgame_short(_offset,_linuxdiff = 8);

native set_pgame_bool(_offset,bool:_value,_linuxdiff = 8);

native bool:get_pgame_bool(_offset,_linuxdiff = 8);

native set_pgame_cbase(_Index_,_offset,_linuxdiff = 8);

native get_pgame_cbase(_offset,_linuxdiff = 8);

/*
* @return адрес указателя g_pGameRules
*/
native get_pgame_rules();
