7.21. 応用機能 - コミュニティ機能
注意:

コミュニティ機能はインターネットマッチメイクでのみ有効です。

コミュニティ機能では NEX の永続ギャザリング機能を使用して、コミュニティの構築、検索、参加、更新、破棄、離脱を行える機能を提供します。

セッションの構築時や検索時にコミュニティ ID を指定することで、同じコミュニティの参加者同士でマッチメイクをすることができます。

本機能を使用する場合はこのページの他に、「NEX マニュアル」 - 「サーバーサービス」 - 「4. マッチメイク」の永続ギャザリングの項目の説明も参照してください。

コミュニティ ID とコミュニティコードについて

参考:

コミュニティ ID とコミュニティコードはそれぞれ NEX の永続ギャザリング ID と永続ギャザリングコードと同一です。

コミュニティの操作を行う際には、コミュニティ ID を使用することになりますが、ユーザーインターフェース上に表示を行う場合はコミュニティコードに変換する必要があります。

ConvertCommunityIdToCommunityCode(), ConvertCommunityCodeToCommunityId() を用いて変換を行います。

コミュニティの構築

コミュニティの構築を行います。次の項目を設定できます。

項目名 概要
最大参加人数 コミュニティに参加できる最大人数
説明文字列 アプリケーションが設定する任意の文字列
アプリケーションデータ アプリケーションが自由に利用できるデータ
募集開始日時 参加可能となる日時
募集終了日時 参加締切となる日時
パスワード 参加の際に必要となるパスワード

一人のプレイヤーが構築可能なコミュニティは 4 件までになります。それを超えるとエラーが返ります。

構築したプレイヤーはコミュニティのオーナーかつ参加者となります。

ただし、公式コミュニティを作成した場合はオーナーのプリンシパル ID は特別なものとなり、構築したプレイヤーからもコミュニティの破棄が行えなくなります。

公式コミュニティを破棄する場合は NMAS からの操作で行う必要があります。その他公式コミュニティに関する注意点に関しては

「NEX マニュアル」 - 「サーバーサービス」 - 「4. マッチメイク」の永続ギャザリングの項目の公式永続ギャザリングに関して記載されている箇所を参照してください。

// 構築するコミュニティの設定
nn::pia::inet::NexCreateCommunitySetting communitySetting;
nn::pia::common::DateTime startDateTime(2015, 12, 25, 0, 0, 0);
communitySetting.SetParticipationStartDate(startDateTime);

nn::pia::common::DateTime endDateTime(2017, 12, 25, 12, 34, 56);
communitySetting.SetParticipationEndDate(endDateTime);

communitySetting.SetCommunityUserPassword(SAMPLE_STRING("password"));
communitySetting.SetDescription(SAMPLE_STRING("description"));

// コミュニティの構築
result = nn::pia::session::Session::GetInstance()->CreateCommunityAsync(&communitySetting);
if (result.IsFailure())
{
    // エラーハンドリング
}

// 非同期処理の完了を待つ
if (nn::pia::session::Session::GetInstance()->IsCreateCommunityCompleted())
{
    result = nn::pia::session::Session::GetInstance()->GetCreateCommunityResult();
    if (result.IsFailure())
    {
        // エラーハンドリング
    }
}

コミュニティの検索

コミュニティの検索方法は 4 種類あり、検索条件に合わせて適切なクラスを使用して検索する必要があります。

クラス名  
inet::NexCommunitySearchCriteriaCommunityId 指定したコミュニティ ID のリストで検索します。
inet::NexCommunitySearchCriteriaOfficial 公式コミュニティを検索します。
inet::NexCommunitySearchCriteriaParticipant 指定したプレイヤーが参加しているコミュニティを検索します。指定したプレイヤーが自分をブラックリストに登録している場合は空の結果になります。
inet::NexCommunitySearchCriteriaOwner 指定したプレイヤーがオーナーとなっているコミュニティを検索します。

検索した結果は、GetBrowsedCommunityInfoList() で取得できます。

 nn::pia::session::CommunitySearchCriteria* pSearchCriteria;
// コミュニティ ID で検索を行う場合
const uint32_t communityArraySize = 4;
uint64_t communityCodeArray[communityArraySize] = {
    67654326919276, 66743798181857, 6910603522364, 33371891371514};
uint32_t communityIdArray[communityArraySize];
for (uint32_t i = 0;i < communityArraySize;++i)
{
    communityIdArray[i] = nn::pia::session::Session::GetInstance()->ConvertCommunityCodeToCommunityId(communityCodeArray[i]);
}
nn::pia::inet::NexCommunitySearchCriteriaCommunityId searchCriteriaCommunityId(communityIdArray, communityArraySize);
pSearchCriteria = &searchCriteriaCommunityId;

// 公式コミュニティを検索する場合
nn::pia::inet::NexCommunitySearchCriteriaOfficial searchCriteriaOfficial(true, 0, 16);
pSearchCriteria = &searchCriteriaOfficial;

// 指定したプレイヤーが参加しているコミュニティを検索する場合
nn::pia::inet::NexCommunitySearchCriteriaParticipant searchCriteriaParticipant(localPrincipalId, 0, 16);
pSearchCriteria = &searchCriteriaParticipant;

// 指定したプレイヤーがオーナーのコミュニティを検索する場合
nn::pia::inet::NexCommunitySearchCriteriaOwner searchCriteriaOwner(localPrincipalId, 0, 16);
pSearchCriteria = &searchCriteriaOwner;

// 指定された検索条件でコミュニティを検索
result = nn::pia::session::Session::GetInstance()->BrowseCommunityAsync(pSearchCriteria);
if (result.IsFailure())
{
    // エラーハンドリング
}
// 非同期処理待ち
if (nn::pia::session::Session::GetInstance()->IsBrowseCommunityCompleted())
{
    result = nn::pia::session::Session::GetInstance()->GetBrowseCommunityResult();
    if (result.IsFailure())
    {
        // エラーハンドリング
    }
    // 検索結果の取得
    nn::pia::session::ICommunityInfoList* communityList = nn::pia::session::Session::GetInstance()->GetBrowsedCommunityInfoList();
    uint32_t foundCommunityNum = communityList->GetSize()
}

コミュニティへの参加

コミュニティへの参加は、コミュニティ ID を指定して行います。

一人のプレイヤーが参加可能なコミュニティは 16 件までになります。それを超えていた場合エラーが返されます。

 // 参加するコミュニティの設定
nn::pia::inet::NexJoinCommunitySetting joinCommunitySetting;
joinCommunitySetting.SetCommunityId(targetCommunityInfo->GetCommunityId());
// パスワードが設定されている場合、パスワードを指定する
if (targetCommunityInfo->IsRestrictedByPassword())
{
    joinCommunitySetting.SetCommunityUserPassword(SAMPLE_STRING("password"));
}
// コミュニティへ参加
result = nn::pia::session::Session::GetInstance()->JoinCommunityAsync(&joinCommunitySetting);
if (result.IsFailure())
{
    // エラーハンドリング
}
// 非同期処理待ち
if (nn::pia::session::Session::GetInstance()->IsJoinCommunityCompleted())
{
    result = nn::pia::session::Session::GetInstance()->GetJoinCommunityResult();
    if (result.IsFailure())
    {
        // エラーハンドリング
    }
}

コミュニティの更新

コミュニティのオーナーである場合、コミュニティの設定を更新できます。

nn::pia::inet::NexUpdateCommunitySetting に更新するコミュニティ ID と更新後の設定を指定し、nn::pia::session::Session::UpdateCommunityAsync() で更新を行います。

注意:

コミュニティの更新は一括して行われるため、変更しない項目についても値を指定する必要があります。

注意:

自分がオーナーではないコミュニティの設定を更新できません。また、公式コミュニティの設定を更新することもできません。

注意:

ユーザーパスワードがかかっていないコミュニティに対して、ユーザーパスワードを設定することはできません。

nn::pia::inet::NexUpdateCommunitySetting communitySetting;

// 更新するコミュニティIDをセット
communitySetting.SetCommunityId(targetCommunityInfo->GetCommunityId());

//
// 更新しない項目は現在の値をセット
//

// 参加人数
communitySetting.SetMinParticipantNum(targetCommunityInfo->GetMinParticipantNum());
communitySetting.SetMaxParticipantNum(targetCommunityInfo->GetMaxParticipantNum());

// 属性
uint32_t attributes[nn::pia::inet::AttributeSizeMax];
for (uint32_t i = 0; i < nn::pia::inet::AttributeSizeMax; ++i)
{
    targetCommunityInfo->GetAttribute(i, &attributes[i]);
}
communitySetting.SetAttributes(attributes);

//
// 更新する項目をセット
//

// 参加日時
nn::pia::common::DateTime startDateTime(2017, 4, 25, 0, 0, 0);
nn::pia::common::DateTime endDateTime(2017, 6, 25, 12, 34, 56);
communitySetting.SetParticipationStartDate(startDateTime);
communitySetting.SetParticipationEndDate(endDateTime);

// ユーザーパスワードが設定されている場合のみパスワードは更新可能
if (targetCommunityInfo->IsRestrictedByPassword())
{
    communitySetting.SetCommunityUserPassword(SAMPLE_STRING("password2"));
}

// 説明文字列
communitySetting.SetDescription(SAMPLE_STRING("description2"));

nn::pia::Result result = nn::pia::session::Session::GetInstance()->UpdateCommunityAsync(&communitySetting);
if (result.IsFailure())
{
    // エラーハンドリング
}

// 非同期処理待ち
if (nn::pia::session::Session::GetInstance()->IsUpdateCommunityCompleted())
{
    result = nn::pia::session::Session::GetInstance()->GetUpdateCommunityResult();
    if (result.IsFailure())
    {
        // エラーハンドリング
    }
}

コミュニティからの離脱

コミュニティからの離脱は、コミュニティ ID を指定して行います。

コミュニティが破棄された場合を除き、自動的にコミュニティから離脱させられることはありません。

// 指定したコミュニティ ID から離脱します
result = nn::pia::session::Session::GetInstance()->LeaveCommunityAsync(targetCommunityInfo->GetCommunityId());
if (result.IsFailure())
{
    // エラーハンドリング
}

// 非同期処理待ち
if (nn::pia::session::Session::GetInstance()->IsLeaveCommunityCompleted())
{
    result = nn::pia::session::Session::GetInstance()->GetLeaveCommunityResult();
    if (result.IsFailure())
    {
        // エラーハンドリング
    }
}

コミュニティの破棄

自身がオーナーであるコミュニティを破棄できます。オーナー以外に参加者がいる場合でも破棄は可能で、その際にはコミュニティの参加者は離脱したことになります。

コミュニティの参加者が 0 人になった場合、自動的にコミュニティは破棄されます。それ以外の理由でコミュニティが自動的に破棄されることはありません。

 // 自身がオーナーであるコミュニティであれば破棄できる
if (targetCommunityInfo->GetOwnerPrincipalId() == localPrincipalId)
{
    result = nn::pia::session::Session::GetInstance()->DestroyCommunityAsync(targetCommunityInfo->GetCommunityId());
    if (result.IsFailure())
    {
        // エラーハンドリング
    }
}
// 非同期処理待ち
if (nn::pia::session::Session::GetInstance()->IsDestroyCommunityCompleted())
{
    result = nn::pia::session::Session::GetInstance()->GetDestroyCommunityResult();
    if (result.IsFailure())
    {
        // エラーハンドリング
    }
}