diff --git a/Facepunch.Steamworks/Interfaces/ISteamMatchmakingServers.cs b/Facepunch.Steamworks/Interfaces/ISteamMatchmakingServers.cs
index 3f555e71..070ee12e 100644
--- a/Facepunch.Steamworks/Interfaces/ISteamMatchmakingServers.cs
+++ b/Facepunch.Steamworks/Interfaces/ISteamMatchmakingServers.cs
@@ -8,6 +8,9 @@ namespace Steamworks
{
internal partial class ISteamMatchmakingServers
{
+ // Cached offset of gameserveritem_t.m_bHadSuccessfulResponse
+ private static int hasSuccessfulResponseOffset;
+
///
/// Read gameserveritem_t.m_bHadSuccessfulResponse without allocating the struct on the heap
///
@@ -21,8 +24,19 @@ internal bool HasServerResponded( HServerListRequest hRequest, int iServer )
// Return false if steam returned null
if ( returnValue == IntPtr.Zero ) return false;
- // first 8 bytes is IPAddress, next 4 bytes is ping, next 1 byte is m_bHadSuccessfulResponse
- return Marshal.ReadByte( IntPtr.Add( returnValue, 12 ) ) == 1;
+ // Cache the offset of m_bHadSuccessfulResponse
+ if ( hasSuccessfulResponseOffset == 0 )
+ {
+ hasSuccessfulResponseOffset = Marshal.OffsetOf( nameof( gameserveritem_t.HadSuccessfulResponse ) ).ToInt32();
+
+ if ( hasSuccessfulResponseOffset == 0 )
+ {
+ throw new Exception( "Failed to get offset of gameserveritem_t.HadSuccessfulResponse" );
+ }
+ }
+
+ // Read byte m_bHadSuccessfulResponse
+ return Marshal.ReadByte( IntPtr.Add( returnValue, hasSuccessfulResponseOffset ) ) == 1;
}
}
}