diff --git a/userraw/maps/mp/gametypes/_persistence.gsc b/userraw/maps/mp/gametypes/_persistence.gsc new file mode 100644 index 0000000..417073b --- /dev/null +++ b/userraw/maps/mp/gametypes/_persistence.gsc @@ -0,0 +1,237 @@ +#include maps\mp\_utility; + +init() +{ + level.persistentDataInfo = []; + + maps\mp\gametypes\_class::init(); + maps\mp\gametypes\_rank::init(); + maps\mp\gametypes\_missions::init(); + maps\mp\gametypes\_playercards::init(); + + level thread updateBufferedStats(); +} + + +initBufferedStats() +{ + self.bufferedStats = []; + self.bufferedStats[ "totalShots" ] = self getPlayerData( "totalShots" ); + self.bufferedStats[ "accuracy" ] = self getPlayerData( "accuracy" ); + self.bufferedStats[ "misses" ] = self getPlayerData( "misses" ); + self.bufferedStats[ "hits" ] = self getPlayerData( "hits" ); + self.bufferedStats[ "timePlayedAllies" ] = self getPlayerData( "timePlayedAllies" ); + self.bufferedStats[ "timePlayedOpfor" ] = self getPlayerData( "timePlayedOpfor" ); + self.bufferedStats[ "timePlayedOther" ] = self getPlayerData( "timePlayedOther" ); + self.bufferedStats[ "timePlayedTotal" ] = self getPlayerData( "timePlayedTotal" ); + + self.bufferedChildStats = []; + self.bufferedChildStats[ "round" ] = []; + self.bufferedChildStats[ "round" ][ "timePlayed" ] = self getPlayerData( "round", "timePlayed" ); +} + + + +// ========================================== +// Script persistent data functions +// These are made for convenience, so persistent data can be tracked by strings. +// They make use of code functions which are prototyped below. + +/* +============= +statGet + +Returns the value of the named stat +============= +*/ +statGet( dataName ) +{ + assert( !isDefined( self.bufferedStats[ dataName ] ) ); // should use statGetBuffered consistently with statSetBuffered + return self GetPlayerData( dataName ); +} + +/* +============= +statSet + +Sets the value of the named stat +============= +*/ +statSet( dataName, value ) +{ + assert( !isDefined( self.bufferedStats[ dataName ] ) ); // should use statGetBuffered consistently with statSetBuffered + + if ( !self rankingEnabled() ) + return; + + self SetPlayerData( dataName, value ); +} + +/* +============= +statAdd + +Adds the passed value to the value of the named stat +============= +*/ +statAdd( dataName, value ) +{ + assert( !isDefined( self.bufferedStats[ dataName ] ) ); // should use statGetBuffered consistently with statSetBuffered + + if ( !self rankingEnabled() ) + return; + + curValue = self GetPlayerData( dataName ); + self SetPlayerData( dataName, value + curValue ); +} + + +statGetChild( parent, child ) +{ + return self GetPlayerData( parent, child ); +} + + +statSetChild( parent, child, value ) +{ + if ( !self rankingEnabled() ) + return; + + self SetPlayerData( parent, child, value ); +} + + +statAddChild( parent, child, value ) +{ + assert( isDefined( self.bufferedChildStats[ parent ][ child ] ) ); + + if ( !self rankingEnabled() ) + return; + + curValue = self GetPlayerData( parent, child ); + self SetPlayerData( parent, child, curValue + value ); +} + + +statGetChildBuffered( parent, child ) +{ + assert( isDefined( self.bufferedChildStats[ parent ][ child ] ) ); + + return self.bufferedChildStats[ parent ][ child ]; +} + + +statSetChildBuffered( parent, child, value ) +{ + assert( isDefined( self.bufferedChildStats[ parent ][ child ] ) ); + + if ( !self rankingEnabled() ) + return; + + self.bufferedChildStats[ parent ][ child ] = value; +} + + +statAddChildBuffered( parent, child, value ) +{ + assert( isDefined( self.bufferedChildStats[ parent ][ child ] ) ); + + if ( !self rankingEnabled() ) + return; + + curValue = statGetChildBuffered( parent, child ); + statSetChildBuffered( parent, child, curValue + value ); +} + + +/* +============= +statGetBuffered + +Returns the value of the named stat +============= +*/ +statGetBuffered( dataName ) +{ + assert( isDefined( self.bufferedStats[ dataName ] ) ); + + return self.bufferedStats[ dataName ]; +} + +/* +============= +statSet + +Sets the value of the named stat +============= +*/ +statSetBuffered( dataName, value ) +{ + assert( isDefined( self.bufferedStats[ dataName ] ) ); + + if ( !self rankingEnabled() ) + return; + + self.bufferedStats[ dataName ] = value; +} + +/* +============= +statAdd + +Adds the passed value to the value of the named stat +============= +*/ +statAddBuffered( dataName, value ) +{ + assert( isDefined( self.bufferedStats[ dataName ] ) ); + + if ( !self rankingEnabled() ) + return; + + curValue = statGetBuffered( dataName ); + statSetBuffered( dataName, curValue + value ); +} + + +updateBufferedStats() +{ + // give the first player time to connect + wait ( 0.15 ); + + nextToUpdate = 0; + while ( !level.gameEnded ) + { + nextToUpdate++; + if ( nextToUpdate >= level.players.size ) + nextToUpdate = 0; + + if ( isDefined( level.players[nextToUpdate] ) ) + level.players[nextToUpdate] writeBufferedStats(); + + wait ( 2.0 ); + } + + foreach ( player in level.players ) + player writeBufferedStats(); +} + + +writeBufferedStats() +{ + if (getDvarInt("developer_script")) + return; + + foreach ( statName, statVal in self.bufferedStats ) + { + self setPlayerData( statName, statVal ); + } + + foreach ( statName, statVal in self.bufferedChildStats ) + { + foreach ( childStatName, childStatVal in statVal ) + self setPlayerData( statName, childStatName, childStatVal ); + } +} + + diff --git a/z_dev.bat b/z_dev.bat index ff4fb9e..5d00e26 100644 --- a/z_dev.bat +++ b/z_dev.bat @@ -1 +1 @@ -start "" "%~dp0iw4x.exe" -nosteam -dump -console -scriptablehttp +set sv_lanonly "1" +set r_fullscreen "0" +set fs_game "mods/dev" +set developer "1" +set developer_script "1" +set cg_drawfps "4" +set cg_drawsnapshot "1" +set thereisacow "1" +set sv_cheats "1" +set bots_manage_add "8" +set drawlagometer "1" +set scr_game_spectatetype "2" +set r_mode "1024x768" +devmap mp_rust \ No newline at end of file +start "" "%~dp0iw4x.exe" -nosteam -dump -console -scriptablehttp +set sv_lanonly "1" +set r_fullscreen "0" +set fs_game "mods/dev" +set developer "1" +set developer_script "1" +set cg_drawfps "4" +set cg_drawsnapshot "1" +set thereisacow "1" +set sv_cheats "1" +set bots_manage_add "0" +set drawlagometer "1" +set scr_game_spectatetype "2" +set r_mode "1024x768" +devmap mp_rust \ No newline at end of file