mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-16 13:43:00 +00:00
1
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||||
//
|
||||
//=============================================================================
|
||||
#ifndef TF_ACHIEVEMENT_DATA_H
|
||||
#define TF_ACHIEVEMENT_DATA_H
|
||||
#pragma once
|
||||
|
||||
#include "UtlSortVector.h"
|
||||
|
||||
#define MAX_ACHIEVEMENT_HISTORY_SLOTS 4
|
||||
#define MAX_ACHIEVEMENT_DAMAGE_HISTORY_SLOTS 128
|
||||
|
||||
//=============================================================================
|
||||
// Custom class to manage lists of history events. Maintains a prioritized list of
|
||||
// events, but includes two extra features:
|
||||
// - Maximum size of the number of entries in the queue.
|
||||
// - Ensures each associated-entity in the entries appears only once in the queue.
|
||||
template <class T, class LessFunc, int maxSize>
|
||||
class CHistoryVector : public CUtlSortVector<T, LessFunc>
|
||||
{
|
||||
public:
|
||||
CHistoryVector()
|
||||
{
|
||||
}
|
||||
|
||||
void InsertHistory( T const &element )
|
||||
{
|
||||
LessFunc less;
|
||||
|
||||
// Make sure it's not in the list already
|
||||
for ( int i = 0; i < this->Count(); i++ )
|
||||
{
|
||||
if ( less.HistoryMatch( this->Element(i), element ) )
|
||||
{
|
||||
this->Remove( i );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
CUtlSortVector<T, LessFunc>::Insert( element );
|
||||
|
||||
// Remove the oldest entry if we're over max size
|
||||
if ( this->Count() > maxSize )
|
||||
{
|
||||
this->Remove( this->Count()-1 );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//=============================================================================
|
||||
// Data stored in players for achievement handling
|
||||
struct EntityHistory_t
|
||||
{
|
||||
EHANDLE hEntity;
|
||||
EHANDLE hObject;
|
||||
float flTimeDamage;
|
||||
};
|
||||
|
||||
struct EntityDamageHistory_t : public EntityHistory_t
|
||||
{
|
||||
int nDamageAmount;
|
||||
};
|
||||
|
||||
|
||||
class CEntityHistoryLess
|
||||
{
|
||||
public:
|
||||
bool Less( const EntityHistory_t &dmg1, const EntityHistory_t &dmg2, void *pCtx )
|
||||
{
|
||||
return (dmg1.flTimeDamage > dmg2.flTimeDamage);
|
||||
}
|
||||
bool HistoryMatch( const EntityHistory_t &dmg1, const EntityHistory_t &dmg2 )
|
||||
{
|
||||
return (dmg1.hEntity == dmg2.hEntity);
|
||||
}
|
||||
};
|
||||
|
||||
// Allow duplicate (source) entries with this type; HistoryMatch always returns false
|
||||
class CEntityDamageHistoryLess
|
||||
{
|
||||
public:
|
||||
bool Less( const EntityDamageHistory_t &dmg1, const EntityDamageHistory_t &dmg2, void *pCtx )
|
||||
{
|
||||
return ( dmg2.flTimeDamage < dmg1.flTimeDamage );
|
||||
}
|
||||
bool HistoryMatch( const EntityDamageHistory_t &dmg1, const EntityDamageHistory_t &dmg2 )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// Achievement Tracking container
|
||||
class CAchievementData
|
||||
{
|
||||
public:
|
||||
void ClearHistories( void )
|
||||
{
|
||||
aDamagers.RemoveAll();
|
||||
aDamageEvents.RemoveAll();
|
||||
aTargets.RemoveAll();
|
||||
aSentryDamagers.RemoveAll();
|
||||
aPushers.RemoveAll();
|
||||
}
|
||||
|
||||
void AddDamagerToHistory( EHANDLE hDamager );
|
||||
EntityHistory_t *GetDamagerHistory( int i ) { if (i >= aDamagers.Count()) return NULL; return &aDamagers[i]; }
|
||||
int CountDamagersWithinTime( float flTime );
|
||||
bool IsDamagerInHistory( CBaseEntity *pTarget, float flTimeWindow );
|
||||
void DumpDamagers( void );
|
||||
|
||||
// Capture the last 64 damage events - duplicates allowed
|
||||
void AddDamageEventToHistory( EHANDLE hAttacker, float flDmgAmount = 0.f );
|
||||
EntityDamageHistory_t *GetDamageEventHistory( int i ) { if ( i >= aDamageEvents.Count() ) return NULL; return &aDamageEvents[i]; }
|
||||
int GetDamageEventHistoryCount( void ) { return aDamageEvents.Count(); }
|
||||
bool IsEntityInDamageEventHistory( CBaseEntity *pEntity, float flTimeWindow );
|
||||
int GetAmountForDamagerInEventHistory( CBaseEntity *pEntity, float flTimeWindow );
|
||||
|
||||
void AddTargetToHistory( EHANDLE hTarget );
|
||||
bool IsTargetInHistory( CBaseEntity *pTarget, float flTimeWindow );
|
||||
EntityHistory_t *GetTargetHistory( int i ) { if (i >= aTargets.Count()) return NULL; return &aTargets[i]; }
|
||||
int CountTargetsWithinTime( float flTime );
|
||||
|
||||
void AddSentryDamager( EHANDLE hDamager, EHANDLE hObject );
|
||||
EntityHistory_t *IsSentryDamagerInHistory( CBaseEntity *pDamager, float flTimeWindow );
|
||||
|
||||
void AddPusherToHistory( EHANDLE hPlayer );
|
||||
bool IsPusherInHistory( CBaseEntity *pPlayer, float flTimeWindow );
|
||||
|
||||
private:
|
||||
CHistoryVector< EntityHistory_t, CEntityHistoryLess, MAX_ACHIEVEMENT_HISTORY_SLOTS > aDamagers;
|
||||
CHistoryVector< EntityDamageHistory_t, CEntityDamageHistoryLess, MAX_ACHIEVEMENT_DAMAGE_HISTORY_SLOTS > aDamageEvents; // Duplicates allowed
|
||||
CHistoryVector< EntityHistory_t, CEntityHistoryLess, MAX_ACHIEVEMENT_HISTORY_SLOTS > aTargets;
|
||||
CHistoryVector< EntityHistory_t, CEntityHistoryLess, MAX_ACHIEVEMENT_HISTORY_SLOTS > aSentryDamagers;
|
||||
CHistoryVector< EntityHistory_t, CEntityHistoryLess, MAX_ACHIEVEMENT_HISTORY_SLOTS > aPushers;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user