> ## Documentation Index
> Fetch the complete documentation index at: https://docs.qwacks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# الفرق

> أصدقاء يبقون معًا من لعبة إلى أخرى.

**الفريق** مجموعة أصدقاء يلعبون معًا: قائد واحد وحتى 63 لاعبًا آخر. ويبقى الفريق قائمًا حتى يغادره
لاعبوه، عبر الألعاب ومرات التشغيل، فيلعب الأصدقاء مباراة بعد أخرى دون أن يدعو بعضهم بعضًا من جديد.
وينضم الأصدقاء بـ **رمز الدعوة** الخاص بالفريق. واللاعب في فريق واحد في كل مرة.

> [!NOTE]
>
> **النطاق:** الفرق تخصّ لاعبيها، داخل **لعبة** واحدة.

**لوحة التحكم**

لا شيء تحتاج إلى إعداده. ويظهر الفريق الذي يبحث عن مطابقة في **اللعب الجماعي ← نشاط المطابقة**
مدخلًا واحدًا مع عدد لاعبيه.

**Unity**

اقرأ الفريق بعد تسجيل الدخول: فقد يكون اللاعب ما يزال في فريق من المرة السابقة.

```csharp theme={null}
FlockMultiplayerProvider multiplayer = FlockClient.Instance.Multiplayer;

// The party from last time, or a new one: 2 to 64 players, 4 when not given.
FlockParty party = await multiplayer.GetMyPartyAsync()
    ?? await multiplayer.CreatePartyAsync(4, new Dictionary<string, object> { ["mode"] = "coop" });
inviteCodeLabel.text = party.InviteCode;

party.MembersChanged += () => ShowMembers(party.Members);   // in the order they joined
party.LeaderChanged += () => leaderControls.SetActive(party.IsLeader);
party.Ended += reason => ShowMainMenu(reason);
```

تنضم لعبة الصديق بالرمز؛ ولا يهمّ حجم الأحرف.

```csharp theme={null}
FlockParty joined = await multiplayer.JoinPartyAsync(typedCode);
if (joined.TryGetSetting("mode", out string mode))
    ShowMode(mode);
```

يدير القائد الفريق، ويستطيع أي لاعب مغادرته.

```csharp theme={null}
await party.UpdateAsync(settings: new Dictionary<string, object> { ["mode"] = "hard" });   // replaces all settings
await party.KickAsync(playerId);
await party.MakeLeaderAsync(playerId);
await party.DisbandAsync();

await party.LeaveAsync();   // when the leader leaves, the first of the others leads
```

يبحث `party.FindMatchAsync` باسم الفريق؛ راجع [المطابقة](/ar/guides/matchmaking.md).

**Unreal**

اقرأ الفريق بعد تسجيل الدخول: فقد يكون اللاعب ما يزال في فريق من المرة السابقة. تعمل الأمثلة في
Game Instance الخاصة بلعبتك؛ وكل الاستدعاءات على `UFlockSubsystem::GetMultiplayerProvider()`، وتُجرى
من خيط اللعبة.

```cpp theme={null}
#include "FlockSubsystem.h"
#include "Multiplayer/FlockParty.h"

// The party from last time, or a new one: 2 to 64 players, 4 when unset.
GetSubsystem<UFlockSubsystem>()->GetMultiplayerProvider()->GetMyParty([this](TFlockResult<UFlockParty*> Mine)
{
    if (!Mine.IsSuccess())
    {
        UE_LOG(LogTemp, Warning, TEXT("%s"), *Mine.Error.ToDisplayText());   // what went wrong, then its fix
    }
    else if (Mine.Value != nullptr)
    {
        HoldParty(Mine.Value);
    }
    else
    {
        GetSubsystem<UFlockSubsystem>()->GetMultiplayerProvider()->CreateParty(4,
            FFlockCommandData().Set(TEXT("mode"), TEXT("coop")),
            [this](TFlockResult<UFlockParty*> Made) { if (Made.IsSuccess()) { HoldParty(Made.Value); } });
    }
});

void UMyGameInstance::HoldParty(UFlockParty* InParty)
{
    Party = InParty;   // a UPROPERTY
    ShowInviteCode(Party->GetInviteCode());
    Party->OnMembersChanged.AddDynamic(this, &UMyGameInstance::ShowMembers);         // GetMembers(): in the order they joined
    Party->OnLeaderChanged.AddDynamic(this, &UMyGameInstance::ShowLeaderControls);   // IsLeader()
    Party->OnEnded.AddDynamic(this, &UMyGameInstance::ShowMainMenu);                 // ShowMainMenu(EFlockPartyEndReason Reason)
}
```

تنضم لعبة الصديق بالرمز؛ ولا يهمّ حجم الأحرف.

```cpp theme={null}
GetSubsystem<UFlockSubsystem>()->GetMultiplayerProvider()->JoinParty(TypedCode, [this](TFlockResult<UFlockParty*> Joined)
{
    FString Mode;
    if (Joined.IsSuccess() && Joined.Value->GetSettings().TryGetString(TEXT("mode"), Mode))
    {
        ShowMode(Mode);
    }
});
```

يدير القائد الفريق، ويستطيع أي لاعب مغادرته. ويكتمل كل استدعاء بالفريق كما صار بعده.

```cpp theme={null}
Party->Update(TOptional<int32>(), FFlockCommandData().Set(TEXT("mode"), TEXT("hard")), nullptr);   // replaces all settings
Party->Kick(PlayerId, nullptr);
Party->MakeLeader(PlayerId, nullptr);
Party->Disband(nullptr);

Party->Leave(nullptr);   // when the leader leaves, the first of the others leads
```

يعيد كل استدعاء `FFlockRequestHandle`، ويوقف `Cancel()` الخاص به الطلب وهو في طريقه. ويُرفض
الاستدعاء على فريق انتهى (`Validation`) دون إرسال طلب. ويبحث `Party->FindMatch` باسم الفريق؛ راجع
[المطابقة](/ar/guides/matchmaking.md).

وفي Blueprint، الاستدعاءات عقد تحت **Flock | Multiplayer**: **Flock Create Party** و**Flock Join
Party** (يطلقان On Success مع الفريق، أو On Failure مع الخطأ)، و**Flock Get My Party** (يطلق On
Party أو On No Party أو On Failure)، و**Flock Leave Party** و**Flock Kick From Party** و**Flock Make
Party Leader** و**Flock Update Party** و**Flock Disband Party**. واربط أحداث الفريق **On Members
Changed** و**On Leader Changed** و**On Ended** على كائن الفريق.

## إبقاء الفريق محدّثًا

تقرأ حزمة التطوير الفريق كل **Party Refresh Seconds** (10 افتراضيًا) وبعد كل تغيير تجريه لعبتك، ويطلق
`MembersChanged` و`LeaderChanged` (‏`OnMembersChanged` و`OnLeaderChanged` في Unreal) عند حدوث تغيير.
ويصل تغيير لاعب آخر إلى لعبتك مع القراءة التالية. وهذه القراءات لا تُحتسب مدفوعة؛ راجع
[اللعب الجماعي](/ar/guides/multiplayer.md#what-counts-as-an-api-call).

## حين ينتهي الفريق

يُطلق `Ended` (‏`OnEnded` في Unreal) مرة واحدة مع سبب: قيمة من `FlockPartyEndReason` في Unity، ومن
`EFlockPartyEndReason` في Unreal، بالأسماء نفسها.

| السبب | متى |
| - | - |
| `Left` | غادر اللاعب الفريق بـ `LeaveAsync` (في Unreal: `Leave`). |
| `Disbanded` | حلّ اللاعب الفريق. |
| `Removed` | لم يعد الخادم يُدرج اللاعب: أخرجه القائد، أو حلّ غيره الفريق، أو غادر اللاعب من جهاز آخر. |
| `SignedOut` | سجّل اللاعب خروجه، أو سجّل لاعب آخر دخوله. وما يزال اللاعب في الفريق على الخادم، فيجده تسجيل الدخول التالي من جديد. |

استدعِ `LeaveAsync` (في Unreal: `Leave`) قبل تسجيل الخروج إن كان اللاعب يقصد المغادرة.

## الأخطاء

كل رمز قيمة من `FlockErrorCode` في Unity ومن `EFlockErrorCode` في Unreal بالاسم نفسه، ويحمل الخطأ
تلميحًا يسمّي الإصلاح.

| `ErrorCode` | متى | ماذا تفعل |
| - | - | - |
| `PartyInvalidInviteCode` | لا فريق مفتوح بهذا الرمز. | اطلب من القائد الرمز الحالي. |
| `PartyFull` | لا مكان في الفريق، أو الحجم الجديد أقل من عدد اللاعبين فيه. | انضم إلى فريق آخر، أو ليرفع القائد الحجم. |
| `PartyAlreadyInParty` | اللاعب في فريق آخر. | اقرأه (`GetMyPartyAsync`، أو `GetMyParty` في Unreal) وغادره أولًا. |
| `PartyNotPartyLeader` | استدعاء لا يجريه إلا القائد. | اقرأ الفريق من جديد لترى من يقوده الآن. |
| `PartyCannotKickLeader` | حاول القائد إخراج نفسه. | سلّم القيادة للاعب آخر ثم غادر، أو حلّ الفريق. |
| `PartyTargetNotAMember` | هذا اللاعب ليس في الفريق. | اختر لاعبًا من أعضاء الفريق. |
| `PartyNotFound` | لم يعد الفريق موجودًا لهذا اللاعب: حُلّ، أو أُخرج اللاعب منه. | تُنهي حزمة التطوير الفريق بـ `Removed`؛ اقرأ فريق اللاعب من جديد. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.