// Byte serialization, written by Marco. Class ExtPlayerStat extends Object implements(ExtSaveDataBase); var int ArVersion,SaveNum; var transient int BufferOffset,BufferSize; var transient array EOFStack; var array Buffer; var array StrMap; const CurrentSaveVer=1; final function bool LoadStatFile( PlayerController Other ) { local string S; FlushData(); S = class'ServerExtMut'.Static.GetStatFile(Other.PlayerReplicationInfo.UniqueId); if( Class'Engine'.Static.BasicLoadObject(Self,S,false,CurrentSaveVer) ) { BufferSize = Buffer.Length; return true; } BufferSize = 0; Buffer.Length = 0; return false; } final function SaveStatFile( PlayerController Other ) { local string S; S = class'ServerExtMut'.Static.GetStatFile(Other.PlayerReplicationInfo.UniqueId); Class'Engine'.Static.BasicSaveObject(Self,S,false,CurrentSaveVer); } function SaveInt( int Value, optional byte MaxVal ) { ++MaxVal; if( (BufferOffset+MaxVal)>Buffer.Length ) { Buffer.Length = (BufferOffset+MaxVal); BufferSize = Buffer.Length; } Buffer[BufferOffset++] = Value & 255; if( MaxVal>1 ) { Buffer[BufferOffset++] = (Value >> 8) & 255; if( MaxVal>2 ) { Buffer[BufferOffset++] = (Value >> 16) & 255; if( MaxVal>3 ) Buffer[BufferOffset++] = (Value >> 24) & 255; } } } function int ReadInt( optional byte MaxVal ) { local int Res; ++MaxVal; if( (BufferOffset+MaxVal)>BufferSize ) return 0; Res = Buffer[BufferOffset++]; if( MaxVal>1 ) { Res = Res | (Buffer[BufferOffset++] << 8); if( MaxVal>2 ) { Res = Res | (Buffer[BufferOffset++] << 16); if( MaxVal>3 ) Res = Res | (Buffer[BufferOffset++] << 24); } } return Res; } function SaveStr( string S ) { local int i; if( S=="" ) { SaveInt(0,1); return; } S = Left(S,255); i = StrMap.Find(S); if( i==-1 ) { i = StrMap.Length; StrMap[StrMap.Length] = S; } SaveInt((i+1),1); } function string ReadStr() { local int i; i = ReadInt(1); if( i==0 || i>StrMap.Length ) return ""; return StrMap[i-1]; } function int TellOffset() { return BufferOffset; } function SeekOffset( int Offset ) { BufferOffset = Clamp(Offset,0,BufferSize); } function int TotalSize() { return BufferSize; } function ToEnd() { BufferOffset = BufferSize; } function ToStart() { BufferOffset = 0; } function bool AtEnd() { return (BufferOffset>=BufferSize); } function SkipBytes( int Count ) { BufferOffset = Clamp(BufferOffset+Count,0,BufferSize); } function FlushData() { ArVersion = 0; SaveNum = 0; BufferOffset = 0; BufferSize = 0; Buffer.Length = 0; EOFStack.Length = 0; StrMap.Length = 0; } final function DebugData() { local string S,SS; local array B; local int i; GetData(B); `Log("DEBUG DATA: Data size: "$B.Length); for( i=0; i Res ) { local int i,l,o,j; Res = Buffer; Res.Insert(0,1); Res[0] = ArVersion; // Add string map to start. // Write string map length. Res.Insert(1,2); l = StrMap.Length; Res[1] = l & 255; Res[2] = (l >> 8) & 255; o = 3; // write each entry. for( i=0; i S ) { local int i,o,l,j; ArVersion = S[0]; Buffer = S; // read string map length. StrMap.Length = Buffer[1] | (Buffer[2] << 8); o = 3; // read each string map entry. for( i=0; i