Premium Реклама Spotlight Bundles Boost Банери Кредити
Основно Начало Сървъри Marketplace Форум Сървъри
Общности Хостинг Добави Auction Boost
Ресурси
Библиотеки Карти Видеа Магазин Bundles
Инструменти
Builder Demo CFG HUD
AMXX API
Вход Регистрация
TOP SERVER
[IG] Easy Surf | Ramp Fix | RANKS | REPLAYS
Counter-Strike 1.6
surf_flyin_fortress
40.160.19.36:27015
18.05 18:49
8/64
186ms
/ Библиотеки / reapi_stocks.inc

reapi_stocks.inc

Copyright © 2017-XXXX Vaqtincha

.inc 41.2 KB 1505 реда 04.04.2026
Pawn / AMX Mod X
// Copyright © 2017-XXXX Vaqtincha

// Update 21.08.2022 (Huehue):
/* Added:
			rg_get_user_health()
			rg_add_user_health()
			rg_set_user_heath()
			rg_is_user_first_spawn()
			rg_is_one_on_one()
			rg_transfer_money()
			rg_play_user_sound()
			client_cmd_ex()
			rg_get_team_score_diff()
			rg_get_team_count_diff()
			rg_set_entity_model()
			rg_remove_entity()
			rg_create_explode_grenade()
			rg_set_entity_skin()
			rg_get_entity_skin()
			rg_get_user_noclip()
			rg_get_user_godmode()
			is_user_vip()
			is_happy_hour()
			rg_get_user_gravity()
			rg_send_hudmessage()
			try_precache_player_model()
			try_precache_sounds()


*/

#if defined _reapi_stocks_included
	#endinput
#endif

#define _reapi_stocks_included

#if !defined _reapi_included
	#include <reapi>
#endif


const GRENADES_BIT_SUM = ((1<<_:WEAPON_HEGRENADE)|(1<<_:WEAPON_SMOKEGRENADE)|(1<<_:WEAPON_FLASHBANG))
const NOCLIP_WEAPONS_BIT_SUM = (GRENADES_BIT_SUM|(1<<_:WEAPON_KNIFE)|(1<<_:WEAPON_C4))
const SECONDARY_WEAPONS_BIT_SUM = ((1<<_:WEAPON_P228)|(1<<_:WEAPON_ELITE)|(1<<_:WEAPON_FIVESEVEN)|(1<<_:WEAPON_USP)|(1<<_:WEAPON_GLOCK18)|(1<<_:WEAPON_DEAGLE))
const PRIMARY_WEAPONS_BIT_SUM = 
(
	(1<<_:WEAPON_SCOUT)|(1<<_:WEAPON_XM1014)|(1<<_:WEAPON_MAC10)|(1<<_:WEAPON_AUG)|(1<<_:WEAPON_UMP45)|(1<<_:WEAPON_SG550)
	|(1<<_:WEAPON_GALIL)|(1<<_:WEAPON_FAMAS)|(1<<_:WEAPON_AWP)|(1<<_:WEAPON_MP5N)|(1<<_:WEAPON_M249)|(1<<_:WEAPON_M3)
	|(1<<_:WEAPON_M4A1)|(1<<_:WEAPON_TMP)|(1<<_:WEAPON_G3SG1)|(1<<_:WEAPON_SG552)|(1<<_:WEAPON_AK47)|(1<<_:WEAPON_P90)
)

const PRIMARY_WEAPONS_WITH_SCOPE_BIT_SUM = (1<<_:WEAPON_SCOUT)|(1<<_:WEAPON_AUG)|(1<<_:WEAPON_SG550)|(1<<_:WEAPON_AWP)|(1<<_:WEAPON_G3SG1)|(1<<_:WEAPON_SG552)


enum GiveAmmoType
{
	GAT_GIVE_AMMO,
	GAT_SET_AMMO
}

enum AmmoTypes
{
	AMMO_NONE,
	AMMO_338MAGNUM,
	AMMO_762NATO,
	AMMO_556NATOBOX,
	AMMO_556NATO,
	AMMO_BUCKSHOT,
	AMMO_45ACP,
	AMMO_57MM,
	AMMO_50AE,
	AMMO_357SIG,
	AMMO_9MM,
	AMMO_FLASHBANG,
	AMMO_HEGRENADE,
	AMMO_SMOKEGRENADE,
	AMMO_C4,

	AMMO_MAX_TYPES
}

enum /* RewardAccount */ 		// from gamerules.h
{
	REWARD_TARGET_BOMB			= 3500,
	REWARD_VIP_ESCAPED			= 3500,
	REWARD_VIP_ASSASSINATED		= 3250,
	REWARD_TERRORISTS_ESCAPED	= 3150,
	REWARD_CTS_PREVENT_ESCAPE	= 3500,
	REWARD_ESCAPING_TT_NEUTRALIZED	= 3250,
	REWARD_BOMB_DEFUSED			= 3250,
	REWARD_BOMB_PLANTED			= 800,
	REWARD_BOMB_EXPLODED		= 3250,
	REWARD_CTS_WIN				= 3000,
	REWARD_TERRORISTS_WIN		= 3000,
	REWARD_ALL_HOSTAGES_RESCUED	= 2500,
	REWARD_TARGET_BOMB_SAVED	= 3250,
	REWARD_HOSTAGE_NOT_RESCUED	= 3250,
	REWARD_VIP_NOT_ESCAPED		= 3250,
	REWARD_LOSER_BONUS_DEFAULT	= 1400,
	REWARD_LOSER_BONUS_MIN		= 1500,
	REWARD_LOSER_BONUS_MAX		= 3000,
	REWARD_LOSER_BONUS_ADD		= 500,
	REWARD_RESCUED_HOSTAGE		= 750,
	// REWARD_KILLED_ENEMY			= 300,
	// REWARD_KILLED_VIP			= 2500,
	// REWARD_VIP_HAVE_SELF_RESCUED = 2500,
	// REWARD_TAKEN_HOSTAGE			= 1000,
	REWARD_TOOK_HOSTAGE_ACC		= 100,
	REWARD_TOOK_HOSTAGE			= 150,
}

enum
{
    WEATHER_NONE = 0,
    WEATHER_RAIN,
    WEATHER_SNOW
}


#define rg_is_valid_weapon_id(%1)		(WEAPON_P228 <= %1 <= WEAPON_P90 && %1 != WEAPON_GLOCK)
#define rg_is_primary_weapon_id(%1)		(PRIMARY_WEAPONS_BIT_SUM & (1 << any:%1))
#define rg_is_secondary_weapon_id(%1)	(SECONDARY_WEAPONS_BIT_SUM & (1 << any:%1))
#define rg_is_grenade_weapon_id(%1)		(GRENADES_BIT_SUM & (1 << any:%1))
#define rg_is_noclip_weapon_id(%1)		(NOCLIP_WEAPONS_BIT_SUM & (1 << any:%1))
#define rg_is_weapon_with_scope(%1)		(PRIMARY_WEAPONS_WITH_SCOPE_BIT_SUM & (1 << any:%1))

#define rg_is_valid_slot_type(%1)		(PRIMARY_WEAPON_SLOT <= %1 <= C4_SLOT)
#define rg_is_valid_armoury(%1)			(ARMOURY_MP5NAVY <= %1 <= ARMOURY_DEAGLE)

#define rg_is_valid_rule_id(%1)			(RR_CTS_WIN <= %1 < RR_END)
#define rg_is_valid_ammo_id(%1)			(AMMO_338MAGNUM <= %1 < AMMO_MAX_TYPES)
#define rg_is_valid_team(%1)			(TEAM_TERRORIST <= get_member(%1, m_iTeam) <= TEAM_CT)

#define get_bit(%1,%2)       			(%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2)        			(%1 |= (1 << (%2 & 31)))
#define reset_bit(%1,%2)    			(%1 &= ~(1 << (%2 & 31)))
#define invert_bit(%1,%2)    			(%1 ^= (1 << (%2 & 31)))
#define rset_bit(%1,%2,%3) 				(%3 && (%1 |= (1 << (%2 & 31))) || (%1 &= ~(1 << (%2 & 31)))) // Reset & Set Bit directly

#define IsNullVector(%0) 				bool:((%0[0] + %0[1] + %0[2]) == 0.0)
#define IsNullString(%0) 				bool:(%0[0] == EOS)

#define CLIENT_IN_DUCK					15.0
#define CLIENT_NOT_IN_DUCK 				35.0

enum _:XYZ {
	Float:X,Float:Y,Float:Z
};

enum _:fRGB {
    Float:fR,Float:fG,Float:fB
};

enum _:RGB {
    R,G,B
};

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Other stocks ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/


// by s1lent
stock rg_map_buy_status(bool:enabled)
{
	new pBuyzone = NULLENT, count
	while((pBuyzone = rg_find_ent_by_class(pBuyzone, "func_buyzone", .useHashTable = true)))
	{
		set_entvar(pBuyzone, var_solid, enabled ? SOLID_TRIGGER : SOLID_NOT)
		count++
	}

	// old
	if(!count) 
	{
		set_member_game(m_bCTCantBuy, enabled)
		set_member_game(m_bTCantBuy, enabled)
	}
}


// change roundtime
stock rg_set_round_time(const newTime) 
{
	new iRoundTime = clamp(newTime, 0, 999)

	set_member_game(m_fRoundStartTime, get_gametime())
	set_member_game(m_iRoundTimeSecs, iRoundTime)

	static gmsgShowTimer, gmsgRoundTime
	if(gmsgShowTimer || (gmsgShowTimer = get_user_msgid("ShowTimer")))
	{
		message_begin(MSG_ALL, gmsgShowTimer)
		message_end()
	}
	
	if(gmsgRoundTime || (gmsgRoundTime = get_user_msgid("RoundTime")))
	{
		message_begin(MSG_ALL, gmsgRoundTime)
		write_short(iRoundTime)
		message_end()
	}
}

stock bool:rg_freezetime_ended(){
	return !get_member_game(m_bFreezePeriod)
}

stock bool:rg_map_has_bombtarget(){
	return get_member_game(m_bMapHasBombTarget)
}

stock bool:rg_buytime_expired() 
{
	static mp_buytime
	if(mp_buytime || (mp_buytime = get_cvar_pointer("mp_buytime")))
	{
		new Float:flBuyTime = get_pcvar_float(mp_buytime)
		if(flBuyTime == -1.0) {  		// no limit
			return false
		}
		if(flBuyTime == 0.0 || (get_gametime() - Float:get_member_game(m_fRoundStartTime) > (flBuyTime * 60))) {
			return true
		}
	}

	return false
}

stock rg_set_round_winner(const WinStatus:st, const iAddPoints = 1)
{
	new ScenarioEventEndRound:Event, ctScore, ttScore
	switch(st)
	{
		case WINSTATUS_CTS: {
			Event = ROUND_CTS_WIN
			ctScore = iAddPoints
		}
		case WINSTATUS_TERRORISTS: {
			Event = ROUND_TERRORISTS_WIN
			ttScore = iAddPoints
		}
		case WINSTATUS_DRAW: {
			Event = ROUND_NONE
		}
		default:return
	}

	rg_round_end(5.0, st, Event)

	if(Event != ROUND_NONE && (ctScore || ttScore)) {
		rg_update_teamscores(ctScore, ttScore)
	}
}

// RR_END  = reset all rules
stock rg_reset_account_rules(RewardRules:iRulesID = RR_END)
{
	static const rgRewardAccountRules[any:RR_END] = {
		REWARD_CTS_WIN,						// RR_CTS_WIN
		REWARD_TERRORISTS_WIN,				// RR_TERRORISTS_WIN
		REWARD_TARGET_BOMB,					// RR_TARGET_BOMB
		REWARD_VIP_ESCAPED,					// RR_VIP_ESCAPED
		REWARD_VIP_ASSASSINATED,			// RR_VIP_ASSASSINATED
		REWARD_TERRORISTS_ESCAPED,			// RR_TERRORISTS_ESCAPED
		REWARD_CTS_PREVENT_ESCAPE,			// RR_CTS_PREVENT_ESCAPE
		REWARD_ESCAPING_TT_NEUTRALIZED,		// RR_ESCAPING_TERRORISTS_NEUTRALIZED
		REWARD_BOMB_DEFUSED,				// RR_BOMB_DEFUSED
		REWARD_BOMB_PLANTED,				// RR_BOMB_PLANTED
		REWARD_BOMB_EXPLODED,				// RR_BOMB_EXPLODED
		REWARD_ALL_HOSTAGES_RESCUED,		// RR_ALL_HOSTAGES_RESCUED
		REWARD_TARGET_BOMB_SAVED,			// RR_TARGET_BOMB_SAVED
		REWARD_HOSTAGE_NOT_RESCUED,			// RR_HOSTAGE_NOT_RESCUED
		REWARD_VIP_NOT_ESCAPED,				// RR_VIP_NOT_ESCAPED
		REWARD_LOSER_BONUS_DEFAULT,			// RR_LOSER_BONUS_DEFAULT
		REWARD_LOSER_BONUS_MIN,				// RR_LOSER_BONUS_MIN
		REWARD_LOSER_BONUS_MAX,				// RR_LOSER_BONUS_MAX
		REWARD_LOSER_BONUS_ADD,				// RR_LOSER_BONUS_ADD
		REWARD_RESCUED_HOSTAGE,				// RR_RESCUED_HOSTAGE
		REWARD_TOOK_HOSTAGE_ACC,			// RR_TOOK_HOSTAGE_ACC
		REWARD_TOOK_HOSTAGE					// RR_TOOK_HOSTAGE
	}

	if(rg_is_valid_rule_id(iRulesID))
	{
		rg_set_account_rules(iRulesID, rgRewardAccountRules[iRulesID])
	}
	else if(iRulesID == RR_END)
	{
		for(iRulesID = RR_CTS_WIN; iRulesID < RR_END; iRulesID++)
		{
			rg_set_account_rules(iRulesID, rgRewardAccountRules[iRulesID])
		}
	}
}

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Player stocks ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/

stock Float:rg_get_user_health(const player) {
	return Float:get_entvar(player, var_health)
}

stock rg_add_user_health(const player, const Float:hp, Float:fMins = 1.0, Float:fMaxs = 100.0, bool:ClampHp = false) {
	if (ClampHp)
		set_entvar(player, var_health, floatclamp((rg_get_user_health(player) + hp), fMins, fMaxs))
	else
		set_entvar(player, var_health, rg_get_user_health(player) + hp)
}

stock rg_set_user_health(const player, const Float:hp) {
	set_entvar(player, var_health, hp)
}

stock rg_set_user_noclip(const player, bool:noclip) {
	set_entvar(player, var_movetype, noclip ? MOVETYPE_NOCLIP : MOVETYPE_WALK)
}

stock bool:rg_get_user_noclip(const player) {
	return bool:(get_entvar(player, var_movetype) == MOVETYPE_NOCLIP)
}

stock rg_set_user_godmode(const player, bool:godmode) {
	set_entvar(player, var_takedamage, godmode ? DAMAGE_NO : DAMAGE_AIM)
}

stock bool:rg_get_user_godmode(const player) {
	return bool:(get_entvar(player, var_takedamage) == DAMAGE_NO)
}

stock rg_is_user_vip(const player, const flag) {
	return (get_user_flags(player) & flag)
}

stock bool:is_happy_hour(const start, const end)
{
	static hour
	time(hour)

	return bool:(start < end ? (start <= hour < end) : (start <= hour || hour < end))
}

/**
    * Check if it is the first spawn of the player
    *   @NOTE: by Emma Jule
    *
    *
    *   @return     bool
*/
stock bool:rg_is_user_first_spawn(const player) {
	return bool:(get_member(player, m_iNumSpawns) == 1)
}

stock bool:rg_is_one_on_one() {
	new iAliveTs, iAliveCTs
	rg_initialize_player_counts(iAliveTs, iAliveCTs)

	return bool:(iAliveTs == 1 && iAliveCTs == 1)
}

stock bool:rg_is_last_player_terrorist() {
	new iAliveTs
	rg_initialize_player_counts(iAliveTs)

	return bool:(iAliveTs == 1)
}

stock bool:rg_is_last_player_ct() {
	new iAliveTs, iAliveCTs
	rg_initialize_player_counts(iAliveTs, iAliveCTs)

	return bool:(iAliveCTs == 1)
}

stock bool:rg_is_last_player() {
	new iAliveTs, iAliveCTs
	rg_initialize_player_counts(iAliveTs, iAliveCTs)

	return bool:((iAliveTs == 1 && iAliveCTs > 1) || (iAliveCTs == 1 && iAliveTs > 1))
}

stock rg_play_user_sound(const player = 0, const sound[], bool:bStopSound = false) {
	if (bStopSound)
		client_cmd_ex(player, "mp3 stop;stopsound")

	if (containi(sound, ".mp3") != -1)
	{
		if (containi(sound, "sound/") != -1)
			client_cmd_ex(player, "mp3 play ^"%s^"", sound)
		else
			client_cmd_ex(player, "mp3 play ^"sound/%s^"", sound)
	}
	else
		client_cmd_ex(player, "spk ^"%s^"", sound)
}

stock client_cmd_ex(id, const command[], any:...)
{
	#pragma unused command
	
	if (id == 0 || is_user_connected(id))
	{
		new szMessage[256]
		
		format_args(szMessage, charsmax(szMessage), 1)
		
		message_begin(id == 0 ? MSG_ALL : MSG_ONE, 51, _, id)
		write_byte(strlen(szMessage) + 2)
		write_byte(10)
		write_string(szMessage)
		message_end()
	}
}

/*
 Similar to GodMode
*/
stock rg_set_user_taketamage(const player, bool:take) {
	set_entvar(player, var_takedamage, take ? DAMAGE_AIM : DAMAGE_NO)
}

stock Float:rg_get_user_maxspeed(const player) {
	return Float:get_entvar(player, var_maxspeed)
}
/* Sets player max. speed. 
*/
stock rg_set_user_maxspeed(const player, Float:speed = -1.0)
{
	if(speed != -1) // reset
		set_entvar(player, var_maxspeed, speed)
	else
		rg_reset_maxspeed(player)
}

/* Sets player gravity.
*/
stock rg_set_user_gravity(const player, Float:gravity = 1.0) {
	set_entvar(player, var_gravity, gravity)
}

stock rg_get_user_gravity(const player) {
	return Float:get_entvar(player, var_gravity)
}

stock rg_set_user_unlimited_ammo(id, bool:unlimited = true) {
	set_member(id, m_iWeaponInfiniteAmmo, unlimited ? 1 : 0)
}

/* Returns in bitwise (see enum SignalState) form if the user is in a specific map zone.
*/
stock SignalState:rg_get_user_mapzones(const player)
{
	new iSignals[UnifiedSignals]
	get_member(player, m_signals, iSignals)

	return SignalState:iSignals[US_State]	
}

stock bool:rg_user_in_buyzone(const player) {
	return bool:(rg_get_user_mapzones(player) & SIGNAL_BUY)
}

stock bool:rg_user_in_bombzone(const player) {
	return bool:((rg_get_user_mapzones(player) & SIGNAL_BOMB) == SIGNAL_BOMB)
}

stock bool:rg_user_in_water(const player) {
	return bool:(get_entvar(player, var_waterlevel) > 0)
}

stock bool:rg_user_on_ladder(const player) {
	return bool:(get_entvar(player, var_movetype) == MOVETYPE_FLY)
}

stock bool:rg_get_user_invisibility(const player) {
	return bool:(get_entvar(player, var_effects) & EF_NODRAW)
}

stock rg_set_user_invisibility(const player, bool:hide = true) {
	new iFlags = get_entvar(player, var_effects)
	set_entvar(player, var_effects, hide ? (iFlags |= EF_NODRAW) : (iFlags &= ~EF_NODRAW))
}

/**
    * Check the WIN differences between CTs and Terrorists
    *   @NOTE: by Emma Jule
    *
    *
    *   @return     int
*/
stock rg_get_team_score_diff() {
	return abs(get_member_game(m_iNumTerroristWins) - get_member_game(m_iNumCTWins));
}

/**
    * Check the team count differences between CTs and Terrorists
    *   @NOTE: by Emma Jule
    *
    *
    *   @return     int
*/
stock rg_get_team_count_diff() {
	return abs(get_member_game(m_iNumTerrorist) - get_member_game(m_iNumCT));
}


stock rg_get_user_money(const player) {
	return get_member(player, m_iAccount)
}

stock rg_set_user_money(const player, amount, const bool:bTrackChange = true) {
	rg_add_account(player, rg_get_user_money(player) + amount, AS_SET, bTrackChange)
}

stock rg_give_user_money(const player, amount, const bool:bTrackChange = true) {
	rg_add_account(player, amount, AS_ADD, bTrackChange)
}

stock rg_take_user_money(const player, amount, const bool:bTrackChange = true) {
	rg_add_account(player, -amount, AS_ADD, bTrackChange)
}

stock rg_transfer_money(const player, const sender, const amount, bool:bTrackChange = false) {
	rg_take_user_money(player, amount, bTrackChange)
	rg_give_user_money(sender, amount, bTrackChange)
}

stock rg_get_user_next_spraytime(const player, Float:time) {
	set_member(player, m_flNextDecalTime, get_gametime() + time)
}

stock rg_set_user_sprayframe(const player, frames = -1) {
	set_member(player, m_nCustomSprayFrames, frames)
}

// Adidasman
stock rg_skip_user_vguimenu(const player) {
	set_member(player, m_bForceShowMenu, true)
}

stock rg_get_user_deaths(const player) {
	return get_member(player, m_iDeaths)
}

stock rg_get_user_frags(const player) {
	return get_entvar(player, var_frags)
}

stock rg_set_user_score(const player, frags, deaths, bool:bUpdateTabScore = true) {
	set_entvar(player, var_frags, float(frags))
	set_member(player, m_iDeaths, deaths)

	if (bUpdateTabScore)
	{
		// Update tabscore
		message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo"))
		write_byte(player)
		write_short(frags)	// Frags
		write_short(deaths)	// Deaths
		write_short(0)
		write_short(get_user_team(player))
		message_end()
	}
}

stock rg_reset_user_score(const player, bool:bUpdateTabScore = true) {
	set_entvar(player, var_frags, 0)
	set_member(player, m_iDeaths, 0)

	if (bUpdateTabScore)
	{
		// Update tabscore
		message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo"))
		write_byte(player)
		write_short(0)	// Frags
		write_short(0)	// Deaths
		write_short(0)
		write_short(get_user_team(player))
		message_end()
	}
}

stock bool:rg_is_user_joined(const player) {
	return bool:(get_member(player, m_iJoiningState) == JOINED)
}

/* Returns true user has blinded.
*/
stock bool:rg_is_user_blinded(const player) {
	return bool:(Float:get_member(player, m_blindStartTime) + Float:get_member(player, m_blindFadeTime) >= get_gametime())
}

// original code by ConnorMcLeod 2011 (see: https://forums.alliedmods.net/showpost.php?p=1612876&postcount=2)

stock rg_get_user_blind_percent(const player)
{
	static const BLINDED_FULLY = 255
	#define fPercent(%1,%2) 	100.0 - (((%1) * 100.0) / %2)

	new Float:flCurTime = get_gametime(),
		Float:flBlindStartTime = Float:get_member(player, m_blindStartTime),
		Float:flBlindHoldTime = Float:get_member(player, m_blindHoldTime),
		Float:flBlindFadeTime = Float:get_member(player, m_blindFadeTime),
		Float:flEndTime = flBlindFadeTime + flBlindHoldTime

	if((flCurTime - flBlindStartTime) > flEndTime)
		return 0

	if(get_member(player, m_blindAlpha) == BLINDED_FULLY)
	{
		if((flBlindStartTime + flBlindHoldTime) >= flCurTime)
			return 100 		// 100 percent

		return floatround(fPercent(flCurTime - (flBlindStartTime + flBlindHoldTime), flBlindFadeTime))
	}
	
	return floatround(fPercent(flCurTime - flBlindStartTime, flEndTime))
}

/* return enum ModelName
*/
stock ModelName:rg_get_user_class(const player) {
	return get_member(player, m_iModelName)
}

stock TeamName:rg_get_user_team(const player, &{ModelName,_}:model = MODEL_UNASSIGNED) 
{
	model = rg_get_user_class(player)
	return TeamName:get_member(player, m_iTeam)
}


/* Does user have night vision goggles?
 */
stock rg_get_user_nvg(const player) {
	return get_member(player, m_bHasNightVision)
}

/* Set nvgoggles to 1 to give night vision goggles to index. Set it to 0 to remove them.
 */
stock rg_set_user_nvg(const player, bool:nvgoggles = true) {
	set_member(player, m_bHasNightVision, nvgoggles)
}

stock bool:rg_user_has_defuser(const player) {
	return bool:(get_member(player, m_bHasDefuser))
}

/* return enum HitBoxGroup 
*/
stock HitBoxGroup:rg_get_user_last_hitgroup(const player) {
	return get_member(player, m_LastHitGroup)
}

stock bool:rg_user_killed_by_headshot(const player) {
	return bool:(rg_get_user_last_hitgroup(player) == HITGROUP_HEAD || get_member(player, m_bHeadshotKilled))
}

/* Returns true if user has a shield, else false.
*/
stock bool:rg_user_has_shield(const player, &bool:bShieldDrawn = false)
{
	if(get_member(player, m_bOwnsShield)) 
	{
		bShieldDrawn = get_member(player, m_bShieldDrawn)
		return true
	}

	return false
}

stock bool:rg_user_has_secondary(const player) {
	return bool:(get_member(player, m_rgpPlayerItems, PISTOL_SLOT) > 0)
}

/* Returns 1 when user has a primary weapon OR a shield in inventory, else 0.
*/
stock bool:rg_user_has_primary(const player) {
	return bool:((get_member(player, m_rgpPlayerItems, PRIMARY_WEAPON_SLOT) > 0) || get_member(player, m_bHasPrimary))
}

stock rg_set_user_can_shot(const player, bool:can = true) {
	set_member(player, m_bIsDefusing, can)
}

stock rg_set_user_team_changed(const player, bool:changed = true) {
	set_member(player, m_bTeamChanged, changed)
}

stock rg_set_user_radio_message(const player, num) {
	set_member(player, m_iRadioMessages, num)
}

stock rg_set_user_ignore_radio(const player, bool:ignore = true) {
	set_member(player, m_bIgnoreRadio, !ignore)
}

stock WeaponIdType:rg_get_user_weapon(const player, InventorySlotType:iSlot, &pWeapon = NULLENT)
{
	if(!rg_is_valid_slot_type(iSlot))
		return WEAPON_NONE

	return ((pWeapon = get_member(player, m_rgpPlayerItems, iSlot)) > 0) ? rg_get_weapon_id(pWeapon) : WEAPON_NONE
}

stock WeaponIdType:rg_get_user_active_weapon(const player, &pWeapon = NULLENT) {
	return ((pWeapon = get_member(player, m_pActiveItem)) > 0) ? rg_get_weapon_id(pWeapon) : WEAPON_NONE
}

stock rg_get_player_item(const player, const szWeapon_Classname[], const InventorySlotType:iSlot = NONE_SLOT) {
    new item = get_member(player, m_rgpPlayerItems, iSlot)

    while (!is_nullent(item)) {
        if (FClassnameIs(item, szWeapon_Classname)) {
            return item
        }
        item = get_member(item, m_pNext)
    }

    return 0
}

stock rg_set_user_weapon_model_v(const player, szModel[]) {
	set_entvar(player, var_viewmodel, szModel)
}

stock rg_set_user_weapon_model_p(const player, szModel[]) {
	set_entvar(player, var_weaponmodel, szModel)
}

// Max = 0   default max (works with GAT_GIVE_AMMO)
stock rg_user_add_ammo(const player, AmmoTypes:AmmoId, Amount, Max = 0, GiveAmmoType:type = GAT_SET_AMMO, bool:bShowPickup = true)
{
	if(!rg_is_valid_ammo_id(AmmoId))
		return

	static const iMaxBpAmmo[AMMO_MAX_TYPES] = {
		0, 30, 90, 200, 90, 32, 100, 100, 35, 52, 120, 2, 1, 1, 1
	}
	
	new finalAmount, userAmmo, finalMax = (Max > 0 ? Max : iMaxBpAmmo[AmmoId])
	
	if(type == GAT_SET_AMMO)
	{
		set_member(player, m_rgAmmo, Amount, AmmoId)
		return
	}
	else if(type == GAT_GIVE_AMMO)
	{
		if(Amount <= 0 || ((userAmmo = get_member(player, m_rgAmmo, AmmoId)) >= finalMax))
			return

		set_member(player, m_rgAmmo, userAmmo + (finalAmount = min(finalMax, Amount)), AmmoId)
	}

	static gmsgAmmoPickup
	if(finalAmount && bShowPickup && (gmsgAmmoPickup || (gmsgAmmoPickup = get_user_msgid("AmmoPickup"))))
	{
		message_begin(MSG_ONE, gmsgAmmoPickup, .player = player)
		write_byte(any:AmmoId)
		write_byte(finalAmount)
		message_end()
	}
}

stock rg_send_weapon_anim(const player, const anim, const Float:fAnimTime, weapon = NULLENT) 
{
	if(weapon > 0 || (weapon = get_member(player, m_pActiveItem)) > 0)
	{
		set_entvar(player, var_weaponanim, anim)

		message_begin(MSG_ONE, SVC_WEAPONANIM, .player = player)
		write_byte(anim)
		write_byte(get_entvar(weapon, var_body))
		message_end()

		set_member(weapon, m_Weapon_flTimeWeaponIdle, fAnimTime)
	}	
}

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ WeaponBox stocks ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/

stock rg_kill_weaponbox(const weaponbox)
{
	if(!get_member(weaponbox, m_WeaponBox_bIsBomb))
	{
		set_entvar(weaponbox, var_nextthink, get_gametime() + 0.1)
		return
	}
	
	new pWeapon = get_member(weaponbox, m_WeaponBox_rgpPlayerItems, C4_SLOT)
	if(!is_nullent(pWeapon)) {
		set_entvar(pWeapon, var_flags, FL_KILLME)
	}

	set_entvar(weaponbox, var_flags, FL_KILLME)

	static gmsgBombPickup
	if(gmsgBombPickup || (gmsgBombPickup = get_user_msgid("BombPickup")))
	{
		message_begin(MSG_ALL, gmsgBombPickup)
		message_end()
	}
}
	
// alternate native WeaponIdType:rg_get_weaponbox_id(const entity)

stock WeaponIdType:rg_get_weaponbox_weapon(const weaponbox, InventorySlotType:iSlot, &pWeapon = NULLENT)
{
	if(!rg_is_valid_slot_type(iSlot))
		return WEAPON_NONE

	return ((pWeapon = get_member(weaponbox, m_WeaponBox_rgpPlayerItems, iSlot)) > 0) ? rg_get_weapon_id(pWeapon) : WEAPON_NONE
}

stock rg_get_weaponbox_ammo(const weaponbox) {
	return get_member(weaponbox, m_WeaponBox_rgAmmo, rg_is_grenade_weapon_id(rg_get_weaponbox_id(weaponbox)) ? 1 : 0)
}

stock rg_set_weaponbox_ammo(const weaponbox, const AmmoTypes:AmmoId, const iCount)
{
	if(!rg_is_valid_ammo_id(AmmoId))
		return

	static const szAmmoTypes[AMMO_MAX_TYPES][] = {
		"", "338Magnum", "762Nato", "556NatoBox", "556Nato", "buckshot", "45acp", "57mm", 
		"50AE", "357SIG", "9mm", "Flashbang", "HEGrenade", "SmokeGrenade", "C4"
	}

	new element = rg_is_grenade_weapon_id(rg_get_weaponbox_id(weaponbox)) ? 1 : 0

	set_member(weaponbox, m_WeaponBox_rgiszAmmo, szAmmoTypes[AmmoId], element)
	set_member(weaponbox, m_WeaponBox_rgAmmo, (iCount < 0) ? 0 : iCount, element)
}

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Weapon stocks ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/

// rg_get_weapon_info() WI_SLOT
stock InventorySlotType:rg_get_weapon_slot(const weapon) {
	return (weapon > 0) ? rg_get_weaponid_slot(rg_get_weapon_id(weapon)) : NONE_SLOT
}

stock InventorySlotType:rg_get_weaponid_slot(const WeaponIdType:weaponid) 
{
	static const InventorySlotType:iWeaponsSlots[any:WEAPON_P90 + 1] = {
		NONE_SLOT,
		PISTOL_SLOT,
		NONE_SLOT,
		PRIMARY_WEAPON_SLOT,
		GRENADE_SLOT,
		PRIMARY_WEAPON_SLOT,
		C4_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		GRENADE_SLOT,
		PISTOL_SLOT,
		PISTOL_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		PISTOL_SLOT,
		PISTOL_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		GRENADE_SLOT,
		PISTOL_SLOT,
		PRIMARY_WEAPON_SLOT,
		PRIMARY_WEAPON_SLOT,
		KNIFE_SLOT,
		PRIMARY_WEAPON_SLOT
	}
	
	return rg_is_valid_weapon_id(weaponid) ? iWeaponsSlots[weaponid] : NONE_SLOT
}

stock WeaponIdType:rg_get_weapon_id(const weapon) {
	return get_member(weapon, m_iId)
}

stock WeaponState:rg_get_weapon_state(const weapon) {
	return get_member(weapon, m_Weapon_iWeaponState)
}

stock WeaponState:rg_get_weapon_owner(const weapon) {
	return get_member(weapon, m_pPlayer)
}

stock rg_set_weapon_can_shot(const weapon, bool:can = true) {
	set_member(weapon, m_Weapon_iWeaponState, (can ? (any:0) : WPNSTATE_SHIELD_DRAWN))
}

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Armoury entity stocks ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/

// -1 = all armoury items
stock rg_invisibility_armoury(const ArmouryItemPack:itemID = any:-1, bool:visible = false)
{
	new pArmoury = NULLENT
	while((pArmoury = rg_find_ent_by_class(pArmoury, "armoury_entity", .useHashTable = true)))
	{
		if(itemID != any:-1 && itemID != get_member(pArmoury, m_Armoury_iItem))
			continue

		if(!visible)
		{
			set_entvar(pArmoury, var_effects, get_entvar(pArmoury, var_effects) | EF_NODRAW)
			set_entvar(pArmoury, var_solid, SOLID_NOT)
		}
		else
		{
			set_entvar(pArmoury, var_effects, get_entvar(pArmoury, var_effects) & ~EF_NODRAW)
			set_entvar(pArmoury, var_solid, SOLID_TRIGGER)
		}
	}
}

/* To get ArmouryItem ID from armoury_entity
*
* @param entity		armoury_entity
* @param count		count item
* @return			return enum's of ArmouryItemPack
*/
stock ArmouryItemPack:rg_get_armoury_info(const entity, &count = 1)
{
	new ArmouryItemPack:item = get_member(entity, m_Armoury_iItem)
	if(!rg_is_valid_armoury(item))
		return any:-1

	count = get_member(entity, m_Armoury_iCount)
	return item
}

/* Set an armoury_entity to be of specified type.
*/
stock bool:rg_set_armoury_type(const entity, const ArmouryItemPack:item)
{
	if(!rg_is_valid_armoury(item))
		return false

	set_member(entity, m_Armoury_iItem, item)
	return true
}

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Other entity stocks ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/

/* Sets the submodel setting of the entity.
* If this is 1, then the user has a backpack or defuser on their model (depending on team)
* 0 removes it.
*/
stock rg_set_entity_submodel(const entity, const value) {
	set_entvar(entity, var_body, value)
}

stock rg_get_entity_submodel(const entity) {
	return get_entvar(entity, var_body)
}

stock rg_set_entity_skin(const entity, const value) {
	set_entvar(entity, var_skin, value)
}

stock rg_get_entity_skin(const entity) {
	return get_entvar(entity, var_skin)
}

stock rg_set_entity_model(const entity, const model[], const modelindex) {
	set_entvar(entity, var_model, model)
	set_entvar(entity, var_modelindex, modelindex)
}

#if !defined rg_remove_entity
stock rg_remove_entity(const entity) {
	if (!is_nullent(entity))
		set_entvar(entity, var_flags, get_entvar(entity, var_flags) | FL_KILLME)
}
#endif

/* Sets player/entity rendering mode. 
*/
stock rg_set_entity_rendering(const entity, fx = kRenderFxNone, Float:color[] = {255.0, 255.0, 255.0}, render = kRenderNormal, Float:amount = 16.0)  {
	set_entvar(entity, var_renderfx, fx)
	set_entvar(entity, var_rendercolor, color)
	set_entvar(entity, var_rendermode, render)
	set_entvar(entity, var_renderamt, amount)
}

stock rg_set_user_rendering_ex(iEntity, iRender = kRenderFxNone, iRed = 255, iGreen = 255, iBlue = 255, iRenderNormal = kRenderNormal, iAmount = 16) {
	set_entvar(iEntity, var_renderfx, iRender)

	new Float:vecRenderColor[RGB]

	vecRenderColor[R] = float(iRed)
	vecRenderColor[G] = float(iGreen)
	vecRenderColor[B] = float(iBlue)

	set_entvar(iEntity, var_rendercolor, vecRenderColor)
	set_entvar(iEntity, var_rendermode, iRenderNormal)
	set_entvar(iEntity, var_renderamt, float(iAmount))

	return 1
}

/**■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ ReAPI native fixes ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■*/

// fix shield/elite drop
stock rg_give_item_fix(const player, const pszName[], GiveType:type = GT_APPEND) {
	if(type != GT_APPEND)
	{
		new WeaponIdType:iId = rg_get_weapon_info(pszName, WI_ID)

		if((rg_is_primary_weapon_id(iId) || iId == WEAPON_ELITE) && get_member(player, m_bOwnsShield))
		{
			rg_remove_item(player, "weapon_shield")
		}
		else if(iId == WEAPON_SHIELDGUN && user_has_weapon(player, any:WEAPON_ELITE))
		{
			rg_remove_item(player, "weapon_elite")
		}
	}

	return rg_give_item(player, pszName, type)
}

// Fixed version of rg_give_item_ex
/*
* Gives the player an item.
*
* @param player		Client index
* @param pszName	Item name eg. "weapon_ak47"
* @param type       Look at the enums with name GiveType
* @param ammo 		Amount of ammo item will have when given (-1 equal to max weapon gun clip size)
* @param bpammo 	Amount of backpack ammo item will have when given (-1 equal to max weapon rounds size)
* @param uid 		Sets a unique index for the entity
*
* @return			Index of entity if successfull, -1 otherwise
*/
stock rg_give_item_ex(const player, pszName[], GiveType:type = GT_APPEND, ammo = 0, bpammo = 0, uid = 0) {
	new WeaponIdType:iWeaponID = rg_get_weapon_info(pszName, WI_ID)

	if(rg_is_primary_weapon_id(iWeaponID) && get_member(player, m_bOwnsShield))
	{
		rg_remove_item(player, "weapon_shield")
	}

	if (uid)
		uid = rg_give_custom_item(player, pszName, type, uid)
	else
		uid = rg_give_item(player, pszName, type)

	if (!rg_is_grenade_weapon_id(iWeaponID))
	{
		if (ammo == -1)
			rg_set_user_ammo(player, iWeaponID, rg_get_weapon_info(iWeaponID, WI_GUN_CLIP_SIZE))
		else if (ammo >= 0)
			rg_set_user_ammo(player, iWeaponID, ammo)
	}

	if (bpammo == -1)
		rg_set_user_bpammo(player, iWeaponID, rg_get_weapon_info(iWeaponID, WI_MAX_ROUNDS))
	else if (bpammo >= 0)
		rg_set_user_bpammo(player, iWeaponID, bpammo)

	if (contain(pszName, "shield") || iWeaponID == WEAPON_SHIELDGUN)
		rg_give_item_fix(player, pszName, type)

	return uid
}

stock rg_give_nades(const player, grenade[], GiveType:type = GT_APPEND, amount = 0) {
	new WeaponIdType:iWeaponID = rg_get_weapon_info(grenade, WI_ID)

	if (!rg_is_grenade_weapon_id(iWeaponID))
	{
		log_amx("Only grenades can be given with this stock! Please fix it now!")
		return
	}

	rg_give_item_ex(player, grenade, type, .bpammo = amount)
}

stock rg_give_he_grenade(const player, GiveType:type = GT_APPEND, amount = 0) {
	rg_give_item_ex(player, "weapon_hegrenade", type, .bpammo = amount)
}

stock rg_give_flash_bang(const player, GiveType:type = GT_APPEND, amount = 0) {
	rg_give_item_ex(player, "weapon_flashbang", type, .bpammo = amount)
}

stock rg_give_smoke_grenade(const player, GiveType:type = GT_APPEND, amount = 0) {
	rg_give_item_ex(player, "weapon_smokegrenade", type, .bpammo = amount)
}

stock UTIL_Weather(const player, iMode, bool:bReliable = false) {
	static iMsgReceiveW
	if (!iMsgReceiveW)
		iMsgReceiveW = get_user_msgid("ReceiveW")

	if (bReliable) message_begin(player ? MSG_ONE : MSG_ALL, iMsgReceiveW, _, player)
	else message_begin(player ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, iMsgReceiveW, _, player)
	write_byte(iMode)
	message_end()
}

stock color_gradient(Float:c1[3], Float:c2[3], Float:value, Float:range, Float:result[3]) {
	new Float:p = floatmin(value, range)/range

	for (new i = 0; i < 3; i++)
		result[i] = (1.0-p) * c1[i] + p * c2[i]
}

/**
	* Creates explode of HE Grenade
	*
	*	@param owner		Owner of the explode
	*	@param vecOrigin	coordinates XYZ
	*	@param fDamage		Damage
	*	@param fRadius		Radius of the explode
	*
	*	@return  
*/

stock rg_create_explode_grenade(const owner = 0, Float:vecOrigin[XYZ] = {0.0, 0.0, 0.0}, const Float:fDamage = 0.0, const Float:fRadius = 0.0) {
	new entity = rg_create_entity("grenade", .useHashTable = true)

	if (is_nullent(entity))
		return

	if (owner)
		set_member(entity, m_Grenade_iTeam, get_member(owner, m_iTeam))

	set_entvar(entity, var_owner, owner)
	rg_dmg_radius(vecOrigin, entity, owner, fDamage, fRadius, 0, DMG_GRENADE)
	set_entvar(entity, var_flags, FL_KILLME)
}

/**
	* Creates bigger explosion effect
	*
	* @param vecOrigin 		coordinates XYZ
	* @param sprite			Sprite to show [Default: "sprites/zerogxplode.spr"]
	* @param size			Size of the sprite showing [Default: 30]
	& @param speed 			How fast the sprite will be shown & hidden [Default: 15]
	*
	* @return	
*/

stock UTIL_BiggerExplosion(Float:vecOrigin[XYZ], sprite, size = 30, speed = 15) {
	message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_EXPLOSION)
	write_coord_f(vecOrigin[X])
	write_coord_f(vecOrigin[Y])
	write_coord_f(vecOrigin[Z])
	write_short(sprite)
	write_byte(size)
	write_byte(speed)
	write_byte(0)
	message_end()
}

stock rg_send_float_bartime(id, Float:flTime, bool:observer = true) {
	new iCeilTime = floatround(flTime, floatround_ceil);
	new iStartTime = floatround((1.0 - flTime / iCeilTime) * 100);

	rg_send_bartime2(id, iCeilTime, iStartTime, observer);
}

// iWins - сколько раундов должна та или иная команда выигрывать подряд
stock TeamName:rg_get_team_wins_row(const iWins) {
	if (get_member_game(m_iNumConsecutiveCTLoses) >= iWins)
	{
		return TEAM_TERRORIST;
	}
	else if (get_member_game(m_iNumConsecutiveTerroristLoses) >= iWins)
	{
		return TEAM_CT;
	}
	
	return TEAM_UNASSIGNED;
}

stock Float:rg_get_remaining_time() {
	return (float(get_member_game(m_iRoundTimeSecs)) - get_gametime() + Float:get_member_game(m_fRoundStartTimeReal));
}

stock TeamName:rg_get_team_loses_row(const loses) {
	if (get_member_game(m_iNumConsecutiveCTLoses) >= loses)
	{
		return TEAM_CT;
	}
	else if (get_member_game(m_iNumConsecutiveTerroristLoses) >= loses)
	{
		return TEAM_TERRORIST;
	}
	
	return TEAM_UNASSIGNED;
}
/*
stock TeamName:rg_get_team_loses_row(const loses)
{
    return (get_member_game(m_iNumConsecutiveCTLoses) >= loses) ? TEAM_CT : (get_member_game(m_iNumConsecutiveTerroristLoses) >= loses) ? TEAM_TERRORIST : TEAM_UNASSIGNED;
}
*/

/* -> Player Animation <- */
stock UTIL_PlayerAnimation(const pPlayer, const szAnim[], const Float:flFrameRateAnim = 1.0, const Activity:iActivity = ACT_RANGE_ATTACK1) {
	new iAnimDesired, Float:flFrameRate, Float:flGroundSpeed, bool:bLoops;
	if ((iAnimDesired = lookup_sequence(pPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
		iAnimDesired = 0;

	static Float:flGameTime; flGameTime = get_gametime();

	UTIL_SetEntityAnim(pPlayer, iAnimDesired, .flFrameRate = flFrameRateAnim);

	set_member(pPlayer, m_fSequenceLoops, bLoops)
	set_member(pPlayer, m_fSequenceFinished, 0)
	set_member(pPlayer, m_flFrameRate, flFrameRate)
	set_member(pPlayer, m_flGroundSpeed, flGroundSpeed)
	set_member(pPlayer, m_flLastEventCheck, flGameTime);
	set_member(pPlayer, m_Activity, iActivity)
	set_member(pPlayer, m_IdealActivity, iActivity)
	set_member(pPlayer, m_flLastFired, flGameTime)
}

/* -> Entity Animation <- */
stock UTIL_SetEntityAnim(const pEntity, const iSequence = 0, const Float:flFrame = 0.0, const Float:flFrameRate = 1.0) {
	set_entvar(pEntity, var_frame, flFrame);
	set_entvar(pEntity, var_framerate, flFrameRate);
	set_entvar(pEntity, var_animtime, get_gametime());
	set_entvar(pEntity, var_sequence, iSequence);
}

/**
* Format number to string with a special character

new iValue = random_num( 10000, 99999999 );
new szFormatedValue[16]; UTIL_FormatNumber(iValue, szFormatedValue, charsmax( szFormatedValue ) );
server_print( "Input: %i, Output: %s", iValue, szFormatedValue );

Output:

Input: 82275013, Output: 82 275 013
*/
stock UTIL_FormatNumber(iValue, szOutput[], iLen, const szSpecialChar = ' ') {
	static szBuffer[16], iOutputPos, iNumPos, iNumLen
	szBuffer[0] = '^0', iOutputPos = iNumPos = iNumLen = 0

	if (iValue < 0)
	{
		szOutput[ iOutputPos++ ] = '-';
		iValue = abs( iValue );
	}

	iNumLen = num_to_str(iValue, szBuffer, charsmax(szBuffer))

	if (iNumLen <= 3)
		iOutputPos += copy( szOutput[ iOutputPos ], iLen, szBuffer)
	else
	{
		while ((iNumPos < iNumLen) && (iOutputPos < iLen))
		{
			szOutput[iOutputPos++] = szBuffer[iNumPos++]
			if ((iNumLen - iNumPos) && !((iNumLen - iNumPos) % 3))
			szOutput[iOutputPos++] = szSpecialChar
		}
		szOutput[iOutputPos] = EOS
	}

	return iOutputPos
}

/*
*    Возвращает адрес переменной.
*/
stock get_var_address(...) {
    assert numargs() == 1;

    #emit LOAD.S.pri    0xC // First argument.
    #emit RETN

    return 0;
}

/*
*    Пишет в память AMX по указанному адресу.
*/
stock write_amx_memory(iAddress, iValue) {
    #emit LOAD.S.pri    iValue
    #emit SREF.S.pri    iAddress
    #emit RETN

    return 0;
}

stock rg_get_players_num(&terrorist = 0, &ct = 0, &spec = 0, &unassigned = 0) {
	for (new id = 1; id <= MaxClients; id++)
	{
		if (!is_user_connected(id))
			continue;

		switch (get_member(id, m_iTeam))
		{
			case TEAM_TERRORIST: terrorist++;
			case TEAM_CT: ct++;
			case TEAM_SPECTATOR: spec++;
			case TEAM_UNASSIGNED: unassigned++;
		}
	}
}

// Garey
/*
FORPLAYERS(i, iPlayers, iAliveCount, GetPlayers_ExcludeDead, "")
{
    rg_set_user_team(iPlayers[i], TEAM_CT);
}

new iPlayers[MAX_PLAYERS], iAliveCount;
get_players_ex(iPlayers, iAliveCount, GetPlayers_ExcludeDead, "")
for(new i = 0; i < iAliveCount; i++)
{
    rg_set_user_team(iPlayers[i], TEAM_CT);
}
*/
#define GETPLAYERS(%1,%2,%3,%4) \
new %1[MAX_PLAYERS], %2; \
get_players_ex(%1, %2, %3, %4)

#define FORPLAYERS(%1,%2,%3,%4,%5) \
GETPLAYERS(%2,%3,%4,%5); \
for(new %1 = 0; %1 < %3; %1++)


/*
* id
* Player to send the message to.
*   0 = everyone
* 
* text[]
*   Text to send.
* 
* Float:X
*   X position on screen.
* 
* Float:Y
*   Y position on screen.
* 
* R
*   Red color.
* 
* G
*   Green color.
* 
* B
*   Blue color.
* 
* A
*   Alpha.
*   Default value: 255
* 
* Float:holdtime
*   Float:fadeintime
*   Time to fade in message
*   Default value: 0.1
* 
* Float:fadeouttime
*   Time to fade out message
*   Default value: 0.1
* 
* channel
*   Textchannel
*   -1 = auto choose.
*   Default value: -1
* 
* effect
*   Effect of message.
*   1 = Flicker with 2nd color.
*   2 = Print out as 2nd color, fade into 1st color.
*     effecttime decides fade time between colors.
*     fadeintime decides how fast the letters should be printed out.
*   Default value: 0
* 
* effect_R
*   Red color of effect.
*   Default value: 0
* 
* effect_G
*   Green color of effect.
*   Default value: 0
* 
* effect_B
*   Blue color of effect.
*   Default value: 0
* 
* effect_A
*   Alpha of effect.
*   Default value: 255
* 
* Float:effecttime
*   Only for effect 2.
*   Default value: 0.0
*
*
*
* Example:
* rg_send_hudmessage(index, szMessage, 0.05, 0.30, random(256), random_num(100, 255), random(256), 150, 5.0, 0.10, 0.20, -1, 2, random_num(0, 100), random_num(0, 100), random_num(0, 100), 200, 2.0)
*/
stock rg_send_hudmessage(id,text[],Float:fX,Float:fY,C_RED,C_GREEN,C_BLUE,A=255,Float:holdtime=5.0,Float:fadeintime=0.1,Float:fadeouttime=0.1,channel=-1,effect=0,effect_R=0,effect_G=0,effect_B=0,effect_A=255,Float:effecttime=0.0) {
	if (id)
		message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, {0,0,0}, id)
	else
		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
	write_byte(TE_TEXTMESSAGE)
	write_byte(channel)
	write_short(rg_coord_to_hudmsgshort(fX))
	write_short(rg_coord_to_hudmsgshort(fY))
	write_byte(effect)
	write_byte(C_RED)   
	write_byte(C_GREEN)
	write_byte(C_BLUE)
	write_byte(A)
	write_byte(effect_R)
	write_byte(effect_G)
	write_byte(effect_B)
	write_byte(effect_A)
	write_short(rg_seconds_to_hudmsgshort(fadeintime))
	write_short(rg_seconds_to_hudmsgshort(fadeouttime))
	write_short(rg_seconds_to_hudmsgshort(holdtime))
	if (effect == 2)
		write_short(rg_seconds_to_hudmsgshort(effecttime))
	write_string(text)
	message_end()
}

/* 0.0 - 255.99609375 seconds */
stock rg_seconds_to_hudmsgshort(Float:sec) {
	new output = floatround(sec * 256)
	return output < 0 ? 0 : output > 65535 ? 65535 : output
}

stock rg_coord_to_hudmsgshort(Float:coord) {
	new output = floatround(coord * 8192)
	return output < -32768 ? -32768 : output > 32767 ? 32767 : output
}

// Credits OciXCrom
stock try_precache_player_model(const name[], &id = 0) {
	new model[128]
	formatex(model, charsmax(model), "models/player/%s/%sT.mdl", name, name)

	if(file_exists(model))
		id = precache_generic(model)

	static const extension[] = "T.mdl"
	#pragma unused extension

	copy(model[strlen(model) - charsmax(extension)], charsmax(model), ".mdl")
	return precache_model(model)
}

stock try_precache_sounds(const name[]) {
	if (file_exists(name))
	{
		if (containi(name, ".mp3") != -1)
			precache_sound(name)
		else
			precache_generic(name)
	}

}

// Credits: OciXCrom for bad calculation of percentage!!
// Credits: Huehue for fixing his bad math..
stock discount_math_fix(iNum, const szPercent[]) {
	static szNewMath[16], bool:bPercent, cOperator, iMath, iCalculate
	
	copy(szNewMath, charsmax(szNewMath), szPercent)
	bPercent = szNewMath[strlen(szNewMath) - 1] == '%'
	cOperator = szNewMath[0]

	if (!isdigit(szNewMath[0]))
		szNewMath[0] = ' '

	if (bPercent)
		replace(szNewMath, charsmax(szNewMath), "%", "")

	trim(szNewMath)
	iMath = str_to_num(szNewMath)

	if (bPercent)
		iCalculate = (iNum * iMath) / 100
	   
	switch(cOperator)
	{
		case '+': iNum += bPercent ? iCalculate : iMath
		case '-': iNum -= bPercent ? iCalculate : iMath
		case '/': iNum /= bPercent ? iCalculate : iMath
		case '*': iNum *= bPercent ? iCalculate : iMath
		default: iNum = bPercent ? iCalculate : iMath
	}

	return iNum
}
РЕКЛАМИРАЙ ПРИ НАС!
AMXX-BG.INFO
КАК ДА ИЗПОЛЗВАМ
Добави в началото на .sma файла:
#include <reapi_stocks>
1. Изтегли
Свали файла от бутона по-горе
2. Копирай
Постави в scripting/include/
3. Включи
Добави #include директивата
4. Компилирай
Използвай amxxpc или scripting/compile.exe
PrivateServ.NET