> ## 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.

# الجلسات

> لعبة واحدة: مضيف ولاعبوه ورمز انضمام.

**الجلسة** لعبة واحدة. **يستضيفها** لاعب واحد ويشغل الآخرون **مقاعد** فيها، حتى 16 لاعبًا في المجموع.
يستضيف لاعبٌ جلسة ويقرأ **رمز الانضمام** الخاص بها بصوت عالٍ، أو تصنعها [مطابقة](/ar/guides/matchmaking.md).
واللاعب يشغل مقعدًا واحدًا في كل مرة: استضافة جلسة أخرى أو الانضمام إليها يتخلّى عن المقعد الحالي.
وحين يغادر المضيف، يصبح اللاعب الأقدم جلوسًا هو المضيف.

> [!NOTE]
>
> **النطاق:** الجلسات تخصّ **لعبة** واحدة؛ والمقعد يخصّ لاعبًا.

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

تعرض **اللعب الجماعي ← الجلسات** قائمتَي **الجلسات المباشرة** و**سجل الجلسات**. وتعرض تفاصيل كل
جلسة مضيفها وخانات **تغييرات المضيف** و**الاتصال** و**رمز الانضمام** و**المشاركون**،
و**بيانات اعتماد الوسيط المسحوبة** من لاعبيها. وتضبط **إعدادات اللعب الجماعي** في الصفحة نفسها
عدد المقاعد والمهل والعمر الأقصى؛ راجع [اللعب الجماعي](/ar/guides/multiplayer.md#setting-up).

**Unity**

استضِف جلسة، واعرض رمزها.

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

// 2 to 16 seats (the game's setting when not given), and the game's own data, set once.
FlockMultiplayerSession session = await multiplayer.HostSessionAsync(
    4, new Dictionary<string, object> { ["map"] = "crypt" });
joinCodeLabel.text = session.JoinCode;
```

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

```csharp theme={null}
FlockMultiplayerSession joined = await multiplayer.JoinSessionAsync(typedCode);
joined.TryGetData("map", out string map);
```

تابع الجلسة، وغادرها.

```csharp theme={null}
session.PlayersChanged += () => ShowPlayers(session.Players);   // seated longest first
session.HostChanged += OnHostChanged;   // start the netcode again: see Connecting players
session.Ended += reason => BackToLobby(reason);

await session.LeaveAsync();                // anyone
await session.EndAsync();                  // the host only: ends it for everyone
await session.MakeHostAsync(otherPlayer);  // the host only: hands hosting over
```

بعد إعادة تشغيل اللعبة، اعثر على المقعد الذي ما يزال اللاعب يشغله:

```csharp theme={null}
FlockMultiplayerSession held = await multiplayer.GetMySessionAsync();   // null when seated nowhere
```

وللوصل بين اللاعبين، راجع [اتصال اللاعبين](/ar/guides/connecting-players.md).

**Unreal**

استضِف جلسة، واعرض رمزها. تعمل الأمثلة في Game Instance الخاصة بلعبتك، التي تبقى بعد تغييرات
المستوى التي تجمع اللاعبين.

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

FFlockMultiplayerProvider* Multiplayer = GetSubsystem<UFlockSubsystem>()->GetMultiplayerProvider();

// 2 to 16 seats (the game's setting when unset), the game's own data, set once, and only players on this build.
Multiplayer->HostSession(4, FFlockCommandData().Set(TEXT("map"), TEXT("crypt")), /*bSameVersionOnly*/ true,
    [this](TFlockResult<UFlockMultiplayerSession*> Hosted)
    {
        if (Hosted.IsSuccess())
        {
            Session = Hosted.Value;   // a UPROPERTY
            ShowJoinCode(Session->GetJoinCode());
        }
    });
```

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

```cpp theme={null}
Multiplayer->JoinSession(TypedCode, [this](TFlockResult<UFlockMultiplayerSession*> Joined)
{
    FString Map;
    if (Joined.IsSuccess() && Joined.Value->GetData().TryGetString(TEXT("map"), Map))
    {
        ShowMap(Map);
    }
});
```

تابع الجلسة، وغادرها.

```cpp theme={null}
Session->OnPlayersChanged.AddDynamic(this, &UMyGameInstance::ShowPlayers);   // GetPlayers(): seated longest first
Session->OnHostChanged.AddDynamic(this, &UMyGameInstance::PlayAgain);         // travel again: see Connecting players
Session->OnEnded.AddDynamic(this, &UMyGameInstance::BackToLobby);             // BackToLobby(const FString& Reason)

Session->Leave(nullptr);                     // anyone
Session->End(nullptr);                       // the host only: ends it for everyone
Session->MakeHost(OtherPlayerId, nullptr);   // the host only: hands hosting over
```

بعد إعادة تشغيل اللعبة، اعثر على المقعد الذي ما يزال اللاعب يشغله:

```cpp theme={null}
Multiplayer->GetMySession([this](TFlockResult<UFlockMultiplayerSession*> Held) { /* Held.Value is null when seated nowhere */ });
```

يعيد كل استدعاء `FFlockRequestHandle`، ويوقف `Cancel()` الخاص به الطلب وهو في طريقه. ويُرفض
الاستدعاء على جلسة انتهت (`Validation`) دون إرسال طلب.

وفي Blueprint، الاستدعاءات عقد تحت **Flock | Multiplayer**: **Flock Host Session** و**Flock Join
Session** و**Flock Get Session** (تطلق On Success مع الجلسة، أو On Failure مع الخطأ)، و**Flock Get My
Session** (تطلق On Session أو On No Session أو On Failure)، و**Flock Leave Session** و**Flock End
Session** و**Flock Make Session Host**. وتأخذ Max Players المتروكة على 0 إعداد اللعبة. واربط أحداث
الجلسة **On Players Changed** و**On Host Changed** و**On Ended** على كائن الجلسة.

وللوصل بين اللاعبين، راجع [اتصال اللاعبين](/ar/guides/connecting-players.md).

## إصدارات اللعبة

لا تقبل الجلسة إلا اللاعبين على **إصدار اللعبة** نفسه لدى المضيف، ما لم يمرّر المضيف
`sameVersionOnly: false` (في Unreal: `bSameVersionOnly` بالقيمة false). ويُرفض اللاعب على إصدار آخر بـ
`MultiplayerVersionMismatch`؛ فاطلب منه تحديث اللعبة.

## حين يصمت لاعب

ترسل حزمة التطوير نبضة كل 20 ثانية ما دامت اللعبة تعمل، فلا تنتهي مهلة لاعب يلعب. وهذا ما يحدث حين تتوقف
اللعبة عن العمل (وحين تذكر الخانة اسمين، فالأول اسم Unity والثاني اسم Unreal):

| ما حدث | ما يفعله Flock | ما يراه اللاعبون |
| - | - | - |
| أغلق لاعب اللعبة | يتخلّى عن المقعد فورًا | `PlayersChanged` / `OnPlayersChanged` |
| تعطّلت لعبة لاعب أو انقطعت شبكته | يتخلّى عن المقعد بعد **مهلة المشارك** (90 ثانية) | `PlayersChanged` / `OnPlayersChanged` |
| انتقل هاتف إلى الشاشة الرئيسية | تتوقف اللعبة فتتوقف نبضاتها؛ وبعد **مهلة المشارك** يُتخلّى عن المقعد | عند العودة إلى اللعبة تنتهي الجلسة بـ `dropped` |
| غادر المضيف | يجعل اللاعب الأقدم جلوسًا مضيفًا فورًا | `HostChanged` / `OnHostChanged` |
| تعطّلت لعبة المضيف | يستبدل المضيف بعد **مهلة المضيف** (60 ثانية) | `HostChanged` / `OnHostChanged`، بعد نحو دقيقة |
| أُعيد تشغيل اللعبة قبل انتهاء المهلة | يحتفظ بالمقعد | يجده `GetMySessionAsync` / `GetMySession` |

## حين تنتهي الجلسة

يُطلق `Ended` (‏`OnEnded` في Unreal) مرة واحدة مع السبب. وفي Unity يكون السبب قيمة من
`FlockMultiplayerSessionEndReason`؛ أما في Unreal فهو نصّ يُقارَن بثوابت
`FlockMultiplayerSessionEndReasons`، وهي بالأسماء نفسها (فـ `FlockMultiplayerSessionEndReasons::EndedByHost`
هو `ended_by_host`). وقد يضيف الخادم أسبابًا جديدة، فاحتفظ بحالة افتراضية:

| Unity | Unreal | متى |
| - | - | - |
| `EndedByHost` | `ended_by_host` | أنهاها المضيف. |
| `HostLeft` | `host_left` | غادر المضيف ولم يكن هناك لاعب جالس ليتولّى. |
| `Empty` | `empty` | غادر الجميع. |
| `Expired` | `expired` | بلغت **الحد الأقصى لعمر الجلسة** (4 ساعات افتراضيًا). |
| `Left` | `left` | غادرها اللاعب. |
| `Dropped` | `dropped` | انتهت مهلة مقعد اللاعب. |
| `MovedToAnotherSession` | `moved_to_another_session` | استضاف اللاعب جلسة أخرى أو انضم إليها. |
| `SignedOut` | `signed_out` | سجّل اللاعب خروجه، أو سجّل لاعب آخر دخوله. |

لا يُطلق `Ended` (‏`OnEnded`) عند إغلاق اللعبة.

## الأخطاء

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

| `ErrorCode` | متى | ماذا تفعل |
| - | - | - |
| `MultiplayerInvalidJoinCode` | لا جلسة مفتوحة بهذا الرمز. | اطلب الرمز من المضيف من جديد؛ فالرمز يتوقف عن العمل حين تنتهي جلسته. |
| `MultiplayerSessionFull` | كل المقاعد مشغولة. | انضم إلى جلسة أخرى، أو استضِف جلسة بمقاعد أكثر. |
| `MultiplayerSessionNotFound` | لا جلسة بهذا المعرّف يشغل اللاعب مقعدًا فيها أو شغله، أو تُخلّي عن مقعد اللاعب. | انضم من جديد برمز انضمام الجلسة. |
| `MultiplayerVersionMismatch` | إصدار اللاعب يختلف عن إصدار المضيف. | حدّث اللعبة، أو استضِف بـ `sameVersionOnly: false` (في Unreal: `bSameVersionOnly` بالقيمة false) ليتمكّن أي إصدار من الانضمام. |
| `MultiplayerNotHost` | استدعاء لا يجريه إلا المضيف. | اقرأ الجلسة من جديد لترى من يستضيفها الآن. |
| `MultiplayerTargetNotAParticipant` | لا يشغل هذا اللاعب مقعدًا في الجلسة. | سلّم الاستضافة لأحد لاعبي الجلسة. |


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