방 정보 보기와 입장하기¶
플레이어는 매칭하는 방 목록을 보고 하나를 선택하여 입장할 수 있습니다. 플레이어가 매칭하는 방의 정보를 확인한 후 입장 여부를 결정할 수 있습니다. 예시:
열린 인스턴스 던전 목록에서(방 하나가 던전을 나타냄)
방금 무작위로 입력한 스쿼드의 세부정보(방 하나가 스쿼드 하나를 나타냄)
친구에게 받은 파티 초대장(방 하나가 파티 하나를 나타냄)
방 속성에서 필수 정보를 얻었다고 가정하면 Strix Room
또는 Strix Node Room
스트럭트가 있어야 방이 플레이어에게 방 정보를 보여줍니다. 또, 그것과 약간의 상호작용을 하고 나면 방(또는 방 중의 하나)에 입장해야 합니다. Strix Node Room Info
스트럭트로 방에 직접 입장할 수 있고 안에 있는 방의 Strix Node Room
스트럭트가 있기 때문에 Strix Node Room Info
가 가장 적당합니다.
참고
Strix Node와 Strix Node Room 스트럭트에서 이용할 수 있는 방 속성이 생소하다면 방 속성을 참조하십시오.
방 목록 표시¶
열린 던전 목록을 표시하려면 일반적으로 Search Node Room
함수를 이용하여 알맞은 조건을 부여합니다. Search Node Room
의 성공 콜백은 (Node Rooms
이라는 이벤트 매개변수에) Strix Node Room Info
스트럭트 배열을 리턴하며, 여기서 방 정보를 표시하는 Strix Node Room
스트럭트를 얻거나 그것으로 방에 입장할 수 있습니다.
현재 속해 있는 방 가져오기¶
특정 방을 지정하지 않고 (예를 들면 Join Random Node Room 함수를 통해) 방에 이미 들어왔다면, Get Current Room
함수는 현재 방에 상응하는 Strix Room
스트럭트를 리턴합니다. 이것으로 플레이어에게 방 정보를 제시하면 됩니다.
식별자로 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을 취합니다.
위 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;
}
위 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
라고도 함)가 필요합니다.
위 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());
}
이 Get Current Node Info 함수는 지정된 채널 Id에서 현재 위치해 있는 방의 방 서버의 호스트 이름과 포트 번호, 프로토콜의 정보를 리턴합니다. 이 함수뿐만 아니라 기본 Get Current Room
함수를 이용하여 고유하게 방을 나타내고 파티 초대에 포함될 준비가 되어 있는 쿼드러플을 알 수 있습니다.
또는, 이 쿼드러플을 이용하여 위의 스크립트를 실행하고, 현재 위치해 있는 NodeRoom을 찾아 그 기본 키를 친구들에게 전달해도 됩니다.