mirror of
https://github.com/Facepunch/Facepunch.Steamworks.git
synced 2025-04-16 14:22:27 +03:00
Leaderboard.GetGlobalEntriesAsync
This commit is contained in:
parent
e5a89b0550
commit
ebcd96326a
@ -29,6 +29,7 @@
|
|||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<WarningLevel>4</WarningLevel>
|
<WarningLevel>4</WarningLevel>
|
||||||
|
<PlatformTarget>x64</PlatformTarget>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
<DebugType>pdbonly</DebugType>
|
<DebugType>pdbonly</DebugType>
|
||||||
|
@ -50,6 +50,31 @@ namespace Steamworks
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public async Task CreateLeaderboard()
|
||||||
|
{
|
||||||
|
var leaderboard = await SteamUserStats.FindOrCreateLeaderboard( "Testleaderboard", Data.LeaderboardSort.Descending, Data.LeaderboardDisplay.Numeric );
|
||||||
|
|
||||||
|
Assert.IsTrue( leaderboard.HasValue );
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestMethod]
|
||||||
|
public async Task FindLeaderboard()
|
||||||
|
{
|
||||||
|
var leaderboard = await SteamUserStats.FindLeaderboard( "Testleaderboard" );
|
||||||
|
Assert.IsTrue( leaderboard.HasValue );
|
||||||
|
|
||||||
|
// Get top 20 global scores
|
||||||
|
var globalsScores = await leaderboard.Value.GetGlobalEntriesAsync( 20 );
|
||||||
|
Assert.IsNotNull( globalsScores );
|
||||||
|
|
||||||
|
foreach ( var e in globalsScores )
|
||||||
|
{
|
||||||
|
Console.WriteLine( $"{e.GlobalRank}: {e.Score} {e.User}" );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -412,13 +412,13 @@ namespace Steamworks
|
|||||||
#region FunctionMeta
|
#region FunctionMeta
|
||||||
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
|
[UnmanagedFunctionPointer( CallingConvention.ThisCall )]
|
||||||
[return: MarshalAs( UnmanagedType.I1 )]
|
[return: MarshalAs( UnmanagedType.I1 )]
|
||||||
private delegate bool GetDownloadedLeaderboardEntryDelegate( IntPtr self, SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, ref LeaderboardEntry_t pLeaderboardEntry, ref int pDetails, int cDetailsMax );
|
private delegate bool GetDownloadedLeaderboardEntryDelegate( IntPtr self, SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, ref LeaderboardEntry_t pLeaderboardEntry, [In,Out] int[] pDetails, int cDetailsMax );
|
||||||
private GetDownloadedLeaderboardEntryDelegate GetDownloadedLeaderboardEntryDelegatePointer;
|
private GetDownloadedLeaderboardEntryDelegate GetDownloadedLeaderboardEntryDelegatePointer;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
internal bool GetDownloadedLeaderboardEntry( SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, ref LeaderboardEntry_t pLeaderboardEntry, ref int pDetails, int cDetailsMax )
|
internal bool GetDownloadedLeaderboardEntry( SteamLeaderboardEntries_t hSteamLeaderboardEntries, int index, ref LeaderboardEntry_t pLeaderboardEntry, [In,Out] int[] pDetails, int cDetailsMax )
|
||||||
{
|
{
|
||||||
return GetDownloadedLeaderboardEntryDelegatePointer( Self, hSteamLeaderboardEntries, index, ref pLeaderboardEntry, ref pDetails, cDetailsMax );
|
return GetDownloadedLeaderboardEntryDelegatePointer( Self, hSteamLeaderboardEntries, index, ref pLeaderboardEntry, pDetails, cDetailsMax );
|
||||||
}
|
}
|
||||||
|
|
||||||
#region FunctionMeta
|
#region FunctionMeta
|
||||||
|
@ -16,6 +16,11 @@ namespace Steamworks
|
|||||||
Id = steamid;
|
Id = steamid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"{Name} ({Id.ToString()})";
|
||||||
|
}
|
||||||
|
|
||||||
public bool IsFriend => Relationship == Relationship.Friend;
|
public bool IsFriend => Relationship == Relationship.Friend;
|
||||||
public bool IsBlocked => Relationship == Relationship.Blocked;
|
public bool IsBlocked => Relationship == Relationship.Blocked;
|
||||||
public bool IsPlayingThisGame => GameInfo?.GameID == SteamUtils.AppId;
|
public bool IsPlayingThisGame => GameInfo?.GameID == SteamUtils.AppId;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@ -9,5 +10,70 @@ namespace Steamworks.Data
|
|||||||
public struct Leaderboard
|
public struct Leaderboard
|
||||||
{
|
{
|
||||||
internal SteamLeaderboard_t Id;
|
internal SteamLeaderboard_t Id;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// the name of a leaderboard
|
||||||
|
/// </summary>
|
||||||
|
public string Name => SteamUserStats.Internal.GetLeaderboardName( Id );
|
||||||
|
public LeaderboardSort Sort => SteamUserStats.Internal.GetLeaderboardSortMethod( Id );
|
||||||
|
public LeaderboardDisplay Display => SteamUserStats.Internal.GetLeaderboardDisplayType( Id );
|
||||||
|
|
||||||
|
static int[] detailsBuffer = new int[64];
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used to query for a sequential range of leaderboard entries by leaderboard Sort.
|
||||||
|
/// </summary>
|
||||||
|
public async Task<LeaderboardEntry[]> GetGlobalEntriesAsync( int count, int offset = 1 )
|
||||||
|
{
|
||||||
|
if ( offset <= 0 ) throw new System.ArgumentException( "Should be 1+", nameof( offset ) );
|
||||||
|
|
||||||
|
var r = await SteamUserStats.Internal.DownloadLeaderboardEntries( Id, LeaderboardDataRequest.Global, offset, offset + count );
|
||||||
|
if ( !r.HasValue )
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return await LeaderboardResultToEntries( r.Value );
|
||||||
|
}
|
||||||
|
|
||||||
|
#region util
|
||||||
|
internal async Task<LeaderboardEntry[]> LeaderboardResultToEntries( LeaderboardScoresDownloaded_t r )
|
||||||
|
{
|
||||||
|
if ( r.CEntryCount == 0 )
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var output = new LeaderboardEntry[r.CEntryCount];
|
||||||
|
var e = default( LeaderboardEntry_t );
|
||||||
|
|
||||||
|
for ( int i = 0; i < r.CEntryCount; i++ )
|
||||||
|
{
|
||||||
|
if ( SteamUserStats.Internal.GetDownloadedLeaderboardEntry( r.SteamLeaderboardEntries, i, ref e, detailsBuffer, detailsBuffer.Length ) )
|
||||||
|
{
|
||||||
|
output[i] = LeaderboardEntry.From( e, detailsBuffer );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await WaitForUserNames( output );
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal async Task WaitForUserNames( LeaderboardEntry[] entries)
|
||||||
|
{
|
||||||
|
bool gotAll = false;
|
||||||
|
while ( !gotAll )
|
||||||
|
{
|
||||||
|
gotAll = true;
|
||||||
|
|
||||||
|
foreach ( var entry in entries )
|
||||||
|
{
|
||||||
|
if ( entry.User.Id == 0 ) continue;
|
||||||
|
if ( !SteamFriends.Internal.RequestUserInformation( entry.User.Id, true ) ) continue;
|
||||||
|
|
||||||
|
gotAll = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.Delay( 1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
31
Facepunch.Steamworks/Structs/LeaderboardEntry.cs
Normal file
31
Facepunch.Steamworks/Structs/LeaderboardEntry.cs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace Steamworks.Data
|
||||||
|
{
|
||||||
|
public struct LeaderboardEntry
|
||||||
|
{
|
||||||
|
public Friend User;
|
||||||
|
public int GlobalRank;
|
||||||
|
public int Score;
|
||||||
|
public int[] Details;
|
||||||
|
// UGCHandle_t m_hUGC
|
||||||
|
|
||||||
|
internal static LeaderboardEntry From( LeaderboardEntry_t e, int[] detailsBuffer )
|
||||||
|
{
|
||||||
|
var r = new LeaderboardEntry
|
||||||
|
{
|
||||||
|
User = new Friend( e.SteamIDUser ),
|
||||||
|
GlobalRank = e.GlobalRank,
|
||||||
|
Score = e.Score,
|
||||||
|
Details = null
|
||||||
|
};
|
||||||
|
|
||||||
|
if ( e.CDetails > 0 )
|
||||||
|
{
|
||||||
|
r.Details = detailsBuffer.Take( e.CDetails ).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -62,6 +62,7 @@ internal class BaseType
|
|||||||
if ( VarName == "psteamIDClans" ) return true;
|
if ( VarName == "psteamIDClans" ) return true;
|
||||||
if ( VarName == "pScoreDetails" ) return true;
|
if ( VarName == "pScoreDetails" ) return true;
|
||||||
if ( VarName == "prgUsers" ) return true;
|
if ( VarName == "prgUsers" ) return true;
|
||||||
|
if ( VarName == "pDetails" ) return true;
|
||||||
if ( NativeType.EndsWith( "**" ) ) return true;
|
if ( NativeType.EndsWith( "**" ) ) return true;
|
||||||
|
|
||||||
if ( NativeType.EndsWith( "*" ) )
|
if ( NativeType.EndsWith( "*" ) )
|
||||||
|
Loading…
x
Reference in New Issue
Block a user