Przejdź do treści
Cała dokumentacja

Giveaway

Twórz giveawaye bezpośrednio w grze: uruchom od razu albo zapisz jako szablon, który na życzenie startuje automatycznie o stałych porach. Gracze dołączają klawiszem lub komendą, zwycięzcy są losowani na żywo z animowaną listą nazw. Tabele skrypt tworzy sam.

Wymagania
  • ESX Legacy (es_extended, testowane z 1.14)
  • oxmysql
  • Tabela owned_vehicles dla nagród w postaci pojazdów (np. z ESX lub off_vehicleshop)
  • Dla obrazków itemów: off_inventory (lub własna ścieżka w itemImages)

Funkcje

  • Menu admina (/giveawayadmin): Twórz giveawaye na jednej stronie (nagrody, czas trwania, zwycięzcy, opcjonalnie nazwa), z podglądem na żywo, jak widzą to gracze.
  • Nagrody: Itemy, bronie, pieniądze (gotówka, bank, brudne pieniądze lub własne konta) i pojazdy. Wszystkie pojazdy z gry, także addonowe, są do wyboru z obrazkiem i kategorią.
  • Stała nagroda lub loteria: Albo każdy zwycięzca dostaje wszystko z listy, albo każdy losuje jedną nagrodę według szansy, np. 60 % pieniądze, 30 % bank, 10 % pojazd.
  • Zasady: Liczba zwycięzców, wpisowe, czas trwania, maksymalna i minimalna liczba uczestników. Jeśli zbierze się za mało, giveaway zostaje anulowany, a wpisowe zwrócone.
  • Szablony: Zapisuj giveawaye i uruchamiaj lub duplikuj je jednym kliknięciem albo dostosuj w zakładce Utwórz.
  • Uruchamiaj automatycznie: Do włączenia dla każdego szablonu, w stałe dni tygodnia i o stałych godzinach, np. w każdy piątek o 20:00 i 22:30. Opcjonalnie tylko, gdy online jest wystarczająco graczy.
  • Historia: Steruj trwającym giveawayem na żywo (losuj teraz lub anuluj) i przeglądaj ostatnie 50 giveawayów ze zwycięzcami.
  • Okienko dla graczy: U góry ekranu z nagrodami, timerem i liczbą uczestników. Dołączasz przez G lub /giveaway, H pokazuje i ukrywa okienko.
  • Dostarczanie później: Jeśli nagroda nie mieści się w ekwipunku albo zwycięzca jest offline, zostaje zapisana i automatycznie dostarczona później.
  • Logi Discord dla akcji admina, giveawayów i każdej wydanej nagrody.

Instalacja

  1. Wrzuć folder off_giveaway do resources.
  2. Dodaj do server.cfg po oxmysql i ESX:
cfg
ensure oxmysql
ensure es_extended
ensure off_giveaway
  1. Wpisz swoją grupę w admin.groups i otwórz /giveawayadmin.
Itemy i bronie

Itemy i bronie muszą istnieć w ESX (tabela items lub lista broni ESX). Inaczej giveawaya nie da się zapisać ani uruchomić. Szablony z brakującymi itemami konsola serwera zgłasza przy starcie.

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 lub it
serverInfo.color{ 155, 89, 255 }Kolor menu i okienka dla graczy
serverInfo.design3Wygląd interfejsu: 1 = Klasyczny, 2 = Paragon, 3 = Storefront
blurtrueRozmyte tło, gdy menu admina jest otwarte
admin.command / groups'giveawayadmin' / { 'projektleitung' }Komenda do menu admina i które grupy mogą je otwierać
join.command / key / keyLabel'giveaway' / 47 / 'G'Komenda i klawisz do dołączania · key jako Control-ID, keyLabel widać w okienku
toggle.key / keyLabel74 / 'H'Klawisz do pokazywania i ukrywania okienka
itemImages'nui://off_inventory/web/dist/images/items/%s.png'Ścieżka do obrazków itemów, %s = nazwa itemu
accountsGotówka, bank, brudne pieniądzeKonta dostępne jako nagroda pieniężna: name = konto ESX, label = wyświetlana nazwa, opcjonalnie icon (ikona Phosphor)
feeAccounts{ 'money', 'bank' }Wpisowe: płaci pierwsze konto z wystarczającą kwotą, czyli gotówka, a w innym razie bank
limits.maxMembers / maxWinners2500 / 25Maksymalne wartości w menu
limits.maxDuration180Najdłuższy czas trwania w minutach
vehicles.plateFormat'LLL NNN'Tablica rejestracyjna wygranych pojazdów: L = litera, N = cyfra, maksymalnie 8 znaków
vehicles.typespatrz plikTyp w owned_vehicles dla każdej kategorii (samochód, motocykl, łódź, helikopter, samolot), musi pasować do twojego garażu
vehicles.blacklistPojazdy wojskoweModele, których nie można wybrać w menu
pendingInterval120Co tyle sekund ponawiane są oczekujące nagrody

Dodanie własnego konta jako nagrody, np. żetonów kasynowych:

lua
accounts = {
  { name = 'money',  label = 'Bargeld' },
  { name = 'bank',   label = 'Bank' },
  { name = 'chips',  label = 'Casino-Chips' },
},

config/functions.lua

Tutaj podłączasz własne skrypty. Błędy w nich są przechwytywane, skrypt działa dalej.

FunkcjaDo czego
Notify(message, type)Notify · Serwer: Notify(source, message, type)
ClientCanUseKeys()false = teraz nie dołączaj klawiszem ani nie przełączaj okienka
ServerCanJoin(source, giveaway)false = gracz nie może dołączyć, np. w więzieniu
ServerGiveawayStarted(giveaway)Giveaway startuje, np. własny post na Discordzie
ServerGiveawayEnded(giveaway, winners)Rozlosowano, winners z source (nil = offline), identifier, name i reward
ServerGiveawayCancelled(giveaway, reason)Anulowano, reason = 'admin' lub 'members'
ServerRewardGiven(source, reward)Po każdej wydanej lub później dostarczonej nagrodzie

config/settings/config.server.lua i języki

Webhooki Discord dla admin (szablony), giveaway (start, losowanie, anulowanie) i rewards (każda nagroda), url = '' wyłącza dany log. Wszystkie teksty są w config/locales/ (jeden plik na język).

W grze

  • Menu admina (/giveawayadmin): U góry przełączasz między Utwórz, Szablony i Historia. Gdy trwa giveaway, u góry wskaźnik LIVE pokazuje pozostały czas.
  • Utwórz: Odpowiedz na trzy pytania: co można wygrać, jak długo trwa, ilu wygrywa. Nazwa jest opcjonalna, cała reszta jest pod Więcej ustawień. Po prawej widzisz okienko tak, jak widzą je gracze. Uruchom giveaway startuje od razu, Jako szablon go zapisuje. Wczytaj szablon wczytuje zapisany szablon do dostosowania.
  • Nagrody: U góry wybierasz rodzaj. Item, broń i pojazd otwierają listę z obrazkiem i wyszukiwarką, pieniądze od razu dodają kwotę. Przy broniach ilość to amunicja. W trybie Loteria (pod Więcej ustawień) dajesz każdej nagrodzie szansę, razem 100 %. Rozdziel równo dzieli je po równo.
  • Szablony: Po lewej lista, po prawej edytor: u góry nazwa, pod nią te same pytania co przy tworzeniu. Nazwa szablonu to też nazwa, którą widzą gracze. Zamiast o nazwę punkt 4 pyta o Uruchamiaj automatycznie: wybierz dni tygodnia i do 6 godzin, pod spodem widać następny start, opcjonalnie Minimum online. Zmiany zapisuje dopiero Zapisz. Uruchom teraz od razu startuje szablon, Dostosuj i uruchom otwiera go w zakładce Utwórz. Liczy się godzina serwera.
  • Historia: U góry sterujesz trwającym giveawayem, niżej są statystyki i ostatnie 50 giveawayów. Kliknięcie wpisu pokazuje zwycięzców z ich nagrodami.
  • Dołączanie: Gdy giveaway startuje, u góry pojawia się okienko u wszystkich graczy. Dołączasz przez G lub /giveaway, wpisowe jest pobierane najpierw z gotówki, a w innym razie z banku. H zwija okienko do małego paska i rozwija je z powrotem.
  • Losowanie: Gdy czas minie albo admin rozlosuje, zwycięzcy są losowani po kolei z animowaną listą nazw. Potem wszyscy widzą listę zwycięzców, a zwycięzcy dostają dodatkowo wiadomość. Bez Animowane losowanie lista pojawia się od razu.
  • Wygrane pojazdy trafiają z własną tablicą rejestracyjną do garażu (owned_vehicles), także gdy zwycięzca jest offline.
  • Dostarczanie później: Jeśli ekwipunek jest pełny albo zwycięzca jest offline, dostanie nagrodę automatycznie, gdy tylko zwolni się miejsce lub wróci online. Zwrot wpisowego dla graczy offline działa tak samo.
Jeden giveaway naraz

Zawsze trwa tylko jeden giveaway. Automatyczny start, który wypada w trakcie trwającego giveawaya, jest pomijany i odnotowywany w konsoli.

Dla deweloperów

lua
-- Serwer
local active = exports.off_giveaway:GetActiveGiveaway()        -- nil, gdy żaden nie trwa
local member = exports.off_giveaway:IsMember(source)
local ok, err = exports.off_giveaway:StartPreset('p_friday', 'Discord-Bot')
local ok, err = exports.off_giveaway:StartGiveaway({
  title = 'Event-Giveaway',
  mode = 'fixed',
  rewards = { { kind = 'account', name = 'bank', amount = 50000 } },
  winners = 1,
  duration = 600,
  maxMembers = 500,
}, 'Event-Team')
local ok, err = exports.off_giveaway:DrawGiveaway()
local ok, err = exports.off_giveaway:CancelGiveaway()

-- Klient
local active = exports.off_giveaway:IsGiveawayActive()
local joined = exports.off_giveaway:HasJoined()

Przy StartGiveaway duration podajesz w sekundach (co najmniej 30). Opcjonalne są description, entryFee, minMembers i options = { reel = false } (bez animowanego losowania).

Nagrody przy StartGiveaway: kind = item, weapon, account lub vehicle, do tego name i amount. Przy pojazdach dodatkowo category (car, bike, boat, heli, plane) i label. W loterii (mode = 'pool') każda nagroda potrzebuje chance, razem 100.

Częste problemy

Przy starcie skrypt zgłasza błędy i wskazówki w konsoli serwera.

ProblemRozwiązanie
„Nie masz do tego uprawnień” przy /giveawayadminWpisz swoją grupę w admin.groups i zrestartuj.
„Przedmiot … nie istnieje w ESX”Dodaj item w tabeli items lub wybierz inny w szablonie.
Brak pojazdu w garażuDostosuj vehicles.types do typów twojego garażu (np. aircraft dla helikoptera i samolotu).
Brak pojazdu na liście wyboruCzy jest w vehicles.blacklist? Pojazdy addonowe pojawiają się, gdy tylko zostaną załadowane w grze.
Szablon nie startuje automatycznieSprawdź godzinę serwera, czy Uruchamiaj automatycznie jest włączone? Jeśli trwa już giveaway lub online jest za mało graczy, konsola to zgłosi.
Nagroda nie docieraPełny ekwipunek: nagroda jest ponawiana co pendingInterval sekund i dotrze automatycznie.
Klawisz G lub H nie działaInne skrypty używają tego klawisza. Zmień join.key / toggle.key, /giveaway działa zawsze.
Brak obrazków itemówUstaw itemImages na folder z obrazkami twojego ekwipunku.

Jeszcze nie kupiony?

Zobacz Giveaway w sklepie