mirror of
https://github.com/alliedmodders/amxmodx.git
synced 2024-12-25 06:15:37 +03:00
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:
parent
6865b984e0
commit
b3e61b1d75
@ -85,6 +85,7 @@ void CPlayer::PutInServer(){
|
|||||||
restartStats();
|
restartStats();
|
||||||
const char* name = STRING(pEdict->v.netname);
|
const char* name = STRING(pEdict->v.netname);
|
||||||
const char* unique = name;
|
const char* unique = name;
|
||||||
|
bool isip = false;
|
||||||
switch((int)csstats_rank->value) {
|
switch((int)csstats_rank->value) {
|
||||||
case 1:
|
case 1:
|
||||||
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
||||||
@ -92,13 +93,23 @@ void CPlayer::PutInServer(){
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
unique = ip;
|
unique = ip;
|
||||||
|
isip = true;
|
||||||
}
|
}
|
||||||
rank = g_rank.findEntryInRank( unique , name );
|
rank = g_rank.findEntryInRank( unique , name , isip);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayer::Connect(const char* address ){
|
void CPlayer::Connect(const char* address ){
|
||||||
bot = IsBot();
|
bot = IsBot();
|
||||||
strcpy(ip,address);
|
strcpy(ip,address);
|
||||||
|
// Strip the port from the ip
|
||||||
|
for (size_t i = 0; i < sizeof(ip); i++)
|
||||||
|
{
|
||||||
|
if (ip[i] == ':')
|
||||||
|
{
|
||||||
|
ip[i] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
rank = 0;
|
rank = 0;
|
||||||
clearStats = 0.0f;
|
clearStats = 0.0f;
|
||||||
}
|
}
|
||||||
|
@ -146,16 +146,50 @@ void RankSystem::unloadCalc()
|
|||||||
MF_UnloadAmxScript(&calc.amx , &calc.code);
|
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;
|
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.
|
||||||
if ( strcmp( a->getUnique() ,unique ) == 0 )
|
|
||||||
return a;
|
|
||||||
|
|
||||||
a = a->prev;
|
// 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
|
||||||
|
{
|
||||||
|
while ( a )
|
||||||
|
{
|
||||||
|
if ( strcmp( a->getUnique() ,unique ) == 0 )
|
||||||
|
return a;
|
||||||
|
|
||||||
|
a = a->prev;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
a = new RankStats( unique ,name,this );
|
a = new RankStats( unique ,name,this );
|
||||||
if ( a == 0 ) return 0;
|
if ( a == 0 ) return 0;
|
||||||
|
@ -98,7 +98,7 @@ public:
|
|||||||
|
|
||||||
void saveRank( const char* filename );
|
void saveRank( const char* filename );
|
||||||
void loadRank( 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);
|
bool loadCalc(const char* filename, char* error);
|
||||||
inline int getRankNum( ) const { return rankNum; }
|
inline int getRankNum( ) const { return rankNum; }
|
||||||
void clear();
|
void clear();
|
||||||
|
@ -77,6 +77,7 @@ void CPlayer::PutInServer(){
|
|||||||
|
|
||||||
const char* unique;
|
const char* unique;
|
||||||
const char* name = STRING(pEdict->v.netname);
|
const char* name = STRING(pEdict->v.netname);
|
||||||
|
bool isip = false;
|
||||||
switch((int)dodstats_rank->value) {
|
switch((int)dodstats_rank->value) {
|
||||||
case 1:
|
case 1:
|
||||||
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
||||||
@ -84,17 +85,27 @@ void CPlayer::PutInServer(){
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
unique = ip;
|
unique = ip;
|
||||||
|
isip = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
unique = name;
|
unique = name;
|
||||||
}
|
}
|
||||||
if ( ( rank = g_rank.findEntryInRank( unique , name ) ) == 0 )
|
if ( ( rank = g_rank.findEntryInRank( unique , name , isip) ) == 0 )
|
||||||
ingame = false;
|
ingame = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CPlayer::Connect(const char* nn,const char* ippp ){
|
void CPlayer::Connect(const char* nn,const char* ippp ){
|
||||||
bot = IsBot();
|
bot = IsBot();
|
||||||
strcpy(ip,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)
|
void CPlayer::restartStats(bool all)
|
||||||
|
@ -163,16 +163,50 @@ void RankSystem::unloadCalc()
|
|||||||
MF_UnloadAmxScript(&calc.amx , &calc.code);
|
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;
|
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.
|
||||||
if ( strcmp( a->getUnique() ,unique ) == 0 )
|
|
||||||
return a;
|
|
||||||
|
|
||||||
a = a->prev;
|
// 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
|
||||||
|
{
|
||||||
|
while ( a )
|
||||||
|
{
|
||||||
|
if ( strcmp( a->getUnique() ,unique ) == 0 )
|
||||||
|
return a;
|
||||||
|
|
||||||
|
a = a->prev;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
a = new RankStats( unique ,name,this );
|
a = new RankStats( unique ,name,this );
|
||||||
if ( a == 0 ) return 0;
|
if ( a == 0 ) return 0;
|
||||||
|
@ -120,7 +120,7 @@ public:
|
|||||||
|
|
||||||
void saveRank( const char* filename );
|
void saveRank( const char* filename );
|
||||||
void loadRank( 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);
|
bool loadCalc(const char* filename, char* error);
|
||||||
inline int getRankNum( ) const { return rankNum; }
|
inline int getRankNum( ) const { return rankNum; }
|
||||||
void clear();
|
void clear();
|
||||||
|
@ -113,6 +113,7 @@ void CPlayer::PutInServer(){
|
|||||||
|
|
||||||
const char* name = STRING(pEdict->v.netname);
|
const char* name = STRING(pEdict->v.netname);
|
||||||
const char* unique = name;
|
const char* unique = name;
|
||||||
|
bool isip = false;
|
||||||
switch((int)tfcstats_rank->value) {
|
switch((int)tfcstats_rank->value) {
|
||||||
case 1:
|
case 1:
|
||||||
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
||||||
@ -120,12 +121,22 @@ void CPlayer::PutInServer(){
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
unique = ip;
|
unique = ip;
|
||||||
|
isip = true;
|
||||||
}
|
}
|
||||||
rank = g_rank.findEntryInRank( unique , name );
|
rank = g_rank.findEntryInRank( unique , name , isip);
|
||||||
}
|
}
|
||||||
void CPlayer::Connect(const char* address ){
|
void CPlayer::Connect(const char* address ){
|
||||||
bot = IsBot();
|
bot = IsBot();
|
||||||
strcpy(ip,address);
|
strcpy(ip,address);
|
||||||
|
// Strip the port from the ip
|
||||||
|
for (size_t i = 0; i < sizeof(ip); i++)
|
||||||
|
{
|
||||||
|
if (ip[i] == ':')
|
||||||
|
{
|
||||||
|
ip[i] = '\0';
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
rank = 0;
|
rank = 0;
|
||||||
clearStats = 0.0f;
|
clearStats = 0.0f;
|
||||||
}
|
}
|
||||||
|
@ -161,16 +161,50 @@ void RankSystem::unloadCalc()
|
|||||||
MF_UnloadAmxScript(&calc.amx , &calc.code);
|
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;
|
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.
|
||||||
if ( strcmp( a->getUnique() ,unique ) == 0 )
|
|
||||||
return a;
|
|
||||||
|
|
||||||
a = a->prev;
|
// 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
|
||||||
|
{
|
||||||
|
while ( a )
|
||||||
|
{
|
||||||
|
if ( strcmp( a->getUnique() ,unique ) == 0 )
|
||||||
|
return a;
|
||||||
|
|
||||||
|
a = a->prev;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
a = new RankStats( unique ,name,this );
|
a = new RankStats( unique ,name,this );
|
||||||
if ( a == 0 ) return 0;
|
if ( a == 0 ) return 0;
|
||||||
|
@ -89,7 +89,7 @@ public:
|
|||||||
|
|
||||||
void saveRank( const char* filename );
|
void saveRank( const char* filename );
|
||||||
void loadRank( 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);
|
bool loadCalc(const char* filename, char* error);
|
||||||
inline int getRankNum( ) const { return rankNum; }
|
inline int getRankNum( ) const { return rankNum; }
|
||||||
void clear();
|
void clear();
|
||||||
|
@ -62,6 +62,7 @@ void CPlayer::PutInServer()
|
|||||||
|
|
||||||
const char* unique;
|
const char* unique;
|
||||||
const char* name = STRING(pEdict->v.netname);
|
const char* name = STRING(pEdict->v.netname);
|
||||||
|
bool isip = false;
|
||||||
switch((int)tsstats_rank->value) {
|
switch((int)tsstats_rank->value) {
|
||||||
case 1:
|
case 1:
|
||||||
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
if ( (unique = GETPLAYERAUTHID(pEdict)) == 0 )
|
||||||
@ -69,16 +70,27 @@ void CPlayer::PutInServer()
|
|||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
unique = ip;
|
unique = ip;
|
||||||
|
isip = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
unique = name;
|
unique = name;
|
||||||
}
|
}
|
||||||
if ( ( rank = g_rank.findEntryInRank( unique , name ) ) == 0 )
|
if ( ( rank = g_rank.findEntryInRank( unique , name , isip) ) == 0 )
|
||||||
ingame = false;
|
ingame = false;
|
||||||
}
|
}
|
||||||
void CPlayer::Connect(const char* ippp)
|
void CPlayer::Connect(const char* ippp)
|
||||||
{
|
{
|
||||||
strcpy(ip,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)
|
void CPlayer::restartStats(bool all)
|
||||||
|
@ -161,16 +161,50 @@ void RankSystem::unloadCalc()
|
|||||||
MF_UnloadAmxScript(&calc.amx , &calc.code);
|
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;
|
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.
|
||||||
if ( strcmp( a->getUnique() ,unique ) == 0 )
|
|
||||||
return a;
|
|
||||||
|
|
||||||
a = a->prev;
|
// 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
|
||||||
|
{
|
||||||
|
while ( a )
|
||||||
|
{
|
||||||
|
if ( strcmp( a->getUnique() ,unique ) == 0 )
|
||||||
|
return a;
|
||||||
|
|
||||||
|
a = a->prev;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
a = new RankStats( unique ,name,this );
|
a = new RankStats( unique ,name,this );
|
||||||
if ( a == 0 ) return 0;
|
if ( a == 0 ) return 0;
|
||||||
|
@ -89,7 +89,7 @@ public:
|
|||||||
|
|
||||||
void saveRank( const char* filename );
|
void saveRank( const char* filename );
|
||||||
void loadRank( 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);
|
bool loadCalc(const char* filename, char* error);
|
||||||
inline int getRankNum( ) const { return rankNum; }
|
inline int getRankNum( ) const { return rankNum; }
|
||||||
void clear();
|
void clear();
|
||||||
|
Loading…
Reference in New Issue
Block a user