방 정보 보기와 입장하기

플레이어는 매칭하는 방 목록을 보고 하나를 선택하여 입장할 수 있습니다. 플레이어가 매칭하는 방의 정보를 확인한 후 입장 여부를 결정할 수 있습니다. 예시:

  • 열린 인스턴스 던전 목록에서(방 하나가 던전을 나타냄)

  • 방금 무작위로 입력한 스쿼드의 세부정보(방 하나가 스쿼드 하나를 나타냄)

  • 친구에게 받은 파티 초대장(방 하나가 파티 하나를 나타냄)

방 속성에서 필수 정보를 얻었다고 가정하면 Strix Room 또는 Strix Node Room 스트럭트가 있어야 방이 플레이어에게 방 정보를 보여줍니다. 또, 그것과 약간의 상호작용을 하고 나면 방(또는 방 중의 하나)에 입장해야 합니다. Strix Node Room Info 스트럭트로 방에 직접 입장할 수 있고 안에 있는 방의 Strix Node Room 스트럭트가 있기 때문에 Strix Node Room Info가 가장 적당합니다.

참고

Strix NodeStrix Node Room 스트럭트에서 이용할 수 있는 방 속성이 생소하다면 방 속성을 참조하십시오.

방 목록 표시

열린 던전 목록을 표시하려면 일반적으로 Search Node Room 함수를 이용하여 알맞은 조건을 부여합니다. Search Node Room의 성공 콜백은 (Node Rooms이라는 이벤트 매개변수에) Strix Node Room Info 스트럭트 배열을 리턴하며, 여기서 방 정보를 표시하는 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++ 코드를 사용해야 합니다.

권장 기법은 세 가지입니다.

  • NodeRoom의 기본 키를 받고 NodeRoom을 찾아 입장합니다.

  • 서버 주소를 받고 방의 기본 키를 찾은 후 NodeRoom을 찾아 입장합니다.

  • 서버 주소와 방의 기본 키를 받은 후 방을 찾아 입장합니다.

기본 키로 NodeRoom 찾기

NodeRoom의 기본 키를 고유 식별자로 받을 경우, 기본 키가 원하는 기본 키와 일치하는 NodeRoom을 찾으면 됩니다. 이를 위해서는 C++로 작성된 헬퍼 함수가 필요합니다.

이 헬퍼 함수는 C++로는 CreateStrixPrimaryKeyEqualsCondition이라고 하고, 블루프린트로는 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 Id, Invited Host, Invited Port, Invited Protocol과 같은 변수를 인풋으로 하고, 끝나면 Strix Node Room Info 스트럭트를 Invited Node Room Info 변수에 넣습니다.

방 id로 방 찾기

방 id와 방 서버 주소로 Strix Node Room Info를 찾기 위해서는 위에서 본 것과 같은 단계가 일부 필요합니다. 그렇게 하면 Strix Room 스트럭트 찾기가 더 쉽습니다.

먼저, 받은 주소로 방 서버에 연결한 후 Search Room을 호출하여 Strix Room 스트럭트를 찾습니다. 이어서 같은 방 서버 연결에서 방 ID를 이용하여 방에 입장하면 됩니다. 이때 위에서 설명한 CreateStrixPrimaryKeyEqualsCondition C++ 함수(primaryKey Field Equals라고도 함)가 필요합니다.

Finding a room by its ID and server identity

위 Blueprint 스크립트는 Invited Room Id, Invited Host, Invited Port, Invited Protocol과 같은 변수를 인풋으로 하고, 끝나면 Strix Room 스트럭트를 Invited Room 변수에 넣습니다.

현재 위치해 있는 방 서버 찾기

한편, 방 서버가 여러 개인 클러스터에서, 예컨대 CreateNodeRoom으로 방을 만든 후에 현재 위치해 있는 방 서버의 주소는 어떻게 알 수 있을까요?

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 함수를 이용하여 고유하게 방을 나타내고 파티 초대에 포함될 준비가 되어 있는 쿼드러플을 알 수 있습니다.

또는, 이 쿼드러플을 이용하여 위의 스크립트를 실행하고, 현재 위치해 있는 NodeRoom을 찾아 그 기본 키를 친구들에게 전달해도 됩니다.