Spent quite a lot of time on this because i had an issue where sometimes players couldn't pickup the flag in MvM due to them having FL_FAKECLIENT
PHP Code:
enum ETFCond
{
TF_COND_INVALID = -1,
TF_COND_AIMING = 0,
TF_COND_ZOOMED = 1,
TF_COND_DISGUISING = 2,
TF_COND_DISGUISED = 3,
TF_COND_STEALTHED = 4,
TF_COND_INVULNERABLE = 5,
TF_COND_TELEPORTED = 6,
TF_COND_TAUNTING = 7,
TF_COND_INVULNERABLE_WEARINGOFF = 8,
TF_COND_STEALTHED_BLINK = 9,
TF_COND_SELECTED_TO_TELEPORT = 10,
TF_COND_CRITBOOSTED = 11,
TF_COND_TMPDAMAGEBONUS = 12,
TF_COND_FEIGN_DEATH = 13,
TF_COND_PHASE = 14,
TF_COND_STUNNED = 15,
TF_COND_OFFENSEBUFF = 16,
TF_COND_SHIELD_CHARGE = 17,
TF_COND_DEMO_BUFF = 18,
TF_COND_ENERGY_BUFF = 19,
TF_COND_RADIUSHEAL = 20,
TF_COND_HEALTH_BUFF = 21,
TF_COND_BURNING = 22,
TF_COND_HEALTH_OVERHEALED = 23,
TF_COND_URINE = 24,
TF_COND_BLEEDING = 25,
TF_COND_DEFENSEBUFF = 26,
TF_COND_MAD_MILK = 27,
TF_COND_MEGAHEAL = 28,
TF_COND_REGENONDAMAGEBUFF = 29,
TF_COND_MARKEDFORDEATH = 30,
TF_COND_NOHEALINGDAMAGEBUFF = 31,
TF_COND_SPEED_BOOST = 32,
TF_COND_CRITBOOSTED_PUMPKIN = 33,
TF_COND_CRITBOOSTED_USER_BUFF = 34,
TF_COND_CRITBOOSTED_DEMO_CHARGE = 35,
TF_COND_SODAPOPPER_HYPE = 36,
TF_COND_CRITBOOSTED_FIRST_BLOOD = 37,
TF_COND_CRITBOOSTED_BONUS_TIME = 38,
TF_COND_CRITBOOSTED_CTF_CAPTURE = 39,
TF_COND_CRITBOOSTED_ON_KILL = 40,
TF_COND_CANNOT_SWITCH_FROM_MELEE = 41,
TF_COND_DEFENSEBUFF_NO_CRIT_BLOCK = 42,
TF_COND_REPROGRAMMED = 43,
TF_COND_CRITBOOSTED_RAGE_BUFF = 44,
TF_COND_DEFENSEBUFF_HIGH = 45,
TF_COND_SNIPERCHARGE_RAGE_BUFF = 46,
TF_COND_DISGUISE_WEARINGOFF = 47,
TF_COND_MARKEDFORDEATH_SILENT = 48,
TF_COND_DISGUISED_AS_DISPENSER = 49,
TF_COND_SAPPED = 50,
TF_COND_INVULNERABLE_HIDE_UNLESS_DAMAGED = 51,
TF_COND_INVULNERABLE_USER_BUFF = 52,
TF_COND_HALLOWEEN_BOMB_HEAD = 53,
TF_COND_HALLOWEEN_THRILLER = 54,
TF_COND_RADIUSHEAL_ON_DAMAGE = 55,
TF_COND_CRITBOOSTED_CARD_EFFECT = 56,
TF_COND_INVULNERABLE_CARD_EFFECT = 57,
TF_COND_MEDIGUN_UBER_BULLET_RESIST = 58,
TF_COND_MEDIGUN_UBER_BLAST_RESIST = 59,
TF_COND_MEDIGUN_UBER_FIRE_RESIST = 60,
TF_COND_MEDIGUN_SMALL_BULLET_RESIST = 61,
TF_COND_MEDIGUN_SMALL_BLAST_RESIST = 62,
TF_COND_MEDIGUN_SMALL_FIRE_RESIST = 63,
TF_COND_STEALTHED_USER_BUFF = 64,
TF_COND_MEDIGUN_DEBUFF = 65,
TF_COND_STEALTHED_USER_BUFF_FADING = 66,
TF_COND_BULLET_IMMUNE = 67,
TF_COND_BLAST_IMMUNE = 68,
TF_COND_FIRE_IMMUNE = 69,
TF_COND_PREVENT_DEATH = 70,
TF_COND_MVM_BOT_STUN_RADIOWAVE = 71,
TF_COND_HALLOWEEN_SPEED_BOOST = 72,
TF_COND_HALLOWEEN_QUICK_HEAL = 73,
TF_COND_HALLOWEEN_GIANT = 74,
TF_COND_HALLOWEEN_TINY = 75,
TF_COND_HALLOWEEN_IN_HELL = 76,
TF_COND_HALLOWEEN_GHOST_MODE = 77,
TF_COND_MINICRITBOOSTED_ON_KILL = 78,
TF_COND_OBSCURED_SMOKE = 79,
TF_COND_PARACHUTE_DEPLOYED = 80,
TF_COND_BLASTJUMPING = 81,
TF_COND_HALLOWEEN_KART = 82,
TF_COND_HALLOWEEN_KART_DASH = 83,
TF_COND_BALLOON_HEAD = 84,
TF_COND_MELEE_ONLY = 85,
TF_COND_SWIMMING_CURSE = 86,
TF_COND_FREEZE_INPUT = 87,
TF_COND_HALLOWEEN_KART_CAGE = 88,
TF_COND_DONOTUSE_0 = 89,
TF_COND_RUNE_STRENGTH = 90,
TF_COND_RUNE_HASTE = 91,
TF_COND_RUNE_REGEN = 92,
TF_COND_RUNE_RESIST = 93,
TF_COND_RUNE_VAMPIRE = 94,
TF_COND_RUNE_REFLECT = 95,
TF_COND_RUNE_PRECISION = 96,
TF_COND_RUNE_AGILITY = 97,
TF_COND_GRAPPLINGHOOK = 98,
TF_COND_GRAPPLINGHOOK_SAFEFALL = 99,
TF_COND_GRAPPLINGHOOK_LATCHED = 100,
TF_COND_GRAPPLINGHOOK_BLEEDING = 101,
TF_COND_AFTERBURN_IMMUNE = 102,
TF_COND_RUNE_KNOCKOUT = 103,
TF_COND_RUNE_IMBALANCE = 104,
TF_COND_CRITBOOSTED_RUNE_TEMP = 105,
TF_COND_PASSTIME_INTERCEPTION = 106,
TF_COND_SWIMMING_NO_EFFECTS = 107,
TF_COND_PURGATORY = 108,
TF_COND_RUNE_KING = 109,
TF_COND_RUNE_PLAGUE = 110,
TF_COND_RUNE_SUPERNOVA = 111,
TF_COND_PLAGUE = 112,
TF_COND_KING_BUFFED = 113,
TF_COND_TEAM_GLOWS = 114,
TF_COND_KNOCKED_INTO_AIR = 115,
TF_COND_COMPETITIVE_WINNER = 116,
TF_COND_COMPETITIVE_LOSER = 117,
TF_COND_HEALING_DEBUFF = 118,
TF_COND_PASSTIME_PENALTY_DEBUFF = 119,
TF_COND_COUNT,
};
//-----------------------------------------------------------------------------
// TF FlagInfo State.
//-----------------------------------------------------------------------------
#define TF_FLAGINFO_NONE 0
#define TF_FLAGINFO_STOLEN (1 << 0)
#define TF_FLAGINFO_DROPPED (1 << 1)
//-----------------------------------------------------------------------------
// For entity_capture_flags to use when placed in the world
//-----------------------------------------------------------------------------
enum
{
TF_FLAGTYPE_CTF = 0, //ctf_
TF_FLAGTYPE_ATTACK_DEFEND, //mvm_
TF_FLAGTYPE_TERRITORY_CONTROL,
TF_FLAGTYPE_INVADE,
TF_FLAGTYPE_SPECIAL_DELIVERY, //sd_
TF_FLAGTYPE_ROBOT_DESTRUCTION, //rd_ and pd_
TF_FLAGTYPE_PLAYER_DESTRUCTION //pd_
};
//----- (007908E0) --------------------------------------------------------
void CCaptureFlag::FlagTouch(CCaptureFlag *this, CBaseEntity *pOther)
{
if (m_bDisabled)
return;
if (m_nFlagStatus == TF_FLAGINFO_STOLEN)
return;
if (!pOther->IsPlayer()))
return;
if (!pOther->IsAlive())
return;
if(m_hPrevOwner.Get() && m_hPrevOwner.Get() == pOther && m_bAllowOwnerPickup == false)
return;
if (pOther->GetTeamNumber() == this->GetTeamNumber())
{
m_outputOnTouchSameTeam.FireOutput(this, this);
if (m_nType != TF_FLAGTYPE_CTF || m_nType == TF_FLAGTYPE_ROBOT_DESTRUCTION)
{
if ( !tf_flag_return_on_touch.GetBool() )
return;
if (m_nFlagStatus != TF_FLAGINFO_NONE || m_nFlagStatus == TF_FLAGINFO_STOLEN)
return;
}
}
if (m_nType == TF_FLAGTYPE_ATTACK_DEFEND || m_nType == TF_FLAGTYPE_TERRITORY_CONTROL)
{
if(pOther->GetTeamNumber() != this->GetTeamNumber())
{
return;
}
}
if (m_nType == TF_FLAGTYPE_INVADE || m_nType == TF_FLAGTYPE_SPECIAL_DELIVERY && this->GetTeamNumber() != TEAM_UNASSIGNED)
{
if(pOther->GetTeamNumber() != this->GetTeamNumber())
{
return;
}
}
if (!TFGameRules()->m_bInWaitingForPlayers && pOther->IsPlayer() && pOther->IsAllowedToPickUpFlag())
{
if (TFGameRules()->m_bPlayingMannVsMachine)
{
PickUp(pOther, true);
return;
}
// Is the touching player about to teleport?
if (pOther->m_Shared.InCond(TF_COND_SELECTED_TO_TELEPORT))
return;
// Can't pickup flag while invulnerable if not playing player destruction
if(pOther->m_Shared.IsInvulnerable() && m_nType != TF_FLAGTYPE_PLAYER_DESTRUCTION)
return;
// Can't pickup flag while invisible
if(pOther->m_Shared.IsStealthed())
return;
// If the player isnt 25% visible don't let them pickup flag
if (pOther->m_Shared.InCond(TF_COND_STEALTHED_BLINK) && pOther->m_Shared.GetPercentInvisible() > 0.25))
return;
// Don't let bonked players pickup the flag
if(pOther->m_Shared.InCond(TF_COND_PHASE))
return;
// Do not allow the player to pick up multiple flags unless the gamemode is player destruction
if (!pOther->HasTheFlag()
|| m_nType == TF_FLAGTYPE_ROBOT_DESTRUCTION
|| m_nType == TF_FLAGTYPE_PLAYER_DESTRUCTION
|| tf_flag_return_on_touch.GetBool())
{
if (!PointInRespawnRoom(pOther, pOther->WorldSpaceCenter(), false)
{
if (m_nFlagStatus == TF_FLAGINFO_DROPPED)
{
if (pOther->GetTeamNumber() == this->GetTeamNumber() && m_nType != TF_FLAGTYPE_CTF && tf_flag_return_on_touch.GetBool())
{
this->Reset();
this->ResetMessage();
CTF_GameStats.Event_PlayerReturnedFlag(pOther);
return;
}
}
PickUp(pOther, true);
}
}
}
}
bool CTFPlayer::IsAllowedToPickUpFlag(CTFPlayer *this)
{
return CAttributeManager::AttribHookValue<int>(this, 0, "cannot_pick_up_intelligence", this, 0, 1) == 0;
}
Theres propably a cast to CTFPlayer there somewhere too but whatever