diff --git a/Source.Common/Bitbuffers/bf_read.cs b/Source.Common/Bitbuffers/bf_read.cs index ab18755e4..85d8d58ba 100644 --- a/Source.Common/Bitbuffers/bf_read.cs +++ b/Source.Common/Bitbuffers/bf_read.cs @@ -750,6 +750,8 @@ public uint ReadUBitVar() { public uint ReadUBitLong(uint bits) => ReadUBitLong((int)bits); // macro public uint ReadUBitLong(int bits) { + Assert(bits > 0 && bits <= 32); + if (BitsLeft < bits) { curBit = dataBits; TriggerOverflow(); diff --git a/Source.Engine/DtEncode.cs b/Source.Engine/DtEncode.cs index 35c7aa9c9..bd46ffcb2 100644 --- a/Source.Engine/DtEncode.cs +++ b/Source.Engine/DtEncode.cs @@ -444,6 +444,19 @@ public static void VectorXY_SkipProp(SendProp prop, bf_read p) { } #endregion #region SendPropType.String + static bool AreBitsDifferent(bf_read buf1, bf_read buf2, int bits) { + int dwords = bits >> 5; + bool diff = false; + for (int i = 0; i < dwords; i++) + diff |= buf1.ReadUBitLong(32) != buf2.ReadUBitLong(32); + + int remainingBits = bits - (dwords << 5); + if (remainingBits > 0) + diff |= buf1.ReadUBitLong(remainingBits) != buf2.ReadUBitLong(remainingBits); + + return diff; + } + public static int String_CompareDeltas(SendProp prop, bf_read p1, bf_read p2) { int len1 = (int)p1.ReadUBitLong(Constants.DT_MAX_STRING_BITS); int len2 = (int)p2.ReadUBitLong(Constants.DT_MAX_STRING_BITS); @@ -452,7 +465,7 @@ public static int String_CompareDeltas(SendProp prop, bf_read p1, bf_read p2) { if (len1 == 0) return 0; - return p1.CompareBits(p2, len1 * 8) ? 1 : 0; + return AreBitsDifferent(p1, p2, len1 * 8) ? 1 : 0; } else { p1.SeekRelative(len1 * 8);