
Shops
System sklepów dla standardowego ekwipunku i ox_inventory: sklepy z koszykiem, sklepy z bronią, rotujący czarny rynek, oferty dnia, sprzedawcy NPC i edytor sklepów w grze.
- ESX Legacy (
es_extended) - oxmysql
- Ekwipunek: standardowy ekwipunek ESX lub ox_inventory (wykrywany przy starcie)
- Opcjonalnie: ox_target
Funkcje
- Trzy typy sklepów: sklep z koszykiem, sklep z bronią i czarny rynek. Płacisz kartą lub gotówką, na czarnym rynku brudnymi pieniędzmi.
- Serwer sprawdza ceny, sumę, wagę i odległość. Stany magazynowe tylko w kupionych sklepach. Zasady dla typu sklepu, sklepu lub przedmiotu.
- Sklepy na sprzedaż: gracze kupują sklep, ustalają ceny, przywożą towar od hurtownika i zarządzają kasą.
- Rotujący czarny rynek ze zmieniającymi się lokalizacjami, asortymentem i cenami, do tego oferty dnia w zwykłych sklepach.
- Edytor sklepów w grze z modelem NPC, scenariuszem, znacznikiem z podglądem na żywo i własnym blipem.
- Logi na Discordzie dla każdego zakupu i statystyki na żywo na Discordzie.
Instalacja
- Wrzuć folder
off_shopsdo swojego folderuresources. - Wszystkie przedmioty z
config/settings/config.items.luamuszą istnieć w twoim ekwipunku – ESX: tabelaitems, ox_inventory:ox_inventory/data/items.lua. Broń (weapon_…) w ESX nie potrzebuje wpisu. - Dodaj do
server.cfg– po ESX, oxmysql i swoim ekwipunku:
ensure oxmysql
ensure es_extended
ensure ox_inventory
ensure off_shopsTabele tworzą się automatycznie i są uzupełniane przy aktualizacjach.
Konfiguracja
config/settings/config.lua
| Opcja | Domyślnie | Opis |
|---|---|---|
serverInfo.name | 'OFF SCRIPTS' | Nazwa serwera, widoczna w interfejsie zamiast „OFF SCRIPTS” |
serverInfo.locale | 'de' | Język: de, en, pl, fr, es, it lub nl |
serverInfo.color | { 155, 89, 255 } | Kolor UI (RGB) |
serverInfo.design | 3 | Wygląd interfejsu: 1 = Klasyczny, 2 = Paragon, 3 = Storefront |
blur | true | Rozmyte tło, dopóki sklep jest otwarty. Edytor zostaje ostry (podgląd) |
useTarget | false | true = ox_target zamiast E |
pedSpeech | true | NPC wita się, żegna i dziękuje głosem |
purchase.maxPerItem | 25 | Maksymalna ilość na artykuł i zakup |
deals.enabled / count / discountPercent | false / 2 / 20 | Oferty dnia (tylko zwykłe sklepy, bez broni): wł./wył., liczba, rabat w procentach |
marker.color / marker.alpha | { 155, 89, 255 } / 150 | Domyślny kolor i krycie znaczników |
editor.command / editor.groups | 'shopeditor' / { 'projektleitung' } | Komenda i grupy ESX dla edytora |
stats.enabled / updateMinutes | true / 10 | Statystyki na żywo na Discordzie, odświeżanie w minutach |
blackmarket.rotation / activeLocations | 'day' / 1 | Zmiana czarnego rynku ('day', 'week', 'month') i ile ich jest jednocześnie |
blackmarket.itemsPerCategory / priceVariancePercent | 2 / 15 | Artykuły na kategorię w danym okresie, wahania cen w procentach |
shopTypes | normal, weapon, blackmarket | Dla każdego typu label, ped (sprzedawca), uiColor (własny kolor UI), blip i rules |
Zasady (rules) ustawiasz dla typu sklepu, sklepu lub przedmiotu: jobs, blockedJobs, minGrade i hours = { from, to } (czas w grze, 22–5 = 22:00–04:59).
config/settings/config.locations.lua – Lokalizacje
{ type = 'normal', label = 'LTD Davis', interactionType = 'ped', position = vec4(-47.02, -1758.23, 29.42, 45.05), categories = { 'food', 'drinks', 'tools' } },
{ type = 'blackmarket', interactionType = 'ped', position = vec4(14.2280, -1104.0475, 29.7970, 340.0), categories = { 'weapons', 'illegal' } },| Pole | Opis |
|---|---|
type | 'normal', 'weapon' lub 'blackmarket' |
interactionType | 'ped' (NPC, vec4 z kierunkiem patrzenia) lub 'marker' |
categories | Które kategorie sklep sprzedaje |
price | Opcjonalnie: cena zakupu · bez price sklep nie jest na sprzedaż |
label / rules / blip = false | Opcjonalnie: własna nazwa, własne zasady lub brak ikony na mapie |
Lokalizacje z type = 'blackmarket' to możliwe miejsca czarnego rynku – z nich activeLocations jest aktywnych jednocześnie.
Kategorie i przedmioty
food = { label = 'Essen', items = { 'bread', 'kebab', 'wrap' } }, -- kategoria
{ name = 'water', label = 'Wasser', price = 10 }, -- przedmiot- Opcjonalnie dla przedmiotu:
max(własna maksymalna ilość),image(własny obrazek),rules(własne zasady). weapon_…jest traktowane jako broń: kupowana pojedynczo, z 42 nabojami w ekwipunku ESX, nie podwójnie.- Obrazki: ESX ładuje
web/dist/assets/items/<name>.png, ox_inventory używa własnych. Brakujące obrazki broni wrzuć jakoweb/dist/assets/weapons/<name>.png.
config/functions.lua
| Funkcja | Do czego |
|---|---|
Notify(message, type) | Własne notify · Serwer: Notify(source, message, type) |
HelpNotify(text) | Tekst podpowiedzi przy sprzedawcy lub znaczniku |
Logi Discord
Webhooki wpisujesz w config/settings/config.server.lua (tylko po stronie serwera): purchases loguje każdy zakup, stats to statystyki na żywo. Pusty url ('') wyłącza log.
Języki
Wszystkie teksty są w config/locales/<język>.json. Dla własnego języka skopiuj plik, przetłumacz go i ustaw locale – zostaw w nim placeholdery jak %s i {total}.
W grze
Przy sprzedawcy lub znaczniku naciśnij E (albo użyj ox_target), wybierz artykuły i zapłać. W sklepie jest koszyk, w sklepie z bronią i na czarnym rynku wybierasz jeden artykuł.
Edytor sklepów (/shopeditor)
- Po lewej są wszystkie sklepy z edytora. Sklepów z configu tam nie ma, zmieniasz je w
config/settings/config.locations.lua. - Nowy tworzy sklep na twojej aktualnej pozycji, Edytuj otwiera istniejący.
- Ustawić można typ, nazwę, kategorie, NPC lub znacznik, pozycję z kierunkiem patrzenia i blip.
- NPC: Wybierz model z listy obrazków wszystkich pedów GTA (wyszukiwanie i kategorie), do tego scenariusz i kierunek patrzenia, wszystko z podglądem na żywo w grze. Addon peda wybierasz, wpisując dokładną nazwę modelu w wyszukiwarce. Domyślny = sprzedawca z
shopTypes. - Znacznik: Typ, rozmiar, odległość od ziemi, obrót, kolor, krycie i ruch z podglądem na żywo w grze.
- Blip: włączony lub wyłączony, opcjonalnie z własną ikoną i własnym kolorem. Inaczej obowiązuje blip z
shopTypes. - Dopóki edytor jest otwarty, chodzisz WASD i rozglądasz się z wciśniętym prawym przyciskiem myszy. Potem naciśnij Ustaw pozycję.
- Po Zapisz zmiana obowiązuje od razu dla wszystkich graczy. Czarny rynek z edytora stoi na stałe i sprzedaje wszystkie artykuły swoich kategorii.
Sklepy na sprzedaż
Czy sklep można kupić, ustawiasz dla sklepów z configu przez price w config.locations.lua, a dla sklepów z edytora w edytorze sklepów (grupa Własność: Na sprzedaż, Cena zakupu). Czarnego rynku nie da się kupić. Sklepy bez właściciela sprzedają jak dotąd, bez stanów.
Opcja (ownership) | Domyślnie | Opis |
|---|---|---|
enabled | true | Sklepy na sprzedaż wł./wył. Wył. = wszystko jak bez tej funkcji |
maxPerPlayer | 1 | Ile sklepów może mieć jeden gracz |
startStock / maxStock | 20 / 200 | Stan początkowy na artykuł po zakupie / maks. stan na artykuł |
priceRange.min / max | 0.8 / 1.5 | Dozwolona cena sprzedaży = cena bazowa × min do max |
wholesaleFactor | 0.6 | Cena hurtowa = cena bazowa × współczynnik |
sellBackPercent | 60 | Odkup przez serwer w % ceny zakupu |
van / orderMaxUnits / orderMinutes | 'speedo' / 300 / 20 | Dostawczak, maks. sztuk na kurs, limit czasu w minutach |
vanSpawn | vec4(...) | Punkt spawnu dostawczaka, gracz jest tam teleportowany |
refundPercent | 0 | Zwrot w % przy nieudanej lub przerwanej dostawie |
wholesalers | 3 × vec3 | Hurtownicy, wybierany jest najbliższy sklepu |
W grze: Przy sklepie na sprzedaż E najpierw otwiera wybór Zakupy lub Zarządzanie, przy NPC z kamerą na sprzedawcę. Jeśli sklep należy do kogoś innego, od razu otwiera się sklep. Bez właściciela Zarządzanie prowadzi do oferty, jako właściciel do panelu z zakładkami Przegląd (kasa, obrót dziś/7 dni/łącznie, wykres, prawie wyprzedane), Magazyn, Ceny, Zamówienie i Kasa (wpłata/wypłata gotówką lub na konto, historia, sprzedaż sklepu). Klienci płacą do kasy i kupują tylko to, co jest na stanie.
Dostawa: Wybierz towar, koszt idzie z kasy. Zostajesz przeteleportowany do punktu vanSpawn i wsadzony do dostawczaka – jedź do hurtownika, w znaczniku E (załadunek), wróć i zaparkuj wóz w znaczniku, potem podejdź do sprzedawcy i naciśnij E. Dopiero wtedy towar trafia na stan. Jeśli wóz zostanie zniszczony, skończy się czas lub opuścisz serwer, towar przepada (zwrot wg refundPercent). Po restarcie serwera otwarta dostawa jest w pełni zwracana.
Log Discord: webhook ownership w config/settings/config.server.lua (zakup, sprzedaż, dostawy, wpłaty/wypłaty). Zwolnij w edytorze zwalnia sklep (magazyn i kasa przepadają).
Częste problemy
| Problem | Rozwiązanie |
|---|---|
[ERROR] w konsoli serwera | Skrypt sprawdza konfigurację przy starcie. Przeczytaj komunikat, napraw błąd, zrestartuj skrypt. |
| „Ten przedmiot jest nieprawidłowy” | Brakuje przedmiotu w ekwipunku (ESX: tabela items, ox_inventory: items.lua). |
| ox_inventory nie jest wykrywany | ensure ox_inventory musi stać przed off_shops. |
| Czarny rynek jest zamknięty | Domyślnie tylko 22–5 czasu w grze (rules.hours). |
| Czarnego rynku nie ma | Aktywnych jest tylko activeLocations lokalizacji – pozostałe przy następnej zmianie. |
| Czarny rynek: „Za mało pieniędzy” | Czarny rynek przyjmuje tylko brudne pieniądze (black_money). |
/shopeditor się nie otwiera | Twoja grupa ESX musi być w editor.groups. |
| „Model NPC … nie istnieje” | Sprawdź nazwę modelu, np. mp_m_shopkeep_01. Addon pedy muszą być streamowane. |
Jeszcze nie kupiony?
Zobacz Shops w sklepie