View Single Post
Author Message
Pelipoika
Veteran Member
Join Date: May 2012
Location: Inside
Old 03-04-2017 , 15:20   [TF2] CCaptureFlag::FlagTouch reversed
Reply With Quote #1

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

This is babbys 2nd reversed function.

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 *thisCBaseEntity *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(thisthis);
        
        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(pOthertrue);
            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(pOtherpOther->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(pOthertrue);
            }
        }
    }
}

bool CTFPlayer::IsAllowedToPickUpFlag(CTFPlayer *this)
{
    return 
CAttributeManager::AttribHookValue<int>(this0"cannot_pick_up_intelligence"this01) == 0;

Maybe someone will find it usefull somehow

Theres propably a cast to CTFPlayer there somewhere too but whatever
__________________

Last edited by Pelipoika; 03-11-2017 at 07:47. Reason: Solved mystery
Pelipoika is offline