# server

```lua
local hasGang = exports['gw-gang']:HasGang(source)
if hasGang then
    print("Le joueur " .. source .. has a gang")
end

```

#### `GetPlayerGang(source)`

Retourne les données complètes du gang d’un joueur ainsi que son ID.

**Retour**

* `table|nil` → données du gang
* `string|nil` → ID du gang

**Exemple**

```lua
local gang, gangId = exports['gw-gang']:GetPlayerGang(source)
if gang then
    print("Gang : " .. gang.name .. " (ID: " .. gangId .. ")")
end
```

***

#### `GetPlayerGangId(source)` → `string|nil`

Retourne uniquement l’ID du gang du joueur.

#### `GetPlayerGangName(source)` → `string|nil`

Retourne uniquement le nom du gang du joueur.

***

#### `GetPlayerHierarchy(source)`

Retourne le niveau de hiérarchie du joueur dans son gang (0–10).

**Retour**

| Type   | Description                              |
| ------ | ---------------------------------------- |
| number | 0 si pas de gang, sinon niveau de 1 à 10 |

**Exemple**

```lua
if exports['gw-gang']:GetPlayerHierarchy(source) >= 7 then
    print("Le joueur est boss ou sous-boss")
end
```

***

#### `HasPermission(source, permission)`

Vérifie si le joueur possède une permission donnée (basée sur sa hiérarchie).

**Paramètres**

| Nom          | Type   | Description                 |
| ------------ | ------ | --------------------------- |
| `permission` | number | Niveau de permission (1–10) |

**Retour** → `boolean`

**Exemple**

```lua
if exports['gw-gang']:HasPermission(source, 5) then
    print("Peut inviter des membres")
end
```

***

#### `GetGangById(gangId)` → `table|nil`

Retourne les données complètes d’un gang à partir de son ID.

#### `GetAllGangs()` → `table`

Retourne une table de tous les gangs (`gangId → gangData`).

#### `GetGangMembers(gangId)` → `table|nil`

Retourne la liste des membres du gang.

#### `GetGangInfluence(gangId)` → `number`

Influence globale du gang (0–100).

#### `GetGangTerritoryCount(gangId)` → `number`

Nombre de territoires contrôlés.

#### `GetGangTerritoryPoints(gangId)` → `number`

Total des points de territoire.

***

#### `AddTerritoryInfluence(source, territoryName, points)` → `boolean`

Ajoute manuellement de l’influence à un territoire.

**Exemple**

```lua
exports['gw-gang']:AddTerritoryInfluence(source, 'grove', 15)
```

***

#### `AddTerritoryInfluenceFromCoords(coords, gangIdOrSource, points)`

Ajoute de l’influence au territoire où se trouvent les coordonnées.

**Paramètres**

| Nom              | Type                 | Description                        |
| ---------------- | -------------------- | ---------------------------------- |
| `coords`         | table/vector3        | {x, y, z} ou vector3               |
| `gangIdOrSource` | string **ou** number | ID du gang **ou** source du joueur |
| `points`         | number               | Points à ajouter (minimum 1)       |

**Retour**

* `boolean` → succès
* `string|nil` → nom du territoire trouvé
* `string|nil` → message d’erreur le cas échéant

**Exemple**

```lua
local success, territory = exports['gw-gang']:AddTerritoryInfluenceFromCoords(
    vector3(100.0, 200.0, 30.0), source, 10
)
if success then
    print("Influence ajoutée dans " .. territory)
end
```

***

#### `GetGangInfluenceInTerritory(territoryName, gangId)` → `number`

Influence d’un gang spécifique dans un territoire donné.

#### `GetTerritoryInfluences(territoryName)` → `table`

Table complète des influences de tous les gangs dans un territoire.

#### `GetCapturedTerritories()` → `table`

Retourne tous les territoires capturés avec leurs propriétaires.

#### `GetAllTerritoryInfluences()` → `table`

Table globale : `territoryName → { gangId = influence }`.

***

### Gestion des gangs

#### `CreateGang(source, name, color)` → `boolean, string|nil`

Crée un nouveau gang.

**Retour**

* `boolean` → succès
* `string|nil` → message d’erreur éventuel

#### `InvitePlayer(source, targetId)` → `boolean`

Envoie une invitation à rejoindre le gang.

#### `KickMember(source, targetIdentifier)` → `boolean`

Expulse un membre (nécessite l’identifier complet).

#### `SyncPlayerGangData(source)`

Force la synchronisation des données gang du joueur côté client.

#### `AreInSameGang(source1, source2)` → `boolean`

Vérifie si deux joueurs sont dans le même gang.

***

### Données de stockage & déblocables

#### `GetGangStorageData(gangId)` → `table|nil`

Retourne les données de coffres, garages, actions, missions, etc.

#### `IsGangActionUnlocked(gangId, actionId)` → `boolean`

Ex : `'cuff'`, `'drag'`, etc.

#### `IsGangMissionUnlocked(gangId, missionId)` → `boolean`

Ex : `'heist_fleeca'`, `'drug_run'`, etc.

#### `NotifyGangMembers(gangId, event, ...)`

Envoie un événement client à tous les membres connectés du gang.

***

### Utilitaires membres

#### `GetGangMember(gangId, identifier)` → `table|nil, number|nil`

Retourne les données du membre + son index dans la liste.

#### `CanManageMember(gangId, managerIdentifier, targetIdentifier)` → `boolean`

Vérifie si un membre peut gérer (promouvoir/rétrograder/expulser) un autre.

***

### Sauvegarde & synchronisation

```lua
exports['gw-gang']:SaveGangs()               -- Force sauvegarde des gangs
exports['gw-gang']:SaveTerritoryInfluences() -- Force sauvegarde des influences
exports['gw-gang']:SyncGangs()               -- Sync tous les gangs vers les clients
exports['gw-gang']:SyncTerritories()         -- Sync tous les territoires
```
