I am trying to get around and understand how to properly use Steamworks.NET C# wrapper as I want to use it with my discord bot. Now, most of the functions work, which uses normal callback methods. I got into a wall when I was trying to use three methods which have the same callback interface, none of which triggers the callback. So in the ISteamMatchmakinServers
interface, there are 3 methods which I want to use - PlayerDetails, PingServer, ServerRules
to get the response you need to use of these interfaces ISteamMatchmakingPingResponse, ISteamMatchmakingPlayersResponse, ISteamMatchmakingRulesResponse
. In the official Steamworks documentation it states:
You must inherit from the ISteamMatchmakingRulesResponse object to receive this callback.
Callback interface for receiving responses after pinging an individual server.
If you are destructing an object that implements this interface then you should
call CancelServerQuery passing in the handle to the query which is in progress.
Failure to cancel in progress queries when destructing a callback handler may
result in a crash when a callback later occurs.
Now, these interfaces do get triggered if I use Unity with its Mono scripts and put the interface in the OnEnable method where it inherits the methods.
public void OnEnable() {
m_ServerListRequest = HServerListRequest.Invalid;
m_ServerQuery = HServerQuery.Invalid;
m_ServerListResponse = new ISteamMatchmakingServerListResponse(OnServerResponded,
OnServerFailedToRespond, OnRefreshComplete);
m_PingResponse = new ISteamMatchmakingPingResponse(OnServerResponded,
OnServerFailedToRespond);
m_PlayersResponse = new ISteamMatchmakingPlayersResponse(OnAddPlayerToList, OnPlayersFailedToRespond,
OnPlayersRefreshComplete);
m_RulesResponse = new ISteamMatchmakingRulesResponse(OnRulesResponded,
OnRulesFailedToRespond, OnRulesRefreshComplete);
}
Now, the idea is that I need these methods only when a user uses .server
command, so I do the same as above just put the inheritance at the start of the command call. then I trigger the method, get the response, but this time the callbacks are not called so I can't access the information. My code:
public class Commands : ModuleBase {
CSteamID m_Lobby;
private HServerQuery m_ServerQuery;
private ISteamMatchmakingPingResponse m_PingResponse;
private ISteamMatchmakingPlayersResponse m_PlayersResponse;
private ISteamMatchmakingRulesResponse m_RulesResponse;
The method:
[Command("server")]
public async Task Server(int serverNumber)
{
m_ServerListRequest = HServerListRequest.Invalid;
m_ServerQuery = HServerQuery.Invalid;
m_ServerListResponse = new ISteamMatchmakingServerListResponse(OnServerResponded,
OnServerFailedToRespond, OnRefreshComplete);
m_PingResponse = new ISteamMatchmakingPingResponse(OnServerResponded,
OnServerFailedToRespond);
m_PlayersResponse = new ISteamMatchmakingPlayersResponse(OnAddPlayerToList, OnPlayersFailedToRespond,
OnPlayersRefreshComplete);
m_RulesResponse = new ISteamMatchmakingRulesResponse(OnRulesResponded,
OnRulesFailedToRespond, OnRulesRefreshComplete);
if (serverNumber == 422) {
m_Lobby = (CSteamID)90130468311942151;
}
Callbacks are in the command class
private void OnServerResponded(HServerListRequest hRequest, int iServer) {
Debug.Log("OnServerResponded: " + hRequest + " - " + iServer);
}
private void OnServerFailedToRespond(HServerListRequest hRequest, int iServer) {
Debug.Log("OnServerFailedToRespond: " + hRequest + " - " + iServer);
}
private void OnRefreshComplete(HServerListRequest hRequest, EMatchMakingServerResponse response) {
Debug.Log("OnRefreshComplete: " + hRequest + " - " + response);
}
// ISteamMatchmakingPingResponse
private void OnServerResponded(gameserveritem_t gsi) {
Debug.Log("OnServerResponded: " + gsi + "\n" + GameServerItemFormattedString(gsi));
}
private void OnServerFailedToRespond() {
Debug.Log("OnServerFailedToRespond");
}
// ISteamMatchmakingPlayersResponse
private void OnAddPlayerToList(string pchName, int nScore, float flTimePlayed) {
Debug.Log("OnAddPlayerToList: " + pchName + " - " + nScore + " - " + flTimePlayed);
}
private void OnPlayersFailedToRespond() {
Debug.Log("OnPlayersFailedToRespond");
}
private void OnPlayersRefreshComplete() {
Debug.Log("OnPlayersRefreshComplete");
}
// ISteamMatchmakingRulesResponse
private void OnRulesResponded(string pchRule, string pchValue) {
Debug.Log("OnRulesResponded: " + pchRule + " - " + pchValue);
}
private void OnRulesFailedToRespond() {
Debug.Log("OnRulesFailedToRespond");
}
private void OnRulesRefreshComplete() {
Debug.Log("OnRulesRefreshComplete");
}
Made it work by creating another method ran every 50miliseconds which calls SteamAPI.RunCallbacks();
and now callbacks are called properly