rn
rnI don't know if you guys are aware, but since the SteamPipe update in February 2013, game binary has been compiled with more recent toolset and it includes now DWARF information. This means there are a lot more debugging datas.
rn
rnThat's it, you can now retrieve a full class header, including its members (offsets) with real name! :p
rn
rnI'm attaching a dump of all classes from DoD binary.
rnI've used pahole under linux. It's kind of unsorted, but just a matter of searching.
rnAs bonus, I've included a dump with pfunct which lists all functions headers (including param name and return type).
rn
rnFor example, for CBasePlayer:
rn
rn
class CBasePlayer : public CBaseMonster {rnpublic:rnrn /* class CBaseMonster ; */ /* 0 0 */rnrn /* XXX 936 bytes hole, try to pack */rnprivate:rnrnrn /* --- cacheline 14 boundary (896 bytes) was 40 bytes ago --- */rn int m_iPlayerSpeed; /* 936 4 */rn int random_seed; /* 940 4 */rn int m_iPlayerSound; /* 944 4 */rn int m_iTargetVolume; /* 948 4 */rn int m_iWeaponVolume; /* 952 4 */rn int m_iExtraSoundTypes; /* 956 4 */rn /* --- cacheline 15 boundary (960 bytes) --- */rn float m_flStopExtraSoundTime; /* 960 4 */rn int m_afButtonLast; /* 964 4 */rn int m_afButtonPressed; /* 968 4 */rn int m_afButtonReleased; /* 972 4 */rn edict_t * m_pentSndLast; /* 976 4 */rn float m_flSndRoomtype; /* 980 4 */rn float m_flSndRange; /* 984 4 */rn float m_flFallVelocity; /* 988 4 */rn int m_fKnownItem; /* 992 4 */rn int m_fNewAmmo; /* 996 4 */rn unsigned int m_afPhysicsFlags; /* 1000 4 */rn float m_fNextSuicideTime; /* 1004 4 */rn float m_flTimeWeaponIdle; /* 1008 4 */rn char m_szTextureName[13]; /* 1012 13 */rn /* --- cacheline 16 boundary (1024 bytes) was 1 bytes ago --- */rn char m_chTextureType; /* 1025 1 */rnrn /* XXX 2 bytes hole, try to pack */rnrn int m_idrowndmg; /* 1028 4 */rn int m_idrownrestored; /* 1032 4 */rn int m_bitsHUDDamage; /* 1036 4 */rn BOOL m_fInitHUD; /* 1040 4 */rn BOOL m_fGameHUDInitialized; /* 1044 4 */rn int m_iTrain; /* 1048 4 */rn BOOL m_fWeapon; /* 1052 4 */rn enum JoinState m_iJoiningState; /* 1056 4 */rn class EHANDLE m_pTank; /* 1060 8 */rn float m_fDeadTime; /* 1068 4 */rn int m_iUpdateTime; /* 1072 4 */rn int m_iHideHUD; /* 1076 4 */rn float m_iRespawnFrames; /* 1080 4 */rn int m_iClientHealth; /* 1084 4 */rn /* --- cacheline 17 boundary (1088 bytes) --- */rn int m_iClientHideHUD; /* 1088 4 */rn int m_iClientFOV; /* 1092 4 */rn int m_nCustomSprayFrames; /* 1096 4 */rn float m_flNextDecalTime; /* 1100 4 */rn class CBasePlayerItem * m_rgpPlayerItems[6]; /* 1104 24 */rn class CBasePlayerItem * m_pActiveItem; /* 1128 4 */rn class CBasePlayerItem * m_pClientActiveItem; /* 1132 4 */rn class CBasePlayerItem * m_pLastItem; /* 1136 4 */rn int m_rgAmmo[32]; /* 1140 128 */rn /* --- cacheline 19 boundary (1216 bytes) was 52 bytes ago --- */rn int m_rgAmmoLast[32]; /* 1268 128 */rn /* --- cacheline 21 boundary (1344 bytes) was 52 bytes ago --- */rn int m_rgItems[5]; /* 1396 20 */rn /* --- cacheline 22 boundary (1408 bytes) was 8 bytes ago --- */rn char m_szTeamName[16]; /* 1416 16 */rnrn /* Bitfield combined with previous fields */rnrn TYPEDESCRIPTION m_playerSaveData[22]; /* 0 352 */rnrn /* XXX 1080 bytes hole, try to pack */rnrn /* --- cacheline 44 boundary (2816 bytes) was 48 bytes ago --- */rn int m_irdytospawn; /* 1432 4 */rn int m_imissedwave; /* 1436 4 */rn int m_ilastteam; /* 1440 4 */rn int m_ijustjoined; /* 1444 4 */rn /* --- cacheline 45 boundary (2880 bytes) --- */rn int m_chatMsg; /* 1448 4 */rn int m_deathMsg; /* 1452 4 */rn int m_handSignal; /* 1456 4 */rn float m_nextRunThink; /* 1460 4 */rn float m_flIdleTimer; /* 1464 4 */rn float m_inextprone; /* 1468 4 */rn int m_voteid; /* 1472 4 */rn int m_iFOV; /* 1476 4 */rn float m_fGunDropTime; /* 1480 4 */rn int m_iNextClass; /* 1484 4 */rn bool m_bIsRandomClass; /* 1488 1 */rnrn /* XXX 3 bytes hole, try to pack */rnrn class EHANDLE m_hObserverTarget; /* 1492 8 */rn float m_flNextObserverInput; /* 1500 4 */rn int m_iObserverWeapon; /* 1504 4 */rn int m_iObserverLastMode; /* 1508 4 */rn /* --- cacheline 46 boundary (2944 bytes) --- */rn int m_bIsObserver; /* 1512 4 */rn BOOL HasObject; /* 1516 4 */rn class CObject * m_pObject; /* 1520 4 */rn char * m_sPlayerModel; /* 1524 4 */rn float m_fNextStamina; /* 1528 4 */rn int m_nMGAmmoCount; /* 1532 4 */rn int m_nGenericAmmoCount; /* 1536 4 */rn int m_iClassSpeed; /* 1540 4 */rn float m_fSpeedFactor; /* 1544 4 */rn bool m_bSlowedByHit; /* 1548 1 */rnrn /* XXX 3 bytes hole, try to pack */rnrn float m_flUnslowTime; /* 1552 4 */rn float m_flNextVoice; /* 1556 4 */rn float m_flNextHand; /* 1560 4 */rn int lastMenuSelected; /* 1564 4 */rn int m_izSBarState[4]; /* 1568 16 */rn /* --- cacheline 47 boundary (3008 bytes) was 8 bytes ago --- */rn float m_flNextSBarUpdateTime; /* 1584 4 */rn float m_flStatusBarDisappearDelay; /* 1588 4 */rn char m_SbarString0[128]; /* 1592 128 */rn /* --- cacheline 49 boundary (3136 bytes) was 16 bytes ago --- */rn char m_SbarString1[128]; /* 1720 128 */rn /* --- cacheline 51 boundary (3264 bytes) was 16 bytes ago --- */rn class EHANDLE m_hLastIDTarget; /* 1848 8 */rn float m_flLastTalkTime; /* 1856 4 */rn int i_cutScenes; /* 1860 4 */rn int i_seenAllieSpawnScene; /* 1864 4 */rn int i_seenAxisSpawnScene; /* 1868 4 */rn int i_seenAllieWinScene; /* 1872 4 */rn int i_seenAxisWinScene; /* 1876 4 */rn int i_seenAllieLooseScene; /* 1880 4 */rn int i_seenAxisLooseScene; /* 1884 4 */rn int i_seenAllieDrawScene; /* 1888 4 */rn int i_seenAxisDrawScene; /* 1892 4 */rn /* --- cacheline 52 boundary (3328 bytes) --- */rn class CUnifiedSignals m_signals; /* 1896 8 */rn int m_iCapAreaIndex; /* 1904 4 */rn int m_iCapAreaIconIndex; /* 1908 4 */rn int m_iObjectAreaIndex; /* 1912 4 */rn float m_fHandleSignalsTime; /* 1916 4 */rn int m_iObjScore; /* 1920 4 */rn int m_iDeaths; /* 1924 4 */rn int m_iNumTKs; /* 1928 4 */rn BOOL m_bBazookaDeployed; /* 1932 4 */rn int m_iMinimap; /* 1936 4 */rn bool m_bShowHints; /* 1940 1 */rn bool m_bAutoReload; /* 1941 1 */rnrn /* XXX 2 bytes hole, try to pack */rnrn class CHintMessageQueue m_hintMessageQueue; /* 1944 48 */rn /* --- cacheline 53 boundary (3392 bytes) was 32 bytes ago --- */rn long int m_flDisplayHistory; /* 1992 4 */rn char m_szAnimExtention[32]; /* 1996 32 */rn /* --- cacheline 54 boundary (3456 bytes) was 4 bytes ago --- */rn char m_szAnimReloadExt[32]; /* 2028 32 */rn int m_iGaitsequence; /* 2060 4 */rn float m_flGaitframe; /* 2064 4 */rn float m_flGaityaw; /* 2068 4 */rn class Vector m_prevgaitorigin; /* 2072 12 */rn float m_flPitch; /* 2084 4 */rn /* --- cacheline 55 boundary (3520 bytes) --- */rn float m_flYaw; /* 2088 4 */rn float m_flGaitMovement; /* 2092 4 */rn float m_flYawModifier; /* 2096 4 */rn int m_iCurrentAnimationState; /* 2100 4 */rn int m_iCurrentAnimationSequence; /* 2104 4 */rn int m_pszSavedWeaponModel; /* 2108 4 */rn int m_ianimupdate; /* 2112 4 */rn float m_flNextMapMarkerTime; /* 2116 4 */rn int m_iMapMarker; /* 2120 4 */rn int m_iWeapons2; /* 2124 4 */rnrn... rn
rnWhat you see at right, is the char-based offset for linux.
rn
rnTo use them with AMXX, you will have to care about two things:
rn
- Whether native takes an int-based offset or not. If so you will need to divide offset by 4. In 1.8.2, all natives are int-based except for the one to set/get a string. In 1.8.3-dev, all new natives (new data type supported) are char-based.
rn - All natives are windows-based, so you will have to calculated windows offset by subtracting the linux extra offset. Of course, same here, if native is int-based you will have to divide extra offset by 4. Usually, linux offset for classes which derives of CBaseMonster is +5 (int-based) or +20 (char-based) : otherwise it's +4 (int-based) or +16 (char-based).
rn
rn
rnFast example:
rn
- int m_iMapMarker; /* 2120 4 */
rnIt's a player's offset. You will use get_pdata_int(index, 2120 / 4, 20 / 4)
rnThis native is int-based, and the default extra linux offset is already 5, so you could write just get_pdata_int(index, 530)
rn
rn
rn - bool m_bIsRandomClass; /* 1488 1 */
rnIn AMXX 1.8.3-dev you have a new native for boolean: get_pdata_bool(index, 1488, 20)
rnNative is char-based. Same as above, there is always a default linux extra offset, which is already 20, so you can just write get_pdata_bool(index, 1488)
rn
rn
rnFeel free to ask if you don't understand something.

