🚗 GoGo Eats - Food Delivery Job | V2 With Menu

A script by emox_manga

No reviews yet.
🚗 GoGo Eats - Food Delivery Job | V2 With Menu main image

Full Description

A V2 with a brand new menu to manage your orders and view history!

Bring food delivery job to your FiveM server with Uber Foods! This script offers a fun and immersive delivery role for your players.


:package: What’s the Job?

  • :blue_car: Rent your delivery vehicle
  • :calling: Request a food delivery from the menu
  • :hamburger: Accept the order from the menu
  • :person_standing: Deliver it to the hungry customer
  • :dollar: Get paid for your service + cash bonus if you complete 2 or more deliveries in a row

:sparkles: Features

  • :electric_plug: Compatible with ESX & QBCore
  • :calling: Brand new menu to manage your deliveries
  • :inbox_tray: Completed deliveries history saved in the SQL database
  • :gear: Easy to configure and customize
  • :brain: Unique job experience
  • :rocket: Lightweight, effective, and smooth
  • :unlock: Partially accessible code for tweaks
  • :receipt: ~1500 lines of clean Lua/HTML code

config.lua
Config = {}

Config.OpenStartDeliveryMenuButton = 167 --Currently set to F6 index, see "https://docs.fivem.net/docs/game-references/controls/#controls" if you want to set any other input.

Config.JobCheck = true --Set to true if you want a specific job to be required to be able to do food Deliveries.
Config.JobRequired = "unemployed" --If job check true, set the name of the required job here to be able to do food Deliveries.

Config.JobMoney = "cash" --Set it to "cash" or "bank" for which account you wanna add/remove money.

Config.MaxDeliveryChain = 3 --The maximum number chance of delivery you may have in a delivery from a restaurant.

Config.CoordsDeliveryCarButton = vector3(-1165.39, -894.57, 13.03) --Position where you open Delivery rent car menu.
Config.CoordsDeliveryCarReturnVehMarker = vector3(-1162.16, -890.53, 12.62) --Position where you return your rented Delivery car.
Config.CoordsDeliveryCarSpawn = vector4(-1164.03, -891.24, 12.62, 301.34) --Postion where the rented car spawn.

Config.CarRentCost = 1000 --The cost of renting your delivery car.

Config.RestaurantFoodPickup = { --Add/Remove restaurants locations here (Do not forget to setup the icon tied to the reasturant name in "Config.RestaurantLogos").
    { 
        name = "Burger Shot", 
        location = vector3( -1194.53, -892.21, 13.89), 
        food = {"Menu", "Burger", "Fries", "IceCream", "eCola", "Sprunk"} 
    },
    { 
        name = "Cluckin' Bell", 
        location = vector3( -137.86, -256.3635, 43.59),
        food = {"Menu", "Burger", "Fries", "Wing", "Veggy", "Balls", "Rings", "IceCream", "eCola", "Sprunk"} 
    },
    { 
        name = "Up-n-Atom Burger", 
        location = vector3( 81.09, 274.13, 110.21),
        food = {"Menu", "Burger", "Fries", "Slices of Bacon", "Chili Dog", "May's Apple Pie", "May's Layer Cake", "IceCream", "eCola", "Sprunk"}
    },
    { 
        name = "Pizza This...", 
        location = vector3( 287.42, -963.57, 29.42),
        food = {"Menu", "Pizza", "Fries", "Pasta", "Salad", "May's Apple Pie", "Donut", "Cherry Pie", "Pastry", "IceCream", "eCola", "Sprunk"}
    },
    { 
        name = "Pearl's Seafood", 
        location = vector3( -1816.25, -1192.57, 14.3),
        food = {"Shrimp Tempura", "Calamari", "Potato Chips", "Soup", "Salad", "Salmon Salad", "Raw Oyster", "Scallop Baked", "Steamed Fish", "Steamed Squid", "Coconut Juice", "Pineapple juice", "Cocktail", "Banana Split"}
    },
    { 
        name = "Sightings Bar & Restaurant", 
        location = vector3( -888.07, -2535.45, 14.55),
        food = {"Menu", "Classic Burger", "Grilled Cheese", "Fish & Chips", "Fries", "Nachos", "Mozzarella Sticks", "Jalapeño Poppers", "Buffalo Wings", "eCola", "Sprunk", "Logger Beer", "Pißwasser", "Cheesecake Slice", "Brownie Sundae"}
    },
    { 
        name = "Slice 'N' Dice Pizzeria", 
        location = vector3( -1329.7, -1285.22, 5.02),
        food = {"Menu", "Pizza", "Fries", "Pasta", "Salad", "May's Apple Pie", "Donut", "Cherry Pie", "Pastry", "IceCream", "eCola", "Sprunk"}
    },
    { 
        name = "Mex on the Beach", 
        location = vector3( -1286.03, -1387.13, 4.45),
        food = {"Menu", "Tacos", "Burrito", "Enchiladas", "Mexican Rice", "Nachos", "Tortilla Chips & Guac", "Nacho Fiesta Platter", "Churros with Chocolate", "Agua Fresca", "Tequila Shot", "Lime Margarita"} 
    },
    { 
        name = "Guido's Take Out", 
        location = vector3( 443.43, 134.69, 100.02),
        food = {"Menu", "Pizza", "Fries", "Pasta", "Salad", "May's Apple Pie", "Donut", "Cherry Pie", "Pastry", "IceCream", "eCola", "Sprunk"}
    },
    { 
        name = "La Spada", 
        location = vector3( -1038.46, -1397.05, 5.55),
        food = {"Linguine alle Vongole", "Risotto ai Frutti di Mare", "Lobster Ravioli", "Caprese Salad", "Bruschetta al Pomodoro", "Tiramisu", "Panna Cotta", "House White Wine", "Sparkling Water", "Espresso Shot"}
    },
    { 
        name = "Pot-Heads Seafood Restaurant", 
        location = vector3( -1229.76, -1173.88, 7.69),
        food = {"Spicy Shrimp Tacos", "Cajun Lobster Roll", "Deep-Fried Catfish Basket", "Beer-Battered Fish & Chips", "Corn on the Cob", "Slaw Cup", "Deep-Fried Biscuit", "Key Lime Pie Slice", "Local Craft Beer", "Sweet Iced Tea", "Pineapple Kush Smoothie"}
    },
    { 
        name = "The Pizza Coven", 
        location = vector3( -1350.68, -1218.5, 5.94),
        food = {"Menu", "Pizza", "Fries", "Pasta", "Salad", "May's Apple Pie", "Donut", "Cherry Pie", "Pastry", "IceCream", "eCola", "Sprunk"} 
    },
    { 
        name = "Hookies", 
        location = vector3( -2194.03, 4290.59, 49.17),
        food = {"Grilled Salmon Fillet", "Beer-Battered Cod Sandwich", "Fried Shrimp Basket", "Fish & Chips", "Lobster Mac & Cheese", "Garlic Mashed Potatoes", "Onion Rings", "Steamed Veggies", "Apple Crumble", "Cheesecake Slice", "Root Beer Float", "Lemonade"}
    },
    { 
        name = "Sandy Rings", 
        location = vector3( -1188.91, -1552.08, 4.36),
        food = {"Glazed Donut", "Cinnamon Twist", "Chocolate Frosted", "Strawberry Sprinkle", "Black Coffee", "Vanilla Latte", "Caramel Iced Coffee", "Bacon & Egg Sandwich", "Sausage Breakfast Burrito", "Ham & Cheese Croissant", "Chocolate Chip Cookie", "Blueberry Muffin"}
    },
    { 
        name = "Sumac Restaurant", 
        location = vector3( -1463.53, -705.02, 26.78),
        food = {"Carpaccio", "Carrot and Feta", "Cabbage", "Salad", "Pasta", "Vini Rossi", "Vini Bianco", "Tiramisu", "Cannoli"}
    },
    { 
        name = "Wok It Off", 
        location = vector3( -163.8, -1439.65, 31.42),
        food = {"General Tso's Chicken", "Beef & Broccoli", "Kung Pao Chicken", "Mongolian Beef", "Sesame Chicken", "Teriyaki Chicken", "Fried Rice", "Chow Mein Noodles", "Vegetable Stir Fry", "Spring Rolls", "Crab Rangoon", "Chicken Skewers" } 
    }
}

Config.RestaurantLogos = {--Setup each restaurant icons here (Needs to match the name of the restaurant set above, put your images in "html\images").
    ["Burger Shot"] = "images/burger_shot.png",
    ["Cluckin' Bell"] = "images/cluckin_bell.png",
    ["Up-n-Atom Burger"] = "images/up_n_atom.png",
    ["Pizza This..."] = "images/pizza_this.png",
    ["Pearl's Seafood"] = "images/pearls_seafood.png",
    ["Sightings Bar & Restaurant"] = "images/sightings_bar.png",
    ["Slice 'N' Dice Pizzeria"] = "images/slice_n_dice.png",
    ["Mex on the Beach"] = "images/mex_on_the_beach.png",
    ["Guido's Take Out"] = "images/guidos_take_out.png",
    ["La Spada"] = "images/la_spada.png",
    ["Pot-Heads Seafood Restaurant"] = "images/pot_heads.png",
    ["The Pizza Coven"] = "images/pizza_coven.png",
    ["Hookies"] = "images/hookies.png",
    ["Sandy Rings"] = "images/sandy_rings.png",
    ["Sumac Restaurant"] = "images/sumac.png",
    ["Wok It Off"] = "images/wok_it_off.png"
}

Config.PenaltyOnMissionCancel = true --Set it to true/false if you want a money penalty on mission cancel.
Config.PenaltyCancelAmount = 300 --The money amount it takes if penalty enabled.

Config.Colour = { R = 160, G = 255, B = 160} --3D Marker Colour

Config.RewardBonus = { min = 170, max = 450 } --Mini/max Amount of payout Bonus.

Config.RewardDeliveryChain = 200 --Amount of payout Bonus you get when you in a chain deliveries.

Config.ChanceDeliveryChain = { -- Chance percentages to offer another delivery after completing one.
    secondPercentage = 50, -- 'secondPercentage' = chance after the 1st delivery.
    morePercentage = 15 -- 'morePercentage' = chance after 2 or more deliveries in a row.
} 

Config.MapBlip = {{--Minimap icon setup.
    title = "GoGo Eats", --Display Name
    colour = 2, --Colour ID
    id = 457, --Blip Icon ID
    x = -1164.13,
    y = -891.29,
    z = 13.81 
}}

Config.DeliveryVehicles = {--Add/remove any car you want as a delivery renting (Here is the recommend cars shown in the video).
    --Name = The vehicle menu display name, model =  In game spawn name, logo = The vehicle Menu icon (put your images in "html\images").
	{ name = "Faggio Sport", model = "foodbike", logo = "images/foodbike.png", price = "$200"},
	{ name = "Faggio Classic", model = "foodbike2", logo = "images/foodbike2.png", price = "$200"},
	{ name = "Blista Compact", model = "foodcar", logo = "images/foodcar.png", price = "$1000"},
	{ name = "Blista", model = "foodcar2", logo = "images/foodcar2.png", price = "$1000"},
	{ name = "Dilettante", model = "foodcar3", logo = "images/foodcar3.png", price = "$1000"},
	{ name = "Panto", model = "foodcar4", logo = "images/foodcar4.png", price = "$700"},
	{ name = "Emperor Lokus", model = "foodcar5", logo = "images/foodcar5.png", price = "$1000"},
	{ name = "Rebel Sport Rusty", model = "foodcar6", logo = "images/foodcar6.png", price = "$500"}
}

Config.GiveTakeFoodAnim = { --Animation for when you pickup/give food to NPC.
    dict = "mp_common", --Anim Dict
    name = "givetake1_b" --Anim Name
}

Config.MaleAnims = {--List of idle anims Male NPC can play (anim dict, anin name).
    { dict = "rcmjosh1", name = "idle" },
    { dict = "random@shop_tattoo", name = "_idle" },
    { dict = "amb@world_human_hang_out_street@male_c@idle_a", name = "idle_a" },
    { dict = "amb@world_human_aa_smoke@male@idle_a", name = "idle_c" },
    { dict = "anim@mp_corona_idles@male_c@idle_a", name = "idle_a" }
}

Config.FemaleAnims = {--List of idle anims Female NPC can play (anim dict, anin name).
    { dict = "amb@world_human_hang_out_street@female_arm_side@base", name = "base" },
    { dict = "mp_move@prostitute@f@hooker", name = "idle" },
    { dict = "move_f@scared@a", name = "idle" },
    { dict = "amb@world_human_smoking@female@idle_a", name = "idle_b" },
    { dict = "amb@world_human_hang_out_street@female_arms_crossed@idle_a", name = "idle_a" }
}
emox_foodjobdeliveryv2_server.lua
function _AddRemoveMoney(src, account, amount, addmoney)
    if Config.Framework == "qb" then
        local Player = Core.Functions.GetPlayer(src)
        if Player then
          if addmoney then
            Player.Functions.AddMoney(account, amount)
          else
            Player.Functions.RemoveMoney(account, amount)
          end
        end
    elseif Config.Framework == "esx" then
        if account == "cash" then
            account = "money"
        end
        local xPlayer = Core.GetPlayerFromId(src)
        if addmoney then
          xPlayer.addAccountMoney(account, amount)
        else
          xPlayer.removeAccountMoney(account, amount)
        end
    end
end
  
RegisterNetEvent('GoGoEats:DeviverySuccess')
AddEventHandler('GoGoEats:DeviverySuccess', function(client, restaurant, food, amount)
  if amount == 0 then return end

  local player = source
  local QBPlayer = nil
  local xPlayer = nil
  local identifier = nil

  if Config.Framework == "qb" then
    QBPlayer = Core.Functions.GetPlayer(player)
    if QBPlayer then
      identifier = Core.Functions.GetIdentifier(player)
      print("QB ID "..identifier)
    end
  elseif Config.Framework == "esx" then
    xPlayer = Core.GetPlayerFromId(player)
      if xPlayer then
        identifier = xPlayer.getIdentifier()
    end
  end

  if xPlayer or QBPlayer then
    local restaurant = restaurant or "Unknown"
    local food = food or "Unknown"

    -- Insère dans la base de données
    MySQL.insert('INSERT INTO gogoeats_deliveries (identifier, client, restaurant, food, payment, date) VALUES (?, ?, ?, ?, ?, ?)',
			{ identifier, client, restaurant, food, amount })
  end
  
  _AddRemoveMoney(player, Config.JobMoney, amount, true) --Set last param to true if you add money, false if you remove.
  TriggerClientEvent('GoGoEats:Notification', player, "Fleeca Bank", "Payment", LangSTR['notifications_gogoeats_delivery_success'].."\n+~g~$"..tostring(amount), 'CHAR_BANK_FLEECA')
end)

RegisterServerEvent('GoGoEats:CancelPenalty')
AddEventHandler('GoGoEats:CancelPenalty', function(money)
    local player = source
    
    _AddRemoveMoney(player, Config.JobMoney, money, false) --Set last param to true if you add money, false if you remove.

    TriggerClientEvent('GoGoEats:Notification', player, "Fleeca Bank", "Payment", LangSTR['notifications_gogoeats_delivery_penalty'].."\n-~r~$"..tostring(Config.PenaltyCancelAmount), 'CHAR_BANK_FLEECA')
end)

local DeliveryCarToNetId = {}

RegisterNetEvent('GoGoEats:RentedCarSpawn')
AddEventHandler('GoGoEats:RentedCarSpawn', function(netId, price)
  local player = source
  DeliveryCarToNetId[player] = netId

  _AddRemoveMoney(player, Config.JobMoney, price, false) --Set last param to true if you add money, false if you remove.

  print("spawn rented car")
  TriggerClientEvent('GoGoEats:Notification', player, "Fleeca Bank", "Payment", LangSTR['notifications_gogoeats_rented_car'].."\n-~r~$".. tostring(price), 'CHAR_BANK_FLEECA')
end)

RegisterServerEvent('GoGoEats:RentedCarReturned', function(netId)
  local player = source
  if netId == DeliveryCarToNetId[player] then
    TriggerClientEvent('GoGoEats:DeleteDeliveryCar', player)
    DeliveryCarToNetId[player] = nil
  else
    TriggerClientEvent('GoGoEats:WrongDeliveryCar', player)
  end
end)

RegisterServerEvent('GoGoEats:NewRandomOrderNotif', function()
  local player = source
  TriggerClientEvent('GoGoEats:Notification', player, "GoGo Eats", "Notification", LangSTR['notifications_gogoeats_new_order'], 'CHAR_HUMANDEFAULT')
end)

RegisterNetEvent("GoGoEats:RentedCarMoneyBack")
AddEventHandler("GoGoEats:RentedCarMoneyBack", function(price)
    local player = source

    _AddRemoveMoney(player, Config.JobMoney, price, true) --Set last param to true if you add money, false if you remove.

    TriggerClientEvent('GoGoEats:Notification', player, "Fleeca Bank", "Payment", LangSTR['notifications_gogoeats_rented_car_return'].."\n+~g~$".. tostring(price), 'CHAR_BANK_FLEECA')
end)

RegisterNetEvent('GoGoEats:GetDeliveryHistory')
AddEventHandler('GoGoEats:GetDeliveryHistory', function()
  print("get delivery history")  
  local player = source
  local identifier = nil

  if Config.Framework == "qb" then
      local Player = Core.Functions.GetPlayer(player)
      if Player then
        identifier = Core.Functions.GetIdentifier(player)
        print("QB ID "..identifier)
      end

  elseif Config.Framework == "esx" then
      local xPlayer = Core.GetPlayerFromId(player)
      if xPlayer then
        local xPlayer = Core.GetPlayerFromId(player)
        identifier = xPlayer.getIdentifier()
      end
  end

  MySQL.query('SELECT * FROM gogoeats_deliveries WHERE identifier = ? ORDER BY date DESC LIMIT 20', {
    identifier
  }, function(result)
      if result and #result > 0 then
          local totalDeliveries = 0
          local totalEarnings = 0
  
          for i, order in ipairs(result) do
              -- Conversion date
              if order.date and order.date > 10000000000 then
                  order.date = order.date / 1000
              end
              order.date = os.date("%d/%m/%Y %H:%M:%S", order.date)
  
              -- Cumul des stats
              totalDeliveries = totalDeliveries + 1
              totalEarnings = totalEarnings + (order.payment or 0)
          end
  
          -- Envoi au client
          TriggerClientEvent('GoGoEats:SendDeliveryHistory', player, result, totalDeliveries, totalEarnings)
      else
          TriggerClientEvent('GoGoEats:SendDeliveryHistory', player, {}, 0, 0)
      end
  end)  
end)

RegisterServerEvent('GoGoEats:StartMissionCheck', function(netId)
  local player = source
  if netId == DeliveryCarToNetId[player] then
    TriggerClientEvent('GoGoEats:OpenMissionMenu', player)
  else
    TriggerClientEvent('GoGoEats:WrongDeliveryCar', player)
  end
end)

RegisterServerEvent('GoGoEats:CheckJobStatus', function()
  local player = source
  local jobName = nil
  local playerName = ""

  if Config.Framework == "qb" then
      local Player = Core.Functions.GetPlayer(player)
      if Player and Player.PlayerData and Player.PlayerData.job then
          jobName = Player.PlayerData.job.name
          playerName = Player.PlayerData.charinfo.firstname or "QBCorePlayer"
      end

  elseif Config.Framework == "esx" then
      local xPlayer = Core.GetPlayerFromId(player)
      if xPlayer and xPlayer.job then
          jobName = xPlayer.job.name
          playerName = xPlayer.getName() or "ESXPlayer"
      end
  end

  if jobName == Config.JobRequired then
      print(playerName.." job is "..jobName.." → access granted!")
      TriggerClientEvent('GoGoEats:JobAccess', player)
  else
      print(playerName.." job is "..tostring(jobName).." → access denied!")
      TriggerClientEvent('GoGoEats:JobDeny', player)
  end
end)

:books: Dependencies


:heart_eyes: Recommended Assets


:movie_camera: Preview


:arrow_down: Download Now

:point_right: https://emox-manga.tebex.io

Code is accessible Partially
Subscription-based No
Lines (approximately) 1500
Requirements ScaleformUI - oxmysql
Support Yes

Config Merger
Have you tried Config Merger? Merge your configs easily