Przejdź do treści
Cała dokumentacja

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.

Wymagania
  • 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

  1. Wrzuć folder off_shops do swojego folderu resources.
  2. Wszystkie przedmioty z config/settings/config.items.lua muszą istnieć w twoim ekwipunku – ESX: tabela items, ox_inventory: ox_inventory/data/items.lua. Broń (weapon_…) w ESX nie potrzebuje wpisu.
  3. Dodaj do server.cfg – po ESX, oxmysql i swoim ekwipunku:
cfg
ensure oxmysql
ensure es_extended
ensure ox_inventory
ensure off_shops

Tabele tworzą się automatycznie i są uzupełniane przy aktualizacjach.

Konfiguracja

config/settings/config.lua

OpcjaDomyślnieOpis
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.design3Wygląd interfejsu: 1 = Klasyczny, 2 = Paragon, 3 = Storefront
blurtrueRozmyte tło, dopóki sklep jest otwarty. Edytor zostaje ostry (podgląd)
useTargetfalsetrue = ox_target zamiast E
pedSpeechtrueNPC wita się, żegna i dziękuje głosem
purchase.maxPerItem25Maksymalna ilość na artykuł i zakup
deals.enabled / count / discountPercentfalse / 2 / 20Oferty dnia (tylko zwykłe sklepy, bez broni): wł./wył., liczba, rabat w procentach
marker.color / marker.alpha{ 155, 89, 255 } / 150Domyślny kolor i krycie znaczników
editor.command / editor.groups'shopeditor' / { 'projektleitung' }Komenda i grupy ESX dla edytora
stats.enabled / updateMinutestrue / 10Statystyki na żywo na Discordzie, odświeżanie w minutach
blackmarket.rotation / activeLocations'day' / 1Zmiana czarnego rynku ('day', 'week', 'month') i ile ich jest jednocześnie
blackmarket.itemsPerCategory / priceVariancePercent2 / 15Artykuły na kategorię w danym okresie, wahania cen w procentach
shopTypesnormal, weapon, blackmarketDla 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

lua
{ 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' } },
PoleOpis
type'normal', 'weapon' lub 'blackmarket'
interactionType'ped' (NPC, vec4 z kierunkiem patrzenia) lub 'marker'
categoriesKtóre kategorie sklep sprzedaje
priceOpcjonalnie: cena zakupu · bez price sklep nie jest na sprzedaż
label / rules / blip = falseOpcjonalnie: 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

lua
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ć jako web/dist/assets/weapons/<name>.png.

config/functions.lua

FunkcjaDo 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ślnieOpis
enabledtrueSklepy na sprzedaż wł./wył. Wył. = wszystko jak bez tej funkcji
maxPerPlayer1Ile sklepów może mieć jeden gracz
startStock / maxStock20 / 200Stan początkowy na artykuł po zakupie / maks. stan na artykuł
priceRange.min / max0.8 / 1.5Dozwolona cena sprzedaży = cena bazowa × min do max
wholesaleFactor0.6Cena hurtowa = cena bazowa × współczynnik
sellBackPercent60Odkup przez serwer w % ceny zakupu
van / orderMaxUnits / orderMinutes'speedo' / 300 / 20Dostawczak, maks. sztuk na kurs, limit czasu w minutach
vanSpawnvec4(...)Punkt spawnu dostawczaka, gracz jest tam teleportowany
refundPercent0Zwrot w % przy nieudanej lub przerwanej dostawie
wholesalers3 × vec3Hurtownicy, 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

ProblemRozwiązanie
[ERROR] w konsoli serweraSkrypt 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 wykrywanyensure ox_inventory musi stać przed off_shops.
Czarny rynek jest zamkniętyDomyślnie tylko 22–5 czasu w grze (rules.hours).
Czarnego rynku nie maAktywnych 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 otwieraTwoja 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