/4 because an offset is always scaled by it's data type, since I don't know much C++ I can't explain well, but here each virtual call address is based on 4 bytes.
-2 because you have to that in linux :p, when you look at IDA, you see it starts by 2 offsets before the real list starts.
I've decompiled fastly the function CBasePlayer::TeamFortress_TakeConcussionBlast ().
It may not exact and vars may not named properly but you get the idea.
So yes, it's was pev->velocity and the virtual call TeamFortress_Concuss().
PHP Code:
CBasePlayer::TeamFortress_TakeConcussionBlast( entvars_s *pVictim, float blast )
{
if( IsAlive() && pev->playerclass )
{
Vector direction = pev->origin - pVictim->pev->origin;
if( direction.length() < 16.0 )
{
pev->velocity *= 0.33;
}
pev->velocity *= ( blast - direction.length() * 0.5 ) * 0.03;
pev->velocity.z *= 1.5;
if( !( gpGlobals->teamplay & ( 1<<4 | 1<<3 | 1<<2 | 1<<1 ) ) || m_iTeamIndex <= 0 || IsAlly( CBasePlayer::Instance( pVictim ) || pVictim->>owner == edict() )
{
MESSAGE_BEGiN( MSG_ONE, gmsgDamage, NULL, ENT( pev ) );
WRITE_BYTE( 0 );
WRITE_BYTE( 0 );
WRITE_LONG( 512 );
WRITE_COORD( pVictim->origin.x );
WRITE_COORD( pVictim->origin.y );
WRITE_COORD( pVictim->origin.z );
MESSAGE_END();
TeamFortress_Concuss( pVictim );
CBasePlayer* owner = CBasePlayer::Instance( pVictim->owner );
char* teamName;
char* ownerTeamName;
if( m_iTeamIndex )
teamName = GetTeamName( m_iTeamIndex );
else
teamName = "SPECTATOR";
if( owner->m_iTeamIndex )
ownerTeamName = GetTeamName( owner->m_iTeamIndex );
UTIL_LogPrintf( "\"%s<%i><%s><%s>\" triggered \"Concussion_Grenade\" against \"%s<%i><%s><%s>\"\n",
STRING( pev->netname ),
GETPLAYERUSERID( edict() ),
GETPLAYERAUTHID( edict() ),
teamName,
STRING( owner->pev->netname ),
GETPLAYERUSERID( owner->edict() ),
GETPLAYERAUTHID( owner->edict() ),
ownerTeamName
}
}
}
Here the vtable list of CBasePlayer :
PHP Code:
// Auto reconstructed from vtable block @ 0x00163240
// from "tfc_i386.so", by ida_vtables.idc
0 ___11CBasePlayer
1 CBasePlayer::Spawn(void)
2 CBasePlayer::Precache(void)
3 CBaseMonster::KeyValue(KeyValueData_s *)
4 CBasePlayer::Save(CSave &)
5 CBasePlayer::Restore(CRestore &)
6 CBasePlayer::ObjectCaps(void)
7 CBaseEntity::Activate(void)
8 CBaseEntity::SetObjectCollisionBox(void)
9 CBasePlayer::Classify(void)
10 CBaseEntity::DeathNotice(entvars_s *)
11 CBasePlayer::TraceAttack(entvars_s *,float,Vector,TraceResult *,int)
12 CBasePlayer::TakeDamage(entvars_s *,entvars_s *,float,int)
13 CBasePlayer::TakeHealth(float,int)
14 CBasePlayer::Killed(entvars_s *,entvars_s *,int)
15 CBaseMonster::BloodColor(void)
16 CBaseEntity::TraceBleed(float,Vector,TraceResult *,int)
17 CBaseEntity::IsTriggered(void)
18 CBaseMonster::MyMonsterPointer(void)
19 CBaseEntity::MySquadMonsterPointer(void)
20 CBaseToggle::GetToggleState(void)
21 CBasePlayer::AddPlayerItem(CBasePlayerItem *)
22 CBasePlayer::RemovePlayerItem(CBasePlayerItem *)
23 CBasePlayer::GiveAmmo(int,char *,int,int *)
24 CBaseToggle::GetDelay(void)
25 CBaseMonster::IsMoving(void)
26 CBaseEntity::OverrideReset(void)
27 CBaseEntity::DamageDecal(int)
28 CBaseEntity::SetToggleState(int)
29 CBasePlayer::StartSneaking(void)
30 CBasePlayer::StopSneaking(void)
31 CBaseEntity::OnControls(entvars_s *)
32 CBasePlayer::IsSneaking(void)
33 CBasePlayer::IsAlive(void)
34 CBaseEntity::IsBSPModel(void)
35 CBaseEntity::ReflectGauss(void)
36 CBaseEntity::HasTarget(unsigned int)
37 CBaseEntity::IsInWorld(void)
38 CBasePlayer::IsPlayer(void)
39 CBasePlayer::IsNetClient(void)
40 CBaseEntity::DB_GetItemName(void)
41 CBaseEntity::GetNextTarget(void)
42 CBaseEntity::Think(void)
43 CBaseEntity::Touch(CBaseEntity *)
44 CBaseEntity::Use(CBaseEntity *,CBaseEntity *,USE_TYPE,float)
45 CBaseEntity::Blocked(CBaseEntity *)
46 CBaseEntity::Respawn(void)
47 CBaseEntity::UpdateOwner(void)
48 CBasePlayer::FBecomeProne(void)
49 CBaseEntity::Center(void)
50 CBaseEntity::EyePosition(void)
51 CBaseEntity::EarPosition(void)
52 CBasePlayer::BodyTarget(Vector const &)
53 CBasePlayer::Illumination(void)
54 CBaseEntity::FVisible(CBaseEntity *)
55 CBaseEntity::FVisible(Vector const &)
56 CBasePlayer::EngineerUse(CBasePlayer *)
57 CBaseEntity::Finished(void)
58 CBaseEntity::TeamFortress_EMPExplode(entvars_s *,float,float)
59 CBasePlayer::TeamFortress_CalcEMPDmgRad(float &,float &)
60 CBasePlayer::TeamFortress_TakeEMPBlast(entvars_s *)
61 CBaseEntity::TeamFortress_EMPRemove(void)
62 CBasePlayer::TeamFortress_TakeConcussionBlast(entvars_s *,float)
63 CBasePlayer::TeamFortress_Concuss(entvars_s *)
64 CBaseMonster::HandleAnimEvent(MonsterEvent_t *)
65 CBaseMonster::Look(int)
66 CBaseMonster::RunAI(void)
67 CBasePlayer::ShouldFadeOnDeath(void)
68 CBaseMonster::ChangeYaw(int)
69 CBaseMonster::MonsterThink(void)
70 CBaseMonster::IRelationship(CBaseEntity *)
71 CBaseMonster::MonsterInit(void)
72 CBaseMonster::MonsterInitDead(void)
73 CBaseMonster::BecomeDead(void)
74 CBaseMonster::StartMonster(void)
75 CBaseMonster::BestVisibleEnemy(void)
76 CBaseMonster::FInViewCone(CBaseEntity *)
77 CBaseMonster::FInViewCone(Vector *)
78 CBaseMonster::CheckLocalMove(Vector const &,Vector const &,CBaseEntity *,float *)
79 CBaseMonster::Move(float)
80 CBaseMonster::MoveExecute(CBaseEntity *,Vector const &,float)
81 CBaseMonster::ShouldAdvanceRoute(float)
82 CBaseMonster::GetStoppedActivity(void)
83 CBaseMonster::Stop(void)
84 CBaseMonster::CheckRangeAttack1(float,float)
85 CBaseMonster::CheckRangeAttack2(float,float)
86 CBaseMonster::CheckMeleeAttack1(float,float)
87 CBaseMonster::CheckMeleeAttack2(float,float)
88 CBaseMonster::ScheduleFromName(char const *)
89 CBaseMonster::StartTask(Task_t *)
90 CBaseMonster::RunTask(Task_t *)
91 CBaseMonster::GetScheduleOfType(int)
92 CBaseMonster::GetSchedule(void)
93 CBaseMonster::ScheduleChange(void)
94 CBaseMonster::CanPlaySequence(int,int)
95 CBaseMonster::CanPlaySentence(int)
96 CBaseMonster::PlaySentence(char const *,float,float,float)
97 CBaseMonster::PlayScriptedSentence(char const *,float,float,float,int,CBaseEntity *)
98 CBaseMonster::SentenceStop(void)
99 CBaseMonster::GetIdealState(void)
100 CBaseMonster::SetActivity(Activity)
101 CBaseMonster::ReportAIState(void)
102 CBaseMonster::CheckEnemy(CBaseEntity *)
103 CBaseMonster::FTriangulate(Vector const &,Vector const &,float,CBaseEntity *,Vector *)
104 CBaseMonster::SetYawSpeed(void)
105 CBaseMonster::BuildNearestRoute(Vector,Vector,float,float)
106 CBaseMonster::FindCover(Vector,Vector,float,float)
107 CBaseMonster::FValidateCover(Vector const &)
108 CBaseMonster::CoverRadius(void)
109 CBaseMonster::FCanCheckAttacks(void)
110 CBaseMonster::CheckAmmo(void)
111 CBaseMonster::IgnoreConditions(void)
112 CBaseMonster::FValidateHintType(short)
113 CBaseMonster::FCanActiveIdle(void)
114 CBaseMonster::ISoundMask(void)
115 CBaseMonster::PBestSound(void)
116 CBaseMonster::PBestScent(void)
117 CBaseMonster::HearingSensitivity(void)
118 CBasePlayer::BarnacleVictimBitten(entvars_s *)
119 CBasePlayer::BarnacleVictimReleased(void)
120 CBaseMonster::PrescheduleThink(void)
121 CBaseMonster::GetDeathActivity(void)
122 CBaseMonster::GibMonster(void)
123 CBaseMonster::HasHumanGibs(void)
124 CBaseMonster::HasAlienGibs(void)
125 CBaseMonster::FadeMonster(void)
126 CBaseMonster::RadiusDamage(entvars_s *,entvars_s *,float,int,int)
127 CBaseMonster::RadiusDamage(Vector,entvars_s *,entvars_s *,float,int,int)
128 CBasePlayer::DeathSound(void)
129 CBaseMonster::AlertSound(void)
130 CBaseMonster::IdleSound(void)
131 CBasePlayer::PainSound(void)
132 CBaseMonster::StopFollowing(int)
133 CBasePlayer::Jump(void)
134 CBasePlayer::Duck(void)
135 CBasePlayer::PreThink(void)
136 CBasePlayer::PostThink(void)
137 CBasePlayer::ImpulseCommands(void)
__________________