ルーム情報を表示して参加する方法

マッチング用のルームの情報を一覧表示し、一つを選択して参加するという処理が必要になることがあります。似た例として、マッチング用ルームの情報を確認した上でそこに参加するかどうかを判断するということもあります。例えば次のような場合が考えられます。

  • 募集中のインスタンスダンジョンの一覧(ルームはダンジョンを表します)

  • ランダムに編成され参加したスクワッドの情報(ルームはスクワッドを表します)

  • フレンドから届いたパーティーへの勧誘(ルームはパーティーを表します)

求める情報がルームプロパティから取得できると仮定すれば、ルーム情報を表示するためには、そのルームのStrix Room構造体かStrix Node Room構造体が必要になります。また、プレイヤーとの対話の後でそのルーム (あるいは、一覧の中の一つのルーム) に参加することになるでしょう。その場合はStrix Node Room Info構造体が便利です。なぜなら、Strix Node Room Info構造体があればルームに直接参加できる上、その内部にはStrix Node Room構造体が含まれているからです。

注釈

Strix Node構造体やStrix Node Room構造体で利用できるルームプロパティについてよく分からない場合は、ルームプロパティをご覧ください。

ルームの一覧を表示する

募集中のダンジョンの一覧を表示する際には、通常、適切な条件を指定した上でSearch Node Room関数を用いることになります。Search Node Room関数の成功コールバックからはStrix Node Room Info構造体の配列が(Node Roomsという名前のイベントパラメーターを通じて)得られますが、そこからStrix Node Room構造体を取得できます。

Showing a list of rooms after a search

今いるルームを取得する

すでにルームに参加しているが特定のルームを参照したわけではない (例えば、Join Random Node Room関数を使用した) 場合には、Get Current Room関数が現在のルームに対応するStrix Room構造体を返します。これを用いてルーム情報を表示することができます。

Get Current Room function

識別情報を用いてNodeRoomを取得する

他のプレイヤーに特定のルームに参加するように誘う(または指示する)通常の方法は、ルームの一意識別情報を渡すことです。識別情報としてはNodeRoomの主キー (primaryKeyプロパティ、つまり、Strix Node Room構造体のIdメンバー変数) を使用できます。その代わりに、ルームの主キー (primaryKeyプロパティ、つまり、Strix Room構造体のIdメンバー変数) をルームサーバーの識別情報と組み合わせて使用することもできます。ルームの主キーは、NodeRoomのルームID (roomIdプロパティ、つまり、Strix Node Room構造体のRoomIdメンバー変数と同じです。

注釈

ルームのprimaryKeyプロパティは単一のルームサーバー内では一意的ですが、他のルームサーバーには同一のprimaryKeyを持つ別のルームが存在する可能性があります。複数のルームサーバーを使用する(または、将来使用する可能性がある)のであれば、ルームを一意的に識別するためには、ルームの主キーとルームサーバーの識別情報を組み合わせる必要があります。

識別情報を受け取ったクライアントがルーム情報を表示し、その後そのルームに参加するためには、その識別情報に対応するStrix Node Room Info構造体を見つける必要があります。これを行うにはC++コードの使用が必要です。

具体的には3通りの手法があります。

  • NodeRoomの主キーを受け取り、NodeRoomを見つけて参加する。

  • サーバーのアドレスとルームの主キーを受け取り、NodeRoomを見つけて参加する。

  • サーバーのアドレスとルームの主キーを受け取り、ルームを見つけて参加する。

主キーからNodeRoomを得る

NodeRoomの主キーを一意識別情報として受け取る場合、指定された主キーと一致する主キーを持つNodeRoomを検索することができますが、そのためにはC++で書いたヘルパー関数が必要になります。

このヘルパー関数は、C++ではCreateStrixPrimaryKeyEqualsCondition、BlueprintではprimaryKey Field Equalsという名前になりますが、これは次の通りです。

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "StrixBlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"

UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

    UFUNCTION(BlueprintPure, Category = "MyBPLibrary|Adapter", meta = (DisplayName = "primaryKey Field Equals"))
    static FStrixCondition CreateStrixPrimaryKeyEqualsCondition(int32 primaryKeyValue);
};
#include "MyBlueprintFunctionLibrary.h"
#include <strix/net/object/ObjectAdapter.h>
#include <strix/client/core/model/manager/filter/builder/ConditionBuilder.h>

using namespace strix::net::object;
using namespace strix::client::core::model::manager::filter::builder;

FStrixCondition UMyBlueprintFunctionLibrary::CreateStrixPrimaryKeyEqualsCondition(int32 primaryKeyValue)
{
    FStrixCondition condition(ConditionBuilder::Builder()
        ->Field("primaryKey")->EqualTo(ObjectAdapter((int64)primaryKeyValue))
        ->Build());
    return condition;
}

これを用いると、以下のBlueprintスクリプトによって目的のNodeRoomを取得できます。

Finding a NodeRoom by its primaryKey

上記のBlueprintスクリプトは、Invited Node Room Idを入力として用い、成功するとルームのStrix Node Room Info構造体をInvited Node Room Infoに格納します。

ルームIDからNodeRoomを得る

ルームID (ルームの主キー) とルームサーバーのアドレス (ホスト名、ポート番号、プロトコル) の組み合わせを受け取る場合、roomIdを使ってNodeRoomを検索し一覧を入手した後で、その中から目的のルームサーバー上にあるものを探すことができます。(異なるルームサーバー上に、同じroomIdを持つNodeRoomがあるかもしれないということを思い出してください。)これを行うにはC++で書いた別のヘルパー関数が必要になります。

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "StrixBlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"

UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

    UFUNCTION(BlueprintPure, Category = "MyBPLibrary|Adapter", meta = (DisplayName = "roomId Field Equals"))
    static FStrixCondition CreateStrixRoomIdEqualsCondition(int32 roomId);
};
#include "MyBlueprintFunctionLibrary.h"
#include <strix/net/object/ObjectAdapter.h>
#include <strix/client/core/model/manager/filter/builder/ConditionBuilder.h>

using namespace strix::net::object;
using namespace strix::client::core::model::manager::filter::builder;

FStrixCondition UMyBlueprintFunctionLibrary::CreateStrixRoomIdEqualsCondition(int32 roomId)
{
    FStrixCondition condition(ConditionBuilder::Builder()
        ->Field("roomId")->EqualTo(ObjectAdapter((int64)roomId))
        ->Build());
    return condition;
}
Finding a NodeRoom by its roomId and server identity Find Matching Node Room Info function

上記のBlueprintスクリプトは、Invited Room IdInvited HostInvited PortInvited Protocolを入力として用い、成功するとルームのStrix Node Room Info構造体をInvited Node Room Infoに格納します。

ルームIDからルームを得る

上で見たように、ルームIDとルームサーバーのアドレスからStrix Node Room Info構造体を見つけるには少々手間がかかります。それよりもStrix Room構造体を見つける方が簡単です。

まず、受け取ったアドレスを用いてルームサーバーに接続してから、Search Roomを呼び出してStrix Room構造体を取得します。その後、同じルームサーバー接続上でルームIDを使用すれば目的のルームに参加できます。上で説明したC++関数CreateStrixPrimaryKeyEqualsCondition (primaryKey Field Equals) が必要になります。

Finding a room by its ID and server identity

上記のBlueprintスクリプトは、Invited Room Idと、Invited HostInvited PortInvited Protocolを入力として用い、成功するとルームのStrix Room構造体をInvited Roomに格納します。

今いるルームサーバーを得る

ところで、複数のルームサーバーのあるクラスターで、例えばCreate Node Roomでルームを作成した場合、どうすれば今いるルームサーバーが分かるのでしょうか?

Blueprintスクリプトでこの情報を得るのは容易ではありませんが、次のC++の関数を使えば取得できます。

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "StrixBlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"

UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

    UFUNCTION(BlueprintCallable, Category = "MyBPLibrary", meta = (WorldContext = "WorldContextObject"))
    static void GetCurrentNodeInfo(const UObject* WorldContextObject, int channelId,
        FString& host, int32& port, FString& protocol);
};
#include "MyBlueprintFunctionLibrary.h"

#include <strix/net/channel/Protocol.h>
#include <strix/client/ingame/network/RoomServerConnection.h>

void UMyBlueprintFunctionLibrary::GetCurrentNodeInfo(const UObject* WorldContextObject,
    int channelId,
    FString& host, int32& port, FString& protocol)
{
    UStrixNetworkFacade* strixNetworkFacade = UStrixNetworkFacade::GetInstance(WorldContextObject);
    if (!strixNetworkFacade) return;

    auto roomContext = strixNetworkFacade->GetRoomContextByChannelId(channelId);
    if (!roomContext) return;

    auto roomConnection = roomContext->GetConnection().lock();
    if (!roomConnection) return;

    host = FString(UTF8_TO_TCHAR(roomConnection->GetHost().c_str()));
    port = roomConnection->GetPortNumber();
    protocol = FString(strix::net::channel::ProtocolStringConverter::ToString(roomConnection->GetProtocol()).c_str());
}
A helper function to get room server identity

このGet Current Node Info関数は、指定したチャネルIDで現在参加しているルームのあるルームサーバーの、ホスト名、ポート番号、プロトコルを返します。この関数とGet Current Room関数を一緒に使うと、そのルームを一意に識別し、パーティーの勧誘に使える4つ組を得ることができます。

別のやり方として、その4つ組を使って上記のスクリプトを実行し、現在のルームのNodeRoomを取得して、その主キーをフレンドに渡してもいいでしょう。