private bool DeltaCompressionRead(PhotonView view, Hashtable data)
{
if (data.ContainsKey((byte)1))
{
// we have a full list of data (cause key 1 is used), so return "we have uncompressed all"
return true;
}
// Compression was applied as data[(byte)2] exists (this is the data with some fields being compressed to null)
// now we also need a previous "full" list of values to restore values that are null in this msg
if (view.lastOnSerializeDataReceived == null)
{
return false; // We dont have a full match yet, we cannot work with missing values: skip this message
}
object[] compressedContents = data[(byte)2] as object[];
if (compressedContents == null)
{
// despite expectation, there is no compressed data in this msg. shouldn't happen. just a null check
return false;
}
int[] indexesThatAreChangedToNull = data[(byte)3] as int[];
if (indexesThatAreChangedToNull == null)
{
indexesThatAreChangedToNull = new int[0];
}
object[] lastReceivedData = view.lastOnSerializeDataReceived;
for (int index = 0; index < compressedContents.Length; index++)
{
if (compressedContents[index] == null && !indexesThatAreChangedToNull.Contains(index))
{
// we replace null values in this received msg unless a index is in the "changed to null" list
object lastValue = lastReceivedData[index];
compressedContents[index] = lastValue;
}
}
data[(byte)1] = compressedContents; // compressedContents are now uncompressed...
return true;
}