Files
GTASource/game/Stats/StatsTypes.h
expvintl 419f2e4752 init
2025-02-23 17:40:52 +08:00

795 lines
30 KiB
C++

//
// StatsTypes.h
//
// Copyright (C) 1999-20010 Rockstar Games. All Rights Reserved.
//
#ifndef _STATSENUMS_H_
#define _STATSENUMS_H_
// Rage includes
#include "atl/hashstring.h"
#include "string/stringhash.h"
// framework
#include "fwutil/Gen9Settings.h"
// --- Defines ------------------------------------------------------------------
#ifdef HASH_STAT_ID
#undef HASH_STAT_ID
#endif
#define HASH_STAT_ID(a) atStringHash(a)
// --- handy metric-to-imperial converters -------------------------------------
#define KGS_TO_LBS(M) (float(M)*2.20462262f)
#define LBS_TO_KGS(M) (float(M)*0.453592f)
#define METERS_TO_MILES(M) (float(M)/1609.344f)
#define KPH_TO_MPH(M) (float(M)/1.609344f)
#define METERS_TO_FEET(M) (float(M)/0.3048f)
#define METERS_TO_KILOMETERS(M) (float(M)/1000.0f)
#define MILES_TO_KILOMETERS(M) (float(M)*1.609344f)
#define STAT_LIMIT (1000.0f)
//If this is set we only use one file in the multiplayer savegames.
// If this is set make sure all SaveCategories in the xml file are set to 0.
#define __MPCLOUDSAVES_ONLY_ONEFILE (0)
#define INCREMENT_STAT (1)
#define DECREMENT_STAT (0)
// if a stat increases by this amount then display message
#define STAT_DISPLAY_THRESHOLD (40)
// Stat Label is the stat unique ID
#define MAX_STAT_LABEL_SIZE 32
// Maximun size of a string
#define MAX_STAT_STRING_SIZE (32)
// Represents a invalid stat, in which the label is NULL as well
#define INVALID_STAT_ID 0
//Profile stats that have priority set to PS_HIGH_PRIORITY or PS_LOW_PRIORITY
// will be downloaded during multiplayer game for the remote players.
#define PS_HIGH_PRIORITY 1
#define PS_LOW_PRIORITY 2
//Maximun number of profile stats that can be download for a remote player.
#define MAX_NUM_READ_REMOTE_GAMER_STATS (11)
//Maximun number os remote gamers that we will need to download profile stats.
#define MAX_NUM_REMOTE_GAMERS (MAX_NUM_ACTIVE_PLAYERS)
//Stat load types
enum eStatsLoadType
{
STATS_LOAD_CLOUD
};
//Stat save types
enum eStatsSaveType
{
STATS_SAVE_CLOUD
};
//These flags are used during stats updates.
enum
{
STATUPDATEFLAG_ASSERTONLINESTATS = (1<<0), //Assert and make multiplayer stats verifications.
STATUPDATEFLAG_DIRTY_PROFILE = (1<<1), //Try to mark dirty into profile stats system.
STATUPDATEFLAG_LOAD_FROM_SP_SAVEGAME = (1<<2), //Stat updated from SP savegame load.
STATUPDATEFLAG_LOAD_FROM_MP_SAVEGAME = (1<<3), //Stat updated from MP savegame load.
STATUPDATEFLAG_SCRIPT_UPDATE = (1<<4), //Stat updated from Script.
STATUPDATEFLAG_GAMER_SERVER = (1<<5), //Stat updated from gamer server transaction.
STATUPDATEFLAG_FORCE_CHANGE = (1<<6), //Force prof stat flush.
//Stat updated from savegame load (either MP or SP).
STATUPDATEFLAG_LOAD_FROM_SAVEGAME = STATUPDATEFLAG_LOAD_FROM_SP_SAVEGAME|STATUPDATEFLAG_LOAD_FROM_MP_SAVEGAME,
//Default stat updates.
STATUPDATEFLAG_DEFAULT = STATUPDATEFLAG_ASSERTONLINESTATS|STATUPDATEFLAG_DIRTY_PROFILE,
STATUPDATEFLAG_DEFAULT_FORCE_CHANGE = STATUPDATEFLAG_ASSERTONLINESTATS|STATUPDATEFLAG_DIRTY_PROFILE|STATUPDATEFLAG_FORCE_CHANGE,
//Default stat updates from game server transactions.
STATUPDATEFLAG_DEFAULT_GAMER_SERVER = STATUPDATEFLAG_DEFAULT|STATUPDATEFLAG_GAMER_SERVER,
//Default stat updates from script.
STATUPDATEFLAG_DEFAULT_SCRIPT_UPDATE = STATUPDATEFLAG_DEFAULT|STATUPDATEFLAG_SCRIPT_UPDATE,
STATUPDATEFLAG_ASSERT_SCRIPT_UPDATE = STATUPDATEFLAG_DEFAULT|STATUPDATEFLAG_SCRIPT_UPDATE|STATUPDATEFLAG_ASSERTONLINESTATS
};
//PURPOSE
// Our stats id identifier.
class StatId
{
private:
atStatNameString m_Id;
public:
StatId() { }
StatId(const char* str) { Set(str); }
StatId(const u32 id) { m_Id.SetHash(id); }
public:
inline u32 GetHash() const { return m_Id.GetHash(); }
inline u32 GetHash() { return m_Id.GetHash(); }
OUTPUT_ONLY(inline const char* GetName() const { return m_Id.TryGetCStr(); })
void Set(const char* str);
void SetHash(const u32 hash, const char* NOTFINAL_ONLY(str))
{
#if !__FINAL
if(str && ustrlen(str)>0)
{
m_Id.SetHashWithString(hash, str);
}
#endif //!__FINAL
//Set the final key hash.
m_Id.SetHash(hash);
}
bool IsValid() { return m_Id.IsNotNull(); }
bool IsValid() const { return m_Id.IsNotNull(); }
bool operator <(const StatId& other) const { return (GetHash() < other.GetHash()); }
bool operator ==(const StatId& other) const { return (GetHash() == other.GetHash()); }
bool operator ==(const u32 id) const { return (GetHash() == id); }
StatId& operator=(const StatId& other)
{
#if !__NO_OUTPUT
SetHash(other.GetHash(), other.GetName());
#else
SetHash(other.GetHash(), 0);
#endif // __FINAL
return *this;
}
operator atStatNameString() const {return m_Id;}
operator u32() const {return m_Id.GetHash();}
};
#define STAT_ID(a) StatId(a)
//PURPOSE
// Same as StatId but it wont have the name in FINAL builds since we only need the hash.
class StatId_static : public StatId
{
#if __ASSERT
public:
// For Validation after the stats have been loaded.
StatId_static* m_Next;
static StatId_static* sm_First;
#endif // __ASSERT
public:
StatId_static(const char* str) : StatId(str)
{
#if __ASSERT
m_Next = sm_First;
sm_First = this;
#endif //__ASSERT
}
StatId_static(const atHashString& hash) : StatId(hash.GetHash())
{
#if __ASSERT
m_Next = sm_First;
sm_First = this;
#endif //__ASSERT
}
ASSERT_ONLY(~StatId_static();)
};
#if __ASSERT
#define STATIC_STAT_ID(a, ...) StatId_static(a)
#else
#define STATIC_STAT_ID(a, ...) StatId_static(__VA_ARGS__)
#endif // __ASSERT
//PURPOSE
// Enum that describes all the possible groups set for the profile stats.
enum eProfileStatsGroups
{
PS_GRP_MP_START = 0
/* MultiPlayer Stats Groups */
,PS_GRP_MP_0 = PS_GRP_MP_START //All remaining MP stats
,PS_GRP_MP_1 //Stats with name perfixed MP0_
,PS_GRP_MP_2 //Stats with name perfixed MP1_
,PS_GRP_MP_3 //Stats with name perfixed MP2_
,PS_GRP_MP_4 //Stats with name perfixed MP3_
,PS_GRP_MP_5 //Stats with name perfixed MP4_ - NOT USED ANYMORE
,PS_GRP_MP_6 //Stats with name perfixed MPPLY_
,PS_GRP_MP_7 //Stats with name perfixed MPGEN_
,PS_GRP_MP_END = PS_GRP_MP_7
/* SinglePlayer Stats Groups */
,PS_GRP_SP_START
,PS_GRP_SP_0 = PS_GRP_SP_START //All non-character SP stats
,PS_GRP_SP_1 //Stats for character 1 (SP0_)
,PS_GRP_SP_2 //Stats for character 2 (SP1_)
,PS_GRP_SP_3 //Stats for character 3 (SP2_)
,PS_GRP_SP_END = PS_GRP_SP_3
};
//Possible stats model prefixes
enum eCharacterIndex
{
CHAR_SP_START /*= 0*/,
CHAR_MICHEAL = CHAR_SP_START,
CHAR_FRANKLIN /*= 1*/,
CHAR_TREVOR /*= 2*/,
CHAR_SP_END = CHAR_TREVOR,
CHAR_MP_START /*= 3*/,
CHAR_MP0 = CHAR_MP_START,
CHAR_MP1 /*= 4*/,
CHAR_MP_END = CHAR_MP1,
MAX_STATS_CHAR_INDEXES, //8
CHAR_INVALID = MAX_STATS_CHAR_INDEXES
};
const u32 MAX_NUM_SP_CHARS = CHAR_MP_START;
const u32 MAX_NUM_MP_CHARS = CHAR_MP_END - CHAR_SP_END;
const u32 MAX_NUM_MP_ACTIVE_CHARS = 2;
const u32 MAX_NUM_MP_CLOUD_FILES = MAX_NUM_MP_CHARS + 1; //1 for the default slot
extern const char * s_StatsModelPrefixes[MAX_STATS_CHAR_INDEXES];
//PURPOSE: Same as StatId but has a hash for each character.
class StatId_char
{
private:
int m_Id[MAX_STATS_CHAR_INDEXES];
#if __ASSERT
public:
// For Validation after the stats have been loaded.
StatId_char* m_Next;
static StatId_char* sm_First;
const char* m_Name;
bool m_Validate;
public:
StatId_char(const char* str, const bool validate) {m_Validate = validate; Set(str);}
StatId_char(const char* name, const atHashString& sp0, const atHashString& sp1, const atHashString& sp2, const atHashString& mp0, const atHashString& mp1, const bool validate);
~StatId_char();
#endif // __ASSERT
public:
StatId_char(const char* str) { ASSERT_ONLY(m_Validate = false;); Set(str); }
StatId_char(const atHashString& sp0, const atHashString& sp1, const atHashString& sp2, const atHashString& mp0, const atHashString& mp1);
u32 GetHash(const u32 prefix) const;
u32 GetHash() const;
StatId GetStatId() const;
StatId GetOnlineStatId(const u32 slot) const;
bool operator ==(const StatId id) const { return (GetHash() == id.GetHash()); }
bool operator ==(const u32 id) const { return (GetHash() == id); }
// Conversion operators
operator StatId() const { return GetStatId(); }
private:
void Set(const char* str);
};
#if __ASSERT
#define STATIC_STAT_ID_CHAR(a, ...) StatId_char(a, __VA_ARGS__, true)
#else
#define STATIC_STAT_ID_CHAR(a, ...) StatId_char(__VA_ARGS__)
#endif // __ASSERT
// Our stats type identifier
typedef u32 StatType;
/*
Legend:
- Disabled
o Save is ignored.
- Deferred Profile Flush
o Performs a profile stats flush when 5 minutes have passed from last flush.
- Cloud Only
o Makes a cloud save Only. Can happen a deferred flush.
- Profile Flush Only
o Makes a Profile Flush Only.
- Profile Flush, Cloud Save
o Makes a cloud save and profile stats Flush.
- Cloud Only, Deferred Profile Flush
o Makes a cloud save and a deferred profile stats Flush.
*/
// These represent commom save types so that we can choose the importance of the save.
enum eSaveTypes
{
STAT_SAVETYPE_INVALID = -1
//Default save where the event is not identifiable.
,STAT_SAVETYPE_DEFAULT /* Disabled */
//Code Saves
,STAT_SAVETYPE_STUNTJUMP /* Deferred Profile Flush */
,STAT_SAVETYPE_CHEATER_CHANGE /* Deferred Profile Flush */
,STAT_SAVETYPE_IMMEDIATE_FLUSH /* Disabled */
,STAT_SAVETYPE_COMMERCE_DEPOSIT /* Disabled */
,STAT_SAVETYPE_EXPLOITS /* Deferred Profile Flush */
,STAT_SAVETYPE_STORE /* Disabled */
,STAT_SAVETYPE_END_CODE
//Script Saves
,STAT_SAVETYPE_AMBIENT = STAT_SAVETYPE_END_CODE /* Cloud Only, Deferred Profile Flush */
,STAT_SAVETYPE_CASH /* Disabled */
,STAT_SAVETYPE_END_GAMER_SETUP /* Profile Flush Only */
,STAT_SAVETYPE_END_SHOPPING /* Profile Flush Only */
,STAT_SAVETYPE_END_GARAGE /* Cloud Only, Same as STAT_SAVETYPE_SCRIPT_MP_GLOBALS */
,STAT_SAVETYPE_END_MISSION /* Cloud Only, Profile Flush */
,STAT_SAVETYPE_END_ATM /* Disabled */
,STAT_SAVETYPE_PRE_STARTSTORE /* Profile Flush, Cloud Save */
,STAT_SAVETYPE_SCRIPT_MP_GLOBALS /* Cloud Only */
,STAT_SAVETYPE_PROLOGUE /* Cloud Only */
,STAT_SAVETYPE_CONTACTS /* Disabled */
,STAT_SAVETYPE_START_MATCH /* Disabled */
,STAT_SAVETYPE_START_SESSION /* Cloud Only */
,STAT_SAVETYPE_INTERACTION_MENU /* Cloud Only, Deferred Profile Flush */
,STAT_SAVETYPE_JOIN_SC /* Disabled */
,STAT_SAVETYPE_AMB_PROFILE_AWARD_TRACKER /* Cloud Only, Deferred Flush */
,STAT_SAVETYPE_PHOTOS /* Deferred Profile Flush */
,STAT_SAVETYPE_WEAPON_DROP /* Disabled */
,STAT_SAVETYPE_RANKUP /* Cloud Only, Deferred Profile Flush */
,STAT_SAVETYPE_END_MISSION_CREATOR /* Cloud Only, Deferred Profile Flush */
//Critical save types.
,STAT_SAVETYPE_CRITICAL
,STAT_SAVETYPE_END_CREATE_NEWCHAR = STAT_SAVETYPE_CRITICAL /* Profile Flush, Cloud Save */
,STAT_SAVETYPE_END_MATCH /* Profile Flush, Cloud Save */
,STAT_SAVETYPE_END_SESSION /* Profile Flush, Cloud Save */
,STAT_SAVETYPE_DELETE_CHAR /* Profile Flush, Cloud Save */
,STAT_SAVETYPE_MAX_NUMBER
};
#if !__FINAL
const char* GET_STAT_SAVETYPE_NAME(const eSaveTypes savetype);
#endif //!__FINAL
// --- Enums --------------------------------------------------------------------
enum eStatModAbilities
{
STAT_MODIFIER_CLIMB_HEIGHT = 0,
STAT_MODIFIER_CLIMB_SPEED,
STAT_MODIFIER_JUMP_SPEED,
STAT_MODIFIER_FIGHT_SPEED,
STAT_MODIFIER_FIGHT_DAMAGE,
STAT_MODIFIER_BMX_SPRINT_SPEED,
STAT_MODIFIER_BMX_BUNNYHOP,
STAT_MODIFIER_SPRINT_ENERGY,
STAT_MODIFIER_BREATH_UNDERWATER,
STAT_MODIFIER_MAX_HEALTH,
STAT_MODIFIER_MAX_HEALTH_LIMIT,
STAT_MODIFIER_BIKE_WHEELIE_MULT,
STAT_MODIFIER_BIKE_BALANCE_FORCE,
STAT_MODIFIER_BIKE_BALANCE_DAMPING,
STAT_MODIFIER_CAR_INAIR_BALANCE,
STAT_MODIFIER_TAKE_DAMAGE_MULT
};
// Frontend display flags.
enum eFrontendStatShowFlag
{
// Always show the stat.
STAT_FLAG_ALWAYS_SHOW = (1<<0)
// Show only incremented stats.
,STAT_FLAG_INC_SHOW = (1<<1)
// Never show the stat.
,STAT_FLAG_NEVER_SHOW = (1<<2)
};
// Types of stats
enum eFrontendStatType
{
// Invalid/not set type
STAT_TYPE_NONE = 0,
// Base types
STAT_TYPE_INT = 1,
STAT_TYPE_FLOAT = 2,
STAT_TYPE_STRING = 3,
STAT_TYPE_BOOLEAN = 4,
STAT_TYPE_UINT8 = 5,
STAT_TYPE_UINT16 = 6,
STAT_TYPE_UINT32 = 7,
STAT_TYPE_UINT64 = 8,
// Variations of base types...
// ... These variations are use when the stat is rendered to apply certain format to then ... or just use to what u want
STAT_TYPE_TIME = 9,
STAT_TYPE_CASH = 10,
STAT_TYPE_PERCENT = 11,
STAT_TYPE_DEGREES = 12,
STAT_TYPE_WEIGHT = 13,
STAT_TYPE_MILES = 14,
STAT_TYPE_METERS = 15,
STAT_TYPE_FEET = 16,
STAT_TYPE_SECONDS = 17,
STAT_TYPE_CHART = 18,
STAT_TYPE_VELOCITY = 19,
STAT_TYPE_DATE = 20,
STAT_TYPE_POS = 21,
//Reminder: To notice that stats wont store an actual string but ratter the key for the map in TheText
STAT_TYPE_TEXTLABEL = 22,
STAT_TYPE_PACKED = 23,
STAT_TYPE_USERID = 24,
STAT_TYPE_PROFILE_SETTING = 25,
STAT_TYPE_INT64 = 26,
MAX_STAT_TYPE
};
//SaveGames can be split up to 14 different categories.
// When this value is used the save doesnt care about the category and doesn't split the stats.
#define MAX_STAT_SAVE_CATEGORY (15)
//SinglePlayer Stats Saves Categories:
// - We can have to 15 categories in which the stats are split so that the savegames
// take less space in memory.
enum eSinglePlayerStatSaveCategory
{
STAT_SP_CATEGORY_DEFAULT = 0
,STAT_SP_CATEGORY_CHAR0
,STAT_SP_CATEGORY_CHAR1
,STAT_SP_CATEGORY_CHAR2
,STAT_SP_CATEGORY_MAX = STAT_SP_CATEGORY_CHAR2
};
//Multiplayer Stats Saves Categories:
// - We can have to 15 categories in which the stats are split so that the savegames
// take less space in memory.
enum eMultiPlayerStatSaveCategory
{
STAT_INVALID_SLOT = -1
,STAT_MP_CATEGORY_DEFAULT = 0
,STAT_MP_CATEGORY_CHAR0 = 1
,STAT_MP_CATEGORY_CHAR1 = 2
,STAT_MP_CATEGORY_MAX = STAT_MP_CATEGORY_CHAR1
};
// Static Const Stats
#if GEN9_STANDALONE_ENABLED
extern const StatId_static STAT_MP_PLATFORM_GENERATION;
extern const StatId_static STAT_MP0_WINDFALL_CHAR;
extern const StatId_static STAT_MP1_WINDFALL_CHAR;
extern const StatId_static STAT_MP0_WINDFALL_CHAR_CAREER;
extern const StatId_static STAT_MP1_WINDFALL_CHAR_CAREER;
#endif
extern const StatId_static STAT_TOTAL_PROGRESS_MADE;
extern const StatId_static STAT_MSG_BEING_DISPLAYED;
extern const StatId_static STAT_MOCAP_CUTSCENE_SKIPPED;
extern const StatId_static STAT_MOCAP_CUTSCENE_WATCHED;
extern const StatId_static STAT_CUTSCENES_SKIPPED;
extern const StatId_static STAT_CUTSCENES_WATCHED;
extern const StatId_static STAT_PLAYING_TIME;
extern const StatId_static STAT_STEALTH_TIME;
extern const StatId_static STAT_MP_PLAYING_TIME;
extern const StatId_static STAT_MP_PLAYING_TIME_NEW;
extern const StatId_static STAT_FIRST_PERSON_CAM_TIME;
extern const StatId_static STAT_THIRD_PERSON_CAM_TIME;
extern const StatId_static STAT_MP_FIRST_PERSON_CAM_TIME;
extern const StatId_static STAT_MP_THIRD_PERSON_CAM_TIME;
extern const StatId_static STAT_CITIES_PASSED;
extern const StatId_static STAT_MP_SESSIONS_STARTED;
extern const StatId_static STAT_MP_SESSIONS_ENDED;
extern const StatId_static STAT_MP_MOST_FRIENDS_IN_ONE_MATCH;
extern const StatId_static STAT_MP_VEHICLE_MODELS_DRIVEN;
extern const StatId_static STAT_SP_VEHICLE_MODELS_DRIVEN;
extern const StatId_static STAT_MP0_CHAR_ISACTIVE;
extern const StatId_static STAT_MP1_CHAR_ISACTIVE;
extern const StatId_static STAT_MPPLY_LAST_MP_CHAR;
extern const StatId_static STAT_ACTIVE_CREW;
extern const StatId_static STAT_MP_KILLS_PLAYERS;
extern const StatId_static STAT_MP_DEATHS_PLAYER;
extern const StatId_static STAT_MP_SUICIDES_PLAYER;
extern const StatId_static STAT_MP_CHAR_DIST_TRAVELLED;
extern const StatId_static STAT_SP_LEAST_FAVORITE_STATION;
extern const StatId_static STAT_SP_MOST_FAVORITE_STATION;
extern const StatId_static STAT_MPPLY_LEAST_FAVORITE_STATION;
extern const StatId_static STAT_MPPLY_MOST_FAVORITE_STATION;
extern const StatId_static STAT_MPPLY_OVERALL_BADSPORT;
extern const StatId_static STAT_MPPLY_IS_BADSPORT;
extern const StatId_static STAT_MPPLY_DEATHS_PLAYERS_CHEATER;
extern const StatId_static STAT_MPPLY_KILLS_PLAYERS_CHEATER;
extern const StatId_char STAT_CASINO_CHIPS;
extern const StatId_char STAT_CHAR_XP_FM;
extern const StatId_char STAT_WALLET_BALANCE; //Per-Character wallet Cash.
extern const StatId_static STAT_BANK_BALANCE; //Bank Cash.
extern const StatId_static STAT_CLIENT_PVC_BALANCE;
extern const StatId_static STAT_CLIENT_EVC_BALANCE;
extern const StatId_static STAT_EVC_BALANCE_CLEARED; //Total Cleared EVC Cash when player is a cheater.
extern const StatId_static STAT_MPPLY_TOTAL_EVC; //Total Virtual cash player has EARN, either in game or via other mechanism.
extern const StatId_char STAT_TOTAL_EVC; //Total Virtual cash player has EARN, either in game or via other mechanism.
extern const StatId_char STAT_VEHICLE_WEAPONHASH;
extern const StatId_static STAT_PVC_DAILY_ADDITIONS; //Amount of PVC added (through purchase or PVC gift receipt) by a player in 1 day.
extern const StatId_static STAT_CLIENT_PXR; // PXR value.
extern const StatId_static STAT_PVC_USDE; // US dollar value of the players PVC. PVC Balance / PXR.
extern const StatId_static STAT_VC_DAILY_TIMESTAMP; //Virtual cash daily posix time - Control daily amount resets.
extern const StatId_static STAT_PVC_DAILY_TRANSFERS; //Amount of PVC transferred out by a player to other players in 1 day.
extern const StatId_static STAT_VC_DAILY_TRANSFERS; //Amount of VC (non-type) transferred out by a player in 1 day
extern const StatId_static STAT_MPPLY_STORE_TOTAL_MONEY_BOUGHT;
extern const StatId_static STAT_MPPLY_STORE_PURCHASE_POSIX_TIME;
extern const StatId_static STAT_MPPLY_STORE_CHECKOUTS_CANCELLED;
extern const StatId_static STAT_MPPLY_STORE_MONEY_SPENT;
extern const StatId_static STAT_SCADMIN_IS_CHEATER;
extern const StatId_static STAT_MPPLY_CHEATER_CLEAR_TIME;
extern const StatId_static STAT_CASH_GIFT_RECEIVED;
extern const StatId_static STAT_CASH_GIFT;
extern const StatId_static STAT_CASH_GIFT_LABEL_1;
extern const StatId_static STAT_CASH_GIFT_LABEL_2;
extern const StatId_static STAT_RP_GIFT_RECEIVED;
extern const StatId_static STAT_RP_GIFT;
extern const StatId_static STAT_CASH_GIFT_NEW;
extern const StatId_static STAT_CASH_GIFT_CREDITED;
extern const StatId_static STAT_CASH_GIFT_DEBITED;
extern const StatId_static STAT_CASH_GIFT_LEAVE_REMAINDER;
extern const StatId_static STAT_CASH_GIFT_MIN_BALANCE;
extern const StatId_static STAT_CASH_EVC_CORRECTION;
extern const StatId_static STAT_CASH_PVC_CORRECTION;
extern const StatId_static STAT_CASH_USDE_CORRECTION;
extern const StatId_static STAT_CASH_PXR_CORRECTION;
extern const StatId_static STAT_CASH_FIX_PVC_WB_CORRECTION;
extern const StatId_static STAT_CASH_FIX_EVC_CORRECTION;
extern const StatId_static STAT_MPPLY_SCADMIN_CESP;
/*
extern const StatId_static STAT_CHIP_GIFT;
extern const StatId_static STAT_CHIP_GIFT_LABEL_1;
extern const StatId_static STAT_CHIP_GIFT_LABEL_2;
extern const StatId_static STAT_CHIP_GIFT_CREDITED;
extern const StatId_static STAT_CHIP_GIFT_DEBITED;
extern const StatId_static STAT_CHIP_GIFT_LEAVE_REMAINDER;
*/
extern const StatId_char STAT_BEND_PROGRESS_HASH;
extern const StatId_char STAT_TOTAL_CASH_EARNED;
extern const StatId_char STAT_TOTAL_CASH;
extern const StatId_char STAT_MONEY_TOTAL_SPENT;
extern const StatId_char STAT_RANK_FM;
extern const StatId_char STAT_LONGEST_PLAYING_TIME;
extern const StatId_char STAT_LONGEST_CHASE_TIME;
extern const StatId_char STAT_LAST_CHASE_TIME;
extern const StatId_char STAT_TOTAL_TIME_MAX_STARS;
extern const StatId_char STAT_TOTAL_CHASE_TIME;
extern const StatId_char STAT_STARS_EVADED;
extern const StatId_char STAT_STARS_ATTAINED;
extern const StatId_char STAT_STAMINA;
extern const StatId_char STAT_LUNG_CAPACITY;
extern const StatId_char STAT_STRENGTH;
extern const StatId_char STAT_LONGEST_2WHEEL_TIME;
extern const StatId_char STAT_LONGEST_2WHEEL_DIST;
extern const StatId_char STAT_LONGEST_WHEELIE_DIST;
extern const StatId_char STAT_LONGEST_WHEELIE_TIME;
extern const StatId_char STAT_TOTAL_WHEELIE_TIME;
extern const StatId_char STAT_LONGEST_STOPPIE_TIME;
extern const StatId_char STAT_LONGEST_STOPPIE_DIST;
extern const StatId_char STAT_CHAR_MISSION_PASSED;
extern const StatId_char STAT_CHAR_MISSION_FAILED;
extern const StatId_char STAT_ENTERED_COVER;
extern const StatId_char STAT_ENTERED_COVER_AND_SHOT;
extern const StatId_char STAT_CROUCHED;
extern const StatId_char STAT_CROUCHED_AND_SHOT;
extern const StatId_char STAT_TOTAL_PLAYING_TIME;
extern const StatId_char STAT_KILLS_IN_FREE_AIM;
extern const StatId_char STAT_FASTEST_SPEED;
extern const StatId_char STAT_TOP_SPEED_CAR;
extern const StatId_char STAT_AVERAGE_SPEED;
extern const StatId_char STAT_WHEELIE_ABILITY;
extern const StatId_char STAT_FLYING_ABILITY;
extern const StatId_char STAT_SHOTS;
extern const StatId_char STAT_HITS;
extern const StatId_char STAT_WEAPON_ACCURACY;
extern const StatId_char STAT_HITS_MISSION;
extern const StatId_char STAT_HITS_PEDS_VEHICLES;
extern const StatId_char STAT_DB_SHOTTIME;
extern const StatId_char STAT_DB_SHOTS;
extern const StatId_char STAT_DB_HITS;
extern const StatId_char STAT_DB_HITS_PEDS_VEHICLES;
extern const StatId_char STAT_PASS_DB_SHOTTIME;
extern const StatId_char STAT_PASS_DB_SHOTS;
extern const StatId_char STAT_PASS_DB_HITS;
extern const StatId_char STAT_PASS_DB_HITS_PEDS_VEHICLES;
extern const StatId_char STAT_DIST_SWIMMING;
extern const StatId_char STAT_TIME_SWIMMING;
extern const StatId_char STAT_DIST_WALKING;
extern const StatId_char STAT_TIME_WALKING;
extern const StatId_char STAT_DIST_WALKING_STEALTH;
extern const StatId_char STAT_DIST_RUNNING;
extern const StatId_char STAT_AWD_PARACHUTE_JUMPS_50M;
extern const StatId_char STAT_AWD_PARACHUTE_JUMPS_10M;
extern const StatId_char STAT_LONGEST_SURVIVED_FREEFALL;
extern const StatId_char STAT_TIME_IN_COVER;
extern const StatId_char STAT_TIRES_POPPED_BY_GUNSHOT;
extern const StatId_char STAT_KILLS;
extern const StatId_char STAT_KILLS_SINCE_LAST_CHECKPOINT;
extern const StatId_char STAT_KILLS_SINCE_SAFEHOUSE_VISIT;
extern const StatId_char STAT_KILLS_ARMED;
extern const StatId_char STAT_DB_KILLS;
extern const StatId_char STAT_PASS_DB_KILLS;
extern const StatId_char STAT_DB_PLAYER_KILLS;
extern const StatId_char STAT_PASS_DB_PLAYER_KILLS;
extern const StatId_char STAT_PLAYER_HEADSHOTS;
extern const StatId_char STAT_DB_HEADSHOTS;
extern const StatId_char STAT_PASS_DB_HEADSHOTS;
extern const StatId_char STAT_DEATHS;
extern const StatId_char STAT_DIED_IN_MISSION;
extern const StatId_char STAT_DEATHS_PLAYER;
extern const StatId_char STAT_MOST_FLIPS_IN_ONE_JUMP;
extern const StatId_char STAT_MOST_SPINS_IN_ONE_JUMP;
extern const StatId_char STAT_LONGEST_DRIVE_NOCRASH;
extern const StatId_char STAT_HIGHEST_JUMP_REACHED;
extern const StatId_char STAT_LONGEST_SKYDIVE;
extern const StatId_char STAT_AIR_LAUNCHES_OVER_5S;
extern const StatId_char STAT_AIR_LAUNCHES_OVER_5M;
extern const StatId_char STAT_AIR_LAUNCHES_OVER_40M;
extern const StatId_char STAT_FARTHEST_JUMP_DIST;
extern const StatId_char STAT_HYDRAULIC_JUMP;
extern const StatId_char STAT_NUMBER_OF_AIR_LAUNCHES;
extern const StatId_char STAT_HIGHEST_SKITTLES;
extern const StatId_char STAT_EXPLOSIVES_USED;
extern const StatId_char STAT_KILLS_BY_OTHERS;
extern const StatId_char STAT_NUMBER_NEAR_MISS;
extern const StatId_char STAT_NUMBER_NEAR_MISS_NOCRASH;
extern const StatId_char STAT_NEAR_MISS_PRECISE;
extern const StatId_char STAT_KILLS_FRIENDLY_GANG_MEMBERS;
extern const StatId_char STAT_KILLS_ENEMY_GANG_MEMBERS;
extern const StatId_char STAT_KILLS_SWAT;
extern const StatId_char STAT_KILLS_COP;
extern const StatId_char STAT_KILLS_INNOCENTS;
extern const StatId_char STAT_KILLS_STEALTH;
extern const StatId_char STAT_PLAYER_KILLS_ON_SPREE;
extern const StatId_char STAT_COPS_KILLS_ON_SPREE;
extern const StatId_char STAT_PEDS_KILLS_ON_SPREE;
extern const StatId_char STAT_LONGEST_KILLING_SPREE;
extern const StatId_char STAT_LONGEST_KILLING_SPREE_TIME;
extern const StatId_char STAT_KILLS_PLAYERS;
extern const StatId_char STAT_SNIPER_KILL;
extern const StatId_char STAT_CARS_EXPLODED;
extern const StatId_char STAT_CARS_COPS_EXPLODED;
extern const StatId_char STAT_BIKES_EXPLODED;
extern const StatId_char STAT_BOATS_EXPLODED;
extern const StatId_char STAT_HELIS_EXPLODED;
extern const StatId_char STAT_PLANES_EXPLODED;
extern const StatId_char STAT_QUADBIKE_EXPLODED;
extern const StatId_char STAT_BICYCLE_EXPLODED;
extern const StatId_char STAT_SUBMARINE_EXPLODED;
extern const StatId_char STAT_TRAIN_EXPLODED;
extern const StatId_char STAT_VEHICLES_DESTROYED_ON_SPREE;
extern const StatId_char STAT_COP_VEHI_DESTROYED_ON_SPREE;
extern const StatId_char STAT_TANKS_DESTROYED_ON_SPREE;
extern const StatId_char STAT_CARS_WRECKED;
extern const StatId_char STAT_CARS_COPS_WRECKED;
extern const StatId_char STAT_TOTAL_DAMAGE_CARS;
extern const StatId_char STAT_LARGE_ACCIDENTS;
extern const StatId_char STAT_NUMBER_CRASHES_CARS;
extern const StatId_char STAT_TOTAL_DAMAGE_QUADBIKES;
extern const StatId_char STAT_NUMBER_CRASHES_QUADBIKES;
extern const StatId_char STAT_TOTAL_DAMAGE_BIKES;
extern const StatId_char STAT_NUMBER_CRASHES_BIKES;
extern const StatId_char STAT_DIST_AS_PASSENGER_TRAIN;
extern const StatId_char STAT_FLIGHT_TIME;
extern const StatId_char STAT_DIST_AS_PASSENGER_TAXI;
extern const StatId_char STAT_DIST_DRIVING_CAR;
extern const StatId_char STAT_DIST_DRIVING_BIKE;
extern const StatId_char STAT_DIST_DRIVING_PLANE;
extern const StatId_char STAT_DIST_DRIVING_QUADBIKE;
extern const StatId_char STAT_DIST_DRIVING_HELI;
extern const StatId_char STAT_DIST_DRIVING_BIKE;
extern const StatId_char STAT_DIST_DRIVING_BICYCLE;
extern const StatId_char STAT_DIST_DRIVING_BOAT;
extern const StatId_char STAT_DIST_DRIVING_SUBMARINE;
extern const StatId_char STAT_TIME_DRIVING_CAR;
extern const StatId_char STAT_TIME_DRIVING_BIKE;
extern const StatId_char STAT_TIME_DRIVING_CAR;
extern const StatId_char STAT_TIME_DRIVING_PLANE;
extern const StatId_char STAT_TIME_DRIVING_QUADBIKE;
extern const StatId_char STAT_TIME_DRIVING_HELI;
extern const StatId_char STAT_TIME_DRIVING_BIKE;
extern const StatId_char STAT_TIME_DRIVING_BICYCLE;
extern const StatId_char STAT_TIME_DRIVING_BOAT;
extern const StatId_char STAT_TIME_DRIVING_SUBMARINE;
extern const StatId_char STAT_DIST_CAR;
extern const StatId_char STAT_DIST_PLANE;
extern const StatId_char STAT_DIST_QUADBIKE;
extern const StatId_char STAT_DIST_HELI;
extern const StatId_char STAT_DIST_BIKE;
extern const StatId_char STAT_DIST_BICYCLE;
extern const StatId_char STAT_DIST_BOAT;
extern const StatId_char STAT_DIST_SUBMARINE;
extern const StatId_char STAT_LONGEST_CAM_TIME_DRIVING;
extern const StatId_char STAT_PACKED_BOOL_0;
extern const StatId_char STAT_STEALTH_ABILITY;
extern const StatId_char STAT_AWD_CAR_BOMBS_ENEMY_KILLS;
extern const StatId_char STAT_PACKED_STAT_INT0;
extern const StatId_char STAT_DAMAGE_SCAR_NUMBER;
extern const StatId_char STAT_NO_TIMES_WANTED_LEVEL;
extern const StatId_char STAT_SPECIAL_ABILITY_ACTIVE_NUM;
extern const StatId_char STAT_SPECIAL_ABILITY_ACTIVE_TIME;
extern const StatId_static STAT_MP_PACKED_INT_0;
extern const StatId_static STAT_PLAYER_MUTED_TALKERS_MET;
extern const StatId_static STAT_PLAYER_MUTED;
extern const StatId_char STAT_EXPLOSIVE_DAMAGE_HITS;
extern const StatId_char STAT_EXPLOSIVE_DAMAGE_HITS_ANYTHING;
extern const StatId_char STAT_EXPLOSIVE_DAMAGE_SHOTS;
extern const StatId_static STAT_SP_PROFILE_STAT_VERSION;
extern const StatId_static STAT_SP_SAVE_TIMESTAMP;
extern const StatId_char STAT_UNARMED_PED_HITS;
extern const StatId_char STAT_MP_AWARD_HOLD_UP_SHOPS;
extern const StatId_char STAT_MP_AWARD_FMHORDWAVESSURVIVE;
extern const StatId_static STAT_MPPLY_TOTAL_CUSTOM_RACES_WON;
extern const StatId_char STAT_MP_STAT_CHAR_FM_PLAT_AWARD_COUNT;
extern const StatId_char STAT_MISSIONS_PASSED;
// Hero Stats
extern const StatId_char STAT_NUMBER_STOLEN_CARS;
extern const StatId_static STAT_MPPLY_KILL_DEATH_RATIO;
// CLEAR SOME STATS - After Save Migration being successful.
extern const StatId_char STAT_BIGGEST_VICTIM;
extern const StatId_char STAT_BIGGEST_VICTIM_NAME;
extern const StatId_char STAT_BIGGEST_VICTIM_KILLS;
extern const StatId_char STAT_ARCHENEMY;
extern const StatId_char STAT_ARCHENEMY_NAME;
extern const StatId_char STAT_ARCHENEMY_KILLS;
extern const StatId_char STAT_SAVE_MIGRATION_CLEAR_STAT;
// Some stats used for telemetry
extern const StatId_char STAT_PROSTITUTES_FREQUENTED;
extern const StatId_char STAT_LAP_DANCED_BOUGHT;
#if __ASSERT
extern const atHashWithStringNotFinal STATTYPE_WEAPON_HEADSHOTS;
extern const atHashWithStringNotFinal STATTYPE_WEAPON_HELDTIME;
extern const atHashWithStringNotFinal STATTYPE_WEAPON_HITS;
extern const atHashWithStringNotFinal STATTYPE_WEAPON_KILLS;
extern const atHashWithStringNotFinal STATTYPE_WEAPON_SHOTS;
extern const atHashWithStringNotFinal STATTYPE_WEAPON_ACQUIRED;
#endif // __ASSERT
extern const StatId_char STAT_NUMBER_OF_SESSIONS_FM;
extern const StatId_char STAT_AVERAGE_TIME_PER_SESSON;
#endif // _STATSENUMS_H_
// EOF