//====== Copyright 1996-2005, Valve Corporation, All rights reserved. ======= // // Purpose: // //============================================================================= #ifndef CSTRIKE15_ITEM_CONSTANTS_H #define CSTRIKE15_ITEM_CONSTANTS_H #ifdef _WIN32 #pragma once #endif //----------------------------------------------------------------------------- // Purpose: Slots for items within loadouts // NOTE: Explicitly numbered slots are for shipped features with the number saved in the database, do not renumber. // Some legacy entries in the enum are still here and some game code uses them, but are not yet shipped and would be // safe to renumber or remove if needed //----------------------------------------------------------------------------- enum loadout_positions_t { LOADOUT_POSITION_INVALID = -1, LOADOUT_POSITION_MELEE = 0, LOADOUT_POSITION_C4 = 1, LOADOUT_POSITION_FIRST_AUTO_BUY_WEAPON = LOADOUT_POSITION_MELEE, LOADOUT_POSITION_LAST_AUTO_BUY_WEAPON = LOADOUT_POSITION_C4, LOADOUT_POSITION_SECONDARY0 = 2, LOADOUT_POSITION_SECONDARY1 = 3, LOADOUT_POSITION_SECONDARY2 = 4, LOADOUT_POSITION_SECONDARY3 = 5, LOADOUT_POSITION_SECONDARY4 = 6, LOADOUT_POSITION_SECONDARY5 = 7, // Unused, no instances in database yet LOADOUT_POSITION_SMG0 = 8, LOADOUT_POSITION_SMG1 = 9, LOADOUT_POSITION_SMG2 = 10, LOADOUT_POSITION_SMG3 = 11, LOADOUT_POSITION_SMG4 = 12, LOADOUT_POSITION_SMG5 = 13, // Unused, no instances in database yet LOADOUT_POSITION_RIFLE0 = 14, LOADOUT_POSITION_RIFLE1 = 15, LOADOUT_POSITION_RIFLE2 = 16, LOADOUT_POSITION_RIFLE3 = 17, LOADOUT_POSITION_RIFLE4 = 18, LOADOUT_POSITION_RIFLE5 = 19, LOADOUT_POSITION_HEAVY0 = 20, LOADOUT_POSITION_HEAVY1 = 21, LOADOUT_POSITION_HEAVY2 = 22, LOADOUT_POSITION_HEAVY3 = 23, LOADOUT_POSITION_HEAVY4 = 24, LOADOUT_POSITION_HEAVY5 = 25, // Unused, no instances in database yet LOADOUT_POSITION_FIRST_WHEEL_WEAPON = LOADOUT_POSITION_SECONDARY0, LOADOUT_POSITION_LAST_WHEEL_WEAPON = LOADOUT_POSITION_HEAVY5, // Grenade slots not yet saved in db LOADOUT_POSITION_FIRST_WHEEL_GRENADE, LOADOUT_POSITION_GRENADE0 = LOADOUT_POSITION_FIRST_WHEEL_GRENADE, LOADOUT_POSITION_GRENADE1, LOADOUT_POSITION_GRENADE2, LOADOUT_POSITION_GRENADE3, LOADOUT_POSITION_GRENADE4, LOADOUT_POSITION_GRENADE5, LOADOUT_POSITION_LAST_WHEEL_GRENADE = LOADOUT_POSITION_GRENADE5, // Equipment slots not yet saved in db LOADOUT_POSITION_EQUIPMENT0, LOADOUT_POSITION_EQUIPMENT1, LOADOUT_POSITION_EQUIPMENT2, LOADOUT_POSITION_EQUIPMENT3, LOADOUT_POSITION_EQUIPMENT4, LOADOUT_POSITION_EQUIPMENT5, LOADOUT_POSITION_FIRST_WHEEL_EQUIPMENT = LOADOUT_POSITION_EQUIPMENT0, LOADOUT_POSITION_LAST_WHEEL_EQUIPMENT = LOADOUT_POSITION_EQUIPMENT5, // Only glove slot saved in db LOADOUT_POSITION_CLOTHING_APPEARANCE, LOADOUT_POSITION_CLOTHING_TORSO, LOADOUT_POSITION_CLOTHING_LOWERBODY, LOADOUT_POSITION_CLOTHING_HANDS = 41, // ALREADY SHIPPED, idx must == 41 LOADOUT_POSITION_CLOTHING_HAT, LOADOUT_POSITION_CLOTHING_FACEMASK, LOADOUT_POSITION_CLOTHING_EYEWEAR, LOADOUT_POSITION_CLOTHING_CUSTOMHEAD, LOADOUT_POSITION_CLOTHING_CUSTOMPLAYER, LOADOUT_POSITION_MISC0, LOADOUT_POSITION_MISC1, LOADOUT_POSITION_MISC2, LOADOUT_POSITION_MISC3, LOADOUT_POSITION_MISC4, LOADOUT_POSITION_MISC5, LOADOUT_POSITION_MISC6, LOADOUT_POSITION_FIRST_COSMETIC = LOADOUT_POSITION_CLOTHING_APPEARANCE, LOADOUT_POSITION_LAST_COSMETIC = LOADOUT_POSITION_MISC6, // ^^^ Warning: CLOTHING COSEMTIC amount of enum entries doesn't match released enum, so must be shuffled before shipping to match public SQL! LOADOUT_POSITION_MUSICKIT = 54, LOADOUT_POSITION_FLAIR0 = 55, LOADOUT_POSITION_SPRAY0 = 56, LOADOUT_POSITION_FIRST_ALL_CHARACTER = LOADOUT_POSITION_MUSICKIT, LOADOUT_POSITION_LAST_ALL_CHARACTER = LOADOUT_POSITION_SPRAY0, LOADOUT_POSITION_COUNT, }; #define LOADOUT_POSITION_NUM_AUTOBUY_WEAPONS ( ( LOADOUT_POSITION_LAST_AUTO_BUY_WEAPON - LOADOUT_POSITION_FIRST_AUTO_BUY_WEAPON) + 1 ) #define LOADOUT_POSITION_NUM_COSMETICS ( ( LOADOUT_POSITION_LAST_COSMETIC - LOADOUT_POSITION_FIRST_COSMETIC ) + 1 ) #define LOADOUT_POSITION_NUM_WHEEL_WEAPONS ( ( LOADOUT_POSITION_LAST_WHEEL_WEAPON - LOADOUT_POSITION_FIRST_WHEEL_WEAPON ) + 1 ) #define LOADOUT_POSITION_NUM_WHEEL_GRENADE ( ( LOADOUT_POSITION_LAST_WHEEL_GRENADE - LOADOUT_POSITION_FIRST_WHEEL_GRENADE ) + 1 ) #define LOADOUT_POSITION_NUM_WHEEL_EQUIPMENT ( ( LOADOUT_POSITION_LAST_WHEEL_EQUIPMENT - LOADOUT_POSITION_FIRST_WHEEL_EQUIPMENT ) + 1 ) #define LOADOUT_POSITION_NUM_ALL_CHARACTER ( ( LOADOUT_POSITION_LAST_ALL_CHARACTER - LOADOUT_POSITION_FIRST_ALL_CHARACTER ) + 1 ) #define LOADOUT_NUM_PANELS ( LOADOUT_POSITION_NUM_AUTOBUY_WEAPONS + LOADOUT_POSITION_NUM_COSMETICS + LOADOUT_POSITION_NUM_WHEEL_WEAPONS + LOADOUT_POSITION_NUM_ALL_CHARACTER ) // We use this to determine the maximum number of wearable instances we'll send from the server down to connected clients. // This hardcoded because of the way RecvPropUtlVector works we can't easily change this // without doing some kludgy work and breaking network/demo compatibility. // Make sure this is up to date before shipping with enough overhead and don't change it without serious consideration. #define LOADOUT_MAX_WEARABLES_COUNT ( 1 /*LOADOUT_POSITION_NUM_COSMETICS*/ ) inline bool IsWearableSlot( int iSlot ) { return ( iSlot >= LOADOUT_POSITION_FIRST_COSMETIC && iSlot <= LOADOUT_POSITION_LAST_COSMETIC ); } inline bool SlotContainsBaseItems( int iSlot ) { // Primary wheel 2 has 6 base item slots... all the rest have 5 and one empty if ( iSlot < LOADOUT_POSITION_MELEE ) { return false; } if ( iSlot >= LOADOUT_POSITION_FIRST_WHEEL_WEAPON && iSlot <= LOADOUT_POSITION_LAST_WHEEL_WEAPON ) { switch( iSlot ) { case LOADOUT_POSITION_SECONDARY5: case LOADOUT_POSITION_SMG5: case LOADOUT_POSITION_HEAVY5: return false; } return true; } if ( iSlot >= LOADOUT_POSITION_FIRST_WHEEL_GRENADE && iSlot <= LOADOUT_POSITION_LAST_WHEEL_GRENADE ) { // switch( iSlot ) // { // case LOADOUT_POSITION_GRENADE5: // return false; // } return true; } if ( iSlot >= LOADOUT_POSITION_FIRST_WHEEL_EQUIPMENT && iSlot <= LOADOUT_POSITION_LAST_WHEEL_EQUIPMENT ) { switch( iSlot ) { case LOADOUT_POSITION_EQUIPMENT0: case LOADOUT_POSITION_EQUIPMENT1: case LOADOUT_POSITION_EQUIPMENT3: case LOADOUT_POSITION_EQUIPMENT4: case LOADOUT_POSITION_EQUIPMENT5: return false; } return true; } if ( iSlot >= LOADOUT_POSITION_FIRST_COSMETIC && iSlot <= LOADOUT_POSITION_LAST_COSMETIC ) { switch( iSlot ) { case LOADOUT_POSITION_CLOTHING_APPEARANCE: case LOADOUT_POSITION_CLOTHING_TORSO: case LOADOUT_POSITION_CLOTHING_LOWERBODY: case LOADOUT_POSITION_CLOTHING_HANDS: case LOADOUT_POSITION_CLOTHING_HAT: case LOADOUT_POSITION_CLOTHING_FACEMASK: case LOADOUT_POSITION_CLOTHING_EYEWEAR: case LOADOUT_POSITION_CLOTHING_CUSTOMHEAD: case LOADOUT_POSITION_CLOTHING_CUSTOMPLAYER: return true; } return false; } if ( iSlot == LOADOUT_POSITION_MUSICKIT ) return true; if ( iSlot >= LOADOUT_POSITION_FIRST_ALL_CHARACTER && iSlot <= LOADOUT_POSITION_LAST_ALL_CHARACTER ) { return false; } return true; } // The total number of loadouts to track for each player. #define LOADOUT_COUNT (2+2) // these are the number of skins (2 valid + 2 invalid) //----------------------------------------------------------------------------- // The maximum number of presets per class - CS doesn't actually use all 10 // right now, though. //----------------------------------------------------------------------------- #define MAX_LOADOUT_PRESET_COUNT 10 enum xp_category_t { kXPCategory_None = 0, kXPCategory_ContributionScore = 1, // Server can send ContributionScore (mutually exclusive with CompetitiveRoundWins) kXPCategory_CompetitiveRoundWins = 2, // Server can send CompetitiveRoundWins (mutually exclusive with ContributionScore) kXPCategory_BonusBoost = 3, // GC rewards this weekly boost kXPCategory_Overwatch = 4, // GC rewards Overwatch XP in post SQL-transaction kXPCategory_OverwatchBonusBoost = 5, // GC rewards Overwatch Bonus XP in post SQL-transaction kXPCategory_QuestReward = 6, // Server sends evaluated quest points, and GC rewards Quest XP from coin progress kXPCategory_QuestBonus = 7, // Server sends evaluated quest bonus points, and GC rewards Quest XP from coin progress kXPCategory_QuestEvent = 8, // Server sends quest event XP, GC relays it to client // kXPCategory_Headshots, etc // GC can also use reduced XP reasons - kXPCategory_ContributionScoreReduced = 51, // ContributionScore remapped by GC for client display kXPCategory_CompetitiveRoundWinsReduced = 52, // CompetitiveRoundWins remapped by GC for client display kXPCategory_OverwatchReduced = 54, // Overwatch XP reason remapped by GC for client display kXPCategory_QuestEventReduced = 58, // QuestEvent XP reason remapped by GC for client display // GC can also use introductory XP reasons - kXPCategory_ContributionScoreIntroductory = 81, // ContributionScore remapped by GC for client display kXPCategory_CompetitiveRoundWinsIntroductory = 82, // CompetitiveRoundWins remapped by GC for client display kXPCategory_QuestEventIntroductory = 88, // QuestEvent XP reason remapped by GC for client display // NEW ENTRIES MUST BE ADDED AT THE BOTTOM }; const uint32 k_nCSGOXpPerLevel = 5000; const uint32 k_nCSGOXpMaxLevel = 40; // Prime status const uint32 k_nCSGOMinLevelForPrimeStatus = 21; inline uint32 CSGOXpPointsToLevel( uint32 unExperiencePoints ) { return Min( k_nCSGOXpMaxLevel, 1 + ( unExperiencePoints / k_nCSGOXpPerLevel ) ); } inline uint32 CSGOXpPointsToXpPoints( uint32 unExperiencePoints ) { return unExperiencePoints % k_nCSGOXpPerLevel; } inline uint32 CSGOXpPointsToXpWirePoints( uint32 unExperiencePoints ) { COMPILE_TIME_ASSERT( k_nCSGOXpPerLevel < 0xFFFF ); Assert( unExperiencePoints <= 0xFFFF ); return ( ( unExperiencePoints ) & 0xFFFF ) | ( ( k_nCSGOXpPerLevel & 0xFFFF ) << 16 ); } inline uint32 CSGOXpPointsFromXpWirePoints( uint32 unXpWirePoints ) { COMPILE_TIME_ASSERT( k_nCSGOXpPerLevel < 0xFFFF ); uint32 const unWireBase = ( unXpWirePoints >> 16 ) & 0xFFFF; if ( !unWireBase || ( unWireBase == k_nCSGOXpPerLevel ) ) return unXpWirePoints & 0xFFFF; else return uint32( ( double( unXpWirePoints & 0xFFFF ) / double( unWireBase ) ) * double( k_nCSGOXpPerLevel ) ); } // STORED IN DATABASE! Do not renumber enum { kCSXpBonusFlags_EarnedXpThisPeriod = 1 << 0, kCSXpBonusFlags_FirstReward = 1 << 1, kCSXpBonusFlags_Msg_YourReportGotConvicted = 1 << 2, kCSXpBonusFlags_Msg_YouPartiedWithCheaters = 1 << 3, kCSXpBonusFlags_PrestigeEarned = 1 << 4, // ===$CHINAGOVERNMENTCERT$=== kCSXpBonusFlags_ChinaGovernmentCert = 1 << 5, // ===$CHINAGOVERNMENTCERT$=== // Client-facing bits not backed by SQL kCSXpBonusFlags_OverwatchBonus = 1 << 28, kCSXpBonusFlags_BonusBoostConsumed = 1 << 29, kCSXpBonusFlags_ReducedGain = 1 << 30, kCSXpBonusFlagsMask_SQLBacked_TimeBased = ( kCSXpBonusFlags_EarnedXpThisPeriod | kCSXpBonusFlags_FirstReward ), kCSXpBonusFlagsMask_SQLBacked_Notifications = ( kCSXpBonusFlags_Msg_YourReportGotConvicted | kCSXpBonusFlags_Msg_YouPartiedWithCheaters ), kCSXpBonusFlagsMask_SQLBacked_Permanent = ( kCSXpBonusFlagsMask_SQLBacked_Notifications | kCSXpBonusFlags_PrestigeEarned | kCSXpBonusFlags_ChinaGovernmentCert // ===$CHINAGOVERNMENTCERT$=== ), kCSXpBonusFlagsMask_SQLBacked = ( kCSXpBonusFlagsMask_SQLBacked_TimeBased | kCSXpBonusFlagsMask_SQLBacked_Permanent ), kCSXpBonusFlagsMask_Client_Permanent = ( kCSXpBonusFlags_OverwatchBonus ), kCSXpBonusFlagsMask_Client_TimeBased = ( kCSXpBonusFlags_BonusBoostConsumed | kCSXpBonusFlags_ReducedGain ), }; // Used in scoreboard to show other players the reason for the drop. Standard weekly drops are of type 'None'. enum { kCSGODropReason_None = 0, kCSGODropReason_Quest = 1, kCSGODropReason_LevelUp = 2, }; #endif // CSTRIKE15_ITEM_CONSTANTS_H