diff --git a/plugins/include/tf2.inc b/plugins/include/tf2.inc
index 4116d0f4..f93d5da5 100644
--- a/plugins/include/tf2.inc
+++ b/plugins/include/tf2.inc
@@ -42,6 +42,7 @@
#define TF_STUNFLAG_NOSOUNDOREFFECT (1 << 5) /**< no sound or particle */
#define TF_STUNFLAG_THIRDPERSON (1 << 6) /**< panic animation */
#define TF_STUNFLAG_GHOSTEFFECT (1 << 7) /**< ghost particles */
+#define TF_STUNFLAG_SOUND (1 << 8) /**< sound */
#define TF_STUNFLAGS_LOSERSTATE TF_STUNFLAG_SLOWDOWN|TF_STUNFLAG_NOSOUNDOREFFECT|TF_STUNFLAG_THIRDPERSON
#define TF_STUNFLAGS_GHOSTSCARE TF_STUNFLAG_GHOSTEFFECT|TF_STUNFLAG_THIRDPERSON
diff --git a/plugins/include/tf2_stocks.inc b/plugins/include/tf2_stocks.inc
index 6b7ae20b..0d68e115 100644
--- a/plugins/include/tf2_stocks.inc
+++ b/plugins/include/tf2_stocks.inc
@@ -1,586 +1,588 @@
-/**
- * vim: set ts=4 :
- * =============================================================================
- * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved.
- * =============================================================================
- *
- * This file is part of the SourceMod/SourcePawn SDK.
- *
- * This program is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License, version 3.0, as published by the
- * Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- * details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program. If not, see .
- *
- * As a special exception, AlliedModders LLC gives you permission to link the
- * code of this program (as well as its derivative works) to "Half-Life 2," the
- * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
- * by the Valve Corporation. You must obey the GNU General Public License in
- * all respects for all other code used. Additionally, AlliedModders LLC grants
- * this exception to all derivative works. AlliedModders LLC defines further
- * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
- * or .
- *
- * Version: $Id$
- */
-
-#if defined _tf2_stocks_included
- #endinput
-#endif
-#define _tf2_stocks_included
-
-#include
-#include
-
-#define TF_CONDFLAG_NONE 0
-#define TF_CONDFLAG_SLOWED (1 << 0)
-#define TF_CONDFLAG_ZOOMED (1 << 1)
-#define TF_CONDFLAG_DISGUISING (1 << 2)
-#define TF_CONDFLAG_DISGUISED (1 << 3)
-#define TF_CONDFLAG_CLOAKED (1 << 4)
-#define TF_CONDFLAG_UBERCHARGED (1 << 5)
-#define TF_CONDFLAG_TELEPORTGLOW (1 << 6)
-#define TF_CONDFLAG_TAUNTING (1 << 7)
-#define TF_CONDFLAG_UBERCHARGEFADE (1 << 8)
-#define TF_CONDFLAG_CLOAKFLICKER (1 << 9)
-#define TF_CONDFLAG_TELEPORTING (1 << 10)
-#define TF_CONDFLAG_KRITZKRIEGED (1 << 11)
-#define TF_CONDFLAG_DEADRINGERED (1 << 13)
-#define TF_CONDFLAG_BONKED (1 << 14)
-#define TF_CONDFLAG_DAZED (1 << 15)
-#define TF_CONDFLAG_BUFFED (1 << 16)
-#define TF_CONDFLAG_CHARGING (1 << 17)
-#define TF_CONDFLAG_DEMOBUFF (1 << 18)
-#define TF_CONDFLAG_CRITCOLA (1 << 19)
-#define TF_CONDFLAG_INHEALRADIUS (1 << 20)
-#define TF_CONDFLAG_HEALING (1 << 21)
-#define TF_CONDFLAG_ONFIRE (1 << 22)
-#define TF_CONDFLAG_OVERHEALED (1 << 23)
-#define TF_CONDFLAG_JARATED (1 << 24)
-#define TF_CONDFLAG_BLEEDING (1 << 25)
-#define TF_CONDFLAG_DEFENSEBUFFED (1 << 26)
-#define TF_CONDFLAG_MILKED (1 << 27)
-#define TF_CONDFLAG_MEGAHEAL (1 << 28)
-#define TF_CONDFLAG_REGENBUFFED (1 << 29)
-#define TF_CONDFLAG_MARKEDFORDEATH (1 << 30)
-
-#define TF_DEATHFLAG_KILLERDOMINATION (1 << 0)
-#define TF_DEATHFLAG_ASSISTERDOMINATION (1 << 1)
-#define TF_DEATHFLAG_KILLERREVENGE (1 << 2)
-#define TF_DEATHFLAG_ASSISTERREVENGE (1 << 3)
-#define TF_DEATHFLAG_FIRSTBLOOD (1 << 4)
-#define TF_DEATHFLAG_DEADRINGER (1 << 5)
-#define TF_DEATHFLAG_INTERRUPTED (1 << 6)
-#define TF_DEATHFLAG_GIBBED (1 << 7)
-#define TF_DEATHFLAG_PURGATORY (1 << 8)
-
-// Custom kill identifiers for the customkill property on the player_death event
-enum {
- TF_CUSTOM_HEADSHOT = 1,
- TF_CUSTOM_BACKSTAB,
- TF_CUSTOM_BURNING,
- TF_CUSTOM_WRENCH_FIX,
- TF_CUSTOM_MINIGUN,
- TF_CUSTOM_SUICIDE,
- TF_CUSTOM_TAUNT_HADOUKEN,
- TF_CUSTOM_BURNING_FLARE,
- TF_CUSTOM_TAUNT_HIGH_NOON,
- TF_CUSTOM_TAUNT_GRAND_SLAM,
- TF_CUSTOM_PENETRATE_MY_TEAM,
- TF_CUSTOM_PENETRATE_ALL_PLAYERS,
- TF_CUSTOM_TAUNT_FENCING,
- TF_CUSTOM_PENETRATE_HEADSHOT,
- TF_CUSTOM_TAUNT_ARROW_STAB,
- TF_CUSTOM_TELEFRAG,
- TF_CUSTOM_BURNING_ARROW,
- TF_CUSTOM_FLYINGBURN,
- TF_CUSTOM_PUMPKIN_BOMB,
- TF_CUSTOM_DECAPITATION,
- TF_CUSTOM_TAUNT_GRENADE,
- TF_CUSTOM_BASEBALL,
- TF_CUSTOM_CHARGE_IMPACT,
- TF_CUSTOM_TAUNT_BARBARIAN_SWING,
- TF_CUSTOM_AIR_STICKY_BURST,
- TF_CUSTOM_DEFENSIVE_STICKY,
- TF_CUSTOM_PICKAXE,
- TF_CUSTOM_ROCKET_DIRECTHIT,
- TF_CUSTOM_TAUNT_UBERSLICE,
- TF_CUSTOM_PLAYER_SENTRY,
- TF_CUSTOM_STANDARD_STICKY,
- TF_CUSTOM_SHOTGUN_REVENGE_CRIT,
- TF_CUSTOM_TAUNT_ENGINEER_SMASH,
- TF_CUSTOM_BLEEDING,
- TF_CUSTOM_GOLD_WRENCH,
- TF_CUSTOM_CARRIED_BUILDING,
- TF_CUSTOM_COMBO_PUNCH,
- TF_CUSTOM_TAUNT_ENGINEER_ARM,
- TF_CUSTOM_FISH_KILL,
- TF_CUSTOM_TRIGGER_HURT,
- TF_CUSTOM_DECAPITATION_BOSS,
- TF_CUSTOM_STICKBOMB_EXPLOSION,
- TF_CUSTOM_AEGIS_ROUND,
- TF_CUSTOM_FLARE_EXPLOSION,
- TF_CUSTOM_BOOTS_STOMP,
- TF_CUSTOM_PLASMA,
- TF_CUSTOM_PLASMA_CHARGED,
- TF_CUSTOM_PLASMA_GIB,
- TF_CUSTOM_PRACTICE_STICKY,
- TF_CUSTOM_EYEBALL_ROCKET,
- TF_CUSTOM_HEADSHOT_DECAPITATION,
- TF_CUSTOM_TAUNT_ARMAGEDDON,
- TF_CUSTOM_FLARE_PELLET,
- TF_CUSTOM_CLEAVER,
- TF_CUSTOM_CLEAVER_CRIT,
- TF_CUSTOM_SAPPER_RECORDER_DEATH,
- TF_CUSTOM_MERASMUS_PLAYER_BOMB,
- TF_CUSTOM_MERASMUS_GRENADE,
- TF_CUSTOM_MERASMUS_ZAP,
- TF_CUSTOM_MERASMUS_DECAPITATION,
- TF_CUSTOM_CANNONBALL_PUSH,
- TF_CUSTOM_TAUNT_ALLCLASS_GUITAR_RIFF,
- TF_CUSTOM_THROWABLE,
- TF_CUSTOM_THROWABLE_KILL,
- TF_CUSTOM_SPELL_TELEPORT,
- TF_CUSTOM_SPELL_SKELETON,
- TF_CUSTOM_SPELL_MIRV,
- TF_CUSTOM_SPELL_METEOR,
- TF_CUSTOM_SPELL_LIGHTNING,
- TF_CUSTOM_SPELL_FIREBALL,
- TF_CUSTOM_SPELL_MONOCULUS,
- TF_CUSTOM_SPELL_BLASTJUMP,
- TF_CUSTOM_SPELL_BATS,
- TF_CUSTOM_SPELL_TINY,
- TF_CUSTOM_KART,
- TF_CUSTOM_GIANT_HAMMER,
- TF_CUSTOM_RUNE_REFLECT,
- TF_CUSTOM_DRAGONS_FURY_IGNITE,
- TF_CUSTOM_DRAGONS_FURY_BONUS_BURNING,
- TF_CUSTOM_SLAP_KILL,
- TF_CUSTOM_CROC,
- TF_CUSTOM_TAUNTATK_GASBLAST,
-};
-
-// Weapon codes as used in some events, such as player_death
-// (not to be confused with Item Definition Indexes)
-enum {
- TF_WEAPON_NONE = 0,
- TF_WEAPON_BAT,
- TF_WEAPON_BAT_WOOD,
- TF_WEAPON_BOTTLE,
- TF_WEAPON_FIREAXE,
- TF_WEAPON_CLUB,
- TF_WEAPON_CROWBAR,
- TF_WEAPON_KNIFE,
- TF_WEAPON_FISTS,
- TF_WEAPON_SHOVEL,
- TF_WEAPON_WRENCH,
- TF_WEAPON_BONESAW,
- TF_WEAPON_SHOTGUN_PRIMARY,
- TF_WEAPON_SHOTGUN_SOLDIER,
- TF_WEAPON_SHOTGUN_HWG,
- TF_WEAPON_SHOTGUN_PYRO,
- TF_WEAPON_SCATTERGUN,
- TF_WEAPON_SNIPERRIFLE,
- TF_WEAPON_MINIGUN,
- TF_WEAPON_SMG,
- TF_WEAPON_SYRINGEGUN_MEDIC,
- TF_WEAPON_TRANQ,
- TF_WEAPON_ROCKETLAUNCHER,
- TF_WEAPON_GRENADELAUNCHER,
- TF_WEAPON_PIPEBOMBLAUNCHER,
- TF_WEAPON_FLAMETHROWER,
- TF_WEAPON_GRENADE_NORMAL,
- TF_WEAPON_GRENADE_CONCUSSION,
- TF_WEAPON_GRENADE_NAIL,
- TF_WEAPON_GRENADE_MIRV,
- TF_WEAPON_GRENADE_MIRV_DEMOMAN,
- TF_WEAPON_GRENADE_NAPALM,
- TF_WEAPON_GRENADE_GAS,
- TF_WEAPON_GRENADE_EMP,
- TF_WEAPON_GRENADE_CALTROP,
- TF_WEAPON_GRENADE_PIPEBOMB,
- TF_WEAPON_GRENADE_SMOKE_BOMB,
- TF_WEAPON_GRENADE_HEAL,
- TF_WEAPON_GRENADE_STUNBALL,
- TF_WEAPON_GRENADE_JAR,
- TF_WEAPON_GRENADE_JAR_MILK,
- TF_WEAPON_PISTOL,
- TF_WEAPON_PISTOL_SCOUT,
- TF_WEAPON_REVOLVER,
- TF_WEAPON_NAILGUN,
- TF_WEAPON_PDA,
- TF_WEAPON_PDA_ENGINEER_BUILD,
- TF_WEAPON_PDA_ENGINEER_DESTROY,
- TF_WEAPON_PDA_SPY,
- TF_WEAPON_BUILDER,
- TF_WEAPON_MEDIGUN,
- TF_WEAPON_GRENADE_MIRVBOMB,
- TF_WEAPON_FLAMETHROWER_ROCKET,
- TF_WEAPON_GRENADE_DEMOMAN,
- TF_WEAPON_SENTRY_BULLET,
- TF_WEAPON_SENTRY_ROCKET,
- TF_WEAPON_DISPENSER,
- TF_WEAPON_INVIS,
- TF_WEAPON_FLAREGUN,
- TF_WEAPON_LUNCHBOX,
- TF_WEAPON_JAR,
- TF_WEAPON_COMPOUND_BOW,
- TF_WEAPON_BUFF_ITEM,
- TF_WEAPON_PUMPKIN_BOMB,
- TF_WEAPON_SWORD,
- TF_WEAPON_DIRECTHIT,
- TF_WEAPON_LIFELINE,
- TF_WEAPON_LASER_POINTER,
- TF_WEAPON_DISPENSER_GUN,
- TF_WEAPON_SENTRY_REVENGE,
- TF_WEAPON_JAR_MILK,
- TF_WEAPON_HANDGUN_SCOUT_PRIMARY,
- TF_WEAPON_BAT_FISH,
- TF_WEAPON_CROSSBOW,
- TF_WEAPON_STICKBOMB,
- TF_WEAPON_HANDGUN_SCOUT_SEC,
- TF_WEAPON_SODA_POPPER,
- TF_WEAPON_SNIPERRIFLE_DECAP,
- TF_WEAPON_RAYGUN,
- TF_WEAPON_PARTICLE_CANNON,
- TF_WEAPON_MECHANICAL_ARM,
- TF_WEAPON_DRG_POMSON,
- TF_WEAPON_BAT_GIFTWRAP,
- TF_WEAPON_GRENADE_ORNAMENT,
- TF_WEAPON_RAYGUN_REVENGE,
- TF_WEAPON_PEP_BRAWLER_BLASTER,
- TF_WEAPON_CLEAVER,
- TF_WEAPON_GRENADE_CLEAVER,
- TF_WEAPON_STICKY_BALL_LAUNCHER,
- TF_WEAPON_GRENADE_STICKY_BALL,
- TF_WEAPON_SHOTGUN_BUILDING_RESCUE,
- TF_WEAPON_CANNON,
- TF_WEAPON_THROWABLE,
- TF_WEAPON_GRENADE_THROWABLE,
- TF_WEAPON_PDA_SPY_BUILD,
- TF_WEAPON_GRENADE_WATERBALLOON,
- TF_WEAPON_HARVESTER_SAW,
- TF_WEAPON_SPELLBOOK,
- TF_WEAPON_SPELLBOOK_PROJECTILE,
- TF_WEAPON_SNIPERRIFLE_CLASSIC,
- TF_WEAPON_PARACHUTE,
- TF_WEAPON_GRAPPLINGHOOK,
- TF_WEAPON_PASSTIME_GUN,
- TF_WEAPON_CHARGED_SMG,
- TF_WEAPON_BREAKABLE_SIGN,
- TF_WEAPON_ROCKETPACK,
- TF_WEAPON_SLAP,
- TF_WEAPON_JAR_GAS,
- TF_WEAPON_GRENADE_JAR_GAS,
- TF_WEAPON_FLAME_BALL,
-};
-
-// TF2 Weapon Loadout Slots
-enum
-{
- TFWeaponSlot_Primary,
- TFWeaponSlot_Secondary,
- TFWeaponSlot_Melee,
- TFWeaponSlot_Grenade,
- TFWeaponSlot_Building,
- TFWeaponSlot_PDA,
- TFWeaponSlot_Item1,
- TFWeaponSlot_Item2
-};
-
-// Identifiers for the eventtype property on the teamplay_flag_event event
-enum {
- TF_FLAGEVENT_PICKEDUP = 1,
- TF_FLAGEVENT_CAPTURED,
- TF_FLAGEVENT_DEFENDED,
- TF_FLAGEVENT_DROPPED,
- TF_FLAGEVENT_RETURNED
-};
-
-enum TFResourceType
-{
- TFResource_Ping,
- TFResource_Score,
- TFResource_Deaths,
- TFResource_TotalScore,
- TFResource_Captures,
- TFResource_Defenses,
- TFResource_Dominations,
- TFResource_Revenge,
- TFResource_BuildingsDestroyed,
- TFResource_Headshots,
- TFResource_Backstabs,
- TFResource_HealPoints,
- TFResource_Invulns,
- TFResource_Teleports,
- TFResource_ResupplyPoints,
- TFResource_KillAssists,
- TFResource_MaxHealth,
- TFResource_PlayerClass
-};
-
-static const char TFResourceNames[TFResourceType][] =
-{
- "m_iPing",
- "m_iScore",
- "m_iDeaths",
- "m_iTotalScore",
- "m_iCaptures",
- "m_iDefenses",
- "m_iDominations",
- "m_iRevenge",
- "m_iBuildingsDestroyed",
- "m_iHeadshots",
- "m_iBackstabs",
- "m_iHealPoints",
- "m_iInvulns",
- "m_iTeleports",
- "m_iResupplyPoints",
- "m_iKillAssists",
- "m_iMaxHealth",
- "m_iPlayerClass"
-};
-
-/**
- * Gets a client's current team.
- *
- * @param client Client index.
- * @return Current TFTeam of client.
- * @error Invalid client index.
- */
-stock TFTeam TF2_GetClientTeam(int client)
-{
- return view_as(GetClientTeam(client));
-}
-
-/**
- * Changes a client's current team.
- *
- * @param client Client index.
- * @param team TFTeam team symbol.
- * @error Invalid client index.
- */
-stock void TF2_ChangeClientTeam(int client, TFTeam team)
-{
- ChangeClientTeam(client, view_as(team));
-}
-
-/**
- * Gets a client's current class.
- *
- * @param client Player's index.
- * @return Current TFClassType of player.
- * @error Invalid client index.
- */
-stock TFClassType TF2_GetPlayerClass(int client)
-{
- return view_as(GetEntProp(client, Prop_Send, "m_iClass"));
-}
-
-/**
- * Sets a client's class.
- *
- * Note: If setting player class in a player spawn hook weapons should be set to false.
- *
- * @param client Player's index.
- * @param classType TFClassType class symbol.
- * @param weapons This parameter is ignored.
- * @param persistent If true, changes the player's desired class so the change stays after death.
- * @error Invalid client index.
- */
-stock void TF2_SetPlayerClass(int client, TFClassType classType, bool weapons=true, bool persistent=true)
-{
- SetEntProp(client, Prop_Send, "m_iClass", view_as(classType));
-
- if (persistent)
- {
- SetEntProp(client, Prop_Send, "m_iDesiredPlayerClass", view_as(classType));
- }
-}
-
-/**
- * Retrieves client data from the resource entity
- *
- * @param client Player's index.
- * @param type ResourceType constant
- * @return Value or -1 on failure.
- * @error Invalid client index, client not in game or failed to find resource entity.
- */
-#pragma deprecated Use GetPlayerResourceEntity and GetEntProp instead
-stock int TF2_GetPlayerResourceData(int client, TFResourceType type)
-{
- if (!IsClientConnected(client))
- {
- return -1;
- }
-
- int offset = FindSendPropInfo("CTFPlayerResource", TFResourceNames[type]);
-
- if (offset < 1)
- {
- return -1;
- }
-
- int entity = TF2_GetResourceEntity();
-
- if (entity == -1)
- {
- return -1;
- }
-
- return GetEntData(entity, offset + (client*4));
-}
-
-/**
- * Sets client data in the resource entity
- *
- * Note: The game overwrites these values every frame, so changing them will have very little effect.
- *
- * @param client Player's index.
- * @param type ResourceType constant
- * @param value Value to set.
- * @return Value or -1 on failure.
- * @error Invalid client index, client not in game or failed to find resource entity.
- */
-#pragma deprecated Use GetPlayerResourceEntity and SetEntProp instead
-stock bool TF2_SetPlayerResourceData(int client, TFResourceType type, any value)
-{
- if (!IsClientConnected(client))
- {
- return false;
- }
-
- int offset = FindSendPropInfo("CTFPlayerResource", TFResourceNames[type]);
-
- if (offset < 1)
- {
- return false;
- }
-
- int entity = TF2_GetResourceEntity();
-
- if (entity == -1)
- {
- return false;
- }
-
- SetEntData(entity, offset + (client*4), value);
-
- return true;
-}
-
-/**
- * Removes all weapons from a client's weapon slot
- *
- * @param client Player's index.
- * @param slot Slot index (0-5)
- * @error Invalid client, invalid slot or lack of mod support
- */
-stock void TF2_RemoveWeaponSlot(int client, int slot)
-{
- int weaponIndex;
- while ((weaponIndex = GetPlayerWeaponSlot(client, slot)) != -1)
- {
- // bug #6206
- // papering over a valve bug where a weapon's extra wearables aren't properly removed from the weapon's owner
- int extraWearable = GetEntPropEnt(weaponIndex, Prop_Send, "m_hExtraWearable");
- if (extraWearable != -1)
- {
- TF2_RemoveWearable(client, extraWearable);
- }
-
- extraWearable = GetEntPropEnt(weaponIndex, Prop_Send, "m_hExtraWearableViewModel");
- if (extraWearable != -1)
- {
- TF2_RemoveWearable(client, extraWearable);
- }
-
- RemovePlayerItem(client, weaponIndex);
- AcceptEntityInput(weaponIndex, "Kill");
- }
-}
-
-/**
- * Removes all weapons from a client
- *
- * @param client Player's index.
- */
-stock void TF2_RemoveAllWeapons(int client)
-{
- for (int i = 0; i <= 5; i++)
- {
- TF2_RemoveWeaponSlot(client, i);
- }
-}
-
-/**
- * Gets a player's condition bits
- *
- * @param client Player's index.
- * @return Player's condition bits
- */
-#pragma deprecated Use TF2_IsPlayerInCondition instead.
-stock int TF2_GetPlayerConditionFlags(int client)
-{
- return GetEntProp(client, Prop_Send, "m_nPlayerCond")|GetEntProp(client, Prop_Send, "_condition_bits");
-}
-
-/**
- * Check whether or not a condition is set on a player
- *
- * @param client Player's index.
- * @param cond TFCond constant
- * @return True if set, false otherwise
- */
-stock bool TF2_IsPlayerInCondition(int client, TFCond cond)
-{
- // Conditions are stored across multiple netprops now, one for each 32-bit segment.
- int iCond = view_as(cond);
- switch (iCond / 32)
- {
- case 0:
- {
- int bit = 1 << iCond;
- if ((GetEntProp(client, Prop_Send, "m_nPlayerCond") & bit) == bit)
- {
- return true;
- }
-
- if ((GetEntProp(client, Prop_Send, "_condition_bits") & bit) == bit)
- {
- return true;
- }
- }
- case 1:
- {
- int bit = (1 << (iCond - 32));
- if ((GetEntProp(client, Prop_Send, "m_nPlayerCondEx") & bit) == bit)
- {
- return true;
- }
- }
- case 2:
- {
- int bit = (1 << (iCond - 64));
- if ((GetEntProp(client, Prop_Send, "m_nPlayerCondEx2") & bit) == bit)
- {
- return true;
- }
- }
- case 3:
- {
- int bit = (1 << (iCond - 96));
- if ((GetEntProp(client, Prop_Send, "m_nPlayerCondEx3") & bit) == bit)
- {
- return true;
- }
- }
+/**
+ * vim: set ts=4 :
+ * =============================================================================
+ * SourceMod (C)2004-2008 AlliedModders LLC. All rights reserved.
+ * =============================================================================
+ *
+ * This file is part of the SourceMod/SourcePawn SDK.
+ *
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, version 3.0, as published by the
+ * Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see .
+ *
+ * As a special exception, AlliedModders LLC gives you permission to link the
+ * code of this program (as well as its derivative works) to "Half-Life 2," the
+ * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
+ * by the Valve Corporation. You must obey the GNU General Public License in
+ * all respects for all other code used. Additionally, AlliedModders LLC grants
+ * this exception to all derivative works. AlliedModders LLC defines further
+ * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
+ * or .
+ *
+ * Version: $Id$
+ */
+
+#if defined _tf2_stocks_included
+ #endinput
+#endif
+#define _tf2_stocks_included
+
+#include
+#include
+
+#define TF_CONDFLAG_NONE 0
+#define TF_CONDFLAG_SLOWED (1 << 0)
+#define TF_CONDFLAG_ZOOMED (1 << 1)
+#define TF_CONDFLAG_DISGUISING (1 << 2)
+#define TF_CONDFLAG_DISGUISED (1 << 3)
+#define TF_CONDFLAG_CLOAKED (1 << 4)
+#define TF_CONDFLAG_UBERCHARGED (1 << 5)
+#define TF_CONDFLAG_TELEPORTGLOW (1 << 6)
+#define TF_CONDFLAG_TAUNTING (1 << 7)
+#define TF_CONDFLAG_UBERCHARGEFADE (1 << 8)
+#define TF_CONDFLAG_CLOAKFLICKER (1 << 9)
+#define TF_CONDFLAG_TELEPORTING (1 << 10)
+#define TF_CONDFLAG_KRITZKRIEGED (1 << 11)
+#define TF_CONDFLAG_DEADRINGERED (1 << 13)
+#define TF_CONDFLAG_BONKED (1 << 14)
+#define TF_CONDFLAG_DAZED (1 << 15)
+#define TF_CONDFLAG_BUFFED (1 << 16)
+#define TF_CONDFLAG_CHARGING (1 << 17)
+#define TF_CONDFLAG_DEMOBUFF (1 << 18)
+#define TF_CONDFLAG_CRITCOLA (1 << 19)
+#define TF_CONDFLAG_INHEALRADIUS (1 << 20)
+#define TF_CONDFLAG_HEALING (1 << 21)
+#define TF_CONDFLAG_ONFIRE (1 << 22)
+#define TF_CONDFLAG_OVERHEALED (1 << 23)
+#define TF_CONDFLAG_JARATED (1 << 24)
+#define TF_CONDFLAG_BLEEDING (1 << 25)
+#define TF_CONDFLAG_DEFENSEBUFFED (1 << 26)
+#define TF_CONDFLAG_MILKED (1 << 27)
+#define TF_CONDFLAG_MEGAHEAL (1 << 28)
+#define TF_CONDFLAG_REGENBUFFED (1 << 29)
+#define TF_CONDFLAG_MARKEDFORDEATH (1 << 30)
+
+#define TF_DEATHFLAG_KILLERDOMINATION (1 << 0)
+#define TF_DEATHFLAG_ASSISTERDOMINATION (1 << 1)
+#define TF_DEATHFLAG_KILLERREVENGE (1 << 2)
+#define TF_DEATHFLAG_ASSISTERREVENGE (1 << 3)
+#define TF_DEATHFLAG_FIRSTBLOOD (1 << 4)
+#define TF_DEATHFLAG_DEADRINGER (1 << 5)
+#define TF_DEATHFLAG_INTERRUPTED (1 << 6)
+#define TF_DEATHFLAG_GIBBED (1 << 7)
+#define TF_DEATHFLAG_PURGATORY (1 << 8)
+#define TF_DEATHFLAG_MINIBOSS (1 << 9)
+#define TF_DEATHFLAG_AUSTRALIUM (1 << 10)
+
+// Custom kill identifiers for the customkill property on the player_death event
+enum {
+ TF_CUSTOM_HEADSHOT = 1,
+ TF_CUSTOM_BACKSTAB,
+ TF_CUSTOM_BURNING,
+ TF_CUSTOM_WRENCH_FIX,
+ TF_CUSTOM_MINIGUN,
+ TF_CUSTOM_SUICIDE,
+ TF_CUSTOM_TAUNT_HADOUKEN,
+ TF_CUSTOM_BURNING_FLARE,
+ TF_CUSTOM_TAUNT_HIGH_NOON,
+ TF_CUSTOM_TAUNT_GRAND_SLAM,
+ TF_CUSTOM_PENETRATE_MY_TEAM,
+ TF_CUSTOM_PENETRATE_ALL_PLAYERS,
+ TF_CUSTOM_TAUNT_FENCING,
+ TF_CUSTOM_PENETRATE_HEADSHOT,
+ TF_CUSTOM_TAUNT_ARROW_STAB,
+ TF_CUSTOM_TELEFRAG,
+ TF_CUSTOM_BURNING_ARROW,
+ TF_CUSTOM_FLYINGBURN,
+ TF_CUSTOM_PUMPKIN_BOMB,
+ TF_CUSTOM_DECAPITATION,
+ TF_CUSTOM_TAUNT_GRENADE,
+ TF_CUSTOM_BASEBALL,
+ TF_CUSTOM_CHARGE_IMPACT,
+ TF_CUSTOM_TAUNT_BARBARIAN_SWING,
+ TF_CUSTOM_AIR_STICKY_BURST,
+ TF_CUSTOM_DEFENSIVE_STICKY,
+ TF_CUSTOM_PICKAXE,
+ TF_CUSTOM_ROCKET_DIRECTHIT,
+ TF_CUSTOM_TAUNT_UBERSLICE,
+ TF_CUSTOM_PLAYER_SENTRY,
+ TF_CUSTOM_STANDARD_STICKY,
+ TF_CUSTOM_SHOTGUN_REVENGE_CRIT,
+ TF_CUSTOM_TAUNT_ENGINEER_SMASH,
+ TF_CUSTOM_BLEEDING,
+ TF_CUSTOM_GOLD_WRENCH,
+ TF_CUSTOM_CARRIED_BUILDING,
+ TF_CUSTOM_COMBO_PUNCH,
+ TF_CUSTOM_TAUNT_ENGINEER_ARM,
+ TF_CUSTOM_FISH_KILL,
+ TF_CUSTOM_TRIGGER_HURT,
+ TF_CUSTOM_DECAPITATION_BOSS,
+ TF_CUSTOM_STICKBOMB_EXPLOSION,
+ TF_CUSTOM_AEGIS_ROUND,
+ TF_CUSTOM_FLARE_EXPLOSION,
+ TF_CUSTOM_BOOTS_STOMP,
+ TF_CUSTOM_PLASMA,
+ TF_CUSTOM_PLASMA_CHARGED,
+ TF_CUSTOM_PLASMA_GIB,
+ TF_CUSTOM_PRACTICE_STICKY,
+ TF_CUSTOM_EYEBALL_ROCKET,
+ TF_CUSTOM_HEADSHOT_DECAPITATION,
+ TF_CUSTOM_TAUNT_ARMAGEDDON,
+ TF_CUSTOM_FLARE_PELLET,
+ TF_CUSTOM_CLEAVER,
+ TF_CUSTOM_CLEAVER_CRIT,
+ TF_CUSTOM_SAPPER_RECORDER_DEATH,
+ TF_CUSTOM_MERASMUS_PLAYER_BOMB,
+ TF_CUSTOM_MERASMUS_GRENADE,
+ TF_CUSTOM_MERASMUS_ZAP,
+ TF_CUSTOM_MERASMUS_DECAPITATION,
+ TF_CUSTOM_CANNONBALL_PUSH,
+ TF_CUSTOM_TAUNT_ALLCLASS_GUITAR_RIFF,
+ TF_CUSTOM_THROWABLE,
+ TF_CUSTOM_THROWABLE_KILL,
+ TF_CUSTOM_SPELL_TELEPORT,
+ TF_CUSTOM_SPELL_SKELETON,
+ TF_CUSTOM_SPELL_MIRV,
+ TF_CUSTOM_SPELL_METEOR,
+ TF_CUSTOM_SPELL_LIGHTNING,
+ TF_CUSTOM_SPELL_FIREBALL,
+ TF_CUSTOM_SPELL_MONOCULUS,
+ TF_CUSTOM_SPELL_BLASTJUMP,
+ TF_CUSTOM_SPELL_BATS,
+ TF_CUSTOM_SPELL_TINY,
+ TF_CUSTOM_KART,
+ TF_CUSTOM_GIANT_HAMMER,
+ TF_CUSTOM_RUNE_REFLECT,
+ TF_CUSTOM_DRAGONS_FURY_IGNITE,
+ TF_CUSTOM_DRAGONS_FURY_BONUS_BURNING,
+ TF_CUSTOM_SLAP_KILL,
+ TF_CUSTOM_CROC,
+ TF_CUSTOM_TAUNTATK_GASBLAST,
+};
+
+// Weapon codes as used in some events, such as player_death
+// (not to be confused with Item Definition Indexes)
+enum {
+ TF_WEAPON_NONE = 0,
+ TF_WEAPON_BAT,
+ TF_WEAPON_BAT_WOOD,
+ TF_WEAPON_BOTTLE,
+ TF_WEAPON_FIREAXE,
+ TF_WEAPON_CLUB,
+ TF_WEAPON_CROWBAR,
+ TF_WEAPON_KNIFE,
+ TF_WEAPON_FISTS,
+ TF_WEAPON_SHOVEL,
+ TF_WEAPON_WRENCH,
+ TF_WEAPON_BONESAW,
+ TF_WEAPON_SHOTGUN_PRIMARY,
+ TF_WEAPON_SHOTGUN_SOLDIER,
+ TF_WEAPON_SHOTGUN_HWG,
+ TF_WEAPON_SHOTGUN_PYRO,
+ TF_WEAPON_SCATTERGUN,
+ TF_WEAPON_SNIPERRIFLE,
+ TF_WEAPON_MINIGUN,
+ TF_WEAPON_SMG,
+ TF_WEAPON_SYRINGEGUN_MEDIC,
+ TF_WEAPON_TRANQ,
+ TF_WEAPON_ROCKETLAUNCHER,
+ TF_WEAPON_GRENADELAUNCHER,
+ TF_WEAPON_PIPEBOMBLAUNCHER,
+ TF_WEAPON_FLAMETHROWER,
+ TF_WEAPON_GRENADE_NORMAL,
+ TF_WEAPON_GRENADE_CONCUSSION,
+ TF_WEAPON_GRENADE_NAIL,
+ TF_WEAPON_GRENADE_MIRV,
+ TF_WEAPON_GRENADE_MIRV_DEMOMAN,
+ TF_WEAPON_GRENADE_NAPALM,
+ TF_WEAPON_GRENADE_GAS,
+ TF_WEAPON_GRENADE_EMP,
+ TF_WEAPON_GRENADE_CALTROP,
+ TF_WEAPON_GRENADE_PIPEBOMB,
+ TF_WEAPON_GRENADE_SMOKE_BOMB,
+ TF_WEAPON_GRENADE_HEAL,
+ TF_WEAPON_GRENADE_STUNBALL,
+ TF_WEAPON_GRENADE_JAR,
+ TF_WEAPON_GRENADE_JAR_MILK,
+ TF_WEAPON_PISTOL,
+ TF_WEAPON_PISTOL_SCOUT,
+ TF_WEAPON_REVOLVER,
+ TF_WEAPON_NAILGUN,
+ TF_WEAPON_PDA,
+ TF_WEAPON_PDA_ENGINEER_BUILD,
+ TF_WEAPON_PDA_ENGINEER_DESTROY,
+ TF_WEAPON_PDA_SPY,
+ TF_WEAPON_BUILDER,
+ TF_WEAPON_MEDIGUN,
+ TF_WEAPON_GRENADE_MIRVBOMB,
+ TF_WEAPON_FLAMETHROWER_ROCKET,
+ TF_WEAPON_GRENADE_DEMOMAN,
+ TF_WEAPON_SENTRY_BULLET,
+ TF_WEAPON_SENTRY_ROCKET,
+ TF_WEAPON_DISPENSER,
+ TF_WEAPON_INVIS,
+ TF_WEAPON_FLAREGUN,
+ TF_WEAPON_LUNCHBOX,
+ TF_WEAPON_JAR,
+ TF_WEAPON_COMPOUND_BOW,
+ TF_WEAPON_BUFF_ITEM,
+ TF_WEAPON_PUMPKIN_BOMB,
+ TF_WEAPON_SWORD,
+ TF_WEAPON_DIRECTHIT,
+ TF_WEAPON_LIFELINE,
+ TF_WEAPON_LASER_POINTER,
+ TF_WEAPON_DISPENSER_GUN,
+ TF_WEAPON_SENTRY_REVENGE,
+ TF_WEAPON_JAR_MILK,
+ TF_WEAPON_HANDGUN_SCOUT_PRIMARY,
+ TF_WEAPON_BAT_FISH,
+ TF_WEAPON_CROSSBOW,
+ TF_WEAPON_STICKBOMB,
+ TF_WEAPON_HANDGUN_SCOUT_SEC,
+ TF_WEAPON_SODA_POPPER,
+ TF_WEAPON_SNIPERRIFLE_DECAP,
+ TF_WEAPON_RAYGUN,
+ TF_WEAPON_PARTICLE_CANNON,
+ TF_WEAPON_MECHANICAL_ARM,
+ TF_WEAPON_DRG_POMSON,
+ TF_WEAPON_BAT_GIFTWRAP,
+ TF_WEAPON_GRENADE_ORNAMENT,
+ TF_WEAPON_RAYGUN_REVENGE,
+ TF_WEAPON_PEP_BRAWLER_BLASTER,
+ TF_WEAPON_CLEAVER,
+ TF_WEAPON_GRENADE_CLEAVER,
+ TF_WEAPON_STICKY_BALL_LAUNCHER,
+ TF_WEAPON_GRENADE_STICKY_BALL,
+ TF_WEAPON_SHOTGUN_BUILDING_RESCUE,
+ TF_WEAPON_CANNON,
+ TF_WEAPON_THROWABLE,
+ TF_WEAPON_GRENADE_THROWABLE,
+ TF_WEAPON_PDA_SPY_BUILD,
+ TF_WEAPON_GRENADE_WATERBALLOON,
+ TF_WEAPON_HARVESTER_SAW,
+ TF_WEAPON_SPELLBOOK,
+ TF_WEAPON_SPELLBOOK_PROJECTILE,
+ TF_WEAPON_SNIPERRIFLE_CLASSIC,
+ TF_WEAPON_PARACHUTE,
+ TF_WEAPON_GRAPPLINGHOOK,
+ TF_WEAPON_PASSTIME_GUN,
+ TF_WEAPON_CHARGED_SMG,
+ TF_WEAPON_BREAKABLE_SIGN,
+ TF_WEAPON_ROCKETPACK,
+ TF_WEAPON_SLAP,
+ TF_WEAPON_JAR_GAS,
+ TF_WEAPON_GRENADE_JAR_GAS,
+ TF_WEAPON_FLAME_BALL,
+};
+
+// TF2 Weapon Loadout Slots
+enum
+{
+ TFWeaponSlot_Primary,
+ TFWeaponSlot_Secondary,
+ TFWeaponSlot_Melee,
+ TFWeaponSlot_Grenade,
+ TFWeaponSlot_Building,
+ TFWeaponSlot_PDA,
+ TFWeaponSlot_Item1,
+ TFWeaponSlot_Item2
+};
+
+// Identifiers for the eventtype property on the teamplay_flag_event event
+enum {
+ TF_FLAGEVENT_PICKEDUP = 1,
+ TF_FLAGEVENT_CAPTURED,
+ TF_FLAGEVENT_DEFENDED,
+ TF_FLAGEVENT_DROPPED,
+ TF_FLAGEVENT_RETURNED
+};
+
+enum TFResourceType
+{
+ TFResource_Ping,
+ TFResource_Score,
+ TFResource_Deaths,
+ TFResource_TotalScore,
+ TFResource_Captures,
+ TFResource_Defenses,
+ TFResource_Dominations,
+ TFResource_Revenge,
+ TFResource_BuildingsDestroyed,
+ TFResource_Headshots,
+ TFResource_Backstabs,
+ TFResource_HealPoints,
+ TFResource_Invulns,
+ TFResource_Teleports,
+ TFResource_ResupplyPoints,
+ TFResource_KillAssists,
+ TFResource_MaxHealth,
+ TFResource_PlayerClass
+};
+
+static const char TFResourceNames[TFResourceType][] =
+{
+ "m_iPing",
+ "m_iScore",
+ "m_iDeaths",
+ "m_iTotalScore",
+ "m_iCaptures",
+ "m_iDefenses",
+ "m_iDominations",
+ "m_iRevenge",
+ "m_iBuildingsDestroyed",
+ "m_iHeadshots",
+ "m_iBackstabs",
+ "m_iHealPoints",
+ "m_iInvulns",
+ "m_iTeleports",
+ "m_iResupplyPoints",
+ "m_iKillAssists",
+ "m_iMaxHealth",
+ "m_iPlayerClass"
+};
+
+/**
+ * Gets a client's current team.
+ *
+ * @param client Client index.
+ * @return Current TFTeam of client.
+ * @error Invalid client index.
+ */
+stock TFTeam TF2_GetClientTeam(int client)
+{
+ return view_as(GetClientTeam(client));
+}
+
+/**
+ * Changes a client's current team.
+ *
+ * @param client Client index.
+ * @param team TFTeam team symbol.
+ * @error Invalid client index.
+ */
+stock void TF2_ChangeClientTeam(int client, TFTeam team)
+{
+ ChangeClientTeam(client, view_as(team));
+}
+
+/**
+ * Gets a client's current class.
+ *
+ * @param client Player's index.
+ * @return Current TFClassType of player.
+ * @error Invalid client index.
+ */
+stock TFClassType TF2_GetPlayerClass(int client)
+{
+ return view_as(GetEntProp(client, Prop_Send, "m_iClass"));
+}
+
+/**
+ * Sets a client's class.
+ *
+ * Note: If setting player class in a player spawn hook weapons should be set to false.
+ *
+ * @param client Player's index.
+ * @param classType TFClassType class symbol.
+ * @param weapons This parameter is ignored.
+ * @param persistent If true, changes the player's desired class so the change stays after death.
+ * @error Invalid client index.
+ */
+stock void TF2_SetPlayerClass(int client, TFClassType classType, bool weapons=true, bool persistent=true)
+{
+ SetEntProp(client, Prop_Send, "m_iClass", view_as(classType));
+
+ if (persistent)
+ {
+ SetEntProp(client, Prop_Send, "m_iDesiredPlayerClass", view_as(classType));
+ }
+}
+
+/**
+ * Retrieves client data from the resource entity
+ *
+ * @param client Player's index.
+ * @param type ResourceType constant
+ * @return Value or -1 on failure.
+ * @error Invalid client index, client not in game or failed to find resource entity.
+ */
+#pragma deprecated Use GetPlayerResourceEntity and GetEntProp instead
+stock int TF2_GetPlayerResourceData(int client, TFResourceType type)
+{
+ if (!IsClientConnected(client))
+ {
+ return -1;
+ }
+
+ int offset = FindSendPropInfo("CTFPlayerResource", TFResourceNames[type]);
+
+ if (offset < 1)
+ {
+ return -1;
+ }
+
+ int entity = TF2_GetResourceEntity();
+
+ if (entity == -1)
+ {
+ return -1;
+ }
+
+ return GetEntData(entity, offset + (client*4));
+}
+
+/**
+ * Sets client data in the resource entity
+ *
+ * Note: The game overwrites these values every frame, so changing them will have very little effect.
+ *
+ * @param client Player's index.
+ * @param type ResourceType constant
+ * @param value Value to set.
+ * @return Value or -1 on failure.
+ * @error Invalid client index, client not in game or failed to find resource entity.
+ */
+#pragma deprecated Use GetPlayerResourceEntity and SetEntProp instead
+stock bool TF2_SetPlayerResourceData(int client, TFResourceType type, any value)
+{
+ if (!IsClientConnected(client))
+ {
+ return false;
+ }
+
+ int offset = FindSendPropInfo("CTFPlayerResource", TFResourceNames[type]);
+
+ if (offset < 1)
+ {
+ return false;
+ }
+
+ int entity = TF2_GetResourceEntity();
+
+ if (entity == -1)
+ {
+ return false;
+ }
+
+ SetEntData(entity, offset + (client*4), value);
+
+ return true;
+}
+
+/**
+ * Removes all weapons from a client's weapon slot
+ *
+ * @param client Player's index.
+ * @param slot Slot index (0-5)
+ * @error Invalid client, invalid slot or lack of mod support
+ */
+stock void TF2_RemoveWeaponSlot(int client, int slot)
+{
+ int weaponIndex;
+ while ((weaponIndex = GetPlayerWeaponSlot(client, slot)) != -1)
+ {
+ // bug #6206
+ // papering over a valve bug where a weapon's extra wearables aren't properly removed from the weapon's owner
+ int extraWearable = GetEntPropEnt(weaponIndex, Prop_Send, "m_hExtraWearable");
+ if (extraWearable != -1)
+ {
+ TF2_RemoveWearable(client, extraWearable);
+ }
+
+ extraWearable = GetEntPropEnt(weaponIndex, Prop_Send, "m_hExtraWearableViewModel");
+ if (extraWearable != -1)
+ {
+ TF2_RemoveWearable(client, extraWearable);
+ }
+
+ RemovePlayerItem(client, weaponIndex);
+ AcceptEntityInput(weaponIndex, "Kill");
+ }
+}
+
+/**
+ * Removes all weapons from a client
+ *
+ * @param client Player's index.
+ */
+stock void TF2_RemoveAllWeapons(int client)
+{
+ for (int i = 0; i <= 5; i++)
+ {
+ TF2_RemoveWeaponSlot(client, i);
+ }
+}
+
+/**
+ * Gets a player's condition bits
+ *
+ * @param client Player's index.
+ * @return Player's condition bits
+ */
+#pragma deprecated Use TF2_IsPlayerInCondition instead.
+stock int TF2_GetPlayerConditionFlags(int client)
+{
+ return GetEntProp(client, Prop_Send, "m_nPlayerCond")|GetEntProp(client, Prop_Send, "_condition_bits");
+}
+
+/**
+ * Check whether or not a condition is set on a player
+ *
+ * @param client Player's index.
+ * @param cond TFCond constant
+ * @return True if set, false otherwise
+ */
+stock bool TF2_IsPlayerInCondition(int client, TFCond cond)
+{
+ // Conditions are stored across multiple netprops now, one for each 32-bit segment.
+ int iCond = view_as(cond);
+ switch (iCond / 32)
+ {
+ case 0:
+ {
+ int bit = 1 << iCond;
+ if ((GetEntProp(client, Prop_Send, "m_nPlayerCond") & bit) == bit)
+ {
+ return true;
+ }
+
+ if ((GetEntProp(client, Prop_Send, "_condition_bits") & bit) == bit)
+ {
+ return true;
+ }
+ }
+ case 1:
+ {
+ int bit = (1 << (iCond - 32));
+ if ((GetEntProp(client, Prop_Send, "m_nPlayerCondEx") & bit) == bit)
+ {
+ return true;
+ }
+ }
+ case 2:
+ {
+ int bit = (1 << (iCond - 64));
+ if ((GetEntProp(client, Prop_Send, "m_nPlayerCondEx2") & bit) == bit)
+ {
+ return true;
+ }
+ }
+ case 3:
+ {
+ int bit = (1 << (iCond - 96));
+ if ((GetEntProp(client, Prop_Send, "m_nPlayerCondEx3") & bit) == bit)
+ {
+ return true;
+ }
+ }
case 4:
{
int bit = (1 << (iCond - 128));
@@ -589,47 +591,47 @@ stock bool TF2_IsPlayerInCondition(int client, TFCond cond)
return true;
}
}
- default:
- ThrowError("Invalid TFCond value %d", iCond);
- }
-
- return false;
-}
-
-/**
- * Gets an entity's object type.
- *
- * @param entity Entity index.
- * @return Current TFObjectType of entity.
- * @error Invalid entity index.
- */
-stock TFObjectType TF2_GetObjectType(int entity)
-{
- int offset = GetEntSendPropOffs(entity, "m_iObjectType");
-
- if (offset <= 0)
- {
- ThrowError("Entity index %d is not an object", entity);
- }
-
- return view_as(GetEntData(entity, offset));
-}
-
-/**
- * Gets an entity's object mode.
- *
- * @param entity Entity index.
- * @return Current TFObjectMode of entity.
- * @error Invalid entity index.
- */
-stock TFObjectMode TF2_GetObjectMode(int entity)
-{
- int offset = GetEntSendPropOffs(entity, "m_iObjectMode");
-
- if (offset <= 0)
- {
- ThrowError("Entity index %d is not an object", entity);
- }
-
- return view_as(GetEntData(entity, offset));
-}
+ default:
+ ThrowError("Invalid TFCond value %d", iCond);
+ }
+
+ return false;
+}
+
+/**
+ * Gets an entity's object type.
+ *
+ * @param entity Entity index.
+ * @return Current TFObjectType of entity.
+ * @error Invalid entity index.
+ */
+stock TFObjectType TF2_GetObjectType(int entity)
+{
+ int offset = GetEntSendPropOffs(entity, "m_iObjectType");
+
+ if (offset <= 0)
+ {
+ ThrowError("Entity index %d is not an object", entity);
+ }
+
+ return view_as(GetEntData(entity, offset));
+}
+
+/**
+ * Gets an entity's object mode.
+ *
+ * @param entity Entity index.
+ * @return Current TFObjectMode of entity.
+ * @error Invalid entity index.
+ */
+stock TFObjectMode TF2_GetObjectMode(int entity)
+{
+ int offset = GetEntSendPropOffs(entity, "m_iObjectMode");
+
+ if (offset <= 0)
+ {
+ ThrowError("Entity index %d is not an object", entity);
+ }
+
+ return view_as(GetEntData(entity, offset));
+}