1. Is it tracking time correctly during a connection and only failing to remember time on re-connect?
2. If 1 is yes, did you do some debugging to ensure your parse() is working correctly to assign the correct day/hour/minute/second values into the variables?
3. You can simplify this by instead using a unix timestamps and deriving the weeks/days/minutes/etc.. See the below plugin I quickly put together.
PHP Code:
#include <amxmodx>
#include <nvault>
new const Version[] = "0.1";
enum PlayerData
{
AuthID[ 35 ],
ConnectTS,
TotalTime
}
new g_pdData[ MAX_PLAYERS + 1 ][ PlayerData ];
new g_Vault;
public plugin_init()
{
register_plugin( "Time Played" , Version , "bugsy" );
g_Vault = nvault_open( "timeVault" );
register_clcmd( "say /time" , "ShowTime" );
}
public plugin_end()
{
nvault_close( g_Vault );
}
public client_authorized( id )
{
new szTime[ 10 ] , iTS;
get_user_authid( id , g_pdData[ id ][ AuthID ] , charsmax( g_pdData[][ AuthID ] ) );
g_pdData[ id ][ ConnectTS ] = get_systime();
g_pdData[ id ][ TotalTime ] = 0;
if ( nvault_lookup( g_Vault , g_pdData[ id ][ AuthID ] , szTime , charsmax( szTime ) , iTS ) )
{
g_pdData[ id ][ TotalTime ] = str_to_num( szTime );
}
}
#if AMXX_VERSION_NUM >= 190
public client_disconnected( id )
#else
public client_disconnect( id )
#endif
{
new szTime[ 10 ] , iTime , iTS;
if ( nvault_lookup( g_Vault , g_pdData[ id ][ AuthID ] , szTime , charsmax( szTime ) , iTS ) )
{
iTime = str_to_num( szTime );
}
num_to_str( ( get_systime() - g_pdData[ id ][ ConnectTS ] ) + iTime , szTime , charsmax( szTime ) );
nvault_set( g_Vault , g_pdData[ id ][ AuthID ] , szTime );
}
public ShowTime( id )
{
new iWeeks , iDays , iHours , iMinutes , iSeconds;
ConvertTimeStamp( g_pdData[ id ][ TotalTime ] + ( get_systime() - g_pdData[ id ][ ConnectTS ] ) , iWeeks , iDays , iHours , iMinutes , iSeconds );
client_print( id , print_chat , "* Time played: %d weeks, %d days, %d hours, %d minutes, %d seconds" , iWeeks , iDays , iHours , iMinutes , iSeconds );
}
ConvertTimeStamp( iTimestamp , &iWeeks , &iDays , &iHours , &iMinutes , &iSeconds )
{
if ( iTimestamp >= 604800 )
{
iWeeks = iTimestamp / 604800;
iTimestamp -= ( iWeeks * 604800 );
}
if ( iTimestamp >= 86400 )
{
iDays = iTimestamp / 86400;
iTimestamp -= ( iDays * 86400 );
}
if ( iTimestamp >= 3600 )
{
iHours = ( iTimestamp / 3600 );
iTimestamp -= ( iHours * 3600 );
}
if ( iTimestamp >= 60 )
{
iMinutes = ( iTimestamp / 60 );
iTimestamp -= ( iMinutes * 60 );
}
iSeconds = iTimestamp;
}