Serwery MTARankingPanel WłaścicielaPomoc i InfoZasobyNews & AlertyWyszukiwarka GraczyPromocjaCmentarzysko Legend
Ładowanie...
KONTAKT DISCORD (quit#8918)
Powrót do Panelu Właściciela

Dokumentacja Systemu Nagród

Kompletny poradnik integracji systemu nagród za głosowanie z Twoim serwerem MTA:SA.

Jak to działa?

1
Gracz wchodzi na profil Twojego serwera na MTA-LISTA.PL
2
Wpisuje swój nick z gry i klika 'Zagłosuj'
3
Strona zapisuje nagrodę do kolejki w bazie danych
4
Twój serwer MTA co 60 sekund sprawdza kolejkę (fetchRemote)
5
Gdy gracz jest online → serwer daje nagrodę i oznacza jako odebrana
💡 Ważne: Nagroda czeka w kolejce do momentu, aż gracz się zaloguje na serwer. Nie przepadnie!

Krok 1: Wygeneruj Klucz API

  1. Zaloguj się na MTA-LISTA.PL przez Discord
  2. Wejdź w Panel Właściciela
  3. Wybierz swój serwer z listy (musi być wcześniej odebrany przez admina)
  4. W sekcji "System Nagród za Głosowanie" skonfiguruj:
    • ⭐ Nagroda za głos — co gracz dostaje za każdy głos
    • 🔥 Streak 3 dni — bonus za głosowanie 3 dni z rzędu (opcjonalne)
    • 🏆 Streak 7 dni — super bonus za 7 dni z rzędu (opcjonalne)
    • 📝 Opis nagród — tekst widoczny na profilu serwera
  5. Kliknij "Aktywuj System Nagród"
  6. Skopiuj wygenerowany Klucz API — będzie potrzebny w skrypcie Lua
NIGDY nie udostępniaj klucza API publicznie! Traktuj go jak hasło.

Krok 2: Utwórz Resource na Serwerze MTA

Stwórz nowy folder w katalogu [resources] Twojego serwera MTA:

Struktura folderów:
mods/deathmatch/resources/
  └── vote-rewards/
      ├── meta.xml
      └── server.lua

Zawartość pliku meta.xml:

meta.xml
<meta>
    <info author="MTA-LISTA.PL" name="vote-rewards" version="1.0" type="script" />
    <script src="server.lua" type="server" />
</meta>

Krok 3: Wklej Skrypt Lua

Skopiuj poniższy kod do pliku server.lua i zmień wartość API_KEY na swój klucz:

-- ==============================================
-- MTA-LISTA.PL - System Nagród za Głosowanie
-- Wersja: 1.0 | Kompatybilność: MTA:SA 1.5+
-- ==============================================

local API_URL = "https://mta-lista.pl/api/rewards"
local API_KEY = "WKLEJ_SWOJ_KLUCZ_API_TUTAJ" -- Klucz z panelu właściciela

-- ============ KONFIGURACJA ============
local CHECK_INTERVAL = 60000  -- Co ile ms sprawdzać nagrody (60s)
local CHAT_PREFIX = "#fbbf24[MTA-LISTA.PL] #FFFFFF"

-- ============ FUNKCJE GŁÓWNE ============

-- Sprawdź oczekujące nagrody
function checkPendingRewards()
    local url = API_URL .. "/pending?key=" .. API_KEY
    fetchRemote(url, function(responseData, err)
        if err ~= 0 then
            outputDebugString("[MTA-LISTA] Błąd połączenia: " .. tostring(err))
            return
        end

        local data = fromJSON(responseData)
        if not data or not data.rewards then return end

        for _, reward in ipairs(data.rewards) do
            local player = getPlayerFromName(reward.playerName)
            if player then
                deliverReward(player, reward)
            end
        end
    end)
end

-- Dostarcz nagrodę graczowi
function deliverReward(player, reward)
    local action = reward.action or "VOTE"
    local value = tonumber(reward.rewardValue) or 0

    -- === TUTAJ DOSTOSUJ NAGRODY DO SWOJEGO SERWERA ===
    if reward.rewardType == "MONEY" then
        givePlayerMoney(player, value)
    elseif reward.rewardType == "VIP" then
        -- Przykład: ustaw dane gracza
        -- setElementData(player, "vip", true)
        -- setElementData(player, "vip.expire", getRealTime().timestamp + 86400)
        outputChatBox("Otrzymujesz status VIP!", player, 255, 200, 0)
    else
        -- CUSTOM - zrób co chcesz
        outputChatBox("Otrzymujesz nagrodę: " .. reward.rewardLabel, player, 255, 200, 0)
    end

    -- Wiadomość na czacie
    local actionText = "głos"
    if action == "STREAK3" then actionText = "STREAK 3 DNI 🔥"
    elseif action == "STREAK7" then actionText = "STREAK 7 DNI 🏆" end

    outputChatBox(CHAT_PREFIX .. "Dziękujemy za " .. actionText .. "! Otrzymujesz: " .. reward.rewardLabel, player, 255, 255, 255, true)

    -- Oznacz nagrodę jako dostarczoną
    claimReward(reward.id)
end

-- Oznacz nagrodę jako odebraną
function claimReward(rewardId)
    local url = API_URL .. "/claim"
    local postData = toJSON({ key = API_KEY, rewardId = rewardId })
    fetchRemote(url, {
        method = "POST",
        headers = { ["Content-Type"] = "application/json" },
        postData = postData
    }, function(responseData, err)
        if err ~= 0 then
            outputDebugString("[MTA-LISTA] Błąd claim: " .. tostring(err))
        end
    end)
end

-- ============ URUCHOMIENIE ============
setTimer(checkPendingRewards, CHECK_INTERVAL, 0)
outputDebugString("[MTA-LISTA.PL] System nagród aktywny! Sprawdzanie co " .. (CHECK_INTERVAL/1000) .. "s")

-- Komenda do ręcznego sprawdzania (opcjonalna, dla adminów)
addCommandHandler("checkvotes", function(player)
    if not hasObjectPermission(player, "command.checkvotes", not isGuestAccount(getPlayerAccount(player))) then
        -- Możesz tu dodać sprawdzanie uprawnień
    end
    checkPendingRewards()
    outputChatBox(CHAT_PREFIX .. "Sprawdzam nagrody...", player, 255, 255, 255, true)
end)

Krok 4: Uruchom Resource

W konsoli serwera MTA wpisz:

Konsola MTA:
refresh
start vote-rewards

Gotowe! W debuglogu powinieneś zobaczyć: [MTA-LISTA.PL] System nagród aktywny!

Aby resource startował automatycznie po restarcie serwera, dodaj go do mtaserver.conf:

<resource src="vote-rewards" startup="1" protected="0" />

System Streak (Seria Głosów)

System automatycznie śledzi, ile dni z rzędu gracz głosuje na Twój serwer. Możesz skonfigurować bonusy za serie:

3 Dni z Rzędu
Dodatkowy bonus oprócz zwykłej nagrody. Np. podwójna kasa.
7 Dni z Rzędu
Super bonus! Np. VIP na 24h lub ekskluzywny skin.

Streak bonusy konfiguruje się w Panelu Właściciela. Skrypt Lua automatycznie rozpoznaje typ nagrody (VOTE, STREAK3, STREAK7) i może przyznawać różne nagrody.

Dokumentacja API (dla zaawansowanych)

GET/api/rewards/pending?key=KLUCZ
Pobierz oczekujące nagrody (max 20). Wywoływane przez serwer MTA.
POST/api/rewards/claim
Oznacz nagrodę jako dostarczoną. Body: { key, rewardId }
GET/api/rewards/vote?serverIp=IP
Sprawdź status systemu nagród dla serwera (publiczne).
POST/api/rewards/vote
Zagłosuj na serwer. Body: { serverIp, playerName }. Wymaga sesji.

Odpowiedź z /pending zawiera pola: id, playerName, action, rewardType, rewardValue, rewardLabel

Publiczne API Listy Graczy

Chcesz wyświetlić listę graczy lub status serwera na własnej stronie WWW lub bocie Discord? Udostępniamy darmowe, ustandaryzowane API dla każdego serwera.

GET/api/public/server/IP:PORT/players
Zwraca status serwera oraz listę graczy (jeśli skonfigurowano Custom API).

Przykład użycia (JavaScript):

fetch('https://mta-lista.pl/api/public/server/127.0.0.1:22003/players')
  .then(res => res.json())
  .then(data => {
    console.log("Serwer: " + data.server.name);
    console.log("Graczy: " + data.server.online + "/" + data.server.max);
    console.log("Lista: ", data.playerList);
  });

Przykład użycia (PHP):

$json = file_get_contents('https://mta-lista.pl/api/public/server/127.0.0.1:22003/players');
$data = json_decode($json, true);

echo "Serwer: " . $data['server']['name'];
echo "Graczy: " . $data['server']['online'];

Własne API Graczy (Standard)

Chcesz, aby na profilu Twojego serwera wyświetlała się **pełna lista nicków graczy online**? Wystarczy, że stworzysz na swoim hostingu prosty plik JSON, który zwraca listę graczy, a jego adres wkleisz w Panelu Właściciela.

🔵 Gotowy skrypt Lua (Bez bazy danych!)

Nie chcesz używać PHP ani bazy danych? Wklej to do swojego resource na serwerze MTA. Skrypt będzie co minutę wysyłał listę graczy bezpośrednio do nas.

local API_KEY = "WKLEJ_SWOJ_KLUCZ_API_TUTAJ"
local PUSH_URL = "https://mta-lista.pl/api/server/push-players"

function pushOnlinePlayers()
    local players = {}
    for _, p in ipairs(getElementsByType("player")) do
        table.insert(players, getPlayerName(p))
    end
    
    fetchRemote(PUSH_URL, {
        method = "POST",
        headers = { ["Content-Type"] = "application/json" },
        postData = toJSON({ key = API_KEY, players = players })
    }, function(data, err)
        -- opcjonalnie logowanie błędów
    end)
end

setTimer(pushOnlinePlayers, 60000, 0) -- Wysyłaj co 60 sekund
pushOnlinePlayers()

🐘 Metoda PHP (Dla zaawansowanych)

Jeśli wolisz pobierać dane bezpośrednio ze swojej bazy danych MySQL, użyj tego skryptu:

<?php
header('Content-Type: application/json');

// 1. Dane do bazy danych Twojego serwera MTA
$host = 'localhost';
$db   = 'mta_database';
$user = 'mta_user';
$pass = 'twoje_haslo';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8", $user, $pass);
    
    // 2. Pobranie graczy (dostosuj nazwę tabeli i kolumny)
    // Przykład: tabela 'players', gdzie 'online' to 1
    $stmt = $pdo->query("SELECT name FROM players WHERE online = 1");
    $players = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
    // 3. Wysłanie wyniku
    echo json_encode($players);

} catch (PDOException $e) {
    echo json_encode(["error" => "Błąd połączenia"]);
}

🟢 Przykład JSON (Oczekiwany format)

Twoje API powinno zwracać prostą listę obiektów lub samych nicków:

[
  { "name": "Nick_Gracza1" },
  { "name": "Nick_Gracza2" },
  { "name": "Nick_Gracza3" }
]
💡 Tip: Po wgraniu pliku na serwer, wejdź w Panel Właściciela na MTA-LISTA.PL i wklej adres (np. https://twoja-strona.pl/api_online.php) w polu "URL do API Graczy".

Najczęstsze Pytania (FAQ)

Co jeśli gracz zagłosuje, ale nie jest online?
Nagroda czeka w kolejce. Gdy gracz wejdzie na serwer, zostanie automatycznie dostarczona przy następnym cyklu sprawdzania (co 60s).
Czy mogę zmienić interwał sprawdzania?
Tak! Zmień wartość CHECK_INTERVAL w skrypcie Lua. Zalecane: 30000-120000ms (30s - 2min).
Jak zmienić nagrodę na coś innego niż pieniądze?
W funkcji deliverReward() w skrypcie Lua dodaj własną logikę w bloku if/elseif. Możesz dawać bronie, pojazdy, rangi — cokolwiek pozwala API MTA.
Czy gracz może głosować z wielu kont?
Głosowanie wymaga zalogowania przez Discord. Jeden klient Discord = jeden głos na cooldown.
Co oznacza 'Wartość (Lua)' w konfiguracji?
To wartość, która trafia do skryptu Lua jako rewardValue. Dla pieniędzy to kwota (np. 5000), dla VIP możesz wpisać np. '24h' i obsłużyć to w skrypcie.