Projekt systemu narkotyków FiveM: zbieranie, przetwarzanie i sprzedaż bezpiecznie

Jak zaprojektować system narkotyków FiveM: zbieranie i przetwarzanie ze sprawdzeniami przedmiotów po stronie serwera, limity szybkości, sprzedaż NPCom bezpiecznie, alerty policji i zbalansowane wypłaty.

Objaw: gracze mają tysiące narkotyków w minuty, sprzedają ten sam przedmiot temu samemu NPC na zawsze, lub zarabiają dziesięć razy więcej niż praca bez żadnego alertu policji.

System narkotyków ma trzy etapy: zbieranie, przetwarzanie i sprzedaż. Wszystkie trzy podążają za tą samą regułą: klient pyta, serwer sprawdzić i decyduje. Ten artykuł pokazuje czeki i pytania dotyczące równowagi, które mają znaczenie.

Trzy etapy

Etap Co się dzieje Co serwer musi sprawdzić
Zbieranie Gracz zbiera roślinę, kopie zasób Lokalizacja, cooldown, limit szybkości
Przetwarzanie Surowe przedmioty stają się gotowym produktem Gracz ma przedmioty, jest w miejscu przetwarzania
Sprzedaż Produkt zmienia się w pieniądze lub brudne pieniądze Przedmiot, nabywca, cena, cooldown

Każdy etap zużywa lub tworzy przedmioty, więc bezpieczny projekt używa funkcji serwera twojego ekwipunku. Strona tworzenia przedmiotu znajduje się w adding items to ox_inventory.

Sprawdzenia przedmiotów po stronie serwera

Nigdy nie ufaj klientowi, który mówi « Mam 10 tego ». Zapytaj ekwipunek na serwerze, usuń wejścia, a następnie dodaj wyjścia, w jednym miejscu:

lua
-- server
RegisterNetEvent('drugs:process', function()
    local src = source
    if not isNearProcessor(src) then return end   -- distance check on the server

    local count = exports.ox_inventory:GetItemCount(src, 'weed_leaf')
    if count < 3 then return end

    if exports.ox_inventory:RemoveItem(src, 'weed_leaf', 3) then
        exports.ox_inventory:AddItem(src, 'weed_bag', 1)
    end
end)

Usuń najpierw, dodaj drugie, i dodaj tylko, gdy usunięcie się powiodło. Jeśli dodasz pierwszą, gracz, który spamuje zdarzenie, może zatrzymać wyjście i nie stracić nic. Sprawdzić canCarryItem przed dodaniem, jeśli gracze mogą być pełni.

Limity szybkości

Nawet legalne zdarzenie może być nadużywane przez spalenie go z pętli. Daj każdemu działaniu minimalne opóźnienie na gracza, przechowywane na serwerze:

lua
local lastAction = {}

local function rateLimited(src, key, ms)
    local now = GetGameTimer()
    lastAction[src] = lastAction[src] or {}
    if lastAction[src][key] and now - lastAction[src][key] < ms then
        return true
    end
    lastAction[src][key] = now
    return false
end

Ustaw opóźnienie nieco poniżej tego, co faktyczne działanie zajmuje, aby uczciwi gracze nigdy nie byli blokowani. Pamiętaj, aby wyczyścić lastAction[src] na playerDropped, więc tabela nie rośnie wiecznie. Zbieranie powinno być również ograniczone lokalizacją: roślina, która istnieje w jednym polu, nie musi być możliwa do zerwania skąd kolwiek.

Sprzedaż NPCom bezpiecznie

Sprzedaż pieszym to najbardziej nadużywana część, ponieważ klient wybiera peda. Dodaj opcję ze swoją biblioteką celowania na kliencie, na przykład na wszystkich pieszych:

lua
-- client (ox_target)
exports.ox_target:addGlobalPed({
    {
        label = 'Offer drugs',
        icon = 'fa-solid fa-cannabis',
        distance = 2.0,
        canInteract = function(entity)
            return not IsPedAPlayer(entity) and not IsEntityDead(entity)
        end,
        onSelect = function(data)
            TriggerServerEvent('drugs:sell', 'weed_bag')
        end,
    },
})

Podstawy targetowania znajdują się w adding ox_target zones. Zwróć uwagę, że klient wysyła tylko nazwę przedmiotu. Wszystko inne decyduje się na serwerze:

lua
RegisterNetEvent('drugs:sell', function(item)
    local src = source
    local price = Config.Prices[item]
    if not price then return end                      -- only allowed items
    if rateLimited(src, 'sell', 4000) then return end -- cooldown between deals

    if exports.ox_inventory:RemoveItem(src, item, 1) then
        local payout = math.random(price.min, price.max)
        exports.ox_inventory:AddItem(src, 'black_money', payout)
    end
end)

Cena pochodzi z konfiguracji serwera, nigdy z klienta. Nazwę przedmiotu należy sprawdzić na liście dozwolonych, ponieważ klient może wysłać każdą nazwę. Dodaj losową szansę, że NPC odmawia lub ci doniesie. Jeśli sprzedaż potrzebuje gracza w strefie lub tylko w nocy, sprawdzić to również na serwerze. Nazwa przedmiotu black_money zależy od twojej konfiguracji; patrz money types.

Alerty policji

Ryzyko to to, co sprawia, że narkotyki są interesujące. Alarmuj policję na szansę, z serwera, z lokalizacją transakcji:

  • Procent szansy na każdą sprzedaż (na przykład mała szansa, że NPC wzywa policję).
  • Większa szansa, gdy mniej transakcji zostało dokonanych w spokojnym obszarze, lub gdy wiele transakcji dzieje się w tym samym miejscu.
  • Wymagane minimum funkcjonariuszy na służbie do sprzedaży i przetwarzania, liczonego na serwerze, jak w setting up a police job.

Jeśli używasz aplikacji telefonicznej do transakcji, zamówienia i punkty spotkania powinny być wciąż tworzone i sprawdzane na serwerze.

Drug Dealer AppUliczna sprzedaż jako aplikacja lb-phone: strefy, kupcy NPC, poziomy i alerty dla policji.od 18,15 €Zobacz skrypt →

Balancowanie wypłat

Balans w liczbach, a nie w uczuciach:

  1. Czas jednej pełnej pętli (zbieranie, przetwarzanie, sprzedaż) i policz ile minut to zajmuje.
  2. Oblicz pieniądze na godzinę: payout razy pętle na godzinę.
  3. Porównaj z kontrolą najlepszej legalne pracy. Narkotyki mogą płacić więcej, ze względu na ryzyko, ale współczynnik dwa lub trzy to wystarczająco.
  4. Dodaj tarcie: czas przetwarzania, waga przedmiotu, ograniczona liczba sprzedaży na NPC, cooldown na lokalizację.

Następnie obserwuj pieniądze w bazie danych po tygodniu i dostosuj. Metoda znajduje się w balancing your server economy.

Lista kontrolna

Objaw Naprawa
Nieskończone przedmioty Sprawdzić lokalizację, usunąć wejścia najpierw i limit szybkości na serwerze
Klient ustawia cenę Pobierz ceny tylko z konfiguracji serwera
Sprzedaje każdy przedmiot jako narkotyki Sprawdzić nazwę przedmiotu na liście dozwolonych
Ten sam NPC kupuje na zawsze Dodaj cooldown na gracza i na peda lub lokalizację
Narkotyki płacą zbyt wiele Porównaj pieniądze na godzinę z normalną pracą
Brak reakcji policji Alarmuj na szansę, z serwera

Szybkie odpowiedzi

Dlaczego gracze dostają nieograniczone narkotyki?

Zdarzenie zbierania lub przetwarzania uruchamia się na serwerze bez sprawdzania lokalizacji, czasu lub limitów, więc zmodyfikowany klient może go wypalić w pętli. Dodaj czeki i limit szybkości na serwerze.

Jak pozwolić graczom sprzedawać narkotyki NPCom?

Dodaj opcję celowania do pieszych na kliencie, a następnie pozwól serwerowi sprawdzić przedmiot, dystans, cooldown i cenę, zanim zapłaci. Klient tylko pyta.

Jak zbalansuję wypłaty narkotyków?

Oblicz pieniądze na godzinę, które gracz może zarobić i porównaj z normalną pracą. Narkotyki mogą płacić więcej ze względu na ryzyko, ale nie tyle, że nikt nie robi nic innego.

Skrypty bez tego problemu

Drug Dealer AppUliczna sprzedaż jako aplikacja lb-phone: strefy, kupcy NPC, poziomy i alerty dla policji.Zobacz skrypt →Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →Pawn Shop AppLombard między graczami wewnątrz lb-phone.Zobacz skrypt →

Czytaj dalej