[ESX] Farmjob Template

2 Beiträge · 3.869 Aufrufe #esx#ESX FIVEM#esx_farmjob
10.01.2022, 15:27 #1

Hey zusammen,



Nun kommen wir zu meinen ersten Beitrag :P



Hier ist mein erster eigener geschriebener Job, womit man legale, sowie illegale routen erstellen kann.


Man kann in der Config anpassen, ob man Blackmoney oder normales bekommt, ebenso die Menge an Geld.


Ich würde mich freuen wenn Profis sich dies mal angucken und mit ggf. Ratschläge oder Verbesserungsvorschläge geben können wie man etwas besser schreiben kann.



Config.lua

Spoiler
Config = {}

    -------------------------------------------
    --=======Farm/Job template by VoTeK======--
    --==============Version 1.0==============--
    -------------------------------------------



    -------------------------------
    --=======Basic settings========
    -------------------------------
    Config.Needjob    = false            -- type true if needed
    Config.Job        = ""        -- type the needed job
    Config.Blackmoney = false        -- type true or false
    Config.money = 250
    -------------------------------
    --=======Items to  Farm========
    -------------------------------
    Config.Item1 = 'apple'
    Config.Item2 = 'applejuice'
    Config.Item3 = ''
    ---------------------------------------------------------------
    --=====How long should it take for player to catch a item======
    ---------------------------------------------------------------
    Config.FarmTime = {a = 5000, b = 8000}
    --------------------------------------
    --=====Circle Zones for the Farm======
    --------------------------------------
    Config.CirlceZones = {
        FarmField = {coords = vector3(2350.70,4998.46,42.85), blip = 238, text = 'Apfelfeld', Notify = 'Drücke E um Äpfel zu sammeln', color = 1, radius = 10, animation = 'world_human_gardener_plant', howmuch = 1, worker = 'Farm', show = true},
        FarmVerarbeiter = {coords = vector3(1646.09,4837.05,42.03), blip = 499, text = 'Apfelverarbeiter', Notify = 'Drücke E um Äpfel zu verarbeiten', color = 1, radius = 10, animation = 'WORLD_HUMAN_STAND_MOBILE_FACILITY', howmuch = 1, worker = 'Verar', show = true},
        FarmVerkaufer = {coords = vector3(2242.73,5152.96,57.33), blip = 500, text = 'Apfelverkäufer', Notify = 'Drücke E um Apfelsaft zu verkaufen', color = 1, radius = 10, animation = 'WORLD_HUMAN_STAND_MOBILE_FACILITY', howmuch = 1, worker = 'Verka', show = true}
    }

Client.lua

Spoiler
ESX = nil
Citizen.CreateThread(function()
    while true do
        Citizen.Wait(2)
        if ESX ~= nil then
        else
            ESX = nil
            TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
        end
    end
end)

local Keys = {
    ["1"] = 185, ["2"] = 158, ["3"] = 160, ["4"] = 164, ["5"] = 165, ["6"] = 159, ["7"] = 161, ["8"] = 162, ["9"] = 163, ["E"] = 38, ["X"] = 73
}

local farming = false
local verarbeiten = false
local verkaufen = false
local ready = false

    -------------------------------
    --=======Farming shitt=========
    -------------------------------
    Citizen.CreateThread(function()
        while true do
            Citizen.Wait(0)
            local ped = PlayerPedId()
            local pedCoords = GetEntityCoords(ped)

            for k,zone in pairs(Config.CirlceZones) do
            if #(pedCoords - zone.coords) < 5.0  then
                if farming == false and verarbeiten == false and verkaufen == false then
                    DisplayHelpText(zone.Notify)
                    if IsControlJustPressed(0, Keys['E']) and IsPedOnFoot(ped) and farming == false and verarbeiten == false and verkaufen == false then
                        ESX.TriggerServerCallback("Farm:GetJob", function (job)
                            if Config.Needjob == true then
                                if job == Config.Job then
                                    if zone.worker == 'Farm'then
                                        ESX.ShowNotification("Beginne zu farmen")
                                        Worker("farming",zone.animation)
                                    end
                                    if zone.worker == 'Verar'then
                                        ESX.ShowNotification("Beginne zu verarbeiten")
                                        Worker("Verar",zone.animation)
                                    end
                                    if zone.worker == 'Verka'then
                                        ESX.ShowNotification("Beginne zu verkaufen")
                                        Worker("Verka",zone.animation)
                                    end
                                else
                                    ESX.ShowNotification("Du benötigst folgenden Job dafür: "..Config.Job)
                                end
                            else
                                if zone.worker == 'Farm'then
                                    ESX.ShowNotification("Beginne zu farmen")
                                    Worker("farming",zone.animation)
                                end
                                if zone.worker == 'Verar'then
                                    ESX.ShowNotification("Beginne zu verarbeiten")
                                    Worker("Verar",zone.animation)
                                end
                                if zone.worker == 'Verka'then
                                    ESX.ShowNotification("Beginne zu verkaufen")
                                    Worker("Verka",zone.animation)
                                end    
                            end
                        end)
                    end
                end
            end
        
            end
            if IsControlJustPressed(0, Keys['X'])  then
                TriggerEvent('Farming:Pedclean')
            end
        end
    end)

    function Worker(whattodo,animation)
        if whattodo == "farming" then
            if IsPedUsingScenario(PlayerPedId(), animation) then
                BlockWeaponWheelThisFrame()
            else
                TaskStartScenarioInPlace(PlayerPedId(), animation, 0, true)
            end
            farming = true
            verarbeiten = false
            verkaufen = false
        end
        if whattodo == "Verar" then
            if IsPedUsingScenario(PlayerPedId(), animation) then
                BlockWeaponWheelThisFrame()
            else
                TaskStartScenarioInPlace(PlayerPedId(), animation, 0, true)
            end
            farming = false
            verarbeiten = true
            verkaufen = false
        end
        if whattodo == "Verka" then
            if IsPedUsingScenario(PlayerPedId(), animation) then
                BlockWeaponWheelThisFrame()
            else
                TaskStartScenarioInPlace(PlayerPedId(), animation, 0, true)
            end
            farming = false
            verarbeiten = false
            verkaufen = true
        end
    end
Citizen.CreateThread(function()
    while true do
        Citizen.Wait(50)
        local wait = math.random(Config.FarmTime.a , Config.FarmTime.b)
        if farming == true and verarbeiten == false and verkaufen == false then
            Citizen.Wait(wait)
            TriggerServerEvent("Farming:Mentalcatch",Config.Item1, Config.Item2)
        end
        if farming == false and verarbeiten == true and verkaufen == false then
            Citizen.Wait(200)
            TriggerServerEvent("Farming:Verarbeiten",Config.Item1, Config.Item2)
        end
        if farming == false and verarbeiten == false and verkaufen == true then
            Citizen.Wait(200)
            TriggerServerEvent("Farming:Verkaufen",Config.Item1, Config.Item2,Config.Blackmoney,Config.money)
        end
    end
end)


    -------------------------------
    --=====Draw Blip to Users======
    -------------------------------

Citizen.CreateThread(function()
    for k,zone in pairs(Config.CirlceZones) do
        CreateBlipCircle(zone.coords, zone.blip, zone.text, zone.radius, zone.color, zone.show)
    end
end)

function CreateBlipCircle(coords, blipnrm, bliptext, radius, color, show)
    if show then
        local blip = AddBlipForCoord(coords)
        SetBlipSprite(blip, blipnrm)
        SetBlipAsShortRange(blip, true)
        BeginTextCommandSetBlipName("STRING")
        AddTextComponentString(bliptext)
        EndTextCommandSetBlipName(blip)
    end
end

    -------------------------------
    --=====Draw Text to Users======
    -------------------------------

function DisplayHelpText(str)
    SetTextComponentFormat("STRING")
    AddTextComponentString(str)
    DisplayHelpTextFromStringLabel(0, 0, 1, -1)
end

    -------------------------------
    --======Clean Ped Users========
    -------------------------------

RegisterNetEvent('Farming:Pedclean')
AddEventHandler('Farming:Pedclean', function()
    ClearPedTasks(PlayerPedId())
    ESX.ShowNotification("Du hast aufgehört zu arbeiten")
    farming = false
    verarbeiten = false
    verkaufen = false
end)

Server.lua

Spoiler
ESX = nil
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)

RegisterNetEvent('Farming:Mentalcatch')
AddEventHandler('Farming:Mentalcatch', function(item1,item2)
    local _source = source
    local weight = 2
    local much = math.random(1,10)
    local xPlayer = ESX.GetPlayerFromId(_source)
    if xPlayer.getInventoryItem(item1).count < 100 then
        xPlayer.addInventoryItem(item1, much)
    else
        TriggerClientEvent('esx:showNotification', source, 'Du hast zuviel: '.. xPlayer.getInventoryItem(item1).label)
        TriggerClientEvent('Farming:Pedclean',source)
    end
end)

RegisterNetEvent('Farming:Verarbeiten')
AddEventHandler('Farming:Verarbeiten', function(item1,item2)
    local _source = source
    local weight = 2
    local much = math.random(1,10)
    local xPlayer = ESX.GetPlayerFromId(_source) 
        
    if  xPlayer.getInventoryItem(item2).count > 100 or xPlayer.getInventoryItem(item1).count < 0 then
        if xPlayer.getInventoryItem(item1).count < 0 then TriggerClientEvent('esx:showNotification', source, 'Nicht genug: '.. xPlayer.getInventoryItem(item1).label) end
        if xPlayer.getInventoryItem(item2).count > 100 then TriggerClientEvent('esx:showNotification', source, 'Du hast zuviel: '.. xPlayer.getInventoryItem(item2).label) end
        TriggerClientEvent('Farming:Pedclean',source)
    else
        xPlayer.addInventoryItem(item2, 1)
        xPlayer.removeInventoryItem(item1, 1)
    end
end)

RegisterNetEvent('Farming:Verkaufen')
AddEventHandler('Farming:Verkaufen', function(item1, item2, blackmoney, money)
    local _source = source
    local weight = 2
    local much = math.random(1,10)
    local xPlayer = ESX.GetPlayerFromId(_source) 
        
    if xPlayer.getInventoryItem(item2).count > 0  then
        if blackmoney == true then
            xPlayer.addAccountMoney('black_money', money)
        else
            xPlayer.addMoney(money)
        end
            xPlayer.removeInventoryItem(item2, 1)
    else
        if xPlayer.getInventoryItem(item2).count < 0 then TriggerClientEvent('esx:showNotification', source, 'Nicht genug: '.. xPlayer.getInventoryItem(item2).label) end
        TriggerClientEvent('Farming:Pedclean',source)
    end
end)


ESX.RegisterServerCallback("Farm:GetJob", function(source, cb)
    local _source = source
    local xPlaxer = ESX.GetPlayerFromId(_source)
    local job = xPlaxer.getJob().name
    cb(job)
end)



Mit freundlichen Grüßen


VoTeK 8o

29.08.2026, 23:13 #2

Hey @VoTeK,

respekt für den ersten eigenen Beitrag — die Config ist sauber kommentiert und die Struktur mit Zonen, Config-Schaltern für Job-Pflicht und Blackmoney ist für ein erstes Script schon ordentlich durchdacht.

Du hast explizit um Verbesserungsvorschläge gebeten, also hier konkret drei Punkte aus dem client.lua:

  • Der ESX-Lade-Thread ganz oben (while true do Citizen.Wait(2) ... end) läuft dauerhaft weiter, auch nachdem ESX längst gesetzt ist — der if ESX ~= nil then-Zweig macht nichts, die Schleife bricht nie ab. Das läuft die ganze Session über alle 2ms und taucht in resmon unnötig auf. Üblich ist, die Schleife nach erfolgreichem Laden mit break zu verlassen.
  • Die Haupt-Schleife für die Farmzonen läuft mit Citizen.Wait(0), also jeden Frame, und prüft dabei alle Zonen per Distanzberechnung — auch wenn der Spieler kilometerweit weg ist. Ein dynamischer Wait (z. B. 500-1000ms, solange keine Zone in der Nähe ist, erst bei Annäherung auf 0 runter) spart hier spürbar Serverlast bei vielbespielten Servern.
  • Eine Rückfrage, weil server.lua nicht mit gepostet wurde: Läuft die eigentliche Geldvergabe (Blackmoney/normal) komplett serverseitig, ausgelöst durch den Farm:GetJob-Callback? Wenn der Client an irgendeiner Stelle selbst ein „Gib mir Geld"-Event triggert, wäre das ein Einfallstor für Cheats.

Insgesamt ein solider Start — mit den beiden Performance-Punkten wird das Script deutlich ressourcenschonender.

~ Dieser Post wurde mithilfe von KI-Inhalten generiert.

In Vice City gewinnt am Ende nicht, wer am lautesten pokert – sondern wer am längsten ruhig bleibt.
Diese Woche hat sich das hier mal wieder bestätigt.

Melde dich an, um zu antworten.
© 2026 GTA-FIVEM.ORGImpressumDatenschutzNutzungsbedingungenCookiesShimo Forum