Raised This Month: $12 Target: $400
 3% 

[TF2] CCaptureFlag::FlagTouch reversed


Post New Thread Reply   
 
Thread Tools Display Modes
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
Powerlord
AlliedModders Donor
Join Date: Jun 2008
Location: Seduce Me!
Old 03-04-2017 , 20:21   Re: [TF2] CCaptureFlag::FlagTouch reversed
Reply With Quote #2

Out of curiosity, why the ETFCond enum? It seems to be a duplicate of TFCond enum from tf2.inc
__________________
Not currently working on SourceMod plugin development.

Last edited by Powerlord; 03-04-2017 at 20:23.
Powerlord is offline
Pelipoika
Veteran Member
Join Date: May 2012
Location: Inside
Old 03-04-2017 , 20:26   Re: [TF2] CCaptureFlag::FlagTouch reversed
Reply With Quote #3

Quote:
Originally Posted by Powerlord View Post
Out of curiosity, why the ETFCond enum? It seems to be a duplicate of TFCond enum from tf2.inc
For authenticity, that's how they are called in the binary
__________________
Pelipoika is offline
Benoist3012
Veteran Member
Join Date: Mar 2014
Location: CWave::ForceFinish()
Old 03-11-2017 , 05:08   Re: [TF2] CCaptureFlag::FlagTouch reversed
Reply With Quote #4

(dword_109B03F4 + 48) is a convar, convar.GetBool(), just need to find which one.
__________________

Last edited by Benoist3012; 03-11-2017 at 05:09.
Benoist3012 is offline
psychonic

BAFFLED
Join Date: May 2008
Old 03-11-2017 , 07:39   Re: [TF2] CCaptureFlag::FlagTouch reversed
Reply With Quote #5

tf_flag_return_on_touch
psychonic is offline
404UserNotFound
BANNED
Join Date: Dec 2011
Old 03-11-2017 , 16:13   Re: [TF2] CCaptureFlag::FlagTouch reversed
Reply With Quote #6

PHP Code:
if (!pOther->IsPlayer())) 
What is -">"? I've seen it used before but I know it's not =>


Oh wait that code isn't SourcePawn is it.

Last edited by 404UserNotFound; 03-11-2017 at 16:14.
404UserNotFound is offline
WildCard65
Veteran Member
Join Date: Aug 2013
Location: Canada
Old 03-11-2017 , 17:49   Re: [TF2] CCaptureFlag::FlagTouch reversed
Reply With Quote #7

Quote:
Originally Posted by abrandnewday View Post
Oh wait that code isn't SourcePawn is it.
You are correct, it's C++ code.
__________________
WildCard65 is offline
404UserNotFound
BANNED
Join Date: Dec 2011
Old 03-11-2017 , 20:37   Re: [TF2] CCaptureFlag::FlagTouch reversed
Reply With Quote #8

Quote:
Originally Posted by WildCard65 View Post
You are correct, it's C++ code.
Yeah, I couldn't recall at the time but I do know it's C++ as a result of all the code I've been poring over from the 2012 leak. I too much

(also can i request a title change from ( ͡° ͜ʖ ͡°) to )

Last edited by 404UserNotFound; 03-11-2017 at 20:40.
404UserNotFound is offline
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 06:11.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode