# Konfiguracja

Ustawienia opisane na tej stronie znajdują się w `config.lua`. Zmieniaj pola w istniejących tabelach i uruchom zasób ponownie, aby zastosować zmiany.

## Wartości początkowe i zapisane ustawienia

Sklepy i reguły progresji w pliku służą jako konfiguracja początkowa. Po zapisaniu ich z panelu administracyjnego obowiązujące wartości są zachowywane między uruchomieniami. Zmiana w pliku nie zastępuje automatycznie zapisanych ustawień: użyj panelu, aby zaktualizować już zainicjowane sklepy, reguły i opcje systemu.

Język, providery, bridge'e, kamera i strój podglądu są konfigurowane w pliku. Źródła i tatuaże opisano w sekcji [katalog i pakiety](https://docs.cxgstudios.com/docs/pl/01-cxg-tattoos/04-catalogo.md).

## Język globalny

```lua
Config.Locale = 'es'
Config.LocaleFallback = 'en'
```

`Locale` ustawia język interfejsu i komunikatów dla wszystkich graczy. Po zmianie uruchom zasób ponownie; gracz nie zmieni tego ustawienia w NUI. `LocaleFallback` określa język zapasowy.

Dostępne języki: `en`, `es`, `pt-BR`, `fr`, `de`, `it`, `pl`, `ru`, `tr`, `th` i `ar`. Interfejs arabski używa kierunku pisma od prawej do lewej.

## System tożsamości

`Config.Identity` konfiguruje integrację z systemem tożsamości serwera. Określa sposób pobierania identyfikatora postaci lub konta, którego zasób używa do zapisu i odczytu tatuaży, XP oraz blueprintów.

```lua
Config.Identity.mode = 'auto'
Config.Identity.qbxResource = 'qbx_core'
```

| Tryb | Zastosowanie |
| --- | --- |
| `auto` | W Qbox używa identyfikatora aktywnej postaci (`citizenid`). Na innych serwerach używa stałego identyfikatora FiveM. |
| `qbx_character` | Jawnie używa identyfikatora postaci Qbox (`citizenid`). |
| `license` | Używa licencji FiveM jako identyfikatora konta. Postacie na tym koncie współdzielą tatuaże, XP i blueprinty. |

Wybierz tryb, zanim udostępnisz zasób graczom. Późniejsza zmiana zmieni tożsamość używaną do wyszukiwania danych; dane nie zostaną automatycznie przeniesione między trybami. Nie wybieraj `license`, jeśli tatuaże mają być oddzielne dla postaci na jednym koncie.

## Powiadomienie o interakcji

```lua
Config.HelpText.enabled = true
Config.HelpText.provider = 'auto'
Config.HelpText.position = 'left-center'
```

| Pole | Wartości lub działanie |
| --- | --- |
| `enabled` | Pokazuje lub ukrywa powiadomienie o interakcji ze sklepami wyposażonymi w marker. |
| `provider` | `auto`, `ox_lib` lub `native`. `auto` używa TextUI, jeśli jest dostępne, a w przeciwnym razie powiadomienia natywnego. |
| `position` | `left-center`, `right-center`, `top-center` lub `bottom-center` dla TextUI. |
| `style` | Kolory, obramowanie, cień, krój pisma i odstępy TextUI. |

Przykład stylu:

```lua
Config.HelpText.style.backgroundColor = '#172328'
Config.HelpText.style.color = '#eef3f3'
Config.HelpText.style.fontSize = '15px'
```

## Sklepy początkowe

`Config.Shops` zawiera sześć lokalizacji. Aby zmienić początkowy wpis, zachowaj jego strukturę:

```lua
{
    label = 'Tattoo Studio',
    coords = vector3(322.62, 180.34, 103.59),
    heading = 156.2,
    drawDistance = 10.0,
    interactDistance = 1.5,
    shopRadius = 4.0,
    marker = {
        type = 1,
        scale = vector3(1.0, 1.0, 1.0),
        color = { r = 255, g = 100, b = 0, a = 100 },
    },
},
```

| Pole | Zastosowanie |
| --- | --- |
| `label` | Nazwa sklepu. |
| `coords`, `heading` | Pozycja i kierunek. |
| `drawDistance` | Odległość wyświetlania markera. |
| `interactDistance` | Odległość interakcji. |
| `shopRadius` | Promień, w którym dozwolone jest korzystanie ze sklepu. |
| `marker.type`, `scale`, `color` | Wygląd markera. |

Ustaw `interactDistance` w granicach `shopRadius`. W przypadku istniejących sklepów użyj sekcji sklepów w panelu administracyjnym; edycja pliku nie tworzy ponownie ani nie zastępuje tych sklepów.

## Poziomy i XP

| Ustawienie `Config.Levels` | Wartość początkowa | Zastosowanie |
| --- | --- | --- |
| `enabled` | `true` | Włącza progresję, wymagania i zniżki. |
| `maxLevel` | `10` | Limit poziomu. |
| `defaultXpPerTattoo` | `10` | XP za tatuaż bez pola `Xp`. |
| `thresholds` | Poziomy od 1 do 10 | Łączna ilość XP wymagana dla każdego poziomu. |
| `formula.base`, `formula.exponent` | `100`, `1.5` | Parametry alternatywnego wzoru progów. |
| `zoneRequirements` | `1` dla każdej strefy | Wymagany poziom dla strefy, gdy nie ustawiono wymagania dla konkretnego tatuażu. |
| `discounts` | Włączone, `3` na poziom, maks. `25` | Zniżka procentowa. |
| `blueprintSlots` | Podstawa `5`, przyrost `3` | Liczba slotów blueprintów zależna od poziomu. |

Progi muszą zaczynać się od poziomu 1 z 0 XP, następować bez przerw i zwiększać wymagane XP:

```lua
Config.Levels.thresholds = {
    { level = 1, xpRequired = 0 },
    { level = 2, xpRequired = 100 },
    { level = 3, xpRequired = 250 },
}
Config.Levels.maxLevel = 3
```

Zniżka jest obliczana jako `poziom × perLevel`, z ograniczeniem `maxDiscount`. Przy wartościach początkowych poziom 5 daje zniżkę 15%, a maksymalna zniżka wynosi 25%.

Liczbę slotów oblicza się jako `base + (poziom - 1) × perLevel`. Przy początkowej konfiguracji poziom 1 ma 5 slotów, a poziom 5 — 17.

Indywidualne `RequiredLevel` z katalogu ma pierwszeństwo przed wymaganiem strefy. Zobacz [pola katalogu](https://docs.cxgstudios.com/docs/pl/01-cxg-tattoos/04-catalogo.md).

Po wyłączeniu poziomów nie obowiązują blokady poziomów, XP ani zniżki; limit blueprintów korzysta z `Config.Blueprints.maxPerPlayer`. Wyłączenie systemu zachowuje zapisane XP. W już zainicjowanych instalacjach zaktualizuj także stan obowiązujący w panelu.

## Blueprinty

Blueprinty zapisują grupy tatuaży i pozwalają udostępniać je za pomocą kodów. Początkowe limity znajdują się w `Config.Blueprints`:

| Pole | Wartość początkowa | Zastosowanie |
| --- | --- | --- |
| `enabled` | `true` | Włącza system. |
| `codePrefix` | `INK` | Prefiks kodów, np. `INK-A3X9`. |
| `codeLength` | `4` | Liczba znaków po prefiksie. |
| `maxPerPlayer` | `20` | Liczba slotów używana, gdy progresja jest wyłączona. |
| `maxTattoosPerBlueprint` | `50` | Maksymalna liczba tatuaży w grupie. |
| `nameMaxLength` | `60` | Maksymalna długość nazwy. |

Wykorzystanie kodu przygotowuje tatuaże do procesu zakupu; nie daje darmowego zakupu. Ekonomię opisano w [integracjach](https://docs.cxgstudios.com/docs/pl/01-cxg-tattoos/05-integraciones.md).

## Kamera

| Tabela | Co kontroluje |
| --- | --- |
| `CameraOffsets` | Docelową kość, odległość, przesunięcia i pole widzenia dla każdej strefy. |
| `CameraFraming` | Ogólną kompozycję i przesunięcie punktu ostrości. |
| `CameraFramingBySide` | Dodatkowe ustawienia widoku z przodu i z tyłu. |
| `CameraManualControls` | Sterowanie ręczne, kroki ruchu, obrót, zoom i limity. |

Skonfigurowane strefy to `ZONE_HEAD`, `ZONE_TORSO`, `ZONE_LEFT_ARM`, `ZONE_RIGHT_ARM`, `ZONE_LEFT_LEG` i `ZONE_RIGHT_LEG`.

Przykłady pojedynczych zmian:

```lua
Config.CameraOffsets['ZONE_TORSO'].fov = 50.0
Config.CameraFraming.screenOffset = 0.35
Config.CameraManualControls.enabled = true
Config.CameraManualControls.step = 0.035
Config.CameraManualControls.zoomStep = 0.08
```

Dodatnie `screenOffset` przesuwa postać w lewo, pozostawiając miejsce na menu po prawej. `lookAtOffsetX/Y/Z` zmienia punkt ostrości; `camOffsetX/Y/Z` w ustawieniach dla stron zmienia pozycję kamery.

W sterowaniu ręcznym `horizontalDegrees` i `rotationStepDegrees` ustawiają obrót. `ranges.y/z`, `radialClamp` i `maxDistance` ograniczają przesunięcia. `zoomCompositionMinBias` reguluje centrowanie przy zbliżaniu. Zmieniaj jedną wartość naraz i testuj wszystkie sześć stref na postaciach męskich i żeńskich.

## Strój podglądu

`Config.PreviewOutfit` pozwala odsłonić tatuowane obszary, gdy interfejs jest otwarty:

```lua
Config.PreviewOutfit.enabled = true
Config.PreviewOutfit.useDefaultVariation = false
Config.PreviewOutfit.presets['mp_m_freemode_01'].components[11] = {
    drawable = 15,
    texture = 0,
}
```

Dołączone presety rozróżniają `mp_m_freemode_01` i `mp_f_freemode_01`. Każdy komponent określa `drawable` i `texture`; `clearProps` usuwa akcesoria na czas podglądu. Dostosuj indeksy do ubrań zainstalowanych na serwerze. Pozostaw `useDefaultVariation = false`, jeśli chcesz zastosować tylko komponenty presetu, bez globalnego resetowania wyglądu.

## Uprawnienia, ekonomia i Qbox

Opis `Config.Permissions`, `Config.AdminCommand`, `Config.Purchases` i `Config.QbxMulticharacterPreview` znajduje się w sekcji [integracje](https://docs.cxgstudios.com/docs/pl/01-cxg-tattoos/05-integraciones.md). Jeśli nazwy zasobów różnią się od domyślnych, ustaw ich rzeczywiste nazwy.

## Diagnostyka

`Config.Debug` włącza ogólną diagnostykę. `Config.Permissions.debug` umożliwia sprawdzanie decyzji o dostępie. Po zakończeniu pozostaw obie opcje wyłączone.

`Config.DebugCommands.clientTattooCommand` jest domyślnie wyłączone. Włącz tę komendę wizualną wyłącznie do testów: nie zapisuje tatuaży ani nie zastępuje zakupu.

[Dalej: katalog](https://docs.cxgstudios.com/docs/pl/01-cxg-tattoos/04-catalogo.md).
