Fix for amb108 - statsx keeping port when saving stats by ip - this should still allow for old stats files to work, but there is a small chance for idiosyncrasies if there are multiple users with the same ip (but different port) saved.

This commit is contained in:
Steve Dudenhoeffer
2007-06-22 15:35:46 +00:00
parent 6865b984e0
commit b3e61b1d75
12 changed files with 209 additions and 28 deletions

View File

@ -62,6 +62,7 @@ void CPlayer::PutInServer()
const char* unique;
const char* name = STRING(pEdict->v.netname);
bool isip = false;
switch((int)tsstats_rank->value) {
case 1:
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
@ -69,16 +70,27 @@ void CPlayer::PutInServer()
break;
case 2:
unique = ip;
isip = true;
break;
default:
unique = name;
}
if ( ( rank = g_rank.findEntryInRank( unique , name ) ) == 0 )
if ( ( rank = g_rank.findEntryInRank( unique , name , isip) ) == 0 )
ingame = false;
}
void CPlayer::Connect(const char* ippp)
{
strcpy(ip,ippp);
// Strip the port from the ip
for (size_t i = 0; i < sizeof(ip); i++)
{
if (ip[i] == ':')
{
ip[i] = '\0';
break;
}
}
}
void CPlayer::restartStats(bool all)

View File

@ -161,16 +161,50 @@ void RankSystem::unloadCalc()
MF_UnloadAmxScript(&calc.amx , &calc.code);
}
RankSystem::RankStats* RankSystem::findEntryInRank(const char* unique, const char* name )
RankSystem::RankStats* RankSystem::findEntryInRank(const char* unique, const char* name, bool isip)
{
RankStats* a = head;
while ( a )
if (isip) // IP lookups need to strip the port from already saved instances.
{ // Otherwise the stats file would be essentially reset.
// The IP passed does not contain the port any more for unique
size_t iplen = strlen(unique);
while ( a )
{
const char* targetUnique = a->getUnique();
if ( strncmp( targetUnique, unique, iplen) == 0 )
{
// It mostly matches, make sure this isn't a false match
// eg: checking 4.2.2.2 would match 4.2.2.24 here.
// Get the next character stored in targetUnique
char c = targetUnique[iplen];
// If c is either a colon or end of line, then this
// is a valid match.
if (c == ':' ||
c == '\0')
{
// Yes, this is a match.
return a;
}
// Any other case was a false match.
}
}
}
else // No special case
{
if ( strcmp( a->getUnique() ,unique ) == 0 )
return a;
while ( a )
{
if ( strcmp( a->getUnique() ,unique ) == 0 )
return a;
a = a->prev;
a = a->prev;
}
}
a = new RankStats( unique ,name,this );
if ( a == 0 ) return 0;

View File

@ -89,7 +89,7 @@ public:
void saveRank( const char* filename );
void loadRank( const char* filename );
RankStats* findEntryInRank(const char* unique, const char* name );
RankStats* findEntryInRank(const char* unique, const char* name , bool isip = false );
bool loadCalc(const char* filename, char* error);
inline int getRankNum( ) const { return rankNum; }
void clear();